diff options
Diffstat (limited to '3rdparty/SDL2/src/video')
286 files changed, 0 insertions, 80032 deletions
diff --git a/3rdparty/SDL2/src/video/SDL_RLEaccel.c b/3rdparty/SDL2/src/video/SDL_RLEaccel.c deleted file mode 100644 index 67baaf664ee..00000000000 --- a/3rdparty/SDL2/src/video/SDL_RLEaccel.c +++ /dev/null @@ -1,1581 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* - * RLE encoding for software colorkey and alpha-channel acceleration - * - * Original version by Sam Lantinga - * - * Mattias Engdegård (Yorick): Rewrite. New encoding format, encoder and - * decoder. Added per-surface alpha blitter. Added per-pixel alpha - * format, encoder and blitter. - * - * Many thanks to Xark and johns for hints, benchmarks and useful comments - * leading to this code. - * - * Welcome to Macro Mayhem. - */ - -/* - * The encoding translates the image data to a stream of segments of the form - * - * <skip> <run> <data> - * - * where <skip> is the number of transparent pixels to skip, - * <run> is the number of opaque pixels to blit, - * and <data> are the pixels themselves. - * - * This basic structure is used both for colorkeyed surfaces, used for simple - * binary transparency and for per-surface alpha blending, and for surfaces - * with per-pixel alpha. The details differ, however: - * - * Encoding of colorkeyed surfaces: - * - * Encoded pixels always have the same format as the target surface. - * <skip> and <run> are unsigned 8 bit integers, except for 32 bit depth - * where they are 16 bit. This makes the pixel data aligned at all times. - * Segments never wrap around from one scan line to the next. - * - * The end of the sequence is marked by a zero <skip>,<run> pair at the * - * beginning of a line. - * - * Encoding of surfaces with per-pixel alpha: - * - * The sequence begins with a struct RLEDestFormat describing the target - * pixel format, to provide reliable un-encoding. - * - * Each scan line is encoded twice: First all completely opaque pixels, - * encoded in the target format as described above, and then all - * partially transparent (translucent) pixels (where 1 <= alpha <= 254), - * in the following 32-bit format: - * - * For 32-bit targets, each pixel has the target RGB format but with - * the alpha value occupying the highest 8 bits. The <skip> and <run> - * counts are 16 bit. - * - * For 16-bit targets, each pixel has the target RGB format, but with - * the middle component (usually green) shifted 16 steps to the left, - * and the hole filled with the 5 most significant bits of the alpha value. - * i.e. if the target has the format rrrrrggggggbbbbb, - * the encoded pixel will be 00000gggggg00000rrrrr0aaaaabbbbb. - * The <skip> and <run> counts are 8 bit for the opaque lines, 16 bit - * for the translucent lines. Two padding bytes may be inserted - * before each translucent line to keep them 32-bit aligned. - * - * The end of the sequence is marked by a zero <skip>,<run> pair at the - * beginning of an opaque line. - */ - -#include "SDL_video.h" -#include "SDL_sysvideo.h" -#include "SDL_blit.h" -#include "SDL_RLEaccel_c.h" - -#ifndef MAX -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#endif -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - -#define PIXEL_COPY(to, from, len, bpp) \ - SDL_memcpy(to, from, (size_t)(len) * (bpp)) - -/* - * Various colorkey blit methods, for opaque and per-surface alpha - */ - -#define OPAQUE_BLIT(to, from, length, bpp, alpha) \ - PIXEL_COPY(to, from, length, bpp) - -/* - * For 32bpp pixels on the form 0x00rrggbb: - * If we treat the middle component separately, we can process the two - * remaining in parallel. This is safe to do because of the gap to the left - * of each component, so the bits from the multiplication don't collide. - * This can be used for any RGB permutation of course. - */ -#define ALPHA_BLIT32_888(to, from, length, bpp, alpha) \ - do { \ - int i; \ - Uint32 *src = (Uint32 *)(from); \ - Uint32 *dst = (Uint32 *)(to); \ - for (i = 0; i < (int)(length); i++) { \ - Uint32 s = *src++; \ - Uint32 d = *dst; \ - Uint32 s1 = s & 0xff00ff; \ - Uint32 d1 = d & 0xff00ff; \ - d1 = (d1 + ((s1 - d1) * alpha >> 8)) & 0xff00ff; \ - s &= 0xff00; \ - d &= 0xff00; \ - d = (d + ((s - d) * alpha >> 8)) & 0xff00; \ - *dst++ = d1 | d; \ - } \ - } while (0) - -/* - * For 16bpp pixels we can go a step further: put the middle component - * in the high 16 bits of a 32 bit word, and process all three RGB - * components at the same time. Since the smallest gap is here just - * 5 bits, we have to scale alpha down to 5 bits as well. - */ -#define ALPHA_BLIT16_565(to, from, length, bpp, alpha) \ - do { \ - int i; \ - Uint16 *src = (Uint16 *)(from); \ - Uint16 *dst = (Uint16 *)(to); \ - Uint32 ALPHA = alpha >> 3; \ - for(i = 0; i < (int)(length); i++) { \ - Uint32 s = *src++; \ - Uint32 d = *dst; \ - s = (s | s << 16) & 0x07e0f81f; \ - d = (d | d << 16) & 0x07e0f81f; \ - d += (s - d) * ALPHA >> 5; \ - d &= 0x07e0f81f; \ - *dst++ = (Uint16)(d | d >> 16); \ - } \ - } while(0) - -#define ALPHA_BLIT16_555(to, from, length, bpp, alpha) \ - do { \ - int i; \ - Uint16 *src = (Uint16 *)(from); \ - Uint16 *dst = (Uint16 *)(to); \ - Uint32 ALPHA = alpha >> 3; \ - for(i = 0; i < (int)(length); i++) { \ - Uint32 s = *src++; \ - Uint32 d = *dst; \ - s = (s | s << 16) & 0x03e07c1f; \ - d = (d | d << 16) & 0x03e07c1f; \ - d += (s - d) * ALPHA >> 5; \ - d &= 0x03e07c1f; \ - *dst++ = (Uint16)(d | d >> 16); \ - } \ - } while(0) - -/* - * The general slow catch-all function, for remaining depths and formats - */ -#define ALPHA_BLIT_ANY(to, from, length, bpp, alpha) \ - do { \ - int i; \ - Uint8 *src = from; \ - Uint8 *dst = to; \ - for (i = 0; i < (int)(length); i++) { \ - Uint32 s, d; \ - unsigned rs, gs, bs, rd, gd, bd; \ - switch (bpp) { \ - case 2: \ - s = *(Uint16 *)src; \ - d = *(Uint16 *)dst; \ - break; \ - case 3: \ - if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { \ - s = (src[0] << 16) | (src[1] << 8) | src[2]; \ - d = (dst[0] << 16) | (dst[1] << 8) | dst[2]; \ - } else { \ - s = (src[2] << 16) | (src[1] << 8) | src[0]; \ - d = (dst[2] << 16) | (dst[1] << 8) | dst[0]; \ - } \ - break; \ - case 4: \ - s = *(Uint32 *)src; \ - d = *(Uint32 *)dst; \ - break; \ - } \ - RGB_FROM_PIXEL(s, fmt, rs, gs, bs); \ - RGB_FROM_PIXEL(d, fmt, rd, gd, bd); \ - rd += (rs - rd) * alpha >> 8; \ - gd += (gs - gd) * alpha >> 8; \ - bd += (bs - bd) * alpha >> 8; \ - PIXEL_FROM_RGB(d, fmt, rd, gd, bd); \ - switch (bpp) { \ - case 2: \ - *(Uint16 *)dst = (Uint16)d; \ - break; \ - case 3: \ - if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { \ - dst[0] = (Uint8)(d >> 16); \ - dst[1] = (Uint8)(d >> 8); \ - dst[2] = (Uint8)(d); \ - } else { \ - dst[0] = (Uint8)d; \ - dst[1] = (Uint8)(d >> 8); \ - dst[2] = (Uint8)(d >> 16); \ - } \ - break; \ - case 4: \ - *(Uint32 *)dst = d; \ - break; \ - } \ - src += bpp; \ - dst += bpp; \ - } \ - } while(0) - -/* - * Special case: 50% alpha (alpha=128) - * This is treated specially because it can be optimized very well, and - * since it is good for many cases of semi-translucency. - * The theory is to do all three components at the same time: - * First zero the lowest bit of each component, which gives us room to - * add them. Then shift right and add the sum of the lowest bits. - */ -#define ALPHA_BLIT32_888_50(to, from, length, bpp, alpha) \ - do { \ - int i; \ - Uint32 *src = (Uint32 *)(from); \ - Uint32 *dst = (Uint32 *)(to); \ - for(i = 0; i < (int)(length); i++) { \ - Uint32 s = *src++; \ - Uint32 d = *dst; \ - *dst++ = (((s & 0x00fefefe) + (d & 0x00fefefe)) >> 1) \ - + (s & d & 0x00010101); \ - } \ - } while(0) - -/* - * For 16bpp, we can actually blend two pixels in parallel, if we take - * care to shift before we add, not after. - */ - -/* helper: blend a single 16 bit pixel at 50% */ -#define BLEND16_50(dst, src, mask) \ - do { \ - Uint32 s = *src++; \ - Uint32 d = *dst; \ - *dst++ = (Uint16)((((s & mask) + (d & mask)) >> 1) + \ - (s & d & (~mask & 0xffff))); \ - } while(0) - -/* basic 16bpp blender. mask is the pixels to keep when adding. */ -#define ALPHA_BLIT16_50(to, from, length, bpp, alpha, mask) \ - do { \ - unsigned n = (length); \ - Uint16 *src = (Uint16 *)(from); \ - Uint16 *dst = (Uint16 *)(to); \ - if (((uintptr_t)src ^ (uintptr_t)dst) & 3) { \ - /* source and destination not in phase, blit one by one */ \ - while (n--) \ - BLEND16_50(dst, src, mask); \ - } else { \ - if ((uintptr_t)src & 3) { \ - /* first odd pixel */ \ - BLEND16_50(dst, src, mask); \ - n--; \ - } \ - for (; n > 1; n -= 2) { \ - Uint32 s = *(Uint32 *)src; \ - Uint32 d = *(Uint32 *)dst; \ - *(Uint32 *)dst = ((s & (mask | mask << 16)) >> 1) \ - + ((d & (mask | mask << 16)) >> 1) \ - + (s & d & (~(mask | mask << 16))); \ - src += 2; \ - dst += 2; \ - } \ - if (n) \ - BLEND16_50(dst, src, mask); /* last odd pixel */ \ - } \ - } while(0) - -#define ALPHA_BLIT16_565_50(to, from, length, bpp, alpha) \ - ALPHA_BLIT16_50(to, from, length, bpp, alpha, 0xf7de) - -#define ALPHA_BLIT16_555_50(to, from, length, bpp, alpha) \ - ALPHA_BLIT16_50(to, from, length, bpp, alpha, 0xfbde) - -#define CHOOSE_BLIT(blitter, alpha, fmt) \ - do { \ - if (alpha == 255) { \ - switch (fmt->BytesPerPixel) { \ - case 1: blitter(1, Uint8, OPAQUE_BLIT); break; \ - case 2: blitter(2, Uint8, OPAQUE_BLIT); break; \ - case 3: blitter(3, Uint8, OPAQUE_BLIT); break; \ - case 4: blitter(4, Uint16, OPAQUE_BLIT); break; \ - } \ - } else { \ - switch (fmt->BytesPerPixel) { \ - case 1: \ - /* No 8bpp alpha blitting */ \ - break; \ - \ - case 2: \ - switch (fmt->Rmask | fmt->Gmask | fmt->Bmask) { \ - case 0xffff: \ - if (fmt->Gmask == 0x07e0 \ - || fmt->Rmask == 0x07e0 \ - || fmt->Bmask == 0x07e0) { \ - if (alpha == 128) { \ - blitter(2, Uint8, ALPHA_BLIT16_565_50); \ - } else { \ - blitter(2, Uint8, ALPHA_BLIT16_565); \ - } \ - } else \ - goto general16; \ - break; \ - \ - case 0x7fff: \ - if (fmt->Gmask == 0x03e0 \ - || fmt->Rmask == 0x03e0 \ - || fmt->Bmask == 0x03e0) { \ - if (alpha == 128) { \ - blitter(2, Uint8, ALPHA_BLIT16_555_50); \ - } else { \ - blitter(2, Uint8, ALPHA_BLIT16_555); \ - } \ - break; \ - } else \ - goto general16; \ - break; \ - \ - default: \ - general16: \ - blitter(2, Uint8, ALPHA_BLIT_ANY); \ - } \ - break; \ - \ - case 3: \ - blitter(3, Uint8, ALPHA_BLIT_ANY); \ - break; \ - \ - case 4: \ - if ((fmt->Rmask | fmt->Gmask | fmt->Bmask) == 0x00ffffff \ - && (fmt->Gmask == 0xff00 || fmt->Rmask == 0xff00 \ - || fmt->Bmask == 0xff00)) { \ - if (alpha == 128) { \ - blitter(4, Uint16, ALPHA_BLIT32_888_50); \ - } else { \ - blitter(4, Uint16, ALPHA_BLIT32_888); \ - } \ - } else \ - blitter(4, Uint16, ALPHA_BLIT_ANY); \ - break; \ - } \ - } \ - } while(0) - -/* - * Set a pixel value using the given format, except that the alpha value is - * placed in the top byte. This is the format used for RLE with alpha. - */ -#define RLEPIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \ -{ \ - Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \ - ((g>>fmt->Gloss)<<fmt->Gshift)| \ - ((b>>fmt->Bloss)<<fmt->Bshift)| \ - (a<<24); \ -} - -/* - * This takes care of the case when the surface is clipped on the left and/or - * right. Top clipping has already been taken care of. - */ -static void -RLEClipBlit(int w, Uint8 * srcbuf, SDL_Surface * surf_dst, - Uint8 * dstbuf, SDL_Rect * srcrect, unsigned alpha) -{ - SDL_PixelFormat *fmt = surf_dst->format; - -#define RLECLIPBLIT(bpp, Type, do_blit) \ - do { \ - int linecount = srcrect->h; \ - int ofs = 0; \ - int left = srcrect->x; \ - int right = left + srcrect->w; \ - dstbuf -= left * bpp; \ - for (;;) { \ - int run; \ - ofs += *(Type *)srcbuf; \ - run = ((Type *)srcbuf)[1]; \ - srcbuf += 2 * sizeof(Type); \ - if (run) { \ - /* clip to left and right borders */ \ - if (ofs < right) { \ - int start = 0; \ - int len = run; \ - int startcol; \ - if (left - ofs > 0) { \ - start = left - ofs; \ - len -= start; \ - if (len <= 0) \ - goto nocopy ## bpp ## do_blit; \ - } \ - startcol = ofs + start; \ - if (len > right - startcol) \ - len = right - startcol; \ - do_blit(dstbuf + startcol * bpp, srcbuf + start * bpp, \ - len, bpp, alpha); \ - } \ - nocopy ## bpp ## do_blit: \ - srcbuf += run * bpp; \ - ofs += run; \ - } else if (!ofs) \ - break; \ - \ - if (ofs == w) { \ - ofs = 0; \ - dstbuf += surf_dst->pitch; \ - if (!--linecount) \ - break; \ - } \ - } \ - } while(0) - - CHOOSE_BLIT(RLECLIPBLIT, alpha, fmt); - -#undef RLECLIPBLIT - -} - - -/* blit a colorkeyed RLE surface */ -int -SDL_RLEBlit(SDL_Surface * surf_src, SDL_Rect * srcrect, - SDL_Surface * surf_dst, SDL_Rect * dstrect) -{ - Uint8 *dstbuf; - Uint8 *srcbuf; - int x, y; - int w = surf_src->w; - unsigned alpha; - - /* Lock the destination if necessary */ - if (SDL_MUSTLOCK(surf_dst)) { - if (SDL_LockSurface(surf_dst) < 0) { - return (-1); - } - } - - /* Set up the source and destination pointers */ - x = dstrect->x; - y = dstrect->y; - dstbuf = (Uint8 *) surf_dst->pixels - + y * surf_dst->pitch + x * surf_src->format->BytesPerPixel; - srcbuf = (Uint8 *) surf_src->map->data; - - { - /* skip lines at the top if necessary */ - int vskip = srcrect->y; - int ofs = 0; - if (vskip) { - -#define RLESKIP(bpp, Type) \ - for(;;) { \ - int run; \ - ofs += *(Type *)srcbuf; \ - run = ((Type *)srcbuf)[1]; \ - srcbuf += sizeof(Type) * 2; \ - if(run) { \ - srcbuf += run * bpp; \ - ofs += run; \ - } else if(!ofs) \ - goto done; \ - if(ofs == w) { \ - ofs = 0; \ - if(!--vskip) \ - break; \ - } \ - } - - switch (surf_src->format->BytesPerPixel) { - case 1: - RLESKIP(1, Uint8); - break; - case 2: - RLESKIP(2, Uint8); - break; - case 3: - RLESKIP(3, Uint8); - break; - case 4: - RLESKIP(4, Uint16); - break; - } - -#undef RLESKIP - - } - } - - alpha = surf_src->map->info.a; - /* if left or right edge clipping needed, call clip blit */ - if (srcrect->x || srcrect->w != surf_src->w) { - RLEClipBlit(w, srcbuf, surf_dst, dstbuf, srcrect, alpha); - } else { - SDL_PixelFormat *fmt = surf_src->format; - -#define RLEBLIT(bpp, Type, do_blit) \ - do { \ - int linecount = srcrect->h; \ - int ofs = 0; \ - for(;;) { \ - unsigned run; \ - ofs += *(Type *)srcbuf; \ - run = ((Type *)srcbuf)[1]; \ - srcbuf += 2 * sizeof(Type); \ - if(run) { \ - do_blit(dstbuf + ofs * bpp, srcbuf, run, bpp, alpha); \ - srcbuf += run * bpp; \ - ofs += run; \ - } else if(!ofs) \ - break; \ - if(ofs == w) { \ - ofs = 0; \ - dstbuf += surf_dst->pitch; \ - if(!--linecount) \ - break; \ - } \ - } \ - } while(0) - - CHOOSE_BLIT(RLEBLIT, alpha, fmt); - -#undef RLEBLIT - } - - done: - /* Unlock the destination if necessary */ - if (SDL_MUSTLOCK(surf_dst)) { - SDL_UnlockSurface(surf_dst); - } - return (0); -} - -#undef OPAQUE_BLIT - -/* - * Per-pixel blitting macros for translucent pixels: - * These use the same techniques as the per-surface blitting macros - */ - -/* - * For 32bpp pixels, we have made sure the alpha is stored in the top - * 8 bits, so proceed as usual - */ -#define BLIT_TRANSL_888(src, dst) \ - do { \ - Uint32 s = src; \ - Uint32 d = dst; \ - unsigned alpha = s >> 24; \ - Uint32 s1 = s & 0xff00ff; \ - Uint32 d1 = d & 0xff00ff; \ - d1 = (d1 + ((s1 - d1) * alpha >> 8)) & 0xff00ff; \ - s &= 0xff00; \ - d &= 0xff00; \ - d = (d + ((s - d) * alpha >> 8)) & 0xff00; \ - dst = d1 | d | 0xff000000; \ - } while(0) - -/* - * For 16bpp pixels, we have stored the 5 most significant alpha bits in - * bits 5-10. As before, we can process all 3 RGB components at the same time. - */ -#define BLIT_TRANSL_565(src, dst) \ - do { \ - Uint32 s = src; \ - Uint32 d = dst; \ - unsigned alpha = (s & 0x3e0) >> 5; \ - s &= 0x07e0f81f; \ - d = (d | d << 16) & 0x07e0f81f; \ - d += (s - d) * alpha >> 5; \ - d &= 0x07e0f81f; \ - dst = (Uint16)(d | d >> 16); \ - } while(0) - -#define BLIT_TRANSL_555(src, dst) \ - do { \ - Uint32 s = src; \ - Uint32 d = dst; \ - unsigned alpha = (s & 0x3e0) >> 5; \ - s &= 0x03e07c1f; \ - d = (d | d << 16) & 0x03e07c1f; \ - d += (s - d) * alpha >> 5; \ - d &= 0x03e07c1f; \ - dst = (Uint16)(d | d >> 16); \ - } while(0) - -/* used to save the destination format in the encoding. Designed to be - macro-compatible with SDL_PixelFormat but without the unneeded fields */ -typedef struct -{ - Uint8 BytesPerPixel; - Uint8 padding[3]; - Uint32 Rmask; - Uint32 Gmask; - Uint32 Bmask; - Uint32 Amask; - Uint8 Rloss; - Uint8 Gloss; - Uint8 Bloss; - Uint8 Aloss; - Uint8 Rshift; - Uint8 Gshift; - Uint8 Bshift; - Uint8 Ashift; -} RLEDestFormat; - -/* blit a pixel-alpha RLE surface clipped at the right and/or left edges */ -static void -RLEAlphaClipBlit(int w, Uint8 * srcbuf, SDL_Surface * surf_dst, - Uint8 * dstbuf, SDL_Rect * srcrect) -{ - SDL_PixelFormat *df = surf_dst->format; - /* - * clipped blitter: Ptype is the destination pixel type, - * Ctype the translucent count type, and do_blend the macro - * to blend one pixel. - */ -#define RLEALPHACLIPBLIT(Ptype, Ctype, do_blend) \ - do { \ - int linecount = srcrect->h; \ - int left = srcrect->x; \ - int right = left + srcrect->w; \ - dstbuf -= left * sizeof(Ptype); \ - do { \ - int ofs = 0; \ - /* blit opaque pixels on one line */ \ - do { \ - unsigned run; \ - ofs += ((Ctype *)srcbuf)[0]; \ - run = ((Ctype *)srcbuf)[1]; \ - srcbuf += 2 * sizeof(Ctype); \ - if(run) { \ - /* clip to left and right borders */ \ - int cofs = ofs; \ - int crun = run; \ - if(left - cofs > 0) { \ - crun -= left - cofs; \ - cofs = left; \ - } \ - if(crun > right - cofs) \ - crun = right - cofs; \ - if(crun > 0) \ - PIXEL_COPY(dstbuf + cofs * sizeof(Ptype), \ - srcbuf + (cofs - ofs) * sizeof(Ptype), \ - (unsigned)crun, sizeof(Ptype)); \ - srcbuf += run * sizeof(Ptype); \ - ofs += run; \ - } else if(!ofs) \ - return; \ - } while(ofs < w); \ - /* skip padding if necessary */ \ - if(sizeof(Ptype) == 2) \ - srcbuf += (uintptr_t)srcbuf & 2; \ - /* blit translucent pixels on the same line */ \ - ofs = 0; \ - do { \ - unsigned run; \ - ofs += ((Uint16 *)srcbuf)[0]; \ - run = ((Uint16 *)srcbuf)[1]; \ - srcbuf += 4; \ - if(run) { \ - /* clip to left and right borders */ \ - int cofs = ofs; \ - int crun = run; \ - if(left - cofs > 0) { \ - crun -= left - cofs; \ - cofs = left; \ - } \ - if(crun > right - cofs) \ - crun = right - cofs; \ - if(crun > 0) { \ - Ptype *dst = (Ptype *)dstbuf + cofs; \ - Uint32 *src = (Uint32 *)srcbuf + (cofs - ofs); \ - int i; \ - for(i = 0; i < crun; i++) \ - do_blend(src[i], dst[i]); \ - } \ - srcbuf += run * 4; \ - ofs += run; \ - } \ - } while(ofs < w); \ - dstbuf += surf_dst->pitch; \ - } while(--linecount); \ - } while(0) - - switch (df->BytesPerPixel) { - case 2: - if (df->Gmask == 0x07e0 || df->Rmask == 0x07e0 || df->Bmask == 0x07e0) - RLEALPHACLIPBLIT(Uint16, Uint8, BLIT_TRANSL_565); - else - RLEALPHACLIPBLIT(Uint16, Uint8, BLIT_TRANSL_555); - break; - case 4: - RLEALPHACLIPBLIT(Uint32, Uint16, BLIT_TRANSL_888); - break; - } -} - -/* blit a pixel-alpha RLE surface */ -int -SDL_RLEAlphaBlit(SDL_Surface * surf_src, SDL_Rect * srcrect, - SDL_Surface * surf_dst, SDL_Rect * dstrect) -{ - int x, y; - int w = surf_src->w; - Uint8 *srcbuf, *dstbuf; - SDL_PixelFormat *df = surf_dst->format; - - /* Lock the destination if necessary */ - if (SDL_MUSTLOCK(surf_dst)) { - if (SDL_LockSurface(surf_dst) < 0) { - return -1; - } - } - - x = dstrect->x; - y = dstrect->y; - dstbuf = (Uint8 *) surf_dst->pixels + y * surf_dst->pitch + x * df->BytesPerPixel; - srcbuf = (Uint8 *) surf_src->map->data + sizeof(RLEDestFormat); - - { - /* skip lines at the top if necessary */ - int vskip = srcrect->y; - if (vskip) { - int ofs; - if (df->BytesPerPixel == 2) { - /* the 16/32 interleaved format */ - do { - /* skip opaque line */ - ofs = 0; - do { - int run; - ofs += srcbuf[0]; - run = srcbuf[1]; - srcbuf += 2; - if (run) { - srcbuf += 2 * run; - ofs += run; - } else if (!ofs) - goto done; - } while (ofs < w); - - /* skip padding */ - srcbuf += (uintptr_t) srcbuf & 2; - - /* skip translucent line */ - ofs = 0; - do { - int run; - ofs += ((Uint16 *) srcbuf)[0]; - run = ((Uint16 *) srcbuf)[1]; - srcbuf += 4 * (run + 1); - ofs += run; - } while (ofs < w); - } while (--vskip); - } else { - /* the 32/32 interleaved format */ - vskip <<= 1; /* opaque and translucent have same format */ - do { - ofs = 0; - do { - int run; - ofs += ((Uint16 *) srcbuf)[0]; - run = ((Uint16 *) srcbuf)[1]; - srcbuf += 4; - if (run) { - srcbuf += 4 * run; - ofs += run; - } else if (!ofs) - goto done; - } while (ofs < w); - } while (--vskip); - } - } - } - - /* if left or right edge clipping needed, call clip blit */ - if (srcrect->x || srcrect->w != surf_src->w) { - RLEAlphaClipBlit(w, srcbuf, surf_dst, dstbuf, srcrect); - } else { - - /* - * non-clipped blitter. Ptype is the destination pixel type, - * Ctype the translucent count type, and do_blend the - * macro to blend one pixel. - */ -#define RLEALPHABLIT(Ptype, Ctype, do_blend) \ - do { \ - int linecount = srcrect->h; \ - do { \ - int ofs = 0; \ - /* blit opaque pixels on one line */ \ - do { \ - unsigned run; \ - ofs += ((Ctype *)srcbuf)[0]; \ - run = ((Ctype *)srcbuf)[1]; \ - srcbuf += 2 * sizeof(Ctype); \ - if(run) { \ - PIXEL_COPY(dstbuf + ofs * sizeof(Ptype), srcbuf, \ - run, sizeof(Ptype)); \ - srcbuf += run * sizeof(Ptype); \ - ofs += run; \ - } else if(!ofs) \ - goto done; \ - } while(ofs < w); \ - /* skip padding if necessary */ \ - if(sizeof(Ptype) == 2) \ - srcbuf += (uintptr_t)srcbuf & 2; \ - /* blit translucent pixels on the same line */ \ - ofs = 0; \ - do { \ - unsigned run; \ - ofs += ((Uint16 *)srcbuf)[0]; \ - run = ((Uint16 *)srcbuf)[1]; \ - srcbuf += 4; \ - if(run) { \ - Ptype *dst = (Ptype *)dstbuf + ofs; \ - unsigned i; \ - for(i = 0; i < run; i++) { \ - Uint32 src = *(Uint32 *)srcbuf; \ - do_blend(src, *dst); \ - srcbuf += 4; \ - dst++; \ - } \ - ofs += run; \ - } \ - } while(ofs < w); \ - dstbuf += surf_dst->pitch; \ - } while(--linecount); \ - } while(0) - - switch (df->BytesPerPixel) { - case 2: - if (df->Gmask == 0x07e0 || df->Rmask == 0x07e0 - || df->Bmask == 0x07e0) - RLEALPHABLIT(Uint16, Uint8, BLIT_TRANSL_565); - else - RLEALPHABLIT(Uint16, Uint8, BLIT_TRANSL_555); - break; - case 4: - RLEALPHABLIT(Uint32, Uint16, BLIT_TRANSL_888); - break; - } - } - - done: - /* Unlock the destination if necessary */ - if (SDL_MUSTLOCK(surf_dst)) { - SDL_UnlockSurface(surf_dst); - } - return 0; -} - -/* - * Auxiliary functions: - * The encoding functions take 32bpp rgb + a, and - * return the number of bytes copied to the destination. - * The decoding functions copy to 32bpp rgb + a, and - * return the number of bytes copied from the source. - * These are only used in the encoder and un-RLE code and are therefore not - * highly optimised. - */ - -/* encode 32bpp rgb + a into 16bpp rgb, losing alpha */ -static int -copy_opaque_16(void *dst, Uint32 * src, int n, - SDL_PixelFormat * sfmt, SDL_PixelFormat * dfmt) -{ - int i; - Uint16 *d = dst; - for (i = 0; i < n; i++) { - unsigned r, g, b; - RGB_FROM_PIXEL(*src, sfmt, r, g, b); - PIXEL_FROM_RGB(*d, dfmt, r, g, b); - src++; - d++; - } - return n * 2; -} - -/* decode opaque pixels from 16bpp to 32bpp rgb + a */ -static int -uncopy_opaque_16(Uint32 * dst, void *src, int n, - RLEDestFormat * sfmt, SDL_PixelFormat * dfmt) -{ - int i; - Uint16 *s = src; - unsigned alpha = dfmt->Amask ? 255 : 0; - for (i = 0; i < n; i++) { - unsigned r, g, b; - RGB_FROM_PIXEL(*s, sfmt, r, g, b); - PIXEL_FROM_RGBA(*dst, dfmt, r, g, b, alpha); - s++; - dst++; - } - return n * 2; -} - - - -/* encode 32bpp rgb + a into 32bpp G0RAB format for blitting into 565 */ -static int -copy_transl_565(void *dst, Uint32 * src, int n, - SDL_PixelFormat * sfmt, SDL_PixelFormat * dfmt) -{ - int i; - Uint32 *d = dst; - for (i = 0; i < n; i++) { - unsigned r, g, b, a; - Uint16 pix; - RGBA_FROM_8888(*src, sfmt, r, g, b, a); - PIXEL_FROM_RGB(pix, dfmt, r, g, b); - *d = ((pix & 0x7e0) << 16) | (pix & 0xf81f) | ((a << 2) & 0x7e0); - src++; - d++; - } - return n * 4; -} - -/* encode 32bpp rgb + a into 32bpp G0RAB format for blitting into 555 */ -static int -copy_transl_555(void *dst, Uint32 * src, int n, - SDL_PixelFormat * sfmt, SDL_PixelFormat * dfmt) -{ - int i; - Uint32 *d = dst; - for (i = 0; i < n; i++) { - unsigned r, g, b, a; - Uint16 pix; - RGBA_FROM_8888(*src, sfmt, r, g, b, a); - PIXEL_FROM_RGB(pix, dfmt, r, g, b); - *d = ((pix & 0x3e0) << 16) | (pix & 0xfc1f) | ((a << 2) & 0x3e0); - src++; - d++; - } - return n * 4; -} - -/* decode translucent pixels from 32bpp GORAB to 32bpp rgb + a */ -static int -uncopy_transl_16(Uint32 * dst, void *src, int n, - RLEDestFormat * sfmt, SDL_PixelFormat * dfmt) -{ - int i; - Uint32 *s = src; - for (i = 0; i < n; i++) { - unsigned r, g, b, a; - Uint32 pix = *s++; - a = (pix & 0x3e0) >> 2; - pix = (pix & ~0x3e0) | pix >> 16; - RGB_FROM_PIXEL(pix, sfmt, r, g, b); - PIXEL_FROM_RGBA(*dst, dfmt, r, g, b, a); - dst++; - } - return n * 4; -} - -/* encode 32bpp rgba into 32bpp rgba, keeping alpha (dual purpose) */ -static int -copy_32(void *dst, Uint32 * src, int n, - SDL_PixelFormat * sfmt, SDL_PixelFormat * dfmt) -{ - int i; - Uint32 *d = dst; - for (i = 0; i < n; i++) { - unsigned r, g, b, a; - RGBA_FROM_8888(*src, sfmt, r, g, b, a); - RLEPIXEL_FROM_RGBA(*d, dfmt, r, g, b, a); - d++; - src++; - } - return n * 4; -} - -/* decode 32bpp rgba into 32bpp rgba, keeping alpha (dual purpose) */ -static int -uncopy_32(Uint32 * dst, void *src, int n, - RLEDestFormat * sfmt, SDL_PixelFormat * dfmt) -{ - int i; - Uint32 *s = src; - for (i = 0; i < n; i++) { - unsigned r, g, b, a; - Uint32 pixel = *s++; - RGB_FROM_PIXEL(pixel, sfmt, r, g, b); - a = pixel >> 24; - PIXEL_FROM_RGBA(*dst, dfmt, r, g, b, a); - dst++; - } - return n * 4; -} - -#define ISOPAQUE(pixel, fmt) ((((pixel) & fmt->Amask) >> fmt->Ashift) == 255) - -#define ISTRANSL(pixel, fmt) \ - ((unsigned)((((pixel) & fmt->Amask) >> fmt->Ashift) - 1U) < 254U) - -/* convert surface to be quickly alpha-blittable onto dest, if possible */ -static int -RLEAlphaSurface(SDL_Surface * surface) -{ - SDL_Surface *dest; - SDL_PixelFormat *df; - int maxsize = 0; - int max_opaque_run; - int max_transl_run = 65535; - unsigned masksum; - Uint8 *rlebuf, *dst; - int (*copy_opaque) (void *, Uint32 *, int, - SDL_PixelFormat *, SDL_PixelFormat *); - int (*copy_transl) (void *, Uint32 *, int, - SDL_PixelFormat *, SDL_PixelFormat *); - - dest = surface->map->dst; - if (!dest) - return -1; - df = dest->format; - if (surface->format->BitsPerPixel != 32) - return -1; /* only 32bpp source supported */ - - /* find out whether the destination is one we support, - and determine the max size of the encoded result */ - masksum = df->Rmask | df->Gmask | df->Bmask; - switch (df->BytesPerPixel) { - case 2: - /* 16bpp: only support 565 and 555 formats */ - switch (masksum) { - case 0xffff: - if (df->Gmask == 0x07e0 - || df->Rmask == 0x07e0 || df->Bmask == 0x07e0) { - copy_opaque = copy_opaque_16; - copy_transl = copy_transl_565; - } else - return -1; - break; - case 0x7fff: - if (df->Gmask == 0x03e0 - || df->Rmask == 0x03e0 || df->Bmask == 0x03e0) { - copy_opaque = copy_opaque_16; - copy_transl = copy_transl_555; - } else - return -1; - break; - default: - return -1; - } - max_opaque_run = 255; /* runs stored as bytes */ - - /* worst case is alternating opaque and translucent pixels, - with room for alignment padding between lines */ - maxsize = surface->h * (2 + (4 + 2) * (surface->w + 1)) + 2; - break; - case 4: - if (masksum != 0x00ffffff) - return -1; /* requires unused high byte */ - copy_opaque = copy_32; - copy_transl = copy_32; - max_opaque_run = 255; /* runs stored as short ints */ - - /* worst case is alternating opaque and translucent pixels */ - maxsize = surface->h * 2 * 4 * (surface->w + 1) + 4; - break; - default: - return -1; /* anything else unsupported right now */ - } - - maxsize += sizeof(RLEDestFormat); - rlebuf = (Uint8 *) SDL_malloc(maxsize); - if (!rlebuf) { - return SDL_OutOfMemory(); - } - { - /* save the destination format so we can undo the encoding later */ - RLEDestFormat *r = (RLEDestFormat *) rlebuf; - r->BytesPerPixel = df->BytesPerPixel; - r->Rmask = df->Rmask; - r->Gmask = df->Gmask; - r->Bmask = df->Bmask; - r->Amask = df->Amask; - r->Rloss = df->Rloss; - r->Gloss = df->Gloss; - r->Bloss = df->Bloss; - r->Aloss = df->Aloss; - r->Rshift = df->Rshift; - r->Gshift = df->Gshift; - r->Bshift = df->Bshift; - r->Ashift = df->Ashift; - } - dst = rlebuf + sizeof(RLEDestFormat); - - /* Do the actual encoding */ - { - int x, y; - int h = surface->h, w = surface->w; - SDL_PixelFormat *sf = surface->format; - Uint32 *src = (Uint32 *) surface->pixels; - Uint8 *lastline = dst; /* end of last non-blank line */ - - /* opaque counts are 8 or 16 bits, depending on target depth */ -#define ADD_OPAQUE_COUNTS(n, m) \ - if(df->BytesPerPixel == 4) { \ - ((Uint16 *)dst)[0] = n; \ - ((Uint16 *)dst)[1] = m; \ - dst += 4; \ - } else { \ - dst[0] = n; \ - dst[1] = m; \ - dst += 2; \ - } - - /* translucent counts are always 16 bit */ -#define ADD_TRANSL_COUNTS(n, m) \ - (((Uint16 *)dst)[0] = n, ((Uint16 *)dst)[1] = m, dst += 4) - - for (y = 0; y < h; y++) { - int runstart, skipstart; - int blankline = 0; - /* First encode all opaque pixels of a scan line */ - x = 0; - do { - int run, skip, len; - skipstart = x; - while (x < w && !ISOPAQUE(src[x], sf)) - x++; - runstart = x; - while (x < w && ISOPAQUE(src[x], sf)) - x++; - skip = runstart - skipstart; - if (skip == w) - blankline = 1; - run = x - runstart; - while (skip > max_opaque_run) { - ADD_OPAQUE_COUNTS(max_opaque_run, 0); - skip -= max_opaque_run; - } - len = MIN(run, max_opaque_run); - ADD_OPAQUE_COUNTS(skip, len); - dst += copy_opaque(dst, src + runstart, len, sf, df); - runstart += len; - run -= len; - while (run) { - len = MIN(run, max_opaque_run); - ADD_OPAQUE_COUNTS(0, len); - dst += copy_opaque(dst, src + runstart, len, sf, df); - runstart += len; - run -= len; - } - } while (x < w); - - /* Make sure the next output address is 32-bit aligned */ - dst += (uintptr_t) dst & 2; - - /* Next, encode all translucent pixels of the same scan line */ - x = 0; - do { - int run, skip, len; - skipstart = x; - while (x < w && !ISTRANSL(src[x], sf)) - x++; - runstart = x; - while (x < w && ISTRANSL(src[x], sf)) - x++; - skip = runstart - skipstart; - blankline &= (skip == w); - run = x - runstart; - while (skip > max_transl_run) { - ADD_TRANSL_COUNTS(max_transl_run, 0); - skip -= max_transl_run; - } - len = MIN(run, max_transl_run); - ADD_TRANSL_COUNTS(skip, len); - dst += copy_transl(dst, src + runstart, len, sf, df); - runstart += len; - run -= len; - while (run) { - len = MIN(run, max_transl_run); - ADD_TRANSL_COUNTS(0, len); - dst += copy_transl(dst, src + runstart, len, sf, df); - runstart += len; - run -= len; - } - if (!blankline) - lastline = dst; - } while (x < w); - - src += surface->pitch >> 2; - } - dst = lastline; /* back up past trailing blank lines */ - ADD_OPAQUE_COUNTS(0, 0); - } - -#undef ADD_OPAQUE_COUNTS -#undef ADD_TRANSL_COUNTS - - /* Now that we have it encoded, release the original pixels */ - if (!(surface->flags & SDL_PREALLOC)) { - SDL_free(surface->pixels); - surface->pixels = NULL; - } - - /* realloc the buffer to release unused memory */ - { - Uint8 *p = SDL_realloc(rlebuf, dst - rlebuf); - if (!p) - p = rlebuf; - surface->map->data = p; - } - - return 0; -} - -static Uint32 -getpix_8(Uint8 * srcbuf) -{ - return *srcbuf; -} - -static Uint32 -getpix_16(Uint8 * srcbuf) -{ - return *(Uint16 *) srcbuf; -} - -static Uint32 -getpix_24(Uint8 * srcbuf) -{ -#if SDL_BYTEORDER == SDL_LIL_ENDIAN - return srcbuf[0] + (srcbuf[1] << 8) + (srcbuf[2] << 16); -#else - return (srcbuf[0] << 16) + (srcbuf[1] << 8) + srcbuf[2]; -#endif -} - -static Uint32 -getpix_32(Uint8 * srcbuf) -{ - return *(Uint32 *) srcbuf; -} - -typedef Uint32(*getpix_func) (Uint8 *); - -static const getpix_func getpixes[4] = { - getpix_8, getpix_16, getpix_24, getpix_32 -}; - -static int -RLEColorkeySurface(SDL_Surface * surface) -{ - Uint8 *rlebuf, *dst; - int maxn; - int y; - Uint8 *srcbuf, *lastline; - int maxsize = 0; - int bpp = surface->format->BytesPerPixel; - getpix_func getpix; - Uint32 ckey, rgbmask; - int w, h; - - /* calculate the worst case size for the compressed surface */ - switch (bpp) { - case 1: - /* worst case is alternating opaque and transparent pixels, - starting with an opaque pixel */ - maxsize = surface->h * 3 * (surface->w / 2 + 1) + 2; - break; - case 2: - case 3: - /* worst case is solid runs, at most 255 pixels wide */ - maxsize = surface->h * (2 * (surface->w / 255 + 1) - + surface->w * bpp) + 2; - break; - case 4: - /* worst case is solid runs, at most 65535 pixels wide */ - maxsize = surface->h * (4 * (surface->w / 65535 + 1) - + surface->w * 4) + 4; - break; - } - - rlebuf = (Uint8 *) SDL_malloc(maxsize); - if (rlebuf == NULL) { - return SDL_OutOfMemory(); - } - - /* Set up the conversion */ - srcbuf = (Uint8 *) surface->pixels; - maxn = bpp == 4 ? 65535 : 255; - dst = rlebuf; - rgbmask = ~surface->format->Amask; - ckey = surface->map->info.colorkey & rgbmask; - lastline = dst; - getpix = getpixes[bpp - 1]; - w = surface->w; - h = surface->h; - -#define ADD_COUNTS(n, m) \ - if(bpp == 4) { \ - ((Uint16 *)dst)[0] = n; \ - ((Uint16 *)dst)[1] = m; \ - dst += 4; \ - } else { \ - dst[0] = n; \ - dst[1] = m; \ - dst += 2; \ - } - - for (y = 0; y < h; y++) { - int x = 0; - int blankline = 0; - do { - int run, skip, len; - int runstart; - int skipstart = x; - - /* find run of transparent, then opaque pixels */ - while (x < w && (getpix(srcbuf + x * bpp) & rgbmask) == ckey) - x++; - runstart = x; - while (x < w && (getpix(srcbuf + x * bpp) & rgbmask) != ckey) - x++; - skip = runstart - skipstart; - if (skip == w) - blankline = 1; - run = x - runstart; - - /* encode segment */ - while (skip > maxn) { - ADD_COUNTS(maxn, 0); - skip -= maxn; - } - len = MIN(run, maxn); - ADD_COUNTS(skip, len); - SDL_memcpy(dst, srcbuf + runstart * bpp, len * bpp); - dst += len * bpp; - run -= len; - runstart += len; - while (run) { - len = MIN(run, maxn); - ADD_COUNTS(0, len); - SDL_memcpy(dst, srcbuf + runstart * bpp, len * bpp); - dst += len * bpp; - runstart += len; - run -= len; - } - if (!blankline) - lastline = dst; - } while (x < w); - - srcbuf += surface->pitch; - } - dst = lastline; /* back up bast trailing blank lines */ - ADD_COUNTS(0, 0); - -#undef ADD_COUNTS - - /* Now that we have it encoded, release the original pixels */ - if (!(surface->flags & SDL_PREALLOC)) { - SDL_free(surface->pixels); - surface->pixels = NULL; - } - - /* realloc the buffer to release unused memory */ - { - /* If realloc returns NULL, the original block is left intact */ - Uint8 *p = SDL_realloc(rlebuf, dst - rlebuf); - if (!p) - p = rlebuf; - surface->map->data = p; - } - - return (0); -} - -int -SDL_RLESurface(SDL_Surface * surface) -{ - int flags; - - /* Clear any previous RLE conversion */ - if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) { - SDL_UnRLESurface(surface, 1); - } - - /* We don't support RLE encoding of bitmaps */ - if (surface->format->BitsPerPixel < 8) { - return -1; - } - - /* Make sure the pixels are available */ - if (!surface->pixels) { - return -1; - } - - /* If we don't have colorkey or blending, nothing to do... */ - flags = surface->map->info.flags; - if (!(flags & (SDL_COPY_COLORKEY | SDL_COPY_BLEND))) { - return -1; - } - - /* Pass on combinations not supported */ - if ((flags & SDL_COPY_MODULATE_COLOR) || - ((flags & SDL_COPY_MODULATE_ALPHA) && surface->format->Amask) || - (flags & (SDL_COPY_ADD | SDL_COPY_MOD)) || - (flags & SDL_COPY_NEAREST)) { - return -1; - } - - /* Encode and set up the blit */ - if (!surface->format->Amask || !(flags & SDL_COPY_BLEND)) { - if (!surface->map->identity) { - return -1; - } - if (RLEColorkeySurface(surface) < 0) { - return -1; - } - surface->map->blit = SDL_RLEBlit; - surface->map->info.flags |= SDL_COPY_RLE_COLORKEY; - } else { - if (RLEAlphaSurface(surface) < 0) { - return -1; - } - surface->map->blit = SDL_RLEAlphaBlit; - surface->map->info.flags |= SDL_COPY_RLE_ALPHAKEY; - } - - /* The surface is now accelerated */ - surface->flags |= SDL_RLEACCEL; - - return (0); -} - -/* - * Un-RLE a surface with pixel alpha - * This may not give back exactly the image before RLE-encoding; all - * completely transparent pixels will be lost, and color and alpha depth - * may have been reduced (when encoding for 16bpp targets). - */ -static SDL_bool -UnRLEAlpha(SDL_Surface * surface) -{ - Uint8 *srcbuf; - Uint32 *dst; - SDL_PixelFormat *sf = surface->format; - RLEDestFormat *df = surface->map->data; - int (*uncopy_opaque) (Uint32 *, void *, int, - RLEDestFormat *, SDL_PixelFormat *); - int (*uncopy_transl) (Uint32 *, void *, int, - RLEDestFormat *, SDL_PixelFormat *); - int w = surface->w; - int bpp = df->BytesPerPixel; - - if (bpp == 2) { - uncopy_opaque = uncopy_opaque_16; - uncopy_transl = uncopy_transl_16; - } else { - uncopy_opaque = uncopy_transl = uncopy_32; - } - - surface->pixels = SDL_malloc(surface->h * surface->pitch); - if (!surface->pixels) { - return (SDL_FALSE); - } - /* fill background with transparent pixels */ - SDL_memset(surface->pixels, 0, surface->h * surface->pitch); - - dst = surface->pixels; - srcbuf = (Uint8 *) (df + 1); - for (;;) { - /* copy opaque pixels */ - int ofs = 0; - do { - unsigned run; - if (bpp == 2) { - ofs += srcbuf[0]; - run = srcbuf[1]; - srcbuf += 2; - } else { - ofs += ((Uint16 *) srcbuf)[0]; - run = ((Uint16 *) srcbuf)[1]; - srcbuf += 4; - } - if (run) { - srcbuf += uncopy_opaque(dst + ofs, srcbuf, run, df, sf); - ofs += run; - } else if (!ofs) - return (SDL_TRUE); - } while (ofs < w); - - /* skip padding if needed */ - if (bpp == 2) - srcbuf += (uintptr_t) srcbuf & 2; - - /* copy translucent pixels */ - ofs = 0; - do { - unsigned run; - ofs += ((Uint16 *) srcbuf)[0]; - run = ((Uint16 *) srcbuf)[1]; - srcbuf += 4; - if (run) { - srcbuf += uncopy_transl(dst + ofs, srcbuf, run, df, sf); - ofs += run; - } - } while (ofs < w); - dst += surface->pitch >> 2; - } - /* Make the compiler happy */ - return (SDL_TRUE); -} - -void -SDL_UnRLESurface(SDL_Surface * surface, int recode) -{ - if (surface->flags & SDL_RLEACCEL) { - surface->flags &= ~SDL_RLEACCEL; - - if (recode && !(surface->flags & SDL_PREALLOC)) { - if (surface->map->info.flags & SDL_COPY_RLE_COLORKEY) { - SDL_Rect full; - - /* re-create the original surface */ - surface->pixels = SDL_malloc(surface->h * surface->pitch); - if (!surface->pixels) { - /* Oh crap... */ - surface->flags |= SDL_RLEACCEL; - return; - } - - /* fill it with the background color */ - SDL_FillRect(surface, NULL, surface->map->info.colorkey); - - /* now render the encoded surface */ - full.x = full.y = 0; - full.w = surface->w; - full.h = surface->h; - SDL_RLEBlit(surface, &full, surface, &full); - } else { - if (!UnRLEAlpha(surface)) { - /* Oh crap... */ - surface->flags |= SDL_RLEACCEL; - return; - } - } - } - surface->map->info.flags &= - ~(SDL_COPY_RLE_COLORKEY | SDL_COPY_RLE_ALPHAKEY); - - SDL_free(surface->map->data); - surface->map->data = NULL; - } -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_RLEaccel_c.h b/3rdparty/SDL2/src/video/SDL_RLEaccel_c.h deleted file mode 100644 index c04fc1527f6..00000000000 --- a/3rdparty/SDL2/src/video/SDL_RLEaccel_c.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* Useful functions and variables from SDL_RLEaccel.c */ - -extern int SDL_RLESurface(SDL_Surface * surface); -extern int SDL_RLEBlit(SDL_Surface * src, SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect); -extern int SDL_RLEAlphaBlit(SDL_Surface * src, SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect); -extern void SDL_UnRLESurface(SDL_Surface * surface, int recode); -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit.c b/3rdparty/SDL2/src/video/SDL_blit.c deleted file mode 100644 index 90aa8789843..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit.c +++ /dev/null @@ -1,286 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_video.h" -#include "SDL_sysvideo.h" -#include "SDL_blit.h" -#include "SDL_blit_auto.h" -#include "SDL_blit_copy.h" -#include "SDL_blit_slow.h" -#include "SDL_RLEaccel_c.h" -#include "SDL_pixels_c.h" - -/* The general purpose software blit routine */ -static int -SDL_SoftBlit(SDL_Surface * src, SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect) -{ - int okay; - int src_locked; - int dst_locked; - - /* Everything is okay at the beginning... */ - okay = 1; - - /* Lock the destination if it's in hardware */ - dst_locked = 0; - if (SDL_MUSTLOCK(dst)) { - if (SDL_LockSurface(dst) < 0) { - okay = 0; - } else { - dst_locked = 1; - } - } - /* Lock the source if it's in hardware */ - src_locked = 0; - if (SDL_MUSTLOCK(src)) { - if (SDL_LockSurface(src) < 0) { - okay = 0; - } else { - src_locked = 1; - } - } - - /* Set up source and destination buffer pointers, and BLIT! */ - if (okay && !SDL_RectEmpty(srcrect)) { - SDL_BlitFunc RunBlit; - SDL_BlitInfo *info = &src->map->info; - - /* Set up the blit information */ - info->src = (Uint8 *) src->pixels + - (Uint16) srcrect->y * src->pitch + - (Uint16) srcrect->x * info->src_fmt->BytesPerPixel; - info->src_w = srcrect->w; - info->src_h = srcrect->h; - info->src_pitch = src->pitch; - info->src_skip = - info->src_pitch - info->src_w * info->src_fmt->BytesPerPixel; - info->dst = - (Uint8 *) dst->pixels + (Uint16) dstrect->y * dst->pitch + - (Uint16) dstrect->x * info->dst_fmt->BytesPerPixel; - info->dst_w = dstrect->w; - info->dst_h = dstrect->h; - info->dst_pitch = dst->pitch; - info->dst_skip = - info->dst_pitch - info->dst_w * info->dst_fmt->BytesPerPixel; - RunBlit = (SDL_BlitFunc) src->map->data; - - /* Run the actual software blit */ - RunBlit(info); - } - - /* We need to unlock the surfaces if they're locked */ - if (dst_locked) { - SDL_UnlockSurface(dst); - } - if (src_locked) { - SDL_UnlockSurface(src); - } - /* Blit is done! */ - return (okay ? 0 : -1); -} - -#ifdef __MACOSX__ -#include <sys/sysctl.h> - -static SDL_bool -SDL_UseAltivecPrefetch() -{ - const char key[] = "hw.l3cachesize"; - u_int64_t result = 0; - size_t typeSize = sizeof(result); - - if (sysctlbyname(key, &result, &typeSize, NULL, 0) == 0 && result > 0) { - return SDL_TRUE; - } else { - return SDL_FALSE; - } -} -#else -static SDL_bool -SDL_UseAltivecPrefetch() -{ - /* Just guess G4 */ - return SDL_TRUE; -} -#endif /* __MACOSX__ */ - -static SDL_BlitFunc -SDL_ChooseBlitFunc(Uint32 src_format, Uint32 dst_format, int flags, - SDL_BlitFuncEntry * entries) -{ - int i, flagcheck; - static Uint32 features = 0xffffffff; - - /* Get the available CPU features */ - if (features == 0xffffffff) { - const char *override = SDL_getenv("SDL_BLIT_CPU_FEATURES"); - - features = SDL_CPU_ANY; - - /* Allow an override for testing .. */ - if (override) { - SDL_sscanf(override, "%u", &features); - } else { - if (SDL_HasMMX()) { - features |= SDL_CPU_MMX; - } - if (SDL_Has3DNow()) { - features |= SDL_CPU_3DNOW; - } - if (SDL_HasSSE()) { - features |= SDL_CPU_SSE; - } - if (SDL_HasSSE2()) { - features |= SDL_CPU_SSE2; - } - if (SDL_HasAltiVec()) { - if (SDL_UseAltivecPrefetch()) { - features |= SDL_CPU_ALTIVEC_PREFETCH; - } else { - features |= SDL_CPU_ALTIVEC_NOPREFETCH; - } - } - } - } - - for (i = 0; entries[i].func; ++i) { - /* Check for matching pixel formats */ - if (src_format != entries[i].src_format) { - continue; - } - if (dst_format != entries[i].dst_format) { - continue; - } - - /* Check modulation flags */ - flagcheck = - (flags & (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA)); - if ((flagcheck & entries[i].flags) != flagcheck) { - continue; - } - - /* Check blend flags */ - flagcheck = - (flags & - (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD)); - if ((flagcheck & entries[i].flags) != flagcheck) { - continue; - } - - /* Check colorkey flag */ - flagcheck = (flags & SDL_COPY_COLORKEY); - if ((flagcheck & entries[i].flags) != flagcheck) { - continue; - } - - /* Check scaling flags */ - flagcheck = (flags & SDL_COPY_NEAREST); - if ((flagcheck & entries[i].flags) != flagcheck) { - continue; - } - - /* Check CPU features */ - flagcheck = entries[i].cpu; - if ((flagcheck & features) != flagcheck) { - continue; - } - - /* We found the best one! */ - return entries[i].func; - } - return NULL; -} - -/* Figure out which of many blit routines to set up on a surface */ -int -SDL_CalculateBlit(SDL_Surface * surface) -{ - SDL_BlitFunc blit = NULL; - SDL_BlitMap *map = surface->map; - SDL_Surface *dst = map->dst; - - /* Clean everything out to start */ - if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) { - SDL_UnRLESurface(surface, 1); - } - map->blit = SDL_SoftBlit; - map->info.src_fmt = surface->format; - map->info.src_pitch = surface->pitch; - map->info.dst_fmt = dst->format; - map->info.dst_pitch = dst->pitch; - - /* See if we can do RLE acceleration */ - if (map->info.flags & SDL_COPY_RLE_DESIRED) { - if (SDL_RLESurface(surface) == 0) { - return 0; - } - } - - /* Choose a standard blit function */ - if (map->identity && !(map->info.flags & ~SDL_COPY_RLE_DESIRED)) { - blit = SDL_BlitCopy; - } else if (surface->format->BitsPerPixel < 8 && - SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) { - blit = SDL_CalculateBlit0(surface); - } else if (surface->format->BytesPerPixel == 1 && - SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) { - blit = SDL_CalculateBlit1(surface); - } else if (map->info.flags & SDL_COPY_BLEND) { - blit = SDL_CalculateBlitA(surface); - } else { - blit = SDL_CalculateBlitN(surface); - } - if (blit == NULL) { - Uint32 src_format = surface->format->format; - Uint32 dst_format = dst->format->format; - - blit = - SDL_ChooseBlitFunc(src_format, dst_format, map->info.flags, - SDL_GeneratedBlitFuncTable); - } -#ifndef TEST_SLOW_BLIT - if (blit == NULL) -#endif - { - Uint32 src_format = surface->format->format; - Uint32 dst_format = dst->format->format; - - if (!SDL_ISPIXELFORMAT_INDEXED(src_format) && - !SDL_ISPIXELFORMAT_FOURCC(src_format) && - !SDL_ISPIXELFORMAT_INDEXED(dst_format) && - !SDL_ISPIXELFORMAT_FOURCC(dst_format)) { - blit = SDL_Blit_Slow; - } - } - map->data = blit; - - /* Make sure we have a blit function */ - if (blit == NULL) { - SDL_InvalidateMap(map); - return SDL_SetError("Blit combination not supported"); - } - - return 0; -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit.h b/3rdparty/SDL2/src/video/SDL_blit.h deleted file mode 100644 index e30f8afecb3..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit.h +++ /dev/null @@ -1,552 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#ifndef _SDL_blit_h -#define _SDL_blit_h - -#include "SDL_cpuinfo.h" -#include "SDL_endian.h" -#include "SDL_surface.h" - -/* Table to do pixel byte expansion */ -extern Uint8* SDL_expand_byte[9]; - -/* SDL blit copy flags */ -#define SDL_COPY_MODULATE_COLOR 0x00000001 -#define SDL_COPY_MODULATE_ALPHA 0x00000002 -#define SDL_COPY_BLEND 0x00000010 -#define SDL_COPY_ADD 0x00000020 -#define SDL_COPY_MOD 0x00000040 -#define SDL_COPY_COLORKEY 0x00000100 -#define SDL_COPY_NEAREST 0x00000200 -#define SDL_COPY_RLE_DESIRED 0x00001000 -#define SDL_COPY_RLE_COLORKEY 0x00002000 -#define SDL_COPY_RLE_ALPHAKEY 0x00004000 -#define SDL_COPY_RLE_MASK (SDL_COPY_RLE_DESIRED|SDL_COPY_RLE_COLORKEY|SDL_COPY_RLE_ALPHAKEY) - -/* SDL blit CPU flags */ -#define SDL_CPU_ANY 0x00000000 -#define SDL_CPU_MMX 0x00000001 -#define SDL_CPU_3DNOW 0x00000002 -#define SDL_CPU_SSE 0x00000004 -#define SDL_CPU_SSE2 0x00000008 -#define SDL_CPU_ALTIVEC_PREFETCH 0x00000010 -#define SDL_CPU_ALTIVEC_NOPREFETCH 0x00000020 - -typedef struct -{ - Uint8 *src; - int src_w, src_h; - int src_pitch; - int src_skip; - Uint8 *dst; - int dst_w, dst_h; - int dst_pitch; - int dst_skip; - SDL_PixelFormat *src_fmt; - SDL_PixelFormat *dst_fmt; - Uint8 *table; - int flags; - Uint32 colorkey; - Uint8 r, g, b, a; -} SDL_BlitInfo; - -typedef void (SDLCALL * SDL_BlitFunc) (SDL_BlitInfo * info); - -typedef struct -{ - Uint32 src_format; - Uint32 dst_format; - int flags; - int cpu; - SDL_BlitFunc func; -} SDL_BlitFuncEntry; - -/* Blit mapping definition */ -typedef struct SDL_BlitMap -{ - SDL_Surface *dst; - int identity; - SDL_blit blit; - void *data; - SDL_BlitInfo info; - - /* the version count matches the destination; mismatch indicates - an invalid mapping */ - Uint32 dst_palette_version; - Uint32 src_palette_version; -} SDL_BlitMap; - -/* Functions found in SDL_blit.c */ -extern int SDL_CalculateBlit(SDL_Surface * surface); - -/* Functions found in SDL_blit_*.c */ -extern SDL_BlitFunc SDL_CalculateBlit0(SDL_Surface * surface); -extern SDL_BlitFunc SDL_CalculateBlit1(SDL_Surface * surface); -extern SDL_BlitFunc SDL_CalculateBlitN(SDL_Surface * surface); -extern SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface * surface); - -/* - * Useful macros for blitting routines - */ - -#if defined(__GNUC__) -#define DECLARE_ALIGNED(t,v,a) t __attribute__((aligned(a))) v -#elif defined(_MSC_VER) -#define DECLARE_ALIGNED(t,v,a) __declspec(align(a)) t v -#else -#define DECLARE_ALIGNED(t,v,a) t v -#endif - -/* Load pixel of the specified format from a buffer and get its R-G-B values */ -#define RGB_FROM_PIXEL(Pixel, fmt, r, g, b) \ -{ \ - r = SDL_expand_byte[fmt->Rloss][((Pixel&fmt->Rmask)>>fmt->Rshift)]; \ - g = SDL_expand_byte[fmt->Gloss][((Pixel&fmt->Gmask)>>fmt->Gshift)]; \ - b = SDL_expand_byte[fmt->Bloss][((Pixel&fmt->Bmask)>>fmt->Bshift)]; \ -} -#define RGB_FROM_RGB565(Pixel, r, g, b) \ - { \ - r = SDL_expand_byte[3][((Pixel&0xF800)>>11)]; \ - g = SDL_expand_byte[2][((Pixel&0x07E0)>>5)]; \ - b = SDL_expand_byte[3][(Pixel&0x001F)]; \ -} -#define RGB_FROM_RGB555(Pixel, r, g, b) \ -{ \ - r = SDL_expand_byte[3][((Pixel&0x7C00)>>10)]; \ - g = SDL_expand_byte[3][((Pixel&0x03E0)>>5)]; \ - b = SDL_expand_byte[3][(Pixel&0x001F)]; \ -} -#define RGB_FROM_RGB888(Pixel, r, g, b) \ -{ \ - r = ((Pixel&0xFF0000)>>16); \ - g = ((Pixel&0xFF00)>>8); \ - b = (Pixel&0xFF); \ -} -#define RETRIEVE_RGB_PIXEL(buf, bpp, Pixel) \ -do { \ - switch (bpp) { \ - case 1: \ - Pixel = *((Uint8 *)(buf)); \ - break; \ - \ - case 2: \ - Pixel = *((Uint16 *)(buf)); \ - break; \ - \ - case 3: { \ - Uint8 *B = (Uint8 *)(buf); \ - if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ - Pixel = B[0] + (B[1] << 8) + (B[2] << 16); \ - } else { \ - Pixel = (B[0] << 16) + (B[1] << 8) + B[2]; \ - } \ - } \ - break; \ - \ - case 4: \ - Pixel = *((Uint32 *)(buf)); \ - break; \ - \ - default: \ - Pixel = 0; /* stop gcc complaints */ \ - break; \ - } \ -} while (0) - -#define DISEMBLE_RGB(buf, bpp, fmt, Pixel, r, g, b) \ -do { \ - switch (bpp) { \ - case 1: \ - Pixel = *((Uint8 *)(buf)); \ - RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \ - break; \ - \ - case 2: \ - Pixel = *((Uint16 *)(buf)); \ - RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \ - break; \ - \ - case 3: { \ - Pixel = 0; \ - if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ - r = *((buf)+fmt->Rshift/8); \ - g = *((buf)+fmt->Gshift/8); \ - b = *((buf)+fmt->Bshift/8); \ - } else { \ - r = *((buf)+2-fmt->Rshift/8); \ - g = *((buf)+2-fmt->Gshift/8); \ - b = *((buf)+2-fmt->Bshift/8); \ - } \ - } \ - break; \ - \ - case 4: \ - Pixel = *((Uint32 *)(buf)); \ - RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \ - break; \ - \ - default: \ - /* stop gcc complaints */ \ - Pixel = 0; \ - r = g = b = 0; \ - break; \ - } \ -} while (0) - -/* Assemble R-G-B values into a specified pixel format and store them */ -#define PIXEL_FROM_RGB(Pixel, fmt, r, g, b) \ -{ \ - Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \ - ((g>>fmt->Gloss)<<fmt->Gshift)| \ - ((b>>fmt->Bloss)<<fmt->Bshift)| \ - fmt->Amask; \ -} -#define RGB565_FROM_RGB(Pixel, r, g, b) \ -{ \ - Pixel = ((r>>3)<<11)|((g>>2)<<5)|(b>>3); \ -} -#define RGB555_FROM_RGB(Pixel, r, g, b) \ -{ \ - Pixel = ((r>>3)<<10)|((g>>3)<<5)|(b>>3); \ -} -#define RGB888_FROM_RGB(Pixel, r, g, b) \ -{ \ - Pixel = (r<<16)|(g<<8)|b; \ -} -#define ARGB8888_FROM_RGBA(Pixel, r, g, b, a) \ -{ \ - Pixel = (a<<24)|(r<<16)|(g<<8)|b; \ -} -#define RGBA8888_FROM_RGBA(Pixel, r, g, b, a) \ -{ \ - Pixel = (r<<24)|(g<<16)|(b<<8)|a; \ -} -#define ABGR8888_FROM_RGBA(Pixel, r, g, b, a) \ -{ \ - Pixel = (a<<24)|(b<<16)|(g<<8)|r; \ -} -#define BGRA8888_FROM_RGBA(Pixel, r, g, b, a) \ -{ \ - Pixel = (b<<24)|(g<<16)|(r<<8)|a; \ -} -#define ARGB2101010_FROM_RGBA(Pixel, r, g, b, a) \ -{ \ - r = r ? ((r << 2) | 0x3) : 0; \ - g = g ? ((g << 2) | 0x3) : 0; \ - b = b ? ((b << 2) | 0x3) : 0; \ - a = (a * 3) / 255; \ - Pixel = (a<<30)|(r<<20)|(g<<10)|b; \ -} -#define ASSEMBLE_RGB(buf, bpp, fmt, r, g, b) \ -{ \ - switch (bpp) { \ - case 1: { \ - Uint8 Pixel; \ - \ - PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \ - *((Uint8 *)(buf)) = Pixel; \ - } \ - break; \ - \ - case 2: { \ - Uint16 Pixel; \ - \ - PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \ - *((Uint16 *)(buf)) = Pixel; \ - } \ - break; \ - \ - case 3: { \ - if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ - *((buf)+fmt->Rshift/8) = r; \ - *((buf)+fmt->Gshift/8) = g; \ - *((buf)+fmt->Bshift/8) = b; \ - } else { \ - *((buf)+2-fmt->Rshift/8) = r; \ - *((buf)+2-fmt->Gshift/8) = g; \ - *((buf)+2-fmt->Bshift/8) = b; \ - } \ - } \ - break; \ - \ - case 4: { \ - Uint32 Pixel; \ - \ - PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \ - *((Uint32 *)(buf)) = Pixel; \ - } \ - break; \ - } \ -} - -/* FIXME: Should we rescale alpha into 0..255 here? */ -#define RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a) \ -{ \ - r = SDL_expand_byte[fmt->Rloss][((Pixel&fmt->Rmask)>>fmt->Rshift)]; \ - g = SDL_expand_byte[fmt->Gloss][((Pixel&fmt->Gmask)>>fmt->Gshift)]; \ - b = SDL_expand_byte[fmt->Bloss][((Pixel&fmt->Bmask)>>fmt->Bshift)]; \ - a = SDL_expand_byte[fmt->Aloss][((Pixel&fmt->Amask)>>fmt->Ashift)]; \ -} -#define RGBA_FROM_8888(Pixel, fmt, r, g, b, a) \ -{ \ - r = (Pixel&fmt->Rmask)>>fmt->Rshift; \ - g = (Pixel&fmt->Gmask)>>fmt->Gshift; \ - b = (Pixel&fmt->Bmask)>>fmt->Bshift; \ - a = (Pixel&fmt->Amask)>>fmt->Ashift; \ -} -#define RGBA_FROM_RGBA8888(Pixel, r, g, b, a) \ -{ \ - r = (Pixel>>24); \ - g = ((Pixel>>16)&0xFF); \ - b = ((Pixel>>8)&0xFF); \ - a = (Pixel&0xFF); \ -} -#define RGBA_FROM_ARGB8888(Pixel, r, g, b, a) \ -{ \ - r = ((Pixel>>16)&0xFF); \ - g = ((Pixel>>8)&0xFF); \ - b = (Pixel&0xFF); \ - a = (Pixel>>24); \ -} -#define RGBA_FROM_ABGR8888(Pixel, r, g, b, a) \ -{ \ - r = (Pixel&0xFF); \ - g = ((Pixel>>8)&0xFF); \ - b = ((Pixel>>16)&0xFF); \ - a = (Pixel>>24); \ -} -#define RGBA_FROM_BGRA8888(Pixel, r, g, b, a) \ -{ \ - r = ((Pixel>>8)&0xFF); \ - g = ((Pixel>>16)&0xFF); \ - b = (Pixel>>24); \ - a = (Pixel&0xFF); \ -} -#define RGBA_FROM_ARGB2101010(Pixel, r, g, b, a) \ -{ \ - r = ((Pixel>>22)&0xFF); \ - g = ((Pixel>>12)&0xFF); \ - b = ((Pixel>>2)&0xFF); \ - a = SDL_expand_byte[6][(Pixel>>30)]; \ -} -#define DISEMBLE_RGBA(buf, bpp, fmt, Pixel, r, g, b, a) \ -do { \ - switch (bpp) { \ - case 1: \ - Pixel = *((Uint8 *)(buf)); \ - RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \ - break; \ - \ - case 2: \ - Pixel = *((Uint16 *)(buf)); \ - RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \ - break; \ - \ - case 3: { \ - Pixel = 0; \ - if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ - r = *((buf)+fmt->Rshift/8); \ - g = *((buf)+fmt->Gshift/8); \ - b = *((buf)+fmt->Bshift/8); \ - } else { \ - r = *((buf)+2-fmt->Rshift/8); \ - g = *((buf)+2-fmt->Gshift/8); \ - b = *((buf)+2-fmt->Bshift/8); \ - } \ - a = 0xFF; \ - } \ - break; \ - \ - case 4: \ - Pixel = *((Uint32 *)(buf)); \ - RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \ - break; \ - \ - default: \ - /* stop gcc complaints */ \ - Pixel = 0; \ - r = g = b = a = 0; \ - break; \ - } \ -} while (0) - -/* FIXME: this isn't correct, especially for Alpha (maximum != 255) */ -#define PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \ -{ \ - Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \ - ((g>>fmt->Gloss)<<fmt->Gshift)| \ - ((b>>fmt->Bloss)<<fmt->Bshift)| \ - ((a>>fmt->Aloss)<<fmt->Ashift); \ -} -#define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a) \ -{ \ - switch (bpp) { \ - case 1: { \ - Uint8 _pixel; \ - \ - PIXEL_FROM_RGBA(_pixel, fmt, r, g, b, a); \ - *((Uint8 *)(buf)) = _pixel; \ - } \ - break; \ - \ - case 2: { \ - Uint16 _pixel; \ - \ - PIXEL_FROM_RGBA(_pixel, fmt, r, g, b, a); \ - *((Uint16 *)(buf)) = _pixel; \ - } \ - break; \ - \ - case 3: { \ - if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ - *((buf)+fmt->Rshift/8) = r; \ - *((buf)+fmt->Gshift/8) = g; \ - *((buf)+fmt->Bshift/8) = b; \ - } else { \ - *((buf)+2-fmt->Rshift/8) = r; \ - *((buf)+2-fmt->Gshift/8) = g; \ - *((buf)+2-fmt->Bshift/8) = b; \ - } \ - } \ - break; \ - \ - case 4: { \ - Uint32 _pixel; \ - \ - PIXEL_FROM_RGBA(_pixel, fmt, r, g, b, a); \ - *((Uint32 *)(buf)) = _pixel; \ - } \ - break; \ - } \ -} - -/* Blend the RGB values of two pixels with an alpha value */ -#define ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB) \ -do { \ - dR = ((((unsigned)(sR-dR)*(unsigned)A)/255)+dR); \ - dG = ((((unsigned)(sG-dG)*(unsigned)A)/255)+dG); \ - dB = ((((unsigned)(sB-dB)*(unsigned)A)/255)+dB); \ -} while(0) - - -/* Blend the RGBA values of two pixels */ -#define ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA) \ -do { \ - dR = ((((unsigned)(sR-dR)*(unsigned)sA)/255)+dR); \ - dG = ((((unsigned)(sG-dG)*(unsigned)sA)/255)+dG); \ - dB = ((((unsigned)(sB-dB)*(unsigned)sA)/255)+dB); \ - dA = ((unsigned)sA+(unsigned)dA-((unsigned)sA*dA)/255); \ -} while(0) - - -/* This is a very useful loop for optimizing blitters */ -#if defined(_MSC_VER) && (_MSC_VER == 1300) -/* There's a bug in the Visual C++ 7 optimizer when compiling this code */ -#else -#define USE_DUFFS_LOOP -#endif -#ifdef USE_DUFFS_LOOP - -/* 8-times unrolled loop */ -#define DUFFS_LOOP8(pixel_copy_increment, width) \ -{ int n = (width+7)/8; \ - switch (width & 7) { \ - case 0: do { pixel_copy_increment; \ - case 7: pixel_copy_increment; \ - case 6: pixel_copy_increment; \ - case 5: pixel_copy_increment; \ - case 4: pixel_copy_increment; \ - case 3: pixel_copy_increment; \ - case 2: pixel_copy_increment; \ - case 1: pixel_copy_increment; \ - } while ( --n > 0 ); \ - } \ -} - -/* 4-times unrolled loop */ -#define DUFFS_LOOP4(pixel_copy_increment, width) \ -{ int n = (width+3)/4; \ - switch (width & 3) { \ - case 0: do { pixel_copy_increment; \ - case 3: pixel_copy_increment; \ - case 2: pixel_copy_increment; \ - case 1: pixel_copy_increment; \ - } while (--n > 0); \ - } \ -} - -/* Use the 8-times version of the loop by default */ -#define DUFFS_LOOP(pixel_copy_increment, width) \ - DUFFS_LOOP8(pixel_copy_increment, width) - -/* Special version of Duff's device for even more optimization */ -#define DUFFS_LOOP_124(pixel_copy_increment1, \ - pixel_copy_increment2, \ - pixel_copy_increment4, width) \ -{ int n = width; \ - if (n & 1) { \ - pixel_copy_increment1; n -= 1; \ - } \ - if (n & 2) { \ - pixel_copy_increment2; n -= 2; \ - } \ - if (n & 4) { \ - pixel_copy_increment4; n -= 4; \ - } \ - if (n) { \ - n /= 8; \ - do { \ - pixel_copy_increment4; \ - pixel_copy_increment4; \ - } while (--n > 0); \ - } \ -} - -#else - -/* Don't use Duff's device to unroll loops */ -#define DUFFS_LOOP(pixel_copy_increment, width) \ -{ int n; \ - for ( n=width; n > 0; --n ) { \ - pixel_copy_increment; \ - } \ -} -#define DUFFS_LOOP8(pixel_copy_increment, width) \ - DUFFS_LOOP(pixel_copy_increment, width) -#define DUFFS_LOOP4(pixel_copy_increment, width) \ - DUFFS_LOOP(pixel_copy_increment, width) -#define DUFFS_LOOP_124(pixel_copy_increment1, \ - pixel_copy_increment2, \ - pixel_copy_increment4, width) \ - DUFFS_LOOP(pixel_copy_increment1, width) - -#endif /* USE_DUFFS_LOOP */ - -/* Prevent Visual C++ 6.0 from printing out stupid warnings */ -#if defined(_MSC_VER) && (_MSC_VER >= 600) -#pragma warning(disable: 4550) -#endif - -#endif /* _SDL_blit_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit_0.c b/3rdparty/SDL2/src/video/SDL_blit_0.c deleted file mode 100644 index fe7330d78d7..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit_0.c +++ /dev/null @@ -1,483 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_video.h" -#include "SDL_blit.h" - -/* Functions to blit from bitmaps to other surfaces */ - -static void -BlitBto1(SDL_BlitInfo * info) -{ - int c; - int width, height; - Uint8 *src, *map, *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = info->src; - srcskip = info->src_skip; - dst = info->dst; - dstskip = info->dst_skip; - map = info->table; - srcskip += width - (width + 7) / 8; - - if (map) { - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (1) { - *dst = map[bit]; - } - dst++; - byte <<= 1; - } - src += srcskip; - dst += dstskip; - } - } else { - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (1) { - *dst = bit; - } - dst++; - byte <<= 1; - } - src += srcskip; - dst += dstskip; - } - } -} - -static void -BlitBto2(SDL_BlitInfo * info) -{ - int c; - int width, height; - Uint8 *src; - Uint16 *map, *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = info->src; - srcskip = info->src_skip; - dst = (Uint16 *) info->dst; - dstskip = info->dst_skip / 2; - map = (Uint16 *) info->table; - srcskip += width - (width + 7) / 8; - - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (1) { - *dst = map[bit]; - } - byte <<= 1; - dst++; - } - src += srcskip; - dst += dstskip; - } -} - -static void -BlitBto3(SDL_BlitInfo * info) -{ - int c, o; - int width, height; - Uint8 *src, *map, *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = info->src; - srcskip = info->src_skip; - dst = info->dst; - dstskip = info->dst_skip; - map = info->table; - srcskip += width - (width + 7) / 8; - - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (1) { - o = bit * 4; - dst[0] = map[o++]; - dst[1] = map[o++]; - dst[2] = map[o++]; - } - byte <<= 1; - dst += 3; - } - src += srcskip; - dst += dstskip; - } -} - -static void -BlitBto4(SDL_BlitInfo * info) -{ - int width, height; - Uint8 *src; - Uint32 *map, *dst; - int srcskip, dstskip; - int c; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = info->src; - srcskip = info->src_skip; - dst = (Uint32 *) info->dst; - dstskip = info->dst_skip / 4; - map = (Uint32 *) info->table; - srcskip += width - (width + 7) / 8; - - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (1) { - *dst = map[bit]; - } - byte <<= 1; - dst++; - } - src += srcskip; - dst += dstskip; - } -} - -static void -BlitBto1Key(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - Uint8 *dst = info->dst; - int srcskip = info->src_skip; - int dstskip = info->dst_skip; - Uint32 ckey = info->colorkey; - Uint8 *palmap = info->table; - int c; - - /* Set up some basic variables */ - srcskip += width - (width + 7) / 8; - - if (palmap) { - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (bit != ckey) { - *dst = palmap[bit]; - } - dst++; - byte <<= 1; - } - src += srcskip; - dst += dstskip; - } - } else { - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (bit != ckey) { - *dst = bit; - } - dst++; - byte <<= 1; - } - src += srcskip; - dst += dstskip; - } - } -} - -static void -BlitBto2Key(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - Uint16 *dstp = (Uint16 *) info->dst; - int srcskip = info->src_skip; - int dstskip = info->dst_skip; - Uint32 ckey = info->colorkey; - Uint8 *palmap = info->table; - int c; - - /* Set up some basic variables */ - srcskip += width - (width + 7) / 8; - dstskip /= 2; - - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (bit != ckey) { - *dstp = ((Uint16 *) palmap)[bit]; - } - byte <<= 1; - dstp++; - } - src += srcskip; - dstp += dstskip; - } -} - -static void -BlitBto3Key(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - Uint8 *dst = info->dst; - int srcskip = info->src_skip; - int dstskip = info->dst_skip; - Uint32 ckey = info->colorkey; - Uint8 *palmap = info->table; - int c; - - /* Set up some basic variables */ - srcskip += width - (width + 7) / 8; - - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (bit != ckey) { - SDL_memcpy(dst, &palmap[bit * 4], 3); - } - byte <<= 1; - dst += 3; - } - src += srcskip; - dst += dstskip; - } -} - -static void -BlitBto4Key(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - Uint32 *dstp = (Uint32 *) info->dst; - int srcskip = info->src_skip; - int dstskip = info->dst_skip; - Uint32 ckey = info->colorkey; - Uint8 *palmap = info->table; - int c; - - /* Set up some basic variables */ - srcskip += width - (width + 7) / 8; - dstskip /= 4; - - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (bit != ckey) { - *dstp = ((Uint32 *) palmap)[bit]; - } - byte <<= 1; - dstp++; - } - src += srcskip; - dstp += dstskip; - } -} - -static void -BlitBtoNAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - Uint8 *dst = info->dst; - int srcskip = info->src_skip; - int dstskip = info->dst_skip; - const SDL_Color *srcpal = info->src_fmt->palette->colors; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int dstbpp; - int c; - Uint32 pixel; - unsigned sR, sG, sB; - unsigned dR, dG, dB, dA; - const unsigned A = info->a; - - /* Set up some basic variables */ - dstbpp = dstfmt->BytesPerPixel; - srcskip += width - (width + 7) / 8; - - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (1) { - sR = srcpal[bit].r; - sG = srcpal[bit].g; - sB = srcpal[bit].b; - DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA); - ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA); - } - byte <<= 1; - dst += dstbpp; - } - src += srcskip; - dst += dstskip; - } -} - -static void -BlitBtoNAlphaKey(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - Uint8 *dst = info->dst; - int srcskip = info->src_skip; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - const SDL_Color *srcpal = srcfmt->palette->colors; - int dstbpp; - int c; - Uint32 pixel; - unsigned sR, sG, sB; - unsigned dR, dG, dB, dA; - const unsigned A = info->a; - Uint32 ckey = info->colorkey; - - /* Set up some basic variables */ - dstbpp = dstfmt->BytesPerPixel; - srcskip += width - (width + 7) / 8; - - while (height--) { - Uint8 byte = 0, bit; - for (c = 0; c < width; ++c) { - if ((c & 7) == 0) { - byte = *src++; - } - bit = (byte & 0x80) >> 7; - if (bit != ckey) { - sR = srcpal[bit].r; - sG = srcpal[bit].g; - sB = srcpal[bit].b; - DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA); - ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA); - } - byte <<= 1; - dst += dstbpp; - } - src += srcskip; - dst += dstskip; - } -} - -static const SDL_BlitFunc bitmap_blit[] = { - (SDL_BlitFunc) NULL, BlitBto1, BlitBto2, BlitBto3, BlitBto4 -}; - -static const SDL_BlitFunc colorkey_blit[] = { - (SDL_BlitFunc) NULL, BlitBto1Key, BlitBto2Key, BlitBto3Key, BlitBto4Key -}; - -SDL_BlitFunc -SDL_CalculateBlit0(SDL_Surface * surface) -{ - int which; - - if (surface->format->BitsPerPixel != 1) { - /* We don't support sub 8-bit packed pixel modes */ - return (SDL_BlitFunc) NULL; - } - if (surface->map->dst->format->BitsPerPixel < 8) { - which = 0; - } else { - which = surface->map->dst->format->BytesPerPixel; - } - switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) { - case 0: - return bitmap_blit[which]; - - case SDL_COPY_COLORKEY: - return colorkey_blit[which]; - - case SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND: - return which >= 2 ? BlitBtoNAlpha : (SDL_BlitFunc) NULL; - - case SDL_COPY_COLORKEY | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND: - return which >= 2 ? BlitBtoNAlphaKey : (SDL_BlitFunc) NULL; - } - return (SDL_BlitFunc) NULL; -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit_1.c b/3rdparty/SDL2/src/video/SDL_blit_1.c deleted file mode 100644 index 69c15d08df6..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit_1.c +++ /dev/null @@ -1,550 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_video.h" -#include "SDL_blit.h" -#include "SDL_sysvideo.h" -#include "SDL_endian.h" - -/* Functions to blit from 8-bit surfaces to other surfaces */ - -static void -Blit1to1(SDL_BlitInfo * info) -{ -#ifndef USE_DUFFS_LOOP - int c; -#endif - int width, height; - Uint8 *src, *map, *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = info->src; - srcskip = info->src_skip; - dst = info->dst; - dstskip = info->dst_skip; - map = info->table; - - while (height--) { -#ifdef USE_DUFFS_LOOP - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - *dst = map[*src]; - } - dst++; - src++; - , width); - /* *INDENT-ON* */ -#else - for (c = width; c; --c) { - *dst = map[*src]; - dst++; - src++; - } -#endif - src += srcskip; - dst += dstskip; - } -} - -/* This is now endian dependent */ -#if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) -#define HI 1 -#define LO 0 -#else /* ( SDL_BYTEORDER == SDL_BIG_ENDIAN ) */ -#define HI 0 -#define LO 1 -#endif -static void -Blit1to2(SDL_BlitInfo * info) -{ -#ifndef USE_DUFFS_LOOP - int c; -#endif - int width, height; - Uint8 *src, *dst; - Uint16 *map; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = info->src; - srcskip = info->src_skip; - dst = info->dst; - dstskip = info->dst_skip; - map = (Uint16 *) info->table; - -#ifdef USE_DUFFS_LOOP - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - *(Uint16 *)dst = map[*src++]; - dst += 2; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -#else - /* Memory align at 4-byte boundary, if necessary */ - if ((long) dst & 0x03) { - /* Don't do anything if width is 0 */ - if (width == 0) { - return; - } - --width; - - while (height--) { - /* Perform copy alignment */ - *(Uint16 *) dst = map[*src++]; - dst += 2; - - /* Copy in 4 pixel chunks */ - for (c = width / 4; c; --c) { - *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]); - src += 2; - dst += 4; - *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]); - src += 2; - dst += 4; - } - /* Get any leftovers */ - switch (width & 3) { - case 3: - *(Uint16 *) dst = map[*src++]; - dst += 2; - case 2: - *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]); - src += 2; - dst += 4; - break; - case 1: - *(Uint16 *) dst = map[*src++]; - dst += 2; - break; - } - src += srcskip; - dst += dstskip; - } - } else { - while (height--) { - /* Copy in 4 pixel chunks */ - for (c = width / 4; c; --c) { - *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]); - src += 2; - dst += 4; - *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]); - src += 2; - dst += 4; - } - /* Get any leftovers */ - switch (width & 3) { - case 3: - *(Uint16 *) dst = map[*src++]; - dst += 2; - case 2: - *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]); - src += 2; - dst += 4; - break; - case 1: - *(Uint16 *) dst = map[*src++]; - dst += 2; - break; - } - src += srcskip; - dst += dstskip; - } - } -#endif /* USE_DUFFS_LOOP */ -} - -static void -Blit1to3(SDL_BlitInfo * info) -{ -#ifndef USE_DUFFS_LOOP - int c; -#endif - int o; - int width, height; - Uint8 *src, *map, *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = info->src; - srcskip = info->src_skip; - dst = info->dst; - dstskip = info->dst_skip; - map = info->table; - - while (height--) { -#ifdef USE_DUFFS_LOOP - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - o = *src * 4; - dst[0] = map[o++]; - dst[1] = map[o++]; - dst[2] = map[o++]; - } - src++; - dst += 3; - , width); - /* *INDENT-ON* */ -#else - for (c = width; c; --c) { - o = *src * 4; - dst[0] = map[o++]; - dst[1] = map[o++]; - dst[2] = map[o++]; - src++; - dst += 3; - } -#endif /* USE_DUFFS_LOOP */ - src += srcskip; - dst += dstskip; - } -} - -static void -Blit1to4(SDL_BlitInfo * info) -{ -#ifndef USE_DUFFS_LOOP - int c; -#endif - int width, height; - Uint8 *src; - Uint32 *map, *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = info->src; - srcskip = info->src_skip; - dst = (Uint32 *) info->dst; - dstskip = info->dst_skip / 4; - map = (Uint32 *) info->table; - - while (height--) { -#ifdef USE_DUFFS_LOOP - /* *INDENT-OFF* */ - DUFFS_LOOP( - *dst++ = map[*src++]; - , width); - /* *INDENT-ON* */ -#else - for (c = width / 4; c; --c) { - *dst++ = map[*src++]; - *dst++ = map[*src++]; - *dst++ = map[*src++]; - *dst++ = map[*src++]; - } - switch (width & 3) { - case 3: - *dst++ = map[*src++]; - case 2: - *dst++ = map[*src++]; - case 1: - *dst++ = map[*src++]; - } -#endif /* USE_DUFFS_LOOP */ - src += srcskip; - dst += dstskip; - } -} - -static void -Blit1to1Key(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - Uint8 *palmap = info->table; - Uint32 ckey = info->colorkey; - - if (palmap) { - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - if ( *src != ckey ) { - *dst = palmap[*src]; - } - dst++; - src++; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } - } else { - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - if ( *src != ckey ) { - *dst = *src; - } - dst++; - src++; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } - } -} - -static void -Blit1to2Key(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint16 *dstp = (Uint16 *) info->dst; - int dstskip = info->dst_skip; - Uint16 *palmap = (Uint16 *) info->table; - Uint32 ckey = info->colorkey; - - /* Set up some basic variables */ - dstskip /= 2; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - if ( *src != ckey ) { - *dstp=palmap[*src]; - } - src++; - dstp++; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dstp += dstskip; - } -} - -static void -Blit1to3Key(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - Uint8 *palmap = info->table; - Uint32 ckey = info->colorkey; - int o; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - if ( *src != ckey ) { - o = *src * 4; - dst[0] = palmap[o++]; - dst[1] = palmap[o++]; - dst[2] = palmap[o++]; - } - src++; - dst += 3; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -static void -Blit1to4Key(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint32 *dstp = (Uint32 *) info->dst; - int dstskip = info->dst_skip; - Uint32 *palmap = (Uint32 *) info->table; - Uint32 ckey = info->colorkey; - - /* Set up some basic variables */ - dstskip /= 4; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - if ( *src != ckey ) { - *dstp = palmap[*src]; - } - src++; - dstp++; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dstp += dstskip; - } -} - -static void -Blit1toNAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *dstfmt = info->dst_fmt; - const SDL_Color *srcpal = info->src_fmt->palette->colors; - int dstbpp; - Uint32 pixel; - unsigned sR, sG, sB; - unsigned dR, dG, dB, dA; - const unsigned A = info->a; - - /* Set up some basic variables */ - dstbpp = dstfmt->BytesPerPixel; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4( - { - sR = srcpal[*src].r; - sG = srcpal[*src].g; - sB = srcpal[*src].b; - DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA); - ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA); - src++; - dst += dstbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -static void -Blit1toNAlphaKey(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *dstfmt = info->dst_fmt; - const SDL_Color *srcpal = info->src_fmt->palette->colors; - Uint32 ckey = info->colorkey; - int dstbpp; - Uint32 pixel; - unsigned sR, sG, sB; - unsigned dR, dG, dB, dA; - const unsigned A = info->a; - - /* Set up some basic variables */ - dstbpp = dstfmt->BytesPerPixel; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - if ( *src != ckey ) { - sR = srcpal[*src].r; - sG = srcpal[*src].g; - sB = srcpal[*src].b; - DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA); - ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA); - } - src++; - dst += dstbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -static const SDL_BlitFunc one_blit[] = { - (SDL_BlitFunc) NULL, Blit1to1, Blit1to2, Blit1to3, Blit1to4 -}; - -static const SDL_BlitFunc one_blitkey[] = { - (SDL_BlitFunc) NULL, Blit1to1Key, Blit1to2Key, Blit1to3Key, Blit1to4Key -}; - -SDL_BlitFunc -SDL_CalculateBlit1(SDL_Surface * surface) -{ - int which; - SDL_PixelFormat *dstfmt; - - dstfmt = surface->map->dst->format; - if (dstfmt->BitsPerPixel < 8) { - which = 0; - } else { - which = dstfmt->BytesPerPixel; - } - switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) { - case 0: - return one_blit[which]; - - case SDL_COPY_COLORKEY: - return one_blitkey[which]; - - case SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND: - /* Supporting 8bpp->8bpp alpha is doable but requires lots of - tables which consume space and takes time to precompute, - so is better left to the user */ - return which >= 2 ? Blit1toNAlpha : (SDL_BlitFunc) NULL; - - case SDL_COPY_COLORKEY | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND: - return which >= 2 ? Blit1toNAlphaKey : (SDL_BlitFunc) NULL; - } - return (SDL_BlitFunc) NULL; -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit_A.c b/3rdparty/SDL2/src/video/SDL_blit_A.c deleted file mode 100644 index 0190ffddda7..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit_A.c +++ /dev/null @@ -1,1388 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_video.h" -#include "SDL_blit.h" - -/* Functions to perform alpha blended blitting */ - -/* N->1 blending with per-surface alpha */ -static void -BlitNto1SurfaceAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - Uint8 *palmap = info->table; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int srcbpp = srcfmt->BytesPerPixel; - Uint32 Pixel; - unsigned sR, sG, sB; - unsigned dR, dG, dB; - const unsigned A = info->a; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4( - { - DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB); - dR = dstfmt->palette->colors[*dst].r; - dG = dstfmt->palette->colors[*dst].g; - dB = dstfmt->palette->colors[*dst].b; - ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB); - dR &= 0xff; - dG &= 0xff; - dB &= 0xff; - /* Pack RGB into 8bit pixel */ - if ( palmap == NULL ) { - *dst =((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0)); - } else { - *dst = palmap[((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0))]; - } - dst++; - src += srcbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -/* N->1 blending with pixel alpha */ -static void -BlitNto1PixelAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - Uint8 *palmap = info->table; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int srcbpp = srcfmt->BytesPerPixel; - Uint32 Pixel; - unsigned sR, sG, sB, sA; - unsigned dR, dG, dB; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4( - { - DISEMBLE_RGBA(src,srcbpp,srcfmt,Pixel,sR,sG,sB,sA); - dR = dstfmt->palette->colors[*dst].r; - dG = dstfmt->palette->colors[*dst].g; - dB = dstfmt->palette->colors[*dst].b; - ALPHA_BLEND_RGB(sR, sG, sB, sA, dR, dG, dB); - dR &= 0xff; - dG &= 0xff; - dB &= 0xff; - /* Pack RGB into 8bit pixel */ - if ( palmap == NULL ) { - *dst =((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0)); - } else { - *dst = palmap[((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0))]; - } - dst++; - src += srcbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -/* colorkeyed N->1 blending with per-surface alpha */ -static void -BlitNto1SurfaceAlphaKey(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - Uint8 *palmap = info->table; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int srcbpp = srcfmt->BytesPerPixel; - Uint32 ckey = info->colorkey; - Uint32 Pixel; - unsigned sR, sG, sB; - unsigned dR, dG, dB; - const unsigned A = info->a; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB); - if ( Pixel != ckey ) { - dR = dstfmt->palette->colors[*dst].r; - dG = dstfmt->palette->colors[*dst].g; - dB = dstfmt->palette->colors[*dst].b; - ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB); - dR &= 0xff; - dG &= 0xff; - dB &= 0xff; - /* Pack RGB into 8bit pixel */ - if ( palmap == NULL ) { - *dst =((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0)); - } else { - *dst = palmap[((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0))]; - } - } - dst++; - src += srcbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -#ifdef __MMX__ - -/* fast RGB888->(A)RGB888 blending with surface alpha=128 special case */ -static void -BlitRGBtoRGBSurfaceAlpha128MMX(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->src_skip >> 2; - Uint32 *dstp = (Uint32 *) info->dst; - int dstskip = info->dst_skip >> 2; - Uint32 dalpha = info->dst_fmt->Amask; - - __m64 src1, src2, dst1, dst2, lmask, hmask, dsta; - - hmask = _mm_set_pi32(0x00fefefe, 0x00fefefe); /* alpha128 mask -> hmask */ - lmask = _mm_set_pi32(0x00010101, 0x00010101); /* !alpha128 mask -> lmask */ - dsta = _mm_set_pi32(dalpha, dalpha); /* dst alpha mask -> dsta */ - - while (height--) { - int n = width; - if (n & 1) { - Uint32 s = *srcp++; - Uint32 d = *dstp; - *dstp++ = ((((s & 0x00fefefe) + (d & 0x00fefefe)) >> 1) - + (s & d & 0x00010101)) | dalpha; - n--; - } - - for (n >>= 1; n > 0; --n) { - dst1 = *(__m64 *) dstp; /* 2 x dst -> dst1(ARGBARGB) */ - dst2 = dst1; /* 2 x dst -> dst2(ARGBARGB) */ - - src1 = *(__m64 *) srcp; /* 2 x src -> src1(ARGBARGB) */ - src2 = src1; /* 2 x src -> src2(ARGBARGB) */ - - dst2 = _mm_and_si64(dst2, hmask); /* dst & mask -> dst2 */ - src2 = _mm_and_si64(src2, hmask); /* src & mask -> src2 */ - src2 = _mm_add_pi32(src2, dst2); /* dst2 + src2 -> src2 */ - src2 = _mm_srli_pi32(src2, 1); /* src2 >> 1 -> src2 */ - - dst1 = _mm_and_si64(dst1, src1); /* src & dst -> dst1 */ - dst1 = _mm_and_si64(dst1, lmask); /* dst1 & !mask -> dst1 */ - dst1 = _mm_add_pi32(dst1, src2); /* src2 + dst1 -> dst1 */ - dst1 = _mm_or_si64(dst1, dsta); /* dsta(full alpha) | dst1 -> dst1 */ - - *(__m64 *) dstp = dst1; /* dst1 -> 2 x dst pixels */ - dstp += 2; - srcp += 2; - } - - srcp += srcskip; - dstp += dstskip; - } - _mm_empty(); -} - -/* fast RGB888->(A)RGB888 blending with surface alpha */ -static void -BlitRGBtoRGBSurfaceAlphaMMX(SDL_BlitInfo * info) -{ - SDL_PixelFormat *df = info->dst_fmt; - Uint32 chanmask; - unsigned alpha = info->a; - - if (alpha == 128 && (df->Rmask | df->Gmask | df->Bmask) == 0x00FFFFFF) { - /* only call a128 version when R,G,B occupy lower bits */ - BlitRGBtoRGBSurfaceAlpha128MMX(info); - } else { - int width = info->dst_w; - int height = info->dst_h; - Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->src_skip >> 2; - Uint32 *dstp = (Uint32 *) info->dst; - int dstskip = info->dst_skip >> 2; - Uint32 dalpha = df->Amask; - Uint32 amult; - - __m64 src1, src2, dst1, dst2, mm_alpha, mm_zero, dsta; - - mm_zero = _mm_setzero_si64(); /* 0 -> mm_zero */ - /* form the alpha mult */ - amult = alpha | (alpha << 8); - amult = amult | (amult << 16); - chanmask = - (0xff << df->Rshift) | (0xff << df-> - Gshift) | (0xff << df->Bshift); - mm_alpha = _mm_set_pi32(0, amult & chanmask); /* 0000AAAA -> mm_alpha, minus 1 chan */ - mm_alpha = _mm_unpacklo_pi8(mm_alpha, mm_zero); /* 0A0A0A0A -> mm_alpha, minus 1 chan */ - /* at this point mm_alpha can be 000A0A0A or 0A0A0A00 or another combo */ - dsta = _mm_set_pi32(dalpha, dalpha); /* dst alpha mask -> dsta */ - - while (height--) { - int n = width; - if (n & 1) { - /* One Pixel Blend */ - src2 = _mm_cvtsi32_si64(*srcp); /* src(ARGB) -> src2 (0000ARGB) */ - src2 = _mm_unpacklo_pi8(src2, mm_zero); /* 0A0R0G0B -> src2 */ - - dst1 = _mm_cvtsi32_si64(*dstp); /* dst(ARGB) -> dst1 (0000ARGB) */ - dst1 = _mm_unpacklo_pi8(dst1, mm_zero); /* 0A0R0G0B -> dst1 */ - - src2 = _mm_sub_pi16(src2, dst1); /* src2 - dst2 -> src2 */ - src2 = _mm_mullo_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */ - src2 = _mm_srli_pi16(src2, 8); /* src2 >> 8 -> src2 */ - dst1 = _mm_add_pi8(src2, dst1); /* src2 + dst1 -> dst1 */ - - dst1 = _mm_packs_pu16(dst1, mm_zero); /* 0000ARGB -> dst1 */ - dst1 = _mm_or_si64(dst1, dsta); /* dsta | dst1 -> dst1 */ - *dstp = _mm_cvtsi64_si32(dst1); /* dst1 -> pixel */ - - ++srcp; - ++dstp; - - n--; - } - - for (n >>= 1; n > 0; --n) { - /* Two Pixels Blend */ - src1 = *(__m64 *) srcp; /* 2 x src -> src1(ARGBARGB) */ - src2 = src1; /* 2 x src -> src2(ARGBARGB) */ - src1 = _mm_unpacklo_pi8(src1, mm_zero); /* low - 0A0R0G0B -> src1 */ - src2 = _mm_unpackhi_pi8(src2, mm_zero); /* high - 0A0R0G0B -> src2 */ - - dst1 = *(__m64 *) dstp; /* 2 x dst -> dst1(ARGBARGB) */ - dst2 = dst1; /* 2 x dst -> dst2(ARGBARGB) */ - dst1 = _mm_unpacklo_pi8(dst1, mm_zero); /* low - 0A0R0G0B -> dst1 */ - dst2 = _mm_unpackhi_pi8(dst2, mm_zero); /* high - 0A0R0G0B -> dst2 */ - - src1 = _mm_sub_pi16(src1, dst1); /* src1 - dst1 -> src1 */ - src1 = _mm_mullo_pi16(src1, mm_alpha); /* src1 * alpha -> src1 */ - src1 = _mm_srli_pi16(src1, 8); /* src1 >> 8 -> src1 */ - dst1 = _mm_add_pi8(src1, dst1); /* src1 + dst1(dst1) -> dst1 */ - - src2 = _mm_sub_pi16(src2, dst2); /* src2 - dst2 -> src2 */ - src2 = _mm_mullo_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */ - src2 = _mm_srli_pi16(src2, 8); /* src2 >> 8 -> src2 */ - dst2 = _mm_add_pi8(src2, dst2); /* src2 + dst2(dst2) -> dst2 */ - - dst1 = _mm_packs_pu16(dst1, dst2); /* 0A0R0G0B(res1), 0A0R0G0B(res2) -> dst1(ARGBARGB) */ - dst1 = _mm_or_si64(dst1, dsta); /* dsta | dst1 -> dst1 */ - - *(__m64 *) dstp = dst1; /* dst1 -> 2 x pixel */ - - srcp += 2; - dstp += 2; - } - srcp += srcskip; - dstp += dstskip; - } - _mm_empty(); - } -} - -/* fast ARGB888->(A)RGB888 blending with pixel alpha */ -static void -BlitRGBtoRGBPixelAlphaMMX(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->src_skip >> 2; - Uint32 *dstp = (Uint32 *) info->dst; - int dstskip = info->dst_skip >> 2; - SDL_PixelFormat *sf = info->src_fmt; - Uint32 amask = sf->Amask; - Uint32 ashift = sf->Ashift; - Uint64 multmask, multmask2; - - __m64 src1, dst1, mm_alpha, mm_zero, mm_alpha2; - - mm_zero = _mm_setzero_si64(); /* 0 -> mm_zero */ - multmask = 0x00FF; - multmask <<= (ashift * 2); - multmask2 = 0x00FF00FF00FF00FFULL; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4({ - Uint32 alpha = *srcp & amask; - if (alpha == 0) { - /* do nothing */ - } else if (alpha == amask) { - *dstp = *srcp; - } else { - src1 = _mm_cvtsi32_si64(*srcp); /* src(ARGB) -> src1 (0000ARGB) */ - src1 = _mm_unpacklo_pi8(src1, mm_zero); /* 0A0R0G0B -> src1 */ - - dst1 = _mm_cvtsi32_si64(*dstp); /* dst(ARGB) -> dst1 (0000ARGB) */ - dst1 = _mm_unpacklo_pi8(dst1, mm_zero); /* 0A0R0G0B -> dst1 */ - - mm_alpha = _mm_cvtsi32_si64(alpha); /* alpha -> mm_alpha (0000000A) */ - mm_alpha = _mm_srli_si64(mm_alpha, ashift); /* mm_alpha >> ashift -> mm_alpha(0000000A) */ - mm_alpha = _mm_unpacklo_pi16(mm_alpha, mm_alpha); /* 00000A0A -> mm_alpha */ - mm_alpha2 = _mm_unpacklo_pi32(mm_alpha, mm_alpha); /* 0A0A0A0A -> mm_alpha2 */ - mm_alpha = _mm_or_si64(mm_alpha2, *(__m64 *) & multmask); /* 0F0A0A0A -> mm_alpha */ - mm_alpha2 = _mm_xor_si64(mm_alpha2, *(__m64 *) & multmask2); /* 255 - mm_alpha -> mm_alpha */ - - /* blend */ - src1 = _mm_mullo_pi16(src1, mm_alpha); - src1 = _mm_srli_pi16(src1, 8); - dst1 = _mm_mullo_pi16(dst1, mm_alpha2); - dst1 = _mm_srli_pi16(dst1, 8); - dst1 = _mm_add_pi16(src1, dst1); - dst1 = _mm_packs_pu16(dst1, mm_zero); - - *dstp = _mm_cvtsi64_si32(dst1); /* dst1 -> pixel */ - } - ++srcp; - ++dstp; - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } - _mm_empty(); -} - -#endif /* __MMX__ */ - -/* fast RGB888->(A)RGB888 blending with surface alpha=128 special case */ -static void -BlitRGBtoRGBSurfaceAlpha128(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->src_skip >> 2; - Uint32 *dstp = (Uint32 *) info->dst; - int dstskip = info->dst_skip >> 2; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4({ - Uint32 s = *srcp++; - Uint32 d = *dstp; - *dstp++ = ((((s & 0x00fefefe) + (d & 0x00fefefe)) >> 1) - + (s & d & 0x00010101)) | 0xff000000; - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } -} - -/* fast RGB888->(A)RGB888 blending with surface alpha */ -static void -BlitRGBtoRGBSurfaceAlpha(SDL_BlitInfo * info) -{ - unsigned alpha = info->a; - if (alpha == 128) { - BlitRGBtoRGBSurfaceAlpha128(info); - } else { - int width = info->dst_w; - int height = info->dst_h; - Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->src_skip >> 2; - Uint32 *dstp = (Uint32 *) info->dst; - int dstskip = info->dst_skip >> 2; - Uint32 s; - Uint32 d; - Uint32 s1; - Uint32 d1; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4({ - s = *srcp; - d = *dstp; - s1 = s & 0xff00ff; - d1 = d & 0xff00ff; - d1 = (d1 + ((s1 - d1) * alpha >> 8)) - & 0xff00ff; - s &= 0xff00; - d &= 0xff00; - d = (d + ((s - d) * alpha >> 8)) & 0xff00; - *dstp = d1 | d | 0xff000000; - ++srcp; - ++dstp; - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } - } -} - -/* fast ARGB888->(A)RGB888 blending with pixel alpha */ -static void -BlitRGBtoRGBPixelAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->src_skip >> 2; - Uint32 *dstp = (Uint32 *) info->dst; - int dstskip = info->dst_skip >> 2; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4({ - Uint32 dalpha; - Uint32 d; - Uint32 s1; - Uint32 d1; - Uint32 s = *srcp; - Uint32 alpha = s >> 24; - /* FIXME: Here we special-case opaque alpha since the - compositioning used (>>8 instead of /255) doesn't handle - it correctly. Also special-case alpha=0 for speed? - Benchmark this! */ - if (alpha) { - if (alpha == SDL_ALPHA_OPAQUE) { - *dstp = *srcp; - } else { - /* - * take out the middle component (green), and process - * the other two in parallel. One multiply less. - */ - d = *dstp; - dalpha = d >> 24; - s1 = s & 0xff00ff; - d1 = d & 0xff00ff; - d1 = (d1 + ((s1 - d1) * alpha >> 8)) & 0xff00ff; - s &= 0xff00; - d &= 0xff00; - d = (d + ((s - d) * alpha >> 8)) & 0xff00; - dalpha = alpha + (dalpha * (alpha ^ 0xFF) >> 8); - *dstp = d1 | d | (dalpha << 24); - } - } - ++srcp; - ++dstp; - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } -} - -#ifdef __3dNOW__ -/* fast (as in MMX with prefetch) ARGB888->(A)RGB888 blending with pixel alpha */ -static void -BlitRGBtoRGBPixelAlphaMMX3DNOW(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->src_skip >> 2; - Uint32 *dstp = (Uint32 *) info->dst; - int dstskip = info->dst_skip >> 2; - SDL_PixelFormat *sf = info->src_fmt; - Uint32 amask = sf->Amask; - Uint32 ashift = sf->Ashift; - Uint64 multmask, multmask2; - - __m64 src1, dst1, mm_alpha, mm_zero, mm_alpha2; - - mm_zero = _mm_setzero_si64(); /* 0 -> mm_zero */ - multmask = 0x00FF; - multmask <<= (ashift * 2); - multmask2 = 0x00FF00FF00FF00FFULL; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4({ - Uint32 alpha; - - _m_prefetch(srcp + 16); - _m_prefetch(dstp + 16); - - alpha = *srcp & amask; - if (alpha == 0) { - /* do nothing */ - } else if (alpha == amask) { - *dstp = *srcp; - } else { - src1 = _mm_cvtsi32_si64(*srcp); /* src(ARGB) -> src1 (0000ARGB) */ - src1 = _mm_unpacklo_pi8(src1, mm_zero); /* 0A0R0G0B -> src1 */ - - dst1 = _mm_cvtsi32_si64(*dstp); /* dst(ARGB) -> dst1 (0000ARGB) */ - dst1 = _mm_unpacklo_pi8(dst1, mm_zero); /* 0A0R0G0B -> dst1 */ - - mm_alpha = _mm_cvtsi32_si64(alpha); /* alpha -> mm_alpha (0000000A) */ - mm_alpha = _mm_srli_si64(mm_alpha, ashift); /* mm_alpha >> ashift -> mm_alpha(0000000A) */ - mm_alpha = _mm_unpacklo_pi16(mm_alpha, mm_alpha); /* 00000A0A -> mm_alpha */ - mm_alpha2 = _mm_unpacklo_pi32(mm_alpha, mm_alpha); /* 0A0A0A0A -> mm_alpha2 */ - mm_alpha = _mm_or_si64(mm_alpha2, *(__m64 *) & multmask); /* 0F0A0A0A -> mm_alpha */ - mm_alpha2 = _mm_xor_si64(mm_alpha2, *(__m64 *) & multmask2); /* 255 - mm_alpha -> mm_alpha */ - - - /* blend */ - src1 = _mm_mullo_pi16(src1, mm_alpha); - src1 = _mm_srli_pi16(src1, 8); - dst1 = _mm_mullo_pi16(dst1, mm_alpha2); - dst1 = _mm_srli_pi16(dst1, 8); - dst1 = _mm_add_pi16(src1, dst1); - dst1 = _mm_packs_pu16(dst1, mm_zero); - - *dstp = _mm_cvtsi64_si32(dst1); /* dst1 -> pixel */ - } - ++srcp; - ++dstp; - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } - _mm_empty(); -} - -#endif /* __3dNOW__ */ - -/* 16bpp special case for per-surface alpha=50%: blend 2 pixels in parallel */ - -/* blend a single 16 bit pixel at 50% */ -#define BLEND16_50(d, s, mask) \ - ((((s & mask) + (d & mask)) >> 1) + (s & d & (~mask & 0xffff))) - -/* blend two 16 bit pixels at 50% */ -#define BLEND2x16_50(d, s, mask) \ - (((s & (mask | mask << 16)) >> 1) + ((d & (mask | mask << 16)) >> 1) \ - + (s & d & (~(mask | mask << 16)))) - -static void -Blit16to16SurfaceAlpha128(SDL_BlitInfo * info, Uint16 mask) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint16 *srcp = (Uint16 *) info->src; - int srcskip = info->src_skip >> 1; - Uint16 *dstp = (Uint16 *) info->dst; - int dstskip = info->dst_skip >> 1; - - while (height--) { - if (((uintptr_t) srcp ^ (uintptr_t) dstp) & 2) { - /* - * Source and destination not aligned, pipeline it. - * This is mostly a win for big blits but no loss for - * small ones - */ - Uint32 prev_sw; - int w = width; - - /* handle odd destination */ - if ((uintptr_t) dstp & 2) { - Uint16 d = *dstp, s = *srcp; - *dstp = BLEND16_50(d, s, mask); - dstp++; - srcp++; - w--; - } - srcp++; /* srcp is now 32-bit aligned */ - - /* bootstrap pipeline with first halfword */ - prev_sw = ((Uint32 *) srcp)[-1]; - - while (w > 1) { - Uint32 sw, dw, s; - sw = *(Uint32 *) srcp; - dw = *(Uint32 *) dstp; -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - s = (prev_sw << 16) + (sw >> 16); -#else - s = (prev_sw >> 16) + (sw << 16); -#endif - prev_sw = sw; - *(Uint32 *) dstp = BLEND2x16_50(dw, s, mask); - dstp += 2; - srcp += 2; - w -= 2; - } - - /* final pixel if any */ - if (w) { - Uint16 d = *dstp, s; -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - s = (Uint16) prev_sw; -#else - s = (Uint16) (prev_sw >> 16); -#endif - *dstp = BLEND16_50(d, s, mask); - srcp++; - dstp++; - } - srcp += srcskip - 1; - dstp += dstskip; - } else { - /* source and destination are aligned */ - int w = width; - - /* first odd pixel? */ - if ((uintptr_t) srcp & 2) { - Uint16 d = *dstp, s = *srcp; - *dstp = BLEND16_50(d, s, mask); - srcp++; - dstp++; - w--; - } - /* srcp and dstp are now 32-bit aligned */ - - while (w > 1) { - Uint32 sw = *(Uint32 *) srcp; - Uint32 dw = *(Uint32 *) dstp; - *(Uint32 *) dstp = BLEND2x16_50(dw, sw, mask); - srcp += 2; - dstp += 2; - w -= 2; - } - - /* last odd pixel? */ - if (w) { - Uint16 d = *dstp, s = *srcp; - *dstp = BLEND16_50(d, s, mask); - srcp++; - dstp++; - } - srcp += srcskip; - dstp += dstskip; - } - } -} - -#ifdef __MMX__ - -/* fast RGB565->RGB565 blending with surface alpha */ -static void -Blit565to565SurfaceAlphaMMX(SDL_BlitInfo * info) -{ - unsigned alpha = info->a; - if (alpha == 128) { - Blit16to16SurfaceAlpha128(info, 0xf7de); - } else { - int width = info->dst_w; - int height = info->dst_h; - Uint16 *srcp = (Uint16 *) info->src; - int srcskip = info->src_skip >> 1; - Uint16 *dstp = (Uint16 *) info->dst; - int dstskip = info->dst_skip >> 1; - Uint32 s, d; - - __m64 src1, dst1, src2, dst2, gmask, bmask, mm_res, mm_alpha; - - alpha &= ~(1 + 2 + 4); /* cut alpha to get the exact same behaviour */ - mm_alpha = _mm_set_pi32(0, alpha); /* 0000000A -> mm_alpha */ - alpha >>= 3; /* downscale alpha to 5 bits */ - - mm_alpha = _mm_unpacklo_pi16(mm_alpha, mm_alpha); /* 00000A0A -> mm_alpha */ - mm_alpha = _mm_unpacklo_pi32(mm_alpha, mm_alpha); /* 0A0A0A0A -> mm_alpha */ - /* position alpha to allow for mullo and mulhi on diff channels - to reduce the number of operations */ - mm_alpha = _mm_slli_si64(mm_alpha, 3); - - /* Setup the 565 color channel masks */ - gmask = _mm_set_pi32(0x07E007E0, 0x07E007E0); /* MASKGREEN -> gmask */ - bmask = _mm_set_pi32(0x001F001F, 0x001F001F); /* MASKBLUE -> bmask */ - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP_124( - { - s = *srcp++; - d = *dstp; - /* - * shift out the middle component (green) to - * the high 16 bits, and process all three RGB - * components at the same time. - */ - s = (s | s << 16) & 0x07e0f81f; - d = (d | d << 16) & 0x07e0f81f; - d += (s - d) * alpha >> 5; - d &= 0x07e0f81f; - *dstp++ = (Uint16)(d | d >> 16); - },{ - s = *srcp++; - d = *dstp; - /* - * shift out the middle component (green) to - * the high 16 bits, and process all three RGB - * components at the same time. - */ - s = (s | s << 16) & 0x07e0f81f; - d = (d | d << 16) & 0x07e0f81f; - d += (s - d) * alpha >> 5; - d &= 0x07e0f81f; - *dstp++ = (Uint16)(d | d >> 16); - s = *srcp++; - d = *dstp; - /* - * shift out the middle component (green) to - * the high 16 bits, and process all three RGB - * components at the same time. - */ - s = (s | s << 16) & 0x07e0f81f; - d = (d | d << 16) & 0x07e0f81f; - d += (s - d) * alpha >> 5; - d &= 0x07e0f81f; - *dstp++ = (Uint16)(d | d >> 16); - },{ - src1 = *(__m64*)srcp; /* 4 src pixels -> src1 */ - dst1 = *(__m64*)dstp; /* 4 dst pixels -> dst1 */ - - /* red */ - src2 = src1; - src2 = _mm_srli_pi16(src2, 11); /* src2 >> 11 -> src2 [000r 000r 000r 000r] */ - - dst2 = dst1; - dst2 = _mm_srli_pi16(dst2, 11); /* dst2 >> 11 -> dst2 [000r 000r 000r 000r] */ - - /* blend */ - src2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */ - src2 = _mm_mullo_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */ - src2 = _mm_srli_pi16(src2, 11); /* src2 >> 11 -> src2 */ - dst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */ - dst2 = _mm_slli_pi16(dst2, 11); /* dst2 << 11 -> dst2 */ - - mm_res = dst2; /* RED -> mm_res */ - - /* green -- process the bits in place */ - src2 = src1; - src2 = _mm_and_si64(src2, gmask); /* src & MASKGREEN -> src2 */ - - dst2 = dst1; - dst2 = _mm_and_si64(dst2, gmask); /* dst & MASKGREEN -> dst2 */ - - /* blend */ - src2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */ - src2 = _mm_mulhi_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */ - src2 = _mm_slli_pi16(src2, 5); /* src2 << 5 -> src2 */ - dst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */ - - mm_res = _mm_or_si64(mm_res, dst2); /* RED | GREEN -> mm_res */ - - /* blue */ - src2 = src1; - src2 = _mm_and_si64(src2, bmask); /* src & MASKBLUE -> src2[000b 000b 000b 000b] */ - - dst2 = dst1; - dst2 = _mm_and_si64(dst2, bmask); /* dst & MASKBLUE -> dst2[000b 000b 000b 000b] */ - - /* blend */ - src2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */ - src2 = _mm_mullo_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */ - src2 = _mm_srli_pi16(src2, 11); /* src2 >> 11 -> src2 */ - dst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */ - dst2 = _mm_and_si64(dst2, bmask); /* dst2 & MASKBLUE -> dst2 */ - - mm_res = _mm_or_si64(mm_res, dst2); /* RED | GREEN | BLUE -> mm_res */ - - *(__m64*)dstp = mm_res; /* mm_res -> 4 dst pixels */ - - srcp += 4; - dstp += 4; - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } - _mm_empty(); - } -} - -/* fast RGB555->RGB555 blending with surface alpha */ -static void -Blit555to555SurfaceAlphaMMX(SDL_BlitInfo * info) -{ - unsigned alpha = info->a; - if (alpha == 128) { - Blit16to16SurfaceAlpha128(info, 0xfbde); - } else { - int width = info->dst_w; - int height = info->dst_h; - Uint16 *srcp = (Uint16 *) info->src; - int srcskip = info->src_skip >> 1; - Uint16 *dstp = (Uint16 *) info->dst; - int dstskip = info->dst_skip >> 1; - Uint32 s, d; - - __m64 src1, dst1, src2, dst2, rmask, gmask, bmask, mm_res, mm_alpha; - - alpha &= ~(1 + 2 + 4); /* cut alpha to get the exact same behaviour */ - mm_alpha = _mm_set_pi32(0, alpha); /* 0000000A -> mm_alpha */ - alpha >>= 3; /* downscale alpha to 5 bits */ - - mm_alpha = _mm_unpacklo_pi16(mm_alpha, mm_alpha); /* 00000A0A -> mm_alpha */ - mm_alpha = _mm_unpacklo_pi32(mm_alpha, mm_alpha); /* 0A0A0A0A -> mm_alpha */ - /* position alpha to allow for mullo and mulhi on diff channels - to reduce the number of operations */ - mm_alpha = _mm_slli_si64(mm_alpha, 3); - - /* Setup the 555 color channel masks */ - rmask = _mm_set_pi32(0x7C007C00, 0x7C007C00); /* MASKRED -> rmask */ - gmask = _mm_set_pi32(0x03E003E0, 0x03E003E0); /* MASKGREEN -> gmask */ - bmask = _mm_set_pi32(0x001F001F, 0x001F001F); /* MASKBLUE -> bmask */ - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP_124( - { - s = *srcp++; - d = *dstp; - /* - * shift out the middle component (green) to - * the high 16 bits, and process all three RGB - * components at the same time. - */ - s = (s | s << 16) & 0x03e07c1f; - d = (d | d << 16) & 0x03e07c1f; - d += (s - d) * alpha >> 5; - d &= 0x03e07c1f; - *dstp++ = (Uint16)(d | d >> 16); - },{ - s = *srcp++; - d = *dstp; - /* - * shift out the middle component (green) to - * the high 16 bits, and process all three RGB - * components at the same time. - */ - s = (s | s << 16) & 0x03e07c1f; - d = (d | d << 16) & 0x03e07c1f; - d += (s - d) * alpha >> 5; - d &= 0x03e07c1f; - *dstp++ = (Uint16)(d | d >> 16); - s = *srcp++; - d = *dstp; - /* - * shift out the middle component (green) to - * the high 16 bits, and process all three RGB - * components at the same time. - */ - s = (s | s << 16) & 0x03e07c1f; - d = (d | d << 16) & 0x03e07c1f; - d += (s - d) * alpha >> 5; - d &= 0x03e07c1f; - *dstp++ = (Uint16)(d | d >> 16); - },{ - src1 = *(__m64*)srcp; /* 4 src pixels -> src1 */ - dst1 = *(__m64*)dstp; /* 4 dst pixels -> dst1 */ - - /* red -- process the bits in place */ - src2 = src1; - src2 = _mm_and_si64(src2, rmask); /* src & MASKRED -> src2 */ - - dst2 = dst1; - dst2 = _mm_and_si64(dst2, rmask); /* dst & MASKRED -> dst2 */ - - /* blend */ - src2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */ - src2 = _mm_mulhi_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */ - src2 = _mm_slli_pi16(src2, 5); /* src2 << 5 -> src2 */ - dst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */ - dst2 = _mm_and_si64(dst2, rmask); /* dst2 & MASKRED -> dst2 */ - - mm_res = dst2; /* RED -> mm_res */ - - /* green -- process the bits in place */ - src2 = src1; - src2 = _mm_and_si64(src2, gmask); /* src & MASKGREEN -> src2 */ - - dst2 = dst1; - dst2 = _mm_and_si64(dst2, gmask); /* dst & MASKGREEN -> dst2 */ - - /* blend */ - src2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */ - src2 = _mm_mulhi_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */ - src2 = _mm_slli_pi16(src2, 5); /* src2 << 5 -> src2 */ - dst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */ - - mm_res = _mm_or_si64(mm_res, dst2); /* RED | GREEN -> mm_res */ - - /* blue */ - src2 = src1; /* src -> src2 */ - src2 = _mm_and_si64(src2, bmask); /* src & MASKBLUE -> src2[000b 000b 000b 000b] */ - - dst2 = dst1; /* dst -> dst2 */ - dst2 = _mm_and_si64(dst2, bmask); /* dst & MASKBLUE -> dst2[000b 000b 000b 000b] */ - - /* blend */ - src2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */ - src2 = _mm_mullo_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */ - src2 = _mm_srli_pi16(src2, 11); /* src2 >> 11 -> src2 */ - dst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */ - dst2 = _mm_and_si64(dst2, bmask); /* dst2 & MASKBLUE -> dst2 */ - - mm_res = _mm_or_si64(mm_res, dst2); /* RED | GREEN | BLUE -> mm_res */ - - *(__m64*)dstp = mm_res; /* mm_res -> 4 dst pixels */ - - srcp += 4; - dstp += 4; - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } - _mm_empty(); - } -} - -#endif /* __MMX__ */ - -/* fast RGB565->RGB565 blending with surface alpha */ -static void -Blit565to565SurfaceAlpha(SDL_BlitInfo * info) -{ - unsigned alpha = info->a; - if (alpha == 128) { - Blit16to16SurfaceAlpha128(info, 0xf7de); - } else { - int width = info->dst_w; - int height = info->dst_h; - Uint16 *srcp = (Uint16 *) info->src; - int srcskip = info->src_skip >> 1; - Uint16 *dstp = (Uint16 *) info->dst; - int dstskip = info->dst_skip >> 1; - alpha >>= 3; /* downscale alpha to 5 bits */ - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4({ - Uint32 s = *srcp++; - Uint32 d = *dstp; - /* - * shift out the middle component (green) to - * the high 16 bits, and process all three RGB - * components at the same time. - */ - s = (s | s << 16) & 0x07e0f81f; - d = (d | d << 16) & 0x07e0f81f; - d += (s - d) * alpha >> 5; - d &= 0x07e0f81f; - *dstp++ = (Uint16)(d | d >> 16); - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } - } -} - -/* fast RGB555->RGB555 blending with surface alpha */ -static void -Blit555to555SurfaceAlpha(SDL_BlitInfo * info) -{ - unsigned alpha = info->a; /* downscale alpha to 5 bits */ - if (alpha == 128) { - Blit16to16SurfaceAlpha128(info, 0xfbde); - } else { - int width = info->dst_w; - int height = info->dst_h; - Uint16 *srcp = (Uint16 *) info->src; - int srcskip = info->src_skip >> 1; - Uint16 *dstp = (Uint16 *) info->dst; - int dstskip = info->dst_skip >> 1; - alpha >>= 3; /* downscale alpha to 5 bits */ - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4({ - Uint32 s = *srcp++; - Uint32 d = *dstp; - /* - * shift out the middle component (green) to - * the high 16 bits, and process all three RGB - * components at the same time. - */ - s = (s | s << 16) & 0x03e07c1f; - d = (d | d << 16) & 0x03e07c1f; - d += (s - d) * alpha >> 5; - d &= 0x03e07c1f; - *dstp++ = (Uint16)(d | d >> 16); - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } - } -} - -/* fast ARGB8888->RGB565 blending with pixel alpha */ -static void -BlitARGBto565PixelAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->src_skip >> 2; - Uint16 *dstp = (Uint16 *) info->dst; - int dstskip = info->dst_skip >> 1; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4({ - Uint32 s = *srcp; - unsigned alpha = s >> 27; /* downscale alpha to 5 bits */ - /* FIXME: Here we special-case opaque alpha since the - compositioning used (>>8 instead of /255) doesn't handle - it correctly. Also special-case alpha=0 for speed? - Benchmark this! */ - if(alpha) { - if(alpha == (SDL_ALPHA_OPAQUE >> 3)) { - *dstp = (Uint16)((s >> 8 & 0xf800) + (s >> 5 & 0x7e0) + (s >> 3 & 0x1f)); - } else { - Uint32 d = *dstp; - /* - * convert source and destination to G0RAB65565 - * and blend all components at the same time - */ - s = ((s & 0xfc00) << 11) + (s >> 8 & 0xf800) - + (s >> 3 & 0x1f); - d = (d | d << 16) & 0x07e0f81f; - d += (s - d) * alpha >> 5; - d &= 0x07e0f81f; - *dstp = (Uint16)(d | d >> 16); - } - } - srcp++; - dstp++; - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } -} - -/* fast ARGB8888->RGB555 blending with pixel alpha */ -static void -BlitARGBto555PixelAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->src_skip >> 2; - Uint16 *dstp = (Uint16 *) info->dst; - int dstskip = info->dst_skip >> 1; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4({ - unsigned alpha; - Uint32 s = *srcp; - alpha = s >> 27; /* downscale alpha to 5 bits */ - /* FIXME: Here we special-case opaque alpha since the - compositioning used (>>8 instead of /255) doesn't handle - it correctly. Also special-case alpha=0 for speed? - Benchmark this! */ - if(alpha) { - if(alpha == (SDL_ALPHA_OPAQUE >> 3)) { - *dstp = (Uint16)((s >> 9 & 0x7c00) + (s >> 6 & 0x3e0) + (s >> 3 & 0x1f)); - } else { - Uint32 d = *dstp; - /* - * convert source and destination to G0RAB65565 - * and blend all components at the same time - */ - s = ((s & 0xf800) << 10) + (s >> 9 & 0x7c00) - + (s >> 3 & 0x1f); - d = (d | d << 16) & 0x03e07c1f; - d += (s - d) * alpha >> 5; - d &= 0x03e07c1f; - *dstp = (Uint16)(d | d >> 16); - } - } - srcp++; - dstp++; - }, width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } -} - -/* General (slow) N->N blending with per-surface alpha */ -static void -BlitNtoNSurfaceAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int srcbpp = srcfmt->BytesPerPixel; - int dstbpp = dstfmt->BytesPerPixel; - Uint32 Pixel; - unsigned sR, sG, sB; - unsigned dR, dG, dB, dA; - const unsigned sA = info->a; - - if (sA) { - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4( - { - DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB); - DISEMBLE_RGBA(dst, dstbpp, dstfmt, Pixel, dR, dG, dB, dA); - ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA); - src += srcbpp; - dst += dstbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } - } -} - -/* General (slow) colorkeyed N->N blending with per-surface alpha */ -static void -BlitNtoNSurfaceAlphaKey(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - Uint32 ckey = info->colorkey; - int srcbpp = srcfmt->BytesPerPixel; - int dstbpp = dstfmt->BytesPerPixel; - Uint32 Pixel; - unsigned sR, sG, sB; - unsigned dR, dG, dB, dA; - const unsigned sA = info->a; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4( - { - RETRIEVE_RGB_PIXEL(src, srcbpp, Pixel); - if(sA && Pixel != ckey) { - RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB); - DISEMBLE_RGBA(dst, dstbpp, dstfmt, Pixel, dR, dG, dB, dA); - ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA); - } - src += srcbpp; - dst += dstbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -/* General (slow) N->N blending with pixel alpha */ -static void -BlitNtoNPixelAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int srcbpp; - int dstbpp; - Uint32 Pixel; - unsigned sR, sG, sB, sA; - unsigned dR, dG, dB, dA; - - /* Set up some basic variables */ - srcbpp = srcfmt->BytesPerPixel; - dstbpp = dstfmt->BytesPerPixel; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP4( - { - DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA); - if(sA) { - DISEMBLE_RGBA(dst, dstbpp, dstfmt, Pixel, dR, dG, dB, dA); - ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA); - } - src += srcbpp; - dst += dstbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - - -SDL_BlitFunc -SDL_CalculateBlitA(SDL_Surface * surface) -{ - SDL_PixelFormat *sf = surface->format; - SDL_PixelFormat *df = surface->map->dst->format; - - switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) { - case SDL_COPY_BLEND: - /* Per-pixel alpha blits */ - switch (df->BytesPerPixel) { - case 1: - return BlitNto1PixelAlpha; - - case 2: - if (sf->BytesPerPixel == 4 && sf->Amask == 0xff000000 - && sf->Gmask == 0xff00 - && ((sf->Rmask == 0xff && df->Rmask == 0x1f) - || (sf->Bmask == 0xff && df->Bmask == 0x1f))) { - if (df->Gmask == 0x7e0) - return BlitARGBto565PixelAlpha; - else if (df->Gmask == 0x3e0) - return BlitARGBto555PixelAlpha; - } - return BlitNtoNPixelAlpha; - - case 4: - if (sf->Rmask == df->Rmask - && sf->Gmask == df->Gmask - && sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) { -#if defined(__MMX__) || defined(__3dNOW__) - if (sf->Rshift % 8 == 0 - && sf->Gshift % 8 == 0 - && sf->Bshift % 8 == 0 - && sf->Ashift % 8 == 0 && sf->Aloss == 0) { -#ifdef __3dNOW__ - if (SDL_Has3DNow()) - return BlitRGBtoRGBPixelAlphaMMX3DNOW; -#endif -#ifdef __MMX__ - if (SDL_HasMMX()) - return BlitRGBtoRGBPixelAlphaMMX; -#endif - } -#endif /* __MMX__ || __3dNOW__ */ - if (sf->Amask == 0xff000000) { - return BlitRGBtoRGBPixelAlpha; - } - } - return BlitNtoNPixelAlpha; - - case 3: - default: - return BlitNtoNPixelAlpha; - } - break; - - case SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND: - if (sf->Amask == 0) { - /* Per-surface alpha blits */ - switch (df->BytesPerPixel) { - case 1: - return BlitNto1SurfaceAlpha; - - case 2: - if (surface->map->identity) { - if (df->Gmask == 0x7e0) { -#ifdef __MMX__ - if (SDL_HasMMX()) - return Blit565to565SurfaceAlphaMMX; - else -#endif - return Blit565to565SurfaceAlpha; - } else if (df->Gmask == 0x3e0) { -#ifdef __MMX__ - if (SDL_HasMMX()) - return Blit555to555SurfaceAlphaMMX; - else -#endif - return Blit555to555SurfaceAlpha; - } - } - return BlitNtoNSurfaceAlpha; - - case 4: - if (sf->Rmask == df->Rmask - && sf->Gmask == df->Gmask - && sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) { -#ifdef __MMX__ - if (sf->Rshift % 8 == 0 - && sf->Gshift % 8 == 0 - && sf->Bshift % 8 == 0 && SDL_HasMMX()) - return BlitRGBtoRGBSurfaceAlphaMMX; -#endif - if ((sf->Rmask | sf->Gmask | sf->Bmask) == 0xffffff) { - return BlitRGBtoRGBSurfaceAlpha; - } - } - return BlitNtoNSurfaceAlpha; - - case 3: - default: - return BlitNtoNSurfaceAlpha; - } - } - break; - - case SDL_COPY_COLORKEY | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND: - if (sf->Amask == 0) { - if (df->BytesPerPixel == 1) { - return BlitNto1SurfaceAlphaKey; - } else { - return BlitNtoNSurfaceAlphaKey; - } - } - break; - } - - return NULL; -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit_N.c b/3rdparty/SDL2/src/video/SDL_blit_N.c deleted file mode 100644 index 94894a78ca3..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit_N.c +++ /dev/null @@ -1,2637 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_video.h" -#include "SDL_endian.h" -#include "SDL_cpuinfo.h" -#include "SDL_blit.h" - -#include "SDL_assert.h" - -/* Functions to blit from N-bit surfaces to other surfaces */ - -#if SDL_ALTIVEC_BLITTERS -#ifdef HAVE_ALTIVEC_H -#include <altivec.h> -#endif -#ifdef __MACOSX__ -#include <sys/sysctl.h> -static size_t -GetL3CacheSize(void) -{ - const char key[] = "hw.l3cachesize"; - u_int64_t result = 0; - size_t typeSize = sizeof(result); - - - int err = sysctlbyname(key, &result, &typeSize, NULL, 0); - if (0 != err) - return 0; - - return result; -} -#else -static size_t -GetL3CacheSize(void) -{ - /* XXX: Just guess G4 */ - return 2097152; -} -#endif /* __MACOSX__ */ - -#if (defined(__MACOSX__) && (__GNUC__ < 4)) -#define VECUINT8_LITERAL(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \ - (vector unsigned char) ( a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p ) -#define VECUINT16_LITERAL(a,b,c,d,e,f,g,h) \ - (vector unsigned short) ( a,b,c,d,e,f,g,h ) -#else -#define VECUINT8_LITERAL(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \ - (vector unsigned char) { a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p } -#define VECUINT16_LITERAL(a,b,c,d,e,f,g,h) \ - (vector unsigned short) { a,b,c,d,e,f,g,h } -#endif - -#define UNALIGNED_PTR(x) (((size_t) x) & 0x0000000F) -#define VSWIZZLE32(a,b,c,d) (vector unsigned char) \ - ( 0x00+a, 0x00+b, 0x00+c, 0x00+d, \ - 0x04+a, 0x04+b, 0x04+c, 0x04+d, \ - 0x08+a, 0x08+b, 0x08+c, 0x08+d, \ - 0x0C+a, 0x0C+b, 0x0C+c, 0x0C+d ) - -#define MAKE8888(dstfmt, r, g, b, a) \ - ( ((r<<dstfmt->Rshift)&dstfmt->Rmask) | \ - ((g<<dstfmt->Gshift)&dstfmt->Gmask) | \ - ((b<<dstfmt->Bshift)&dstfmt->Bmask) | \ - ((a<<dstfmt->Ashift)&dstfmt->Amask) ) - -/* - * Data Stream Touch...Altivec cache prefetching. - * - * Don't use this on a G5...however, the speed boost is very significant - * on a G4. - */ -#define DST_CHAN_SRC 1 -#define DST_CHAN_DEST 2 - -/* macro to set DST control word value... */ -#define DST_CTRL(size, count, stride) \ - (((size) << 24) | ((count) << 16) | (stride)) - -#define VEC_ALIGNER(src) ((UNALIGNED_PTR(src)) \ - ? vec_lvsl(0, src) \ - : vec_add(vec_lvsl(8, src), vec_splat_u8(8))) - -/* Calculate the permute vector used for 32->32 swizzling */ -static vector unsigned char -calc_swizzle32(const SDL_PixelFormat * srcfmt, const SDL_PixelFormat * dstfmt) -{ - /* - * We have to assume that the bits that aren't used by other - * colors is alpha, and it's one complete byte, since some formats - * leave alpha with a zero mask, but we should still swizzle the bits. - */ - /* ARGB */ - const static const struct SDL_PixelFormat default_pixel_format = { - 0, NULL, 0, 0, - {0, 0}, - 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000, - 0, 0, 0, 0, - 16, 8, 0, 24, - 0, NULL - }; - if (!srcfmt) { - srcfmt = &default_pixel_format; - } - if (!dstfmt) { - dstfmt = &default_pixel_format; - } - const vector unsigned char plus = VECUINT8_LITERAL(0x00, 0x00, 0x00, 0x00, - 0x04, 0x04, 0x04, 0x04, - 0x08, 0x08, 0x08, 0x08, - 0x0C, 0x0C, 0x0C, - 0x0C); - vector unsigned char vswiz; - vector unsigned int srcvec; -#define RESHIFT(X) (3 - ((X) >> 3)) - Uint32 rmask = RESHIFT(srcfmt->Rshift) << (dstfmt->Rshift); - Uint32 gmask = RESHIFT(srcfmt->Gshift) << (dstfmt->Gshift); - Uint32 bmask = RESHIFT(srcfmt->Bshift) << (dstfmt->Bshift); - Uint32 amask; - /* Use zero for alpha if either surface doesn't have alpha */ - if (dstfmt->Amask) { - amask = - ((srcfmt->Amask) ? RESHIFT(srcfmt-> - Ashift) : 0x10) << (dstfmt->Ashift); - } else { - amask = - 0x10101010 & ((dstfmt->Rmask | dstfmt->Gmask | dstfmt->Bmask) ^ - 0xFFFFFFFF); - } -#undef RESHIFT - ((unsigned int *) (char *) &srcvec)[0] = (rmask | gmask | bmask | amask); - vswiz = vec_add(plus, (vector unsigned char) vec_splat(srcvec, 0)); - return (vswiz); -} - -static void Blit_RGB888_RGB565(SDL_BlitInfo * info); -static void -Blit_RGB888_RGB565Altivec(SDL_BlitInfo * info) -{ - int height = info->dst_h; - Uint8 *src = (Uint8 *) info->src; - int srcskip = info->src_skip; - Uint8 *dst = (Uint8 *) info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - vector unsigned char valpha = vec_splat_u8(0); - vector unsigned char vpermute = calc_swizzle32(srcfmt, NULL); - vector unsigned char vgmerge = VECUINT8_LITERAL(0x00, 0x02, 0x00, 0x06, - 0x00, 0x0a, 0x00, 0x0e, - 0x00, 0x12, 0x00, 0x16, - 0x00, 0x1a, 0x00, 0x1e); - vector unsigned short v1 = vec_splat_u16(1); - vector unsigned short v3 = vec_splat_u16(3); - vector unsigned short v3f = - VECUINT16_LITERAL(0x003f, 0x003f, 0x003f, 0x003f, - 0x003f, 0x003f, 0x003f, 0x003f); - vector unsigned short vfc = - VECUINT16_LITERAL(0x00fc, 0x00fc, 0x00fc, 0x00fc, - 0x00fc, 0x00fc, 0x00fc, 0x00fc); - vector unsigned short vf800 = (vector unsigned short) vec_splat_u8(-7); - vf800 = vec_sl(vf800, vec_splat_u16(8)); - - while (height--) { - vector unsigned char valigner; - vector unsigned char voverflow; - vector unsigned char vsrc; - - int width = info->dst_w; - int extrawidth; - - /* do scalar until we can align... */ -#define ONE_PIXEL_BLEND(condition, widthvar) \ - while (condition) { \ - Uint32 Pixel; \ - unsigned sR, sG, sB, sA; \ - DISEMBLE_RGBA((Uint8 *)src, 4, srcfmt, Pixel, \ - sR, sG, sB, sA); \ - *(Uint16 *)(dst) = (((sR << 8) & 0x0000F800) | \ - ((sG << 3) & 0x000007E0) | \ - ((sB >> 3) & 0x0000001F)); \ - dst += 2; \ - src += 4; \ - widthvar--; \ - } - - ONE_PIXEL_BLEND(((UNALIGNED_PTR(dst)) && (width)), width); - - /* After all that work, here's the vector part! */ - extrawidth = (width % 8); /* trailing unaligned stores */ - width -= extrawidth; - vsrc = vec_ld(0, src); - valigner = VEC_ALIGNER(src); - - while (width) { - vector unsigned short vpixel, vrpixel, vgpixel, vbpixel; - vector unsigned int vsrc1, vsrc2; - vector unsigned char vdst; - - voverflow = vec_ld(15, src); - vsrc = vec_perm(vsrc, voverflow, valigner); - vsrc1 = (vector unsigned int) vec_perm(vsrc, valpha, vpermute); - src += 16; - vsrc = voverflow; - voverflow = vec_ld(15, src); - vsrc = vec_perm(vsrc, voverflow, valigner); - vsrc2 = (vector unsigned int) vec_perm(vsrc, valpha, vpermute); - /* 1555 */ - vpixel = (vector unsigned short) vec_packpx(vsrc1, vsrc2); - vgpixel = (vector unsigned short) vec_perm(vsrc1, vsrc2, vgmerge); - vgpixel = vec_and(vgpixel, vfc); - vgpixel = vec_sl(vgpixel, v3); - vrpixel = vec_sl(vpixel, v1); - vrpixel = vec_and(vrpixel, vf800); - vbpixel = vec_and(vpixel, v3f); - vdst = - vec_or((vector unsigned char) vrpixel, - (vector unsigned char) vgpixel); - /* 565 */ - vdst = vec_or(vdst, (vector unsigned char) vbpixel); - vec_st(vdst, 0, dst); - - width -= 8; - src += 16; - dst += 16; - vsrc = voverflow; - } - - SDL_assert(width == 0); - - /* do scalar until we can align... */ - ONE_PIXEL_BLEND((extrawidth), extrawidth); -#undef ONE_PIXEL_BLEND - - src += srcskip; /* move to next row, accounting for pitch. */ - dst += dstskip; - } - - -} - -static void -Blit_RGB565_32Altivec(SDL_BlitInfo * info) -{ - int height = info->dst_h; - Uint8 *src = (Uint8 *) info->src; - int srcskip = info->src_skip; - Uint8 *dst = (Uint8 *) info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - unsigned alpha; - vector unsigned char valpha; - vector unsigned char vpermute; - vector unsigned short vf800; - vector unsigned int v8 = vec_splat_u32(8); - vector unsigned int v16 = vec_add(v8, v8); - vector unsigned short v2 = vec_splat_u16(2); - vector unsigned short v3 = vec_splat_u16(3); - /* - 0x10 - 0x1f is the alpha - 0x00 - 0x0e evens are the red - 0x01 - 0x0f odds are zero - */ - vector unsigned char vredalpha1 = VECUINT8_LITERAL(0x10, 0x00, 0x01, 0x01, - 0x10, 0x02, 0x01, 0x01, - 0x10, 0x04, 0x01, 0x01, - 0x10, 0x06, 0x01, - 0x01); - vector unsigned char vredalpha2 = - (vector unsigned - char) (vec_add((vector unsigned int) vredalpha1, vec_sl(v8, v16)) - ); - /* - 0x00 - 0x0f is ARxx ARxx ARxx ARxx - 0x11 - 0x0f odds are blue - */ - vector unsigned char vblue1 = VECUINT8_LITERAL(0x00, 0x01, 0x02, 0x11, - 0x04, 0x05, 0x06, 0x13, - 0x08, 0x09, 0x0a, 0x15, - 0x0c, 0x0d, 0x0e, 0x17); - vector unsigned char vblue2 = - (vector unsigned char) (vec_add((vector unsigned int) vblue1, v8) - ); - /* - 0x00 - 0x0f is ARxB ARxB ARxB ARxB - 0x10 - 0x0e evens are green - */ - vector unsigned char vgreen1 = VECUINT8_LITERAL(0x00, 0x01, 0x10, 0x03, - 0x04, 0x05, 0x12, 0x07, - 0x08, 0x09, 0x14, 0x0b, - 0x0c, 0x0d, 0x16, 0x0f); - vector unsigned char vgreen2 = - (vector unsigned - char) (vec_add((vector unsigned int) vgreen1, vec_sl(v8, v8)) - ); - - SDL_assert(srcfmt->BytesPerPixel == 2); - SDL_assert(dstfmt->BytesPerPixel == 4); - - vf800 = (vector unsigned short) vec_splat_u8(-7); - vf800 = vec_sl(vf800, vec_splat_u16(8)); - - if (dstfmt->Amask && info->a) { - ((unsigned char *) &valpha)[0] = alpha = info->a; - valpha = vec_splat(valpha, 0); - } else { - alpha = 0; - valpha = vec_splat_u8(0); - } - - vpermute = calc_swizzle32(NULL, dstfmt); - while (height--) { - vector unsigned char valigner; - vector unsigned char voverflow; - vector unsigned char vsrc; - - int width = info->dst_w; - int extrawidth; - - /* do scalar until we can align... */ -#define ONE_PIXEL_BLEND(condition, widthvar) \ - while (condition) { \ - unsigned sR, sG, sB; \ - unsigned short Pixel = *((unsigned short *)src); \ - sR = (Pixel >> 8) & 0xf8; \ - sG = (Pixel >> 3) & 0xfc; \ - sB = (Pixel << 3) & 0xf8; \ - ASSEMBLE_RGBA(dst, 4, dstfmt, sR, sG, sB, alpha); \ - src += 2; \ - dst += 4; \ - widthvar--; \ - } - ONE_PIXEL_BLEND(((UNALIGNED_PTR(dst)) && (width)), width); - - /* After all that work, here's the vector part! */ - extrawidth = (width % 8); /* trailing unaligned stores */ - width -= extrawidth; - vsrc = vec_ld(0, src); - valigner = VEC_ALIGNER(src); - - while (width) { - vector unsigned short vR, vG, vB; - vector unsigned char vdst1, vdst2; - - voverflow = vec_ld(15, src); - vsrc = vec_perm(vsrc, voverflow, valigner); - - vR = vec_and((vector unsigned short) vsrc, vf800); - vB = vec_sl((vector unsigned short) vsrc, v3); - vG = vec_sl(vB, v2); - - vdst1 = - (vector unsigned char) vec_perm((vector unsigned char) vR, - valpha, vredalpha1); - vdst1 = vec_perm(vdst1, (vector unsigned char) vB, vblue1); - vdst1 = vec_perm(vdst1, (vector unsigned char) vG, vgreen1); - vdst1 = vec_perm(vdst1, valpha, vpermute); - vec_st(vdst1, 0, dst); - - vdst2 = - (vector unsigned char) vec_perm((vector unsigned char) vR, - valpha, vredalpha2); - vdst2 = vec_perm(vdst2, (vector unsigned char) vB, vblue2); - vdst2 = vec_perm(vdst2, (vector unsigned char) vG, vgreen2); - vdst2 = vec_perm(vdst2, valpha, vpermute); - vec_st(vdst2, 16, dst); - - width -= 8; - dst += 32; - src += 16; - vsrc = voverflow; - } - - SDL_assert(width == 0); - - - /* do scalar until we can align... */ - ONE_PIXEL_BLEND((extrawidth), extrawidth); -#undef ONE_PIXEL_BLEND - - src += srcskip; /* move to next row, accounting for pitch. */ - dst += dstskip; - } - -} - - -static void -Blit_RGB555_32Altivec(SDL_BlitInfo * info) -{ - int height = info->dst_h; - Uint8 *src = (Uint8 *) info->src; - int srcskip = info->src_skip; - Uint8 *dst = (Uint8 *) info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - unsigned alpha; - vector unsigned char valpha; - vector unsigned char vpermute; - vector unsigned short vf800; - vector unsigned int v8 = vec_splat_u32(8); - vector unsigned int v16 = vec_add(v8, v8); - vector unsigned short v1 = vec_splat_u16(1); - vector unsigned short v3 = vec_splat_u16(3); - /* - 0x10 - 0x1f is the alpha - 0x00 - 0x0e evens are the red - 0x01 - 0x0f odds are zero - */ - vector unsigned char vredalpha1 = VECUINT8_LITERAL(0x10, 0x00, 0x01, 0x01, - 0x10, 0x02, 0x01, 0x01, - 0x10, 0x04, 0x01, 0x01, - 0x10, 0x06, 0x01, - 0x01); - vector unsigned char vredalpha2 = - (vector unsigned - char) (vec_add((vector unsigned int) vredalpha1, vec_sl(v8, v16)) - ); - /* - 0x00 - 0x0f is ARxx ARxx ARxx ARxx - 0x11 - 0x0f odds are blue - */ - vector unsigned char vblue1 = VECUINT8_LITERAL(0x00, 0x01, 0x02, 0x11, - 0x04, 0x05, 0x06, 0x13, - 0x08, 0x09, 0x0a, 0x15, - 0x0c, 0x0d, 0x0e, 0x17); - vector unsigned char vblue2 = - (vector unsigned char) (vec_add((vector unsigned int) vblue1, v8) - ); - /* - 0x00 - 0x0f is ARxB ARxB ARxB ARxB - 0x10 - 0x0e evens are green - */ - vector unsigned char vgreen1 = VECUINT8_LITERAL(0x00, 0x01, 0x10, 0x03, - 0x04, 0x05, 0x12, 0x07, - 0x08, 0x09, 0x14, 0x0b, - 0x0c, 0x0d, 0x16, 0x0f); - vector unsigned char vgreen2 = - (vector unsigned - char) (vec_add((vector unsigned int) vgreen1, vec_sl(v8, v8)) - ); - - SDL_assert(srcfmt->BytesPerPixel == 2); - SDL_assert(dstfmt->BytesPerPixel == 4); - - vf800 = (vector unsigned short) vec_splat_u8(-7); - vf800 = vec_sl(vf800, vec_splat_u16(8)); - - if (dstfmt->Amask && info->a) { - ((unsigned char *) &valpha)[0] = alpha = info->a; - valpha = vec_splat(valpha, 0); - } else { - alpha = 0; - valpha = vec_splat_u8(0); - } - - vpermute = calc_swizzle32(NULL, dstfmt); - while (height--) { - vector unsigned char valigner; - vector unsigned char voverflow; - vector unsigned char vsrc; - - int width = info->dst_w; - int extrawidth; - - /* do scalar until we can align... */ -#define ONE_PIXEL_BLEND(condition, widthvar) \ - while (condition) { \ - unsigned sR, sG, sB; \ - unsigned short Pixel = *((unsigned short *)src); \ - sR = (Pixel >> 7) & 0xf8; \ - sG = (Pixel >> 2) & 0xf8; \ - sB = (Pixel << 3) & 0xf8; \ - ASSEMBLE_RGBA(dst, 4, dstfmt, sR, sG, sB, alpha); \ - src += 2; \ - dst += 4; \ - widthvar--; \ - } - ONE_PIXEL_BLEND(((UNALIGNED_PTR(dst)) && (width)), width); - - /* After all that work, here's the vector part! */ - extrawidth = (width % 8); /* trailing unaligned stores */ - width -= extrawidth; - vsrc = vec_ld(0, src); - valigner = VEC_ALIGNER(src); - - while (width) { - vector unsigned short vR, vG, vB; - vector unsigned char vdst1, vdst2; - - voverflow = vec_ld(15, src); - vsrc = vec_perm(vsrc, voverflow, valigner); - - vR = vec_and(vec_sl((vector unsigned short) vsrc, v1), vf800); - vB = vec_sl((vector unsigned short) vsrc, v3); - vG = vec_sl(vB, v3); - - vdst1 = - (vector unsigned char) vec_perm((vector unsigned char) vR, - valpha, vredalpha1); - vdst1 = vec_perm(vdst1, (vector unsigned char) vB, vblue1); - vdst1 = vec_perm(vdst1, (vector unsigned char) vG, vgreen1); - vdst1 = vec_perm(vdst1, valpha, vpermute); - vec_st(vdst1, 0, dst); - - vdst2 = - (vector unsigned char) vec_perm((vector unsigned char) vR, - valpha, vredalpha2); - vdst2 = vec_perm(vdst2, (vector unsigned char) vB, vblue2); - vdst2 = vec_perm(vdst2, (vector unsigned char) vG, vgreen2); - vdst2 = vec_perm(vdst2, valpha, vpermute); - vec_st(vdst2, 16, dst); - - width -= 8; - dst += 32; - src += 16; - vsrc = voverflow; - } - - SDL_assert(width == 0); - - - /* do scalar until we can align... */ - ONE_PIXEL_BLEND((extrawidth), extrawidth); -#undef ONE_PIXEL_BLEND - - src += srcskip; /* move to next row, accounting for pitch. */ - dst += dstskip; - } - -} - -static void BlitNtoNKey(SDL_BlitInfo * info); -static void BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info); -static void -Blit32to32KeyAltivec(SDL_BlitInfo * info) -{ - int height = info->dst_h; - Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->src_skip / 4; - Uint32 *dstp = (Uint32 *) info->dst; - int dstskip = info->dst_skip / 4; - SDL_PixelFormat *srcfmt = info->src_fmt; - int srcbpp = srcfmt->BytesPerPixel; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int dstbpp = dstfmt->BytesPerPixel; - int copy_alpha = (srcfmt->Amask && dstfmt->Amask); - unsigned alpha = dstfmt->Amask ? info->a : 0; - Uint32 rgbmask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask; - Uint32 ckey = info->colorkey; - vector unsigned int valpha; - vector unsigned char vpermute; - vector unsigned char vzero; - vector unsigned int vckey; - vector unsigned int vrgbmask; - vpermute = calc_swizzle32(srcfmt, dstfmt); - if (info->dst_w < 16) { - if (copy_alpha) { - BlitNtoNKeyCopyAlpha(info); - } else { - BlitNtoNKey(info); - } - return; - } - vzero = vec_splat_u8(0); - if (alpha) { - ((unsigned char *) &valpha)[0] = (unsigned char) alpha; - valpha = - (vector unsigned int) vec_splat((vector unsigned char) valpha, 0); - } else { - valpha = (vector unsigned int) vzero; - } - ckey &= rgbmask; - ((unsigned int *) (char *) &vckey)[0] = ckey; - vckey = vec_splat(vckey, 0); - ((unsigned int *) (char *) &vrgbmask)[0] = rgbmask; - vrgbmask = vec_splat(vrgbmask, 0); - - while (height--) { -#define ONE_PIXEL_BLEND(condition, widthvar) \ - if (copy_alpha) { \ - while (condition) { \ - Uint32 Pixel; \ - unsigned sR, sG, sB, sA; \ - DISEMBLE_RGBA((Uint8 *)srcp, srcbpp, srcfmt, Pixel, \ - sR, sG, sB, sA); \ - if ( (Pixel & rgbmask) != ckey ) { \ - ASSEMBLE_RGBA((Uint8 *)dstp, dstbpp, dstfmt, \ - sR, sG, sB, sA); \ - } \ - dstp = (Uint32 *) (((Uint8 *) dstp) + dstbpp); \ - srcp = (Uint32 *) (((Uint8 *) srcp) + srcbpp); \ - widthvar--; \ - } \ - } else { \ - while (condition) { \ - Uint32 Pixel; \ - unsigned sR, sG, sB; \ - RETRIEVE_RGB_PIXEL((Uint8 *)srcp, srcbpp, Pixel); \ - if ( Pixel != ckey ) { \ - RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB); \ - ASSEMBLE_RGBA((Uint8 *)dstp, dstbpp, dstfmt, \ - sR, sG, sB, alpha); \ - } \ - dstp = (Uint32 *) (((Uint8 *)dstp) + dstbpp); \ - srcp = (Uint32 *) (((Uint8 *)srcp) + srcbpp); \ - widthvar--; \ - } \ - } - int width = info->dst_w; - ONE_PIXEL_BLEND((UNALIGNED_PTR(dstp)) && (width), width); - SDL_assert(width > 0); - if (width > 0) { - int extrawidth = (width % 4); - vector unsigned char valigner = VEC_ALIGNER(srcp); - vector unsigned int vs = vec_ld(0, srcp); - width -= extrawidth; - SDL_assert(width >= 4); - while (width) { - vector unsigned char vsel; - vector unsigned int vd; - vector unsigned int voverflow = vec_ld(15, srcp); - /* load the source vec */ - vs = vec_perm(vs, voverflow, valigner); - /* vsel is set for items that match the key */ - vsel = (vector unsigned char) vec_and(vs, vrgbmask); - vsel = (vector unsigned char) vec_cmpeq(vs, vckey); - /* permute the src vec to the dest format */ - vs = vec_perm(vs, valpha, vpermute); - /* load the destination vec */ - vd = vec_ld(0, dstp); - /* select the source and dest into vs */ - vd = (vector unsigned int) vec_sel((vector unsigned char) vs, - (vector unsigned char) vd, - vsel); - - vec_st(vd, 0, dstp); - srcp += 4; - width -= 4; - dstp += 4; - vs = voverflow; - } - ONE_PIXEL_BLEND((extrawidth), extrawidth); -#undef ONE_PIXEL_BLEND - srcp += srcskip; - dstp += dstskip; - } - } -} - -/* Altivec code to swizzle one 32-bit surface to a different 32-bit format. */ -/* Use this on a G5 */ -static void -ConvertAltivec32to32_noprefetch(SDL_BlitInfo * info) -{ - int height = info->dst_h; - Uint32 *src = (Uint32 *) info->src; - int srcskip = info->src_skip / 4; - Uint32 *dst = (Uint32 *) info->dst; - int dstskip = info->dst_skip / 4; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - vector unsigned int vzero = vec_splat_u32(0); - vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt); - if (dstfmt->Amask && !srcfmt->Amask) { - if (info->a) { - vector unsigned char valpha; - ((unsigned char *) &valpha)[0] = info->a; - vzero = (vector unsigned int) vec_splat(valpha, 0); - } - } - - SDL_assert(srcfmt->BytesPerPixel == 4); - SDL_assert(dstfmt->BytesPerPixel == 4); - - while (height--) { - vector unsigned char valigner; - vector unsigned int vbits; - vector unsigned int voverflow; - Uint32 bits; - Uint8 r, g, b, a; - - int width = info->dst_w; - int extrawidth; - - /* do scalar until we can align... */ - while ((UNALIGNED_PTR(dst)) && (width)) { - bits = *(src++); - RGBA_FROM_8888(bits, srcfmt, r, g, b, a); - if(!srcfmt->Amask) - a = info->a; - *(dst++) = MAKE8888(dstfmt, r, g, b, a); - width--; - } - - /* After all that work, here's the vector part! */ - extrawidth = (width % 4); - width -= extrawidth; - valigner = VEC_ALIGNER(src); - vbits = vec_ld(0, src); - - while (width) { - voverflow = vec_ld(15, src); - src += 4; - width -= 4; - vbits = vec_perm(vbits, voverflow, valigner); /* src is ready. */ - vbits = vec_perm(vbits, vzero, vpermute); /* swizzle it. */ - vec_st(vbits, 0, dst); /* store it back out. */ - dst += 4; - vbits = voverflow; - } - - SDL_assert(width == 0); - - /* cover pixels at the end of the row that didn't fit in 16 bytes. */ - while (extrawidth) { - bits = *(src++); /* max 7 pixels, don't bother with prefetch. */ - RGBA_FROM_8888(bits, srcfmt, r, g, b, a); - if(!srcfmt->Amask) - a = info->a; - *(dst++) = MAKE8888(dstfmt, r, g, b, a); - extrawidth--; - } - - src += srcskip; - dst += dstskip; - } - -} - -/* Altivec code to swizzle one 32-bit surface to a different 32-bit format. */ -/* Use this on a G4 */ -static void -ConvertAltivec32to32_prefetch(SDL_BlitInfo * info) -{ - const int scalar_dst_lead = sizeof(Uint32) * 4; - const int vector_dst_lead = sizeof(Uint32) * 16; - - int height = info->dst_h; - Uint32 *src = (Uint32 *) info->src; - int srcskip = info->src_skip / 4; - Uint32 *dst = (Uint32 *) info->dst; - int dstskip = info->dst_skip / 4; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - vector unsigned int vzero = vec_splat_u32(0); - vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt); - if (dstfmt->Amask && !srcfmt->Amask) { - if (info->a) { - vector unsigned char valpha; - ((unsigned char *) &valpha)[0] = info->a; - vzero = (vector unsigned int) vec_splat(valpha, 0); - } - } - - SDL_assert(srcfmt->BytesPerPixel == 4); - SDL_assert(dstfmt->BytesPerPixel == 4); - - while (height--) { - vector unsigned char valigner; - vector unsigned int vbits; - vector unsigned int voverflow; - Uint32 bits; - Uint8 r, g, b, a; - - int width = info->dst_w; - int extrawidth; - - /* do scalar until we can align... */ - while ((UNALIGNED_PTR(dst)) && (width)) { - vec_dstt(src + scalar_dst_lead, DST_CTRL(2, 32, 1024), - DST_CHAN_SRC); - vec_dstst(dst + scalar_dst_lead, DST_CTRL(2, 32, 1024), - DST_CHAN_DEST); - bits = *(src++); - RGBA_FROM_8888(bits, srcfmt, r, g, b, a); - if(!srcfmt->Amask) - a = info->a; - *(dst++) = MAKE8888(dstfmt, r, g, b, a); - width--; - } - - /* After all that work, here's the vector part! */ - extrawidth = (width % 4); - width -= extrawidth; - valigner = VEC_ALIGNER(src); - vbits = vec_ld(0, src); - - while (width) { - vec_dstt(src + vector_dst_lead, DST_CTRL(2, 32, 1024), - DST_CHAN_SRC); - vec_dstst(dst + vector_dst_lead, DST_CTRL(2, 32, 1024), - DST_CHAN_DEST); - voverflow = vec_ld(15, src); - src += 4; - width -= 4; - vbits = vec_perm(vbits, voverflow, valigner); /* src is ready. */ - vbits = vec_perm(vbits, vzero, vpermute); /* swizzle it. */ - vec_st(vbits, 0, dst); /* store it back out. */ - dst += 4; - vbits = voverflow; - } - - SDL_assert(width == 0); - - /* cover pixels at the end of the row that didn't fit in 16 bytes. */ - while (extrawidth) { - bits = *(src++); /* max 7 pixels, don't bother with prefetch. */ - RGBA_FROM_8888(bits, srcfmt, r, g, b, a); - if(!srcfmt->Amask) - a = info->a; - *(dst++) = MAKE8888(dstfmt, r, g, b, a); - extrawidth--; - } - - src += srcskip; - dst += dstskip; - } - - vec_dss(DST_CHAN_SRC); - vec_dss(DST_CHAN_DEST); -} - -static Uint32 -GetBlitFeatures(void) -{ - static Uint32 features = 0xffffffff; - if (features == 0xffffffff) { - /* Provide an override for testing .. */ - char *override = SDL_getenv("SDL_ALTIVEC_BLIT_FEATURES"); - if (override) { - features = 0; - SDL_sscanf(override, "%u", &features); - } else { - features = (0 - /* Feature 1 is has-MMX */ - | ((SDL_HasMMX())? 1 : 0) - /* Feature 2 is has-AltiVec */ - | ((SDL_HasAltiVec())? 2 : 0) - /* Feature 4 is dont-use-prefetch */ - /* !!!! FIXME: Check for G5 or later, not the cache size! Always prefetch on a G4. */ - | ((GetL3CacheSize() == 0) ? 4 : 0) - ); - } - } - return features; -} - -#if __MWERKS__ -#pragma altivec_model off -#endif -#else -/* Feature 1 is has-MMX */ -#define GetBlitFeatures() ((Uint32)(SDL_HasMMX() ? 1 : 0)) -#endif - -/* This is now endian dependent */ -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define HI 1 -#define LO 0 -#else /* SDL_BYTEORDER == SDL_BIG_ENDIAN */ -#define HI 0 -#define LO 1 -#endif - -/* Special optimized blit for RGB 8-8-8 --> RGB 3-3-2 */ -#define RGB888_RGB332(dst, src) { \ - dst = (Uint8)((((src)&0x00E00000)>>16)| \ - (((src)&0x0000E000)>>11)| \ - (((src)&0x000000C0)>>6)); \ -} -static void -Blit_RGB888_index8(SDL_BlitInfo * info) -{ -#ifndef USE_DUFFS_LOOP - int c; -#endif - int width, height; - Uint32 *src; - const Uint8 *map; - Uint8 *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = (Uint32 *) info->src; - srcskip = info->src_skip / 4; - dst = info->dst; - dstskip = info->dst_skip; - map = info->table; - - if (map == NULL) { - while (height--) { -#ifdef USE_DUFFS_LOOP - /* *INDENT-OFF* */ - DUFFS_LOOP( - RGB888_RGB332(*dst++, *src); - , width); - /* *INDENT-ON* */ -#else - for (c = width / 4; c; --c) { - /* Pack RGB into 8bit pixel */ - ++src; - RGB888_RGB332(*dst++, *src); - ++src; - RGB888_RGB332(*dst++, *src); - ++src; - RGB888_RGB332(*dst++, *src); - ++src; - } - switch (width & 3) { - case 3: - RGB888_RGB332(*dst++, *src); - ++src; - case 2: - RGB888_RGB332(*dst++, *src); - ++src; - case 1: - RGB888_RGB332(*dst++, *src); - ++src; - } -#endif /* USE_DUFFS_LOOP */ - src += srcskip; - dst += dstskip; - } - } else { - int Pixel; - - while (height--) { -#ifdef USE_DUFFS_LOOP - /* *INDENT-OFF* */ - DUFFS_LOOP( - RGB888_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - , width); - /* *INDENT-ON* */ -#else - for (c = width / 4; c; --c) { - /* Pack RGB into 8bit pixel */ - RGB888_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - RGB888_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - RGB888_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - RGB888_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - } - switch (width & 3) { - case 3: - RGB888_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - case 2: - RGB888_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - case 1: - RGB888_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - } -#endif /* USE_DUFFS_LOOP */ - src += srcskip; - dst += dstskip; - } - } -} - -/* Special optimized blit for RGB 10-10-10 --> RGB 3-3-2 */ -#define RGB101010_RGB332(dst, src) { \ - dst = (Uint8)((((src)&0x38000000)>>22)| \ - (((src)&0x000E0000)>>15)| \ - (((src)&0x00000300)>>8)); \ -} -static void -Blit_RGB101010_index8(SDL_BlitInfo * info) -{ -#ifndef USE_DUFFS_LOOP - int c; -#endif - int width, height; - Uint32 *src; - const Uint8 *map; - Uint8 *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = (Uint32 *) info->src; - srcskip = info->src_skip / 4; - dst = info->dst; - dstskip = info->dst_skip; - map = info->table; - - if (map == NULL) { - while (height--) { -#ifdef USE_DUFFS_LOOP - /* *INDENT-OFF* */ - DUFFS_LOOP( - RGB101010_RGB332(*dst++, *src); - , width); - /* *INDENT-ON* */ -#else - for (c = width / 4; c; --c) { - /* Pack RGB into 8bit pixel */ - ++src; - RGB101010_RGB332(*dst++, *src); - ++src; - RGB101010_RGB332(*dst++, *src); - ++src; - RGB101010_RGB332(*dst++, *src); - ++src; - } - switch (width & 3) { - case 3: - RGB101010_RGB332(*dst++, *src); - ++src; - case 2: - RGB101010_RGB332(*dst++, *src); - ++src; - case 1: - RGB101010_RGB332(*dst++, *src); - ++src; - } -#endif /* USE_DUFFS_LOOP */ - src += srcskip; - dst += dstskip; - } - } else { - int Pixel; - - while (height--) { -#ifdef USE_DUFFS_LOOP - /* *INDENT-OFF* */ - DUFFS_LOOP( - RGB101010_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - , width); - /* *INDENT-ON* */ -#else - for (c = width / 4; c; --c) { - /* Pack RGB into 8bit pixel */ - RGB101010_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - RGB101010_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - RGB101010_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - RGB101010_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - } - switch (width & 3) { - case 3: - RGB101010_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - case 2: - RGB101010_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - case 1: - RGB101010_RGB332(Pixel, *src); - *dst++ = map[Pixel]; - ++src; - } -#endif /* USE_DUFFS_LOOP */ - src += srcskip; - dst += dstskip; - } - } -} - -/* Special optimized blit for RGB 8-8-8 --> RGB 5-5-5 */ -#define RGB888_RGB555(dst, src) { \ - *(Uint16 *)(dst) = (Uint16)((((*src)&0x00F80000)>>9)| \ - (((*src)&0x0000F800)>>6)| \ - (((*src)&0x000000F8)>>3)); \ -} -#define RGB888_RGB555_TWO(dst, src) { \ - *(Uint32 *)(dst) = (((((src[HI])&0x00F80000)>>9)| \ - (((src[HI])&0x0000F800)>>6)| \ - (((src[HI])&0x000000F8)>>3))<<16)| \ - (((src[LO])&0x00F80000)>>9)| \ - (((src[LO])&0x0000F800)>>6)| \ - (((src[LO])&0x000000F8)>>3); \ -} -static void -Blit_RGB888_RGB555(SDL_BlitInfo * info) -{ -#ifndef USE_DUFFS_LOOP - int c; -#endif - int width, height; - Uint32 *src; - Uint16 *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = (Uint32 *) info->src; - srcskip = info->src_skip / 4; - dst = (Uint16 *) info->dst; - dstskip = info->dst_skip / 2; - -#ifdef USE_DUFFS_LOOP - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - RGB888_RGB555(dst, src); - ++src; - ++dst; - , width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -#else - /* Memory align at 4-byte boundary, if necessary */ - if ((long) dst & 0x03) { - /* Don't do anything if width is 0 */ - if (width == 0) { - return; - } - --width; - - while (height--) { - /* Perform copy alignment */ - RGB888_RGB555(dst, src); - ++src; - ++dst; - - /* Copy in 4 pixel chunks */ - for (c = width / 4; c; --c) { - RGB888_RGB555_TWO(dst, src); - src += 2; - dst += 2; - RGB888_RGB555_TWO(dst, src); - src += 2; - dst += 2; - } - /* Get any leftovers */ - switch (width & 3) { - case 3: - RGB888_RGB555(dst, src); - ++src; - ++dst; - case 2: - RGB888_RGB555_TWO(dst, src); - src += 2; - dst += 2; - break; - case 1: - RGB888_RGB555(dst, src); - ++src; - ++dst; - break; - } - src += srcskip; - dst += dstskip; - } - } else { - while (height--) { - /* Copy in 4 pixel chunks */ - for (c = width / 4; c; --c) { - RGB888_RGB555_TWO(dst, src); - src += 2; - dst += 2; - RGB888_RGB555_TWO(dst, src); - src += 2; - dst += 2; - } - /* Get any leftovers */ - switch (width & 3) { - case 3: - RGB888_RGB555(dst, src); - ++src; - ++dst; - case 2: - RGB888_RGB555_TWO(dst, src); - src += 2; - dst += 2; - break; - case 1: - RGB888_RGB555(dst, src); - ++src; - ++dst; - break; - } - src += srcskip; - dst += dstskip; - } - } -#endif /* USE_DUFFS_LOOP */ -} - -/* Special optimized blit for RGB 8-8-8 --> RGB 5-6-5 */ -#define RGB888_RGB565(dst, src) { \ - *(Uint16 *)(dst) = (Uint16)((((*src)&0x00F80000)>>8)| \ - (((*src)&0x0000FC00)>>5)| \ - (((*src)&0x000000F8)>>3)); \ -} -#define RGB888_RGB565_TWO(dst, src) { \ - *(Uint32 *)(dst) = (((((src[HI])&0x00F80000)>>8)| \ - (((src[HI])&0x0000FC00)>>5)| \ - (((src[HI])&0x000000F8)>>3))<<16)| \ - (((src[LO])&0x00F80000)>>8)| \ - (((src[LO])&0x0000FC00)>>5)| \ - (((src[LO])&0x000000F8)>>3); \ -} -static void -Blit_RGB888_RGB565(SDL_BlitInfo * info) -{ -#ifndef USE_DUFFS_LOOP - int c; -#endif - int width, height; - Uint32 *src; - Uint16 *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = (Uint32 *) info->src; - srcskip = info->src_skip / 4; - dst = (Uint16 *) info->dst; - dstskip = info->dst_skip / 2; - -#ifdef USE_DUFFS_LOOP - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - RGB888_RGB565(dst, src); - ++src; - ++dst; - , width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -#else - /* Memory align at 4-byte boundary, if necessary */ - if ((long) dst & 0x03) { - /* Don't do anything if width is 0 */ - if (width == 0) { - return; - } - --width; - - while (height--) { - /* Perform copy alignment */ - RGB888_RGB565(dst, src); - ++src; - ++dst; - - /* Copy in 4 pixel chunks */ - for (c = width / 4; c; --c) { - RGB888_RGB565_TWO(dst, src); - src += 2; - dst += 2; - RGB888_RGB565_TWO(dst, src); - src += 2; - dst += 2; - } - /* Get any leftovers */ - switch (width & 3) { - case 3: - RGB888_RGB565(dst, src); - ++src; - ++dst; - case 2: - RGB888_RGB565_TWO(dst, src); - src += 2; - dst += 2; - break; - case 1: - RGB888_RGB565(dst, src); - ++src; - ++dst; - break; - } - src += srcskip; - dst += dstskip; - } - } else { - while (height--) { - /* Copy in 4 pixel chunks */ - for (c = width / 4; c; --c) { - RGB888_RGB565_TWO(dst, src); - src += 2; - dst += 2; - RGB888_RGB565_TWO(dst, src); - src += 2; - dst += 2; - } - /* Get any leftovers */ - switch (width & 3) { - case 3: - RGB888_RGB565(dst, src); - ++src; - ++dst; - case 2: - RGB888_RGB565_TWO(dst, src); - src += 2; - dst += 2; - break; - case 1: - RGB888_RGB565(dst, src); - ++src; - ++dst; - break; - } - src += srcskip; - dst += dstskip; - } - } -#endif /* USE_DUFFS_LOOP */ -} - - -/* Special optimized blit for RGB 5-6-5 --> 32-bit RGB surfaces */ -#define RGB565_32(dst, src, map) (map[src[LO]*2] + map[src[HI]*2+1]) -static void -Blit_RGB565_32(SDL_BlitInfo * info, const Uint32 * map) -{ -#ifndef USE_DUFFS_LOOP - int c; -#endif - int width, height; - Uint8 *src; - Uint32 *dst; - int srcskip, dstskip; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = (Uint8 *) info->src; - srcskip = info->src_skip; - dst = (Uint32 *) info->dst; - dstskip = info->dst_skip / 4; - -#ifdef USE_DUFFS_LOOP - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - *dst++ = RGB565_32(dst, src, map); - src += 2; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -#else - while (height--) { - /* Copy in 4 pixel chunks */ - for (c = width / 4; c; --c) { - *dst++ = RGB565_32(dst, src, map); - src += 2; - *dst++ = RGB565_32(dst, src, map); - src += 2; - *dst++ = RGB565_32(dst, src, map); - src += 2; - *dst++ = RGB565_32(dst, src, map); - src += 2; - } - /* Get any leftovers */ - switch (width & 3) { - case 3: - *dst++ = RGB565_32(dst, src, map); - src += 2; - case 2: - *dst++ = RGB565_32(dst, src, map); - src += 2; - case 1: - *dst++ = RGB565_32(dst, src, map); - src += 2; - break; - } - src += srcskip; - dst += dstskip; - } -#endif /* USE_DUFFS_LOOP */ -} - -/* Special optimized blit for RGB 5-6-5 --> ARGB 8-8-8-8 */ -static const Uint32 RGB565_ARGB8888_LUT[512] = { - 0x00000000, 0xff000000, 0x00000008, 0xff002000, - 0x00000010, 0xff004000, 0x00000018, 0xff006100, - 0x00000020, 0xff008100, 0x00000029, 0xff00a100, - 0x00000031, 0xff00c200, 0x00000039, 0xff00e200, - 0x00000041, 0xff080000, 0x0000004a, 0xff082000, - 0x00000052, 0xff084000, 0x0000005a, 0xff086100, - 0x00000062, 0xff088100, 0x0000006a, 0xff08a100, - 0x00000073, 0xff08c200, 0x0000007b, 0xff08e200, - 0x00000083, 0xff100000, 0x0000008b, 0xff102000, - 0x00000094, 0xff104000, 0x0000009c, 0xff106100, - 0x000000a4, 0xff108100, 0x000000ac, 0xff10a100, - 0x000000b4, 0xff10c200, 0x000000bd, 0xff10e200, - 0x000000c5, 0xff180000, 0x000000cd, 0xff182000, - 0x000000d5, 0xff184000, 0x000000de, 0xff186100, - 0x000000e6, 0xff188100, 0x000000ee, 0xff18a100, - 0x000000f6, 0xff18c200, 0x000000ff, 0xff18e200, - 0x00000400, 0xff200000, 0x00000408, 0xff202000, - 0x00000410, 0xff204000, 0x00000418, 0xff206100, - 0x00000420, 0xff208100, 0x00000429, 0xff20a100, - 0x00000431, 0xff20c200, 0x00000439, 0xff20e200, - 0x00000441, 0xff290000, 0x0000044a, 0xff292000, - 0x00000452, 0xff294000, 0x0000045a, 0xff296100, - 0x00000462, 0xff298100, 0x0000046a, 0xff29a100, - 0x00000473, 0xff29c200, 0x0000047b, 0xff29e200, - 0x00000483, 0xff310000, 0x0000048b, 0xff312000, - 0x00000494, 0xff314000, 0x0000049c, 0xff316100, - 0x000004a4, 0xff318100, 0x000004ac, 0xff31a100, - 0x000004b4, 0xff31c200, 0x000004bd, 0xff31e200, - 0x000004c5, 0xff390000, 0x000004cd, 0xff392000, - 0x000004d5, 0xff394000, 0x000004de, 0xff396100, - 0x000004e6, 0xff398100, 0x000004ee, 0xff39a100, - 0x000004f6, 0xff39c200, 0x000004ff, 0xff39e200, - 0x00000800, 0xff410000, 0x00000808, 0xff412000, - 0x00000810, 0xff414000, 0x00000818, 0xff416100, - 0x00000820, 0xff418100, 0x00000829, 0xff41a100, - 0x00000831, 0xff41c200, 0x00000839, 0xff41e200, - 0x00000841, 0xff4a0000, 0x0000084a, 0xff4a2000, - 0x00000852, 0xff4a4000, 0x0000085a, 0xff4a6100, - 0x00000862, 0xff4a8100, 0x0000086a, 0xff4aa100, - 0x00000873, 0xff4ac200, 0x0000087b, 0xff4ae200, - 0x00000883, 0xff520000, 0x0000088b, 0xff522000, - 0x00000894, 0xff524000, 0x0000089c, 0xff526100, - 0x000008a4, 0xff528100, 0x000008ac, 0xff52a100, - 0x000008b4, 0xff52c200, 0x000008bd, 0xff52e200, - 0x000008c5, 0xff5a0000, 0x000008cd, 0xff5a2000, - 0x000008d5, 0xff5a4000, 0x000008de, 0xff5a6100, - 0x000008e6, 0xff5a8100, 0x000008ee, 0xff5aa100, - 0x000008f6, 0xff5ac200, 0x000008ff, 0xff5ae200, - 0x00000c00, 0xff620000, 0x00000c08, 0xff622000, - 0x00000c10, 0xff624000, 0x00000c18, 0xff626100, - 0x00000c20, 0xff628100, 0x00000c29, 0xff62a100, - 0x00000c31, 0xff62c200, 0x00000c39, 0xff62e200, - 0x00000c41, 0xff6a0000, 0x00000c4a, 0xff6a2000, - 0x00000c52, 0xff6a4000, 0x00000c5a, 0xff6a6100, - 0x00000c62, 0xff6a8100, 0x00000c6a, 0xff6aa100, - 0x00000c73, 0xff6ac200, 0x00000c7b, 0xff6ae200, - 0x00000c83, 0xff730000, 0x00000c8b, 0xff732000, - 0x00000c94, 0xff734000, 0x00000c9c, 0xff736100, - 0x00000ca4, 0xff738100, 0x00000cac, 0xff73a100, - 0x00000cb4, 0xff73c200, 0x00000cbd, 0xff73e200, - 0x00000cc5, 0xff7b0000, 0x00000ccd, 0xff7b2000, - 0x00000cd5, 0xff7b4000, 0x00000cde, 0xff7b6100, - 0x00000ce6, 0xff7b8100, 0x00000cee, 0xff7ba100, - 0x00000cf6, 0xff7bc200, 0x00000cff, 0xff7be200, - 0x00001000, 0xff830000, 0x00001008, 0xff832000, - 0x00001010, 0xff834000, 0x00001018, 0xff836100, - 0x00001020, 0xff838100, 0x00001029, 0xff83a100, - 0x00001031, 0xff83c200, 0x00001039, 0xff83e200, - 0x00001041, 0xff8b0000, 0x0000104a, 0xff8b2000, - 0x00001052, 0xff8b4000, 0x0000105a, 0xff8b6100, - 0x00001062, 0xff8b8100, 0x0000106a, 0xff8ba100, - 0x00001073, 0xff8bc200, 0x0000107b, 0xff8be200, - 0x00001083, 0xff940000, 0x0000108b, 0xff942000, - 0x00001094, 0xff944000, 0x0000109c, 0xff946100, - 0x000010a4, 0xff948100, 0x000010ac, 0xff94a100, - 0x000010b4, 0xff94c200, 0x000010bd, 0xff94e200, - 0x000010c5, 0xff9c0000, 0x000010cd, 0xff9c2000, - 0x000010d5, 0xff9c4000, 0x000010de, 0xff9c6100, - 0x000010e6, 0xff9c8100, 0x000010ee, 0xff9ca100, - 0x000010f6, 0xff9cc200, 0x000010ff, 0xff9ce200, - 0x00001400, 0xffa40000, 0x00001408, 0xffa42000, - 0x00001410, 0xffa44000, 0x00001418, 0xffa46100, - 0x00001420, 0xffa48100, 0x00001429, 0xffa4a100, - 0x00001431, 0xffa4c200, 0x00001439, 0xffa4e200, - 0x00001441, 0xffac0000, 0x0000144a, 0xffac2000, - 0x00001452, 0xffac4000, 0x0000145a, 0xffac6100, - 0x00001462, 0xffac8100, 0x0000146a, 0xffaca100, - 0x00001473, 0xffacc200, 0x0000147b, 0xfface200, - 0x00001483, 0xffb40000, 0x0000148b, 0xffb42000, - 0x00001494, 0xffb44000, 0x0000149c, 0xffb46100, - 0x000014a4, 0xffb48100, 0x000014ac, 0xffb4a100, - 0x000014b4, 0xffb4c200, 0x000014bd, 0xffb4e200, - 0x000014c5, 0xffbd0000, 0x000014cd, 0xffbd2000, - 0x000014d5, 0xffbd4000, 0x000014de, 0xffbd6100, - 0x000014e6, 0xffbd8100, 0x000014ee, 0xffbda100, - 0x000014f6, 0xffbdc200, 0x000014ff, 0xffbde200, - 0x00001800, 0xffc50000, 0x00001808, 0xffc52000, - 0x00001810, 0xffc54000, 0x00001818, 0xffc56100, - 0x00001820, 0xffc58100, 0x00001829, 0xffc5a100, - 0x00001831, 0xffc5c200, 0x00001839, 0xffc5e200, - 0x00001841, 0xffcd0000, 0x0000184a, 0xffcd2000, - 0x00001852, 0xffcd4000, 0x0000185a, 0xffcd6100, - 0x00001862, 0xffcd8100, 0x0000186a, 0xffcda100, - 0x00001873, 0xffcdc200, 0x0000187b, 0xffcde200, - 0x00001883, 0xffd50000, 0x0000188b, 0xffd52000, - 0x00001894, 0xffd54000, 0x0000189c, 0xffd56100, - 0x000018a4, 0xffd58100, 0x000018ac, 0xffd5a100, - 0x000018b4, 0xffd5c200, 0x000018bd, 0xffd5e200, - 0x000018c5, 0xffde0000, 0x000018cd, 0xffde2000, - 0x000018d5, 0xffde4000, 0x000018de, 0xffde6100, - 0x000018e6, 0xffde8100, 0x000018ee, 0xffdea100, - 0x000018f6, 0xffdec200, 0x000018ff, 0xffdee200, - 0x00001c00, 0xffe60000, 0x00001c08, 0xffe62000, - 0x00001c10, 0xffe64000, 0x00001c18, 0xffe66100, - 0x00001c20, 0xffe68100, 0x00001c29, 0xffe6a100, - 0x00001c31, 0xffe6c200, 0x00001c39, 0xffe6e200, - 0x00001c41, 0xffee0000, 0x00001c4a, 0xffee2000, - 0x00001c52, 0xffee4000, 0x00001c5a, 0xffee6100, - 0x00001c62, 0xffee8100, 0x00001c6a, 0xffeea100, - 0x00001c73, 0xffeec200, 0x00001c7b, 0xffeee200, - 0x00001c83, 0xfff60000, 0x00001c8b, 0xfff62000, - 0x00001c94, 0xfff64000, 0x00001c9c, 0xfff66100, - 0x00001ca4, 0xfff68100, 0x00001cac, 0xfff6a100, - 0x00001cb4, 0xfff6c200, 0x00001cbd, 0xfff6e200, - 0x00001cc5, 0xffff0000, 0x00001ccd, 0xffff2000, - 0x00001cd5, 0xffff4000, 0x00001cde, 0xffff6100, - 0x00001ce6, 0xffff8100, 0x00001cee, 0xffffa100, - 0x00001cf6, 0xffffc200, 0x00001cff, 0xffffe200 -}; - -static void -Blit_RGB565_ARGB8888(SDL_BlitInfo * info) -{ - Blit_RGB565_32(info, RGB565_ARGB8888_LUT); -} - -/* Special optimized blit for RGB 5-6-5 --> ABGR 8-8-8-8 */ -static const Uint32 RGB565_ABGR8888_LUT[512] = { - 0xff000000, 0x00000000, 0xff080000, 0x00002000, - 0xff100000, 0x00004000, 0xff180000, 0x00006100, - 0xff200000, 0x00008100, 0xff290000, 0x0000a100, - 0xff310000, 0x0000c200, 0xff390000, 0x0000e200, - 0xff410000, 0x00000008, 0xff4a0000, 0x00002008, - 0xff520000, 0x00004008, 0xff5a0000, 0x00006108, - 0xff620000, 0x00008108, 0xff6a0000, 0x0000a108, - 0xff730000, 0x0000c208, 0xff7b0000, 0x0000e208, - 0xff830000, 0x00000010, 0xff8b0000, 0x00002010, - 0xff940000, 0x00004010, 0xff9c0000, 0x00006110, - 0xffa40000, 0x00008110, 0xffac0000, 0x0000a110, - 0xffb40000, 0x0000c210, 0xffbd0000, 0x0000e210, - 0xffc50000, 0x00000018, 0xffcd0000, 0x00002018, - 0xffd50000, 0x00004018, 0xffde0000, 0x00006118, - 0xffe60000, 0x00008118, 0xffee0000, 0x0000a118, - 0xfff60000, 0x0000c218, 0xffff0000, 0x0000e218, - 0xff000400, 0x00000020, 0xff080400, 0x00002020, - 0xff100400, 0x00004020, 0xff180400, 0x00006120, - 0xff200400, 0x00008120, 0xff290400, 0x0000a120, - 0xff310400, 0x0000c220, 0xff390400, 0x0000e220, - 0xff410400, 0x00000029, 0xff4a0400, 0x00002029, - 0xff520400, 0x00004029, 0xff5a0400, 0x00006129, - 0xff620400, 0x00008129, 0xff6a0400, 0x0000a129, - 0xff730400, 0x0000c229, 0xff7b0400, 0x0000e229, - 0xff830400, 0x00000031, 0xff8b0400, 0x00002031, - 0xff940400, 0x00004031, 0xff9c0400, 0x00006131, - 0xffa40400, 0x00008131, 0xffac0400, 0x0000a131, - 0xffb40400, 0x0000c231, 0xffbd0400, 0x0000e231, - 0xffc50400, 0x00000039, 0xffcd0400, 0x00002039, - 0xffd50400, 0x00004039, 0xffde0400, 0x00006139, - 0xffe60400, 0x00008139, 0xffee0400, 0x0000a139, - 0xfff60400, 0x0000c239, 0xffff0400, 0x0000e239, - 0xff000800, 0x00000041, 0xff080800, 0x00002041, - 0xff100800, 0x00004041, 0xff180800, 0x00006141, - 0xff200800, 0x00008141, 0xff290800, 0x0000a141, - 0xff310800, 0x0000c241, 0xff390800, 0x0000e241, - 0xff410800, 0x0000004a, 0xff4a0800, 0x0000204a, - 0xff520800, 0x0000404a, 0xff5a0800, 0x0000614a, - 0xff620800, 0x0000814a, 0xff6a0800, 0x0000a14a, - 0xff730800, 0x0000c24a, 0xff7b0800, 0x0000e24a, - 0xff830800, 0x00000052, 0xff8b0800, 0x00002052, - 0xff940800, 0x00004052, 0xff9c0800, 0x00006152, - 0xffa40800, 0x00008152, 0xffac0800, 0x0000a152, - 0xffb40800, 0x0000c252, 0xffbd0800, 0x0000e252, - 0xffc50800, 0x0000005a, 0xffcd0800, 0x0000205a, - 0xffd50800, 0x0000405a, 0xffde0800, 0x0000615a, - 0xffe60800, 0x0000815a, 0xffee0800, 0x0000a15a, - 0xfff60800, 0x0000c25a, 0xffff0800, 0x0000e25a, - 0xff000c00, 0x00000062, 0xff080c00, 0x00002062, - 0xff100c00, 0x00004062, 0xff180c00, 0x00006162, - 0xff200c00, 0x00008162, 0xff290c00, 0x0000a162, - 0xff310c00, 0x0000c262, 0xff390c00, 0x0000e262, - 0xff410c00, 0x0000006a, 0xff4a0c00, 0x0000206a, - 0xff520c00, 0x0000406a, 0xff5a0c00, 0x0000616a, - 0xff620c00, 0x0000816a, 0xff6a0c00, 0x0000a16a, - 0xff730c00, 0x0000c26a, 0xff7b0c00, 0x0000e26a, - 0xff830c00, 0x00000073, 0xff8b0c00, 0x00002073, - 0xff940c00, 0x00004073, 0xff9c0c00, 0x00006173, - 0xffa40c00, 0x00008173, 0xffac0c00, 0x0000a173, - 0xffb40c00, 0x0000c273, 0xffbd0c00, 0x0000e273, - 0xffc50c00, 0x0000007b, 0xffcd0c00, 0x0000207b, - 0xffd50c00, 0x0000407b, 0xffde0c00, 0x0000617b, - 0xffe60c00, 0x0000817b, 0xffee0c00, 0x0000a17b, - 0xfff60c00, 0x0000c27b, 0xffff0c00, 0x0000e27b, - 0xff001000, 0x00000083, 0xff081000, 0x00002083, - 0xff101000, 0x00004083, 0xff181000, 0x00006183, - 0xff201000, 0x00008183, 0xff291000, 0x0000a183, - 0xff311000, 0x0000c283, 0xff391000, 0x0000e283, - 0xff411000, 0x0000008b, 0xff4a1000, 0x0000208b, - 0xff521000, 0x0000408b, 0xff5a1000, 0x0000618b, - 0xff621000, 0x0000818b, 0xff6a1000, 0x0000a18b, - 0xff731000, 0x0000c28b, 0xff7b1000, 0x0000e28b, - 0xff831000, 0x00000094, 0xff8b1000, 0x00002094, - 0xff941000, 0x00004094, 0xff9c1000, 0x00006194, - 0xffa41000, 0x00008194, 0xffac1000, 0x0000a194, - 0xffb41000, 0x0000c294, 0xffbd1000, 0x0000e294, - 0xffc51000, 0x0000009c, 0xffcd1000, 0x0000209c, - 0xffd51000, 0x0000409c, 0xffde1000, 0x0000619c, - 0xffe61000, 0x0000819c, 0xffee1000, 0x0000a19c, - 0xfff61000, 0x0000c29c, 0xffff1000, 0x0000e29c, - 0xff001400, 0x000000a4, 0xff081400, 0x000020a4, - 0xff101400, 0x000040a4, 0xff181400, 0x000061a4, - 0xff201400, 0x000081a4, 0xff291400, 0x0000a1a4, - 0xff311400, 0x0000c2a4, 0xff391400, 0x0000e2a4, - 0xff411400, 0x000000ac, 0xff4a1400, 0x000020ac, - 0xff521400, 0x000040ac, 0xff5a1400, 0x000061ac, - 0xff621400, 0x000081ac, 0xff6a1400, 0x0000a1ac, - 0xff731400, 0x0000c2ac, 0xff7b1400, 0x0000e2ac, - 0xff831400, 0x000000b4, 0xff8b1400, 0x000020b4, - 0xff941400, 0x000040b4, 0xff9c1400, 0x000061b4, - 0xffa41400, 0x000081b4, 0xffac1400, 0x0000a1b4, - 0xffb41400, 0x0000c2b4, 0xffbd1400, 0x0000e2b4, - 0xffc51400, 0x000000bd, 0xffcd1400, 0x000020bd, - 0xffd51400, 0x000040bd, 0xffde1400, 0x000061bd, - 0xffe61400, 0x000081bd, 0xffee1400, 0x0000a1bd, - 0xfff61400, 0x0000c2bd, 0xffff1400, 0x0000e2bd, - 0xff001800, 0x000000c5, 0xff081800, 0x000020c5, - 0xff101800, 0x000040c5, 0xff181800, 0x000061c5, - 0xff201800, 0x000081c5, 0xff291800, 0x0000a1c5, - 0xff311800, 0x0000c2c5, 0xff391800, 0x0000e2c5, - 0xff411800, 0x000000cd, 0xff4a1800, 0x000020cd, - 0xff521800, 0x000040cd, 0xff5a1800, 0x000061cd, - 0xff621800, 0x000081cd, 0xff6a1800, 0x0000a1cd, - 0xff731800, 0x0000c2cd, 0xff7b1800, 0x0000e2cd, - 0xff831800, 0x000000d5, 0xff8b1800, 0x000020d5, - 0xff941800, 0x000040d5, 0xff9c1800, 0x000061d5, - 0xffa41800, 0x000081d5, 0xffac1800, 0x0000a1d5, - 0xffb41800, 0x0000c2d5, 0xffbd1800, 0x0000e2d5, - 0xffc51800, 0x000000de, 0xffcd1800, 0x000020de, - 0xffd51800, 0x000040de, 0xffde1800, 0x000061de, - 0xffe61800, 0x000081de, 0xffee1800, 0x0000a1de, - 0xfff61800, 0x0000c2de, 0xffff1800, 0x0000e2de, - 0xff001c00, 0x000000e6, 0xff081c00, 0x000020e6, - 0xff101c00, 0x000040e6, 0xff181c00, 0x000061e6, - 0xff201c00, 0x000081e6, 0xff291c00, 0x0000a1e6, - 0xff311c00, 0x0000c2e6, 0xff391c00, 0x0000e2e6, - 0xff411c00, 0x000000ee, 0xff4a1c00, 0x000020ee, - 0xff521c00, 0x000040ee, 0xff5a1c00, 0x000061ee, - 0xff621c00, 0x000081ee, 0xff6a1c00, 0x0000a1ee, - 0xff731c00, 0x0000c2ee, 0xff7b1c00, 0x0000e2ee, - 0xff831c00, 0x000000f6, 0xff8b1c00, 0x000020f6, - 0xff941c00, 0x000040f6, 0xff9c1c00, 0x000061f6, - 0xffa41c00, 0x000081f6, 0xffac1c00, 0x0000a1f6, - 0xffb41c00, 0x0000c2f6, 0xffbd1c00, 0x0000e2f6, - 0xffc51c00, 0x000000ff, 0xffcd1c00, 0x000020ff, - 0xffd51c00, 0x000040ff, 0xffde1c00, 0x000061ff, - 0xffe61c00, 0x000081ff, 0xffee1c00, 0x0000a1ff, - 0xfff61c00, 0x0000c2ff, 0xffff1c00, 0x0000e2ff -}; - -static void -Blit_RGB565_ABGR8888(SDL_BlitInfo * info) -{ - Blit_RGB565_32(info, RGB565_ABGR8888_LUT); -} - -/* Special optimized blit for RGB 5-6-5 --> RGBA 8-8-8-8 */ -static const Uint32 RGB565_RGBA8888_LUT[512] = { - 0x000000ff, 0x00000000, 0x000008ff, 0x00200000, - 0x000010ff, 0x00400000, 0x000018ff, 0x00610000, - 0x000020ff, 0x00810000, 0x000029ff, 0x00a10000, - 0x000031ff, 0x00c20000, 0x000039ff, 0x00e20000, - 0x000041ff, 0x08000000, 0x00004aff, 0x08200000, - 0x000052ff, 0x08400000, 0x00005aff, 0x08610000, - 0x000062ff, 0x08810000, 0x00006aff, 0x08a10000, - 0x000073ff, 0x08c20000, 0x00007bff, 0x08e20000, - 0x000083ff, 0x10000000, 0x00008bff, 0x10200000, - 0x000094ff, 0x10400000, 0x00009cff, 0x10610000, - 0x0000a4ff, 0x10810000, 0x0000acff, 0x10a10000, - 0x0000b4ff, 0x10c20000, 0x0000bdff, 0x10e20000, - 0x0000c5ff, 0x18000000, 0x0000cdff, 0x18200000, - 0x0000d5ff, 0x18400000, 0x0000deff, 0x18610000, - 0x0000e6ff, 0x18810000, 0x0000eeff, 0x18a10000, - 0x0000f6ff, 0x18c20000, 0x0000ffff, 0x18e20000, - 0x000400ff, 0x20000000, 0x000408ff, 0x20200000, - 0x000410ff, 0x20400000, 0x000418ff, 0x20610000, - 0x000420ff, 0x20810000, 0x000429ff, 0x20a10000, - 0x000431ff, 0x20c20000, 0x000439ff, 0x20e20000, - 0x000441ff, 0x29000000, 0x00044aff, 0x29200000, - 0x000452ff, 0x29400000, 0x00045aff, 0x29610000, - 0x000462ff, 0x29810000, 0x00046aff, 0x29a10000, - 0x000473ff, 0x29c20000, 0x00047bff, 0x29e20000, - 0x000483ff, 0x31000000, 0x00048bff, 0x31200000, - 0x000494ff, 0x31400000, 0x00049cff, 0x31610000, - 0x0004a4ff, 0x31810000, 0x0004acff, 0x31a10000, - 0x0004b4ff, 0x31c20000, 0x0004bdff, 0x31e20000, - 0x0004c5ff, 0x39000000, 0x0004cdff, 0x39200000, - 0x0004d5ff, 0x39400000, 0x0004deff, 0x39610000, - 0x0004e6ff, 0x39810000, 0x0004eeff, 0x39a10000, - 0x0004f6ff, 0x39c20000, 0x0004ffff, 0x39e20000, - 0x000800ff, 0x41000000, 0x000808ff, 0x41200000, - 0x000810ff, 0x41400000, 0x000818ff, 0x41610000, - 0x000820ff, 0x41810000, 0x000829ff, 0x41a10000, - 0x000831ff, 0x41c20000, 0x000839ff, 0x41e20000, - 0x000841ff, 0x4a000000, 0x00084aff, 0x4a200000, - 0x000852ff, 0x4a400000, 0x00085aff, 0x4a610000, - 0x000862ff, 0x4a810000, 0x00086aff, 0x4aa10000, - 0x000873ff, 0x4ac20000, 0x00087bff, 0x4ae20000, - 0x000883ff, 0x52000000, 0x00088bff, 0x52200000, - 0x000894ff, 0x52400000, 0x00089cff, 0x52610000, - 0x0008a4ff, 0x52810000, 0x0008acff, 0x52a10000, - 0x0008b4ff, 0x52c20000, 0x0008bdff, 0x52e20000, - 0x0008c5ff, 0x5a000000, 0x0008cdff, 0x5a200000, - 0x0008d5ff, 0x5a400000, 0x0008deff, 0x5a610000, - 0x0008e6ff, 0x5a810000, 0x0008eeff, 0x5aa10000, - 0x0008f6ff, 0x5ac20000, 0x0008ffff, 0x5ae20000, - 0x000c00ff, 0x62000000, 0x000c08ff, 0x62200000, - 0x000c10ff, 0x62400000, 0x000c18ff, 0x62610000, - 0x000c20ff, 0x62810000, 0x000c29ff, 0x62a10000, - 0x000c31ff, 0x62c20000, 0x000c39ff, 0x62e20000, - 0x000c41ff, 0x6a000000, 0x000c4aff, 0x6a200000, - 0x000c52ff, 0x6a400000, 0x000c5aff, 0x6a610000, - 0x000c62ff, 0x6a810000, 0x000c6aff, 0x6aa10000, - 0x000c73ff, 0x6ac20000, 0x000c7bff, 0x6ae20000, - 0x000c83ff, 0x73000000, 0x000c8bff, 0x73200000, - 0x000c94ff, 0x73400000, 0x000c9cff, 0x73610000, - 0x000ca4ff, 0x73810000, 0x000cacff, 0x73a10000, - 0x000cb4ff, 0x73c20000, 0x000cbdff, 0x73e20000, - 0x000cc5ff, 0x7b000000, 0x000ccdff, 0x7b200000, - 0x000cd5ff, 0x7b400000, 0x000cdeff, 0x7b610000, - 0x000ce6ff, 0x7b810000, 0x000ceeff, 0x7ba10000, - 0x000cf6ff, 0x7bc20000, 0x000cffff, 0x7be20000, - 0x001000ff, 0x83000000, 0x001008ff, 0x83200000, - 0x001010ff, 0x83400000, 0x001018ff, 0x83610000, - 0x001020ff, 0x83810000, 0x001029ff, 0x83a10000, - 0x001031ff, 0x83c20000, 0x001039ff, 0x83e20000, - 0x001041ff, 0x8b000000, 0x00104aff, 0x8b200000, - 0x001052ff, 0x8b400000, 0x00105aff, 0x8b610000, - 0x001062ff, 0x8b810000, 0x00106aff, 0x8ba10000, - 0x001073ff, 0x8bc20000, 0x00107bff, 0x8be20000, - 0x001083ff, 0x94000000, 0x00108bff, 0x94200000, - 0x001094ff, 0x94400000, 0x00109cff, 0x94610000, - 0x0010a4ff, 0x94810000, 0x0010acff, 0x94a10000, - 0x0010b4ff, 0x94c20000, 0x0010bdff, 0x94e20000, - 0x0010c5ff, 0x9c000000, 0x0010cdff, 0x9c200000, - 0x0010d5ff, 0x9c400000, 0x0010deff, 0x9c610000, - 0x0010e6ff, 0x9c810000, 0x0010eeff, 0x9ca10000, - 0x0010f6ff, 0x9cc20000, 0x0010ffff, 0x9ce20000, - 0x001400ff, 0xa4000000, 0x001408ff, 0xa4200000, - 0x001410ff, 0xa4400000, 0x001418ff, 0xa4610000, - 0x001420ff, 0xa4810000, 0x001429ff, 0xa4a10000, - 0x001431ff, 0xa4c20000, 0x001439ff, 0xa4e20000, - 0x001441ff, 0xac000000, 0x00144aff, 0xac200000, - 0x001452ff, 0xac400000, 0x00145aff, 0xac610000, - 0x001462ff, 0xac810000, 0x00146aff, 0xaca10000, - 0x001473ff, 0xacc20000, 0x00147bff, 0xace20000, - 0x001483ff, 0xb4000000, 0x00148bff, 0xb4200000, - 0x001494ff, 0xb4400000, 0x00149cff, 0xb4610000, - 0x0014a4ff, 0xb4810000, 0x0014acff, 0xb4a10000, - 0x0014b4ff, 0xb4c20000, 0x0014bdff, 0xb4e20000, - 0x0014c5ff, 0xbd000000, 0x0014cdff, 0xbd200000, - 0x0014d5ff, 0xbd400000, 0x0014deff, 0xbd610000, - 0x0014e6ff, 0xbd810000, 0x0014eeff, 0xbda10000, - 0x0014f6ff, 0xbdc20000, 0x0014ffff, 0xbde20000, - 0x001800ff, 0xc5000000, 0x001808ff, 0xc5200000, - 0x001810ff, 0xc5400000, 0x001818ff, 0xc5610000, - 0x001820ff, 0xc5810000, 0x001829ff, 0xc5a10000, - 0x001831ff, 0xc5c20000, 0x001839ff, 0xc5e20000, - 0x001841ff, 0xcd000000, 0x00184aff, 0xcd200000, - 0x001852ff, 0xcd400000, 0x00185aff, 0xcd610000, - 0x001862ff, 0xcd810000, 0x00186aff, 0xcda10000, - 0x001873ff, 0xcdc20000, 0x00187bff, 0xcde20000, - 0x001883ff, 0xd5000000, 0x00188bff, 0xd5200000, - 0x001894ff, 0xd5400000, 0x00189cff, 0xd5610000, - 0x0018a4ff, 0xd5810000, 0x0018acff, 0xd5a10000, - 0x0018b4ff, 0xd5c20000, 0x0018bdff, 0xd5e20000, - 0x0018c5ff, 0xde000000, 0x0018cdff, 0xde200000, - 0x0018d5ff, 0xde400000, 0x0018deff, 0xde610000, - 0x0018e6ff, 0xde810000, 0x0018eeff, 0xdea10000, - 0x0018f6ff, 0xdec20000, 0x0018ffff, 0xdee20000, - 0x001c00ff, 0xe6000000, 0x001c08ff, 0xe6200000, - 0x001c10ff, 0xe6400000, 0x001c18ff, 0xe6610000, - 0x001c20ff, 0xe6810000, 0x001c29ff, 0xe6a10000, - 0x001c31ff, 0xe6c20000, 0x001c39ff, 0xe6e20000, - 0x001c41ff, 0xee000000, 0x001c4aff, 0xee200000, - 0x001c52ff, 0xee400000, 0x001c5aff, 0xee610000, - 0x001c62ff, 0xee810000, 0x001c6aff, 0xeea10000, - 0x001c73ff, 0xeec20000, 0x001c7bff, 0xeee20000, - 0x001c83ff, 0xf6000000, 0x001c8bff, 0xf6200000, - 0x001c94ff, 0xf6400000, 0x001c9cff, 0xf6610000, - 0x001ca4ff, 0xf6810000, 0x001cacff, 0xf6a10000, - 0x001cb4ff, 0xf6c20000, 0x001cbdff, 0xf6e20000, - 0x001cc5ff, 0xff000000, 0x001ccdff, 0xff200000, - 0x001cd5ff, 0xff400000, 0x001cdeff, 0xff610000, - 0x001ce6ff, 0xff810000, 0x001ceeff, 0xffa10000, - 0x001cf6ff, 0xffc20000, 0x001cffff, 0xffe20000, -}; - -static void -Blit_RGB565_RGBA8888(SDL_BlitInfo * info) -{ - Blit_RGB565_32(info, RGB565_RGBA8888_LUT); -} - -/* Special optimized blit for RGB 5-6-5 --> BGRA 8-8-8-8 */ -static const Uint32 RGB565_BGRA8888_LUT[512] = { - 0x00000000, 0x000000ff, 0x08000000, 0x002000ff, - 0x10000000, 0x004000ff, 0x18000000, 0x006100ff, - 0x20000000, 0x008100ff, 0x29000000, 0x00a100ff, - 0x31000000, 0x00c200ff, 0x39000000, 0x00e200ff, - 0x41000000, 0x000008ff, 0x4a000000, 0x002008ff, - 0x52000000, 0x004008ff, 0x5a000000, 0x006108ff, - 0x62000000, 0x008108ff, 0x6a000000, 0x00a108ff, - 0x73000000, 0x00c208ff, 0x7b000000, 0x00e208ff, - 0x83000000, 0x000010ff, 0x8b000000, 0x002010ff, - 0x94000000, 0x004010ff, 0x9c000000, 0x006110ff, - 0xa4000000, 0x008110ff, 0xac000000, 0x00a110ff, - 0xb4000000, 0x00c210ff, 0xbd000000, 0x00e210ff, - 0xc5000000, 0x000018ff, 0xcd000000, 0x002018ff, - 0xd5000000, 0x004018ff, 0xde000000, 0x006118ff, - 0xe6000000, 0x008118ff, 0xee000000, 0x00a118ff, - 0xf6000000, 0x00c218ff, 0xff000000, 0x00e218ff, - 0x00040000, 0x000020ff, 0x08040000, 0x002020ff, - 0x10040000, 0x004020ff, 0x18040000, 0x006120ff, - 0x20040000, 0x008120ff, 0x29040000, 0x00a120ff, - 0x31040000, 0x00c220ff, 0x39040000, 0x00e220ff, - 0x41040000, 0x000029ff, 0x4a040000, 0x002029ff, - 0x52040000, 0x004029ff, 0x5a040000, 0x006129ff, - 0x62040000, 0x008129ff, 0x6a040000, 0x00a129ff, - 0x73040000, 0x00c229ff, 0x7b040000, 0x00e229ff, - 0x83040000, 0x000031ff, 0x8b040000, 0x002031ff, - 0x94040000, 0x004031ff, 0x9c040000, 0x006131ff, - 0xa4040000, 0x008131ff, 0xac040000, 0x00a131ff, - 0xb4040000, 0x00c231ff, 0xbd040000, 0x00e231ff, - 0xc5040000, 0x000039ff, 0xcd040000, 0x002039ff, - 0xd5040000, 0x004039ff, 0xde040000, 0x006139ff, - 0xe6040000, 0x008139ff, 0xee040000, 0x00a139ff, - 0xf6040000, 0x00c239ff, 0xff040000, 0x00e239ff, - 0x00080000, 0x000041ff, 0x08080000, 0x002041ff, - 0x10080000, 0x004041ff, 0x18080000, 0x006141ff, - 0x20080000, 0x008141ff, 0x29080000, 0x00a141ff, - 0x31080000, 0x00c241ff, 0x39080000, 0x00e241ff, - 0x41080000, 0x00004aff, 0x4a080000, 0x00204aff, - 0x52080000, 0x00404aff, 0x5a080000, 0x00614aff, - 0x62080000, 0x00814aff, 0x6a080000, 0x00a14aff, - 0x73080000, 0x00c24aff, 0x7b080000, 0x00e24aff, - 0x83080000, 0x000052ff, 0x8b080000, 0x002052ff, - 0x94080000, 0x004052ff, 0x9c080000, 0x006152ff, - 0xa4080000, 0x008152ff, 0xac080000, 0x00a152ff, - 0xb4080000, 0x00c252ff, 0xbd080000, 0x00e252ff, - 0xc5080000, 0x00005aff, 0xcd080000, 0x00205aff, - 0xd5080000, 0x00405aff, 0xde080000, 0x00615aff, - 0xe6080000, 0x00815aff, 0xee080000, 0x00a15aff, - 0xf6080000, 0x00c25aff, 0xff080000, 0x00e25aff, - 0x000c0000, 0x000062ff, 0x080c0000, 0x002062ff, - 0x100c0000, 0x004062ff, 0x180c0000, 0x006162ff, - 0x200c0000, 0x008162ff, 0x290c0000, 0x00a162ff, - 0x310c0000, 0x00c262ff, 0x390c0000, 0x00e262ff, - 0x410c0000, 0x00006aff, 0x4a0c0000, 0x00206aff, - 0x520c0000, 0x00406aff, 0x5a0c0000, 0x00616aff, - 0x620c0000, 0x00816aff, 0x6a0c0000, 0x00a16aff, - 0x730c0000, 0x00c26aff, 0x7b0c0000, 0x00e26aff, - 0x830c0000, 0x000073ff, 0x8b0c0000, 0x002073ff, - 0x940c0000, 0x004073ff, 0x9c0c0000, 0x006173ff, - 0xa40c0000, 0x008173ff, 0xac0c0000, 0x00a173ff, - 0xb40c0000, 0x00c273ff, 0xbd0c0000, 0x00e273ff, - 0xc50c0000, 0x00007bff, 0xcd0c0000, 0x00207bff, - 0xd50c0000, 0x00407bff, 0xde0c0000, 0x00617bff, - 0xe60c0000, 0x00817bff, 0xee0c0000, 0x00a17bff, - 0xf60c0000, 0x00c27bff, 0xff0c0000, 0x00e27bff, - 0x00100000, 0x000083ff, 0x08100000, 0x002083ff, - 0x10100000, 0x004083ff, 0x18100000, 0x006183ff, - 0x20100000, 0x008183ff, 0x29100000, 0x00a183ff, - 0x31100000, 0x00c283ff, 0x39100000, 0x00e283ff, - 0x41100000, 0x00008bff, 0x4a100000, 0x00208bff, - 0x52100000, 0x00408bff, 0x5a100000, 0x00618bff, - 0x62100000, 0x00818bff, 0x6a100000, 0x00a18bff, - 0x73100000, 0x00c28bff, 0x7b100000, 0x00e28bff, - 0x83100000, 0x000094ff, 0x8b100000, 0x002094ff, - 0x94100000, 0x004094ff, 0x9c100000, 0x006194ff, - 0xa4100000, 0x008194ff, 0xac100000, 0x00a194ff, - 0xb4100000, 0x00c294ff, 0xbd100000, 0x00e294ff, - 0xc5100000, 0x00009cff, 0xcd100000, 0x00209cff, - 0xd5100000, 0x00409cff, 0xde100000, 0x00619cff, - 0xe6100000, 0x00819cff, 0xee100000, 0x00a19cff, - 0xf6100000, 0x00c29cff, 0xff100000, 0x00e29cff, - 0x00140000, 0x0000a4ff, 0x08140000, 0x0020a4ff, - 0x10140000, 0x0040a4ff, 0x18140000, 0x0061a4ff, - 0x20140000, 0x0081a4ff, 0x29140000, 0x00a1a4ff, - 0x31140000, 0x00c2a4ff, 0x39140000, 0x00e2a4ff, - 0x41140000, 0x0000acff, 0x4a140000, 0x0020acff, - 0x52140000, 0x0040acff, 0x5a140000, 0x0061acff, - 0x62140000, 0x0081acff, 0x6a140000, 0x00a1acff, - 0x73140000, 0x00c2acff, 0x7b140000, 0x00e2acff, - 0x83140000, 0x0000b4ff, 0x8b140000, 0x0020b4ff, - 0x94140000, 0x0040b4ff, 0x9c140000, 0x0061b4ff, - 0xa4140000, 0x0081b4ff, 0xac140000, 0x00a1b4ff, - 0xb4140000, 0x00c2b4ff, 0xbd140000, 0x00e2b4ff, - 0xc5140000, 0x0000bdff, 0xcd140000, 0x0020bdff, - 0xd5140000, 0x0040bdff, 0xde140000, 0x0061bdff, - 0xe6140000, 0x0081bdff, 0xee140000, 0x00a1bdff, - 0xf6140000, 0x00c2bdff, 0xff140000, 0x00e2bdff, - 0x00180000, 0x0000c5ff, 0x08180000, 0x0020c5ff, - 0x10180000, 0x0040c5ff, 0x18180000, 0x0061c5ff, - 0x20180000, 0x0081c5ff, 0x29180000, 0x00a1c5ff, - 0x31180000, 0x00c2c5ff, 0x39180000, 0x00e2c5ff, - 0x41180000, 0x0000cdff, 0x4a180000, 0x0020cdff, - 0x52180000, 0x0040cdff, 0x5a180000, 0x0061cdff, - 0x62180000, 0x0081cdff, 0x6a180000, 0x00a1cdff, - 0x73180000, 0x00c2cdff, 0x7b180000, 0x00e2cdff, - 0x83180000, 0x0000d5ff, 0x8b180000, 0x0020d5ff, - 0x94180000, 0x0040d5ff, 0x9c180000, 0x0061d5ff, - 0xa4180000, 0x0081d5ff, 0xac180000, 0x00a1d5ff, - 0xb4180000, 0x00c2d5ff, 0xbd180000, 0x00e2d5ff, - 0xc5180000, 0x0000deff, 0xcd180000, 0x0020deff, - 0xd5180000, 0x0040deff, 0xde180000, 0x0061deff, - 0xe6180000, 0x0081deff, 0xee180000, 0x00a1deff, - 0xf6180000, 0x00c2deff, 0xff180000, 0x00e2deff, - 0x001c0000, 0x0000e6ff, 0x081c0000, 0x0020e6ff, - 0x101c0000, 0x0040e6ff, 0x181c0000, 0x0061e6ff, - 0x201c0000, 0x0081e6ff, 0x291c0000, 0x00a1e6ff, - 0x311c0000, 0x00c2e6ff, 0x391c0000, 0x00e2e6ff, - 0x411c0000, 0x0000eeff, 0x4a1c0000, 0x0020eeff, - 0x521c0000, 0x0040eeff, 0x5a1c0000, 0x0061eeff, - 0x621c0000, 0x0081eeff, 0x6a1c0000, 0x00a1eeff, - 0x731c0000, 0x00c2eeff, 0x7b1c0000, 0x00e2eeff, - 0x831c0000, 0x0000f6ff, 0x8b1c0000, 0x0020f6ff, - 0x941c0000, 0x0040f6ff, 0x9c1c0000, 0x0061f6ff, - 0xa41c0000, 0x0081f6ff, 0xac1c0000, 0x00a1f6ff, - 0xb41c0000, 0x00c2f6ff, 0xbd1c0000, 0x00e2f6ff, - 0xc51c0000, 0x0000ffff, 0xcd1c0000, 0x0020ffff, - 0xd51c0000, 0x0040ffff, 0xde1c0000, 0x0061ffff, - 0xe61c0000, 0x0081ffff, 0xee1c0000, 0x00a1ffff, - 0xf61c0000, 0x00c2ffff, 0xff1c0000, 0x00e2ffff -}; - -static void -Blit_RGB565_BGRA8888(SDL_BlitInfo * info) -{ - Blit_RGB565_32(info, RGB565_BGRA8888_LUT); -} - -static void -BlitNto1(SDL_BlitInfo * info) -{ -#ifndef USE_DUFFS_LOOP - int c; -#endif - int width, height; - Uint8 *src; - const Uint8 *map; - Uint8 *dst; - int srcskip, dstskip; - int srcbpp; - Uint32 Pixel; - int sR, sG, sB; - SDL_PixelFormat *srcfmt; - - /* Set up some basic variables */ - width = info->dst_w; - height = info->dst_h; - src = info->src; - srcskip = info->src_skip; - dst = info->dst; - dstskip = info->dst_skip; - map = info->table; - srcfmt = info->src_fmt; - srcbpp = srcfmt->BytesPerPixel; - - if (map == NULL) { - while (height--) { -#ifdef USE_DUFFS_LOOP - /* *INDENT-OFF* */ - DUFFS_LOOP( - DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, - sR, sG, sB); - if ( 1 ) { - /* Pack RGB into 8bit pixel */ - *dst = ((sR>>5)<<(3+2))| - ((sG>>5)<<(2)) | - ((sB>>6)<<(0)) ; - } - dst++; - src += srcbpp; - , width); - /* *INDENT-ON* */ -#else - for (c = width; c; --c) { - DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB); - if (1) { - /* Pack RGB into 8bit pixel */ - *dst = ((sR >> 5) << (3 + 2)) | - ((sG >> 5) << (2)) | ((sB >> 6) << (0)); - } - dst++; - src += srcbpp; - } -#endif - src += srcskip; - dst += dstskip; - } - } else { - while (height--) { -#ifdef USE_DUFFS_LOOP - /* *INDENT-OFF* */ - DUFFS_LOOP( - DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, - sR, sG, sB); - if ( 1 ) { - /* Pack RGB into 8bit pixel */ - *dst = map[((sR>>5)<<(3+2))| - ((sG>>5)<<(2)) | - ((sB>>6)<<(0)) ]; - } - dst++; - src += srcbpp; - , width); - /* *INDENT-ON* */ -#else - for (c = width; c; --c) { - DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB); - if (1) { - /* Pack RGB into 8bit pixel */ - *dst = map[((sR >> 5) << (3 + 2)) | - ((sG >> 5) << (2)) | ((sB >> 6) << (0))]; - } - dst++; - src += srcbpp; - } -#endif /* USE_DUFFS_LOOP */ - src += srcskip; - dst += dstskip; - } - } -} - -/* blits 32 bit RGB<->RGBA with both surfaces having the same R,G,B fields */ -static void -Blit4to4MaskAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint32 *src = (Uint32 *) info->src; - int srcskip = info->src_skip; - Uint32 *dst = (Uint32 *) info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - - if (dstfmt->Amask) { - /* RGB->RGBA, SET_ALPHA */ - Uint32 mask = (info->a >> dstfmt->Aloss) << dstfmt->Ashift; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - *dst = *src | mask; - ++dst; - ++src; - }, - width); - /* *INDENT-ON* */ - src = (Uint32 *) ((Uint8 *) src + srcskip); - dst = (Uint32 *) ((Uint8 *) dst + dstskip); - } - } else { - /* RGBA->RGB, NO_ALPHA */ - Uint32 mask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - *dst = *src & mask; - ++dst; - ++src; - }, - width); - /* *INDENT-ON* */ - src = (Uint32 *) ((Uint8 *) src + srcskip); - dst = (Uint32 *) ((Uint8 *) dst + dstskip); - } - } -} - -/* blits 32 bit RGBA<->RGBA with both surfaces having the same R,G,B,A fields */ -static void -Blit4to4CopyAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint32 *src = (Uint32 *) info->src; - int srcskip = info->src_skip; - Uint32 *dst = (Uint32 *) info->dst; - int dstskip = info->dst_skip; - - /* RGBA->RGBA, COPY_ALPHA */ - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - *dst = *src; - ++dst; - ++src; - }, - width); - /* *INDENT-ON* */ - src = (Uint32 *) ((Uint8 *) src + srcskip); - dst = (Uint32 *) ((Uint8 *) dst + dstskip); - } -} - -static void -BlitNtoN(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - int srcbpp = srcfmt->BytesPerPixel; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int dstbpp = dstfmt->BytesPerPixel; - unsigned alpha = dstfmt->Amask ? info->a : 0; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - Uint32 Pixel; - unsigned sR; - unsigned sG; - unsigned sB; - DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, alpha); - dst += dstbpp; - src += srcbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -static void -BlitNtoNCopyAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - int srcbpp = srcfmt->BytesPerPixel; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int dstbpp = dstfmt->BytesPerPixel; - int c; - - while (height--) { - for (c = width; c; --c) { - Uint32 Pixel; - unsigned sR, sG, sB, sA; - DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, sA); - dst += dstbpp; - src += srcbpp; - } - src += srcskip; - dst += dstskip; - } -} - -static void -BlitNto1Key(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - const Uint8 *palmap = info->table; - Uint32 ckey = info->colorkey; - Uint32 rgbmask = ~srcfmt->Amask; - int srcbpp; - Uint32 Pixel; - unsigned sR, sG, sB; - - /* Set up some basic variables */ - srcbpp = srcfmt->BytesPerPixel; - ckey &= rgbmask; - - if (palmap == NULL) { - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, - sR, sG, sB); - if ( (Pixel & rgbmask) != ckey ) { - /* Pack RGB into 8bit pixel */ - *dst = (Uint8)(((sR>>5)<<(3+2))| - ((sG>>5)<<(2)) | - ((sB>>6)<<(0))); - } - dst++; - src += srcbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } - } else { - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, - sR, sG, sB); - if ( (Pixel & rgbmask) != ckey ) { - /* Pack RGB into 8bit pixel */ - *dst = (Uint8)palmap[((sR>>5)<<(3+2))| - ((sG>>5)<<(2)) | - ((sB>>6)<<(0)) ]; - } - dst++; - src += srcbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } - } -} - -static void -Blit2to2Key(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint16 *srcp = (Uint16 *) info->src; - int srcskip = info->src_skip; - Uint16 *dstp = (Uint16 *) info->dst; - int dstskip = info->dst_skip; - Uint32 ckey = info->colorkey; - Uint32 rgbmask = ~info->src_fmt->Amask; - - /* Set up some basic variables */ - srcskip /= 2; - dstskip /= 2; - ckey &= rgbmask; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - if ( (*srcp & rgbmask) != ckey ) { - *dstp = *srcp; - } - dstp++; - srcp++; - }, - width); - /* *INDENT-ON* */ - srcp += srcskip; - dstp += dstskip; - } -} - -static void -BlitNtoNKey(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - Uint32 ckey = info->colorkey; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int srcbpp = srcfmt->BytesPerPixel; - int dstbpp = dstfmt->BytesPerPixel; - unsigned alpha = dstfmt->Amask ? info->a : 0; - Uint32 rgbmask = ~srcfmt->Amask; - - /* Set up some basic variables */ - ckey &= rgbmask; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - Uint32 Pixel; - unsigned sR; - unsigned sG; - unsigned sB; - RETRIEVE_RGB_PIXEL(src, srcbpp, Pixel); - if ( (Pixel & rgbmask) != ckey ) { - RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, alpha); - } - dst += dstbpp; - src += srcbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -static void -BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - Uint32 ckey = info->colorkey; - SDL_PixelFormat *srcfmt = info->src_fmt; - SDL_PixelFormat *dstfmt = info->dst_fmt; - Uint32 rgbmask = ~srcfmt->Amask; - - Uint8 srcbpp; - Uint8 dstbpp; - Uint32 Pixel; - unsigned sR, sG, sB, sA; - - /* Set up some basic variables */ - srcbpp = srcfmt->BytesPerPixel; - dstbpp = dstfmt->BytesPerPixel; - ckey &= rgbmask; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA); - if ( (Pixel & rgbmask) != ckey ) { - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, sA); - } - dst += dstbpp; - src += srcbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -/* Special optimized blit for ARGB 2-10-10-10 --> RGBA */ -static void -Blit2101010toN(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *dstfmt = info->dst_fmt; - int dstbpp = dstfmt->BytesPerPixel; - Uint32 Pixel; - unsigned sR, sG, sB, sA; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - Pixel = *(Uint32 *)src; - RGBA_FROM_ARGB2101010(Pixel, sR, sG, sB, sA); - ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, sA); - dst += dstbpp; - src += 4; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -/* Special optimized blit for RGBA --> ARGB 2-10-10-10 */ -static void -BlitNto2101010(SDL_BlitInfo * info) -{ - int width = info->dst_w; - int height = info->dst_h; - Uint8 *src = info->src; - int srcskip = info->src_skip; - Uint8 *dst = info->dst; - int dstskip = info->dst_skip; - SDL_PixelFormat *srcfmt = info->src_fmt; - int srcbpp = srcfmt->BytesPerPixel; - Uint32 Pixel; - unsigned sR, sG, sB, sA; - - while (height--) { - /* *INDENT-OFF* */ - DUFFS_LOOP( - { - DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA); - ARGB2101010_FROM_RGBA(Pixel, sR, sG, sB, sA); - *(Uint32 *)dst = Pixel; - dst += 4; - src += srcbpp; - }, - width); - /* *INDENT-ON* */ - src += srcskip; - dst += dstskip; - } -} - -/* Normal N to N optimized blitters */ -struct blit_table -{ - Uint32 srcR, srcG, srcB; - int dstbpp; - Uint32 dstR, dstG, dstB; - Uint32 blit_features; - SDL_BlitFunc blitfunc; - enum - { NO_ALPHA = 1, SET_ALPHA = 2, COPY_ALPHA = 4 } alpha; -}; -static const struct blit_table normal_blit_1[] = { - /* Default for 8-bit RGB source, never optimized */ - {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0} -}; - -static const struct blit_table normal_blit_2[] = { -#if SDL_ALTIVEC_BLITTERS - /* has-altivec */ - {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x00000000, 0x00000000, 0x00000000, - 2, Blit_RGB565_32Altivec, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, - {0x00007C00, 0x000003E0, 0x0000001F, 4, 0x00000000, 0x00000000, 0x00000000, - 2, Blit_RGB555_32Altivec, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, -#endif - {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x00FF0000, 0x0000FF00, 0x000000FF, - 0, Blit_RGB565_ARGB8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, - {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x000000FF, 0x0000FF00, 0x00FF0000, - 0, Blit_RGB565_ABGR8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, - {0x0000F800, 0x000007E0, 0x0000001F, 4, 0xFF000000, 0x00FF0000, 0x0000FF00, - 0, Blit_RGB565_RGBA8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, - {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x0000FF00, 0x00FF0000, 0xFF000000, - 0, Blit_RGB565_BGRA8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, - - /* Default for 16-bit RGB source, used if no other blitter matches */ - {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0} -}; - -static const struct blit_table normal_blit_3[] = { - /* Default for 24-bit RGB source, never optimized */ - {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0} -}; - -static const struct blit_table normal_blit_4[] = { -#if SDL_ALTIVEC_BLITTERS - /* has-altivec | dont-use-prefetch */ - {0x00000000, 0x00000000, 0x00000000, 4, 0x00000000, 0x00000000, 0x00000000, - 6, ConvertAltivec32to32_noprefetch, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, - /* has-altivec */ - {0x00000000, 0x00000000, 0x00000000, 4, 0x00000000, 0x00000000, 0x00000000, - 2, ConvertAltivec32to32_prefetch, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, - /* has-altivec */ - {0x00000000, 0x00000000, 0x00000000, 2, 0x0000F800, 0x000007E0, 0x0000001F, - 2, Blit_RGB888_RGB565Altivec, NO_ALPHA}, -#endif - {0x00FF0000, 0x0000FF00, 0x000000FF, 2, 0x0000F800, 0x000007E0, 0x0000001F, - 0, Blit_RGB888_RGB565, NO_ALPHA}, - {0x00FF0000, 0x0000FF00, 0x000000FF, 2, 0x00007C00, 0x000003E0, 0x0000001F, - 0, Blit_RGB888_RGB555, NO_ALPHA}, - /* Default for 32-bit RGB source, used if no other blitter matches */ - {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0} -}; - -static const struct blit_table *const normal_blit[] = { - normal_blit_1, normal_blit_2, normal_blit_3, normal_blit_4 -}; - -/* Mask matches table, or table entry is zero */ -#define MASKOK(x, y) (((x) == (y)) || ((y) == 0x00000000)) - -SDL_BlitFunc -SDL_CalculateBlitN(SDL_Surface * surface) -{ - SDL_PixelFormat *srcfmt; - SDL_PixelFormat *dstfmt; - const struct blit_table *table; - int which; - SDL_BlitFunc blitfun; - - /* Set up data for choosing the blit */ - srcfmt = surface->format; - dstfmt = surface->map->dst->format; - - /* We don't support destinations less than 8-bits */ - if (dstfmt->BitsPerPixel < 8) { - return (NULL); - } - - switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) { - case 0: - blitfun = NULL; - if (dstfmt->BitsPerPixel == 8) { - if ((srcfmt->BytesPerPixel == 4) && - (srcfmt->Rmask == 0x00FF0000) && - (srcfmt->Gmask == 0x0000FF00) && - (srcfmt->Bmask == 0x000000FF)) { - blitfun = Blit_RGB888_index8; - } else if ((srcfmt->BytesPerPixel == 4) && - (srcfmt->Rmask == 0x3FF00000) && - (srcfmt->Gmask == 0x000FFC00) && - (srcfmt->Bmask == 0x000003FF)) { - blitfun = Blit_RGB101010_index8; - } else { - blitfun = BlitNto1; - } - } else { - /* Now the meat, choose the blitter we want */ - int a_need = NO_ALPHA; - if (dstfmt->Amask) - a_need = srcfmt->Amask ? COPY_ALPHA : SET_ALPHA; - table = normal_blit[srcfmt->BytesPerPixel - 1]; - for (which = 0; table[which].dstbpp; ++which) { - if (MASKOK(srcfmt->Rmask, table[which].srcR) && - MASKOK(srcfmt->Gmask, table[which].srcG) && - MASKOK(srcfmt->Bmask, table[which].srcB) && - MASKOK(dstfmt->Rmask, table[which].dstR) && - MASKOK(dstfmt->Gmask, table[which].dstG) && - MASKOK(dstfmt->Bmask, table[which].dstB) && - dstfmt->BytesPerPixel == table[which].dstbpp && - (a_need & table[which].alpha) == a_need && - ((table[which].blit_features & GetBlitFeatures()) == - table[which].blit_features)) - break; - } - blitfun = table[which].blitfunc; - - if (blitfun == BlitNtoN) { /* default C fallback catch-all. Slow! */ - if (srcfmt->format == SDL_PIXELFORMAT_ARGB2101010) { - blitfun = Blit2101010toN; - } else if (dstfmt->format == SDL_PIXELFORMAT_ARGB2101010) { - blitfun = BlitNto2101010; - } else if (srcfmt->BytesPerPixel == 4 && - dstfmt->BytesPerPixel == 4 && - srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && - srcfmt->Bmask == dstfmt->Bmask) { - if (a_need == COPY_ALPHA) { - if (srcfmt->Amask == dstfmt->Amask) { - /* Fastpath C fallback: 32bit RGBA<->RGBA blit with matching RGBA */ - blitfun = Blit4to4CopyAlpha; - } else { - blitfun = BlitNtoNCopyAlpha; - } - } else { - /* Fastpath C fallback: 32bit RGB<->RGBA blit with matching RGB */ - blitfun = Blit4to4MaskAlpha; - } - } else if (a_need == COPY_ALPHA) { - blitfun = BlitNtoNCopyAlpha; - } - } - } - return (blitfun); - - case SDL_COPY_COLORKEY: - /* colorkey blit: Here we don't have too many options, mostly - because RLE is the preferred fast way to deal with this. - If a particular case turns out to be useful we'll add it. */ - - if (srcfmt->BytesPerPixel == 2 && surface->map->identity) - return Blit2to2Key; - else if (dstfmt->BytesPerPixel == 1) - return BlitNto1Key; - else { -#if SDL_ALTIVEC_BLITTERS - if ((srcfmt->BytesPerPixel == 4) && (dstfmt->BytesPerPixel == 4) - && SDL_HasAltiVec()) { - return Blit32to32KeyAltivec; - } else -#endif - if (srcfmt->Amask && dstfmt->Amask) { - return BlitNtoNKeyCopyAlpha; - } else { - return BlitNtoNKey; - } - } - } - - return NULL; -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit_auto.c b/3rdparty/SDL2/src/video/SDL_blit_auto.c deleted file mode 100644 index f1228191339..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit_auto.c +++ /dev/null @@ -1,7419 +0,0 @@ -/* DO NOT EDIT! This file is generated by sdlgenblit.pl */ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* *INDENT-OFF* */ - -#include "SDL_video.h" -#include "SDL_blit.h" -#include "SDL_blit_auto.h" - -static void SDL_Blit_RGB888_RGB888_Scale(SDL_BlitInfo *info) -{ - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - *dst = *src; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_RGB888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_RGB888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_RGB888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_RGB888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_RGB888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_BGR888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_BGR888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_BGR888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_BGR888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_BGR888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_BGR888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_ARGB8888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = 0xFF; - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_ARGB8888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_ARGB8888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = 0xFF; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = 0xFF; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGB888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_RGB888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_RGB888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_RGB888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_RGB888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_RGB888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_RGB888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_BGR888_Scale(SDL_BlitInfo *info) -{ - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - *dst = *src; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_BGR888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_BGR888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_BGR888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_BGR888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_BGR888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_ARGB8888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = 0xFF; - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_ARGB8888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_ARGB8888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = 0xFF; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = 0xFF; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGR888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_RGB888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_RGB888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_RGB888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_RGB888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_RGB888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_RGB888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_BGR888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_BGR888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_BGR888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_BGR888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_BGR888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_BGR888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_ARGB8888_Scale(SDL_BlitInfo *info) -{ - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - *dst = *src; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_ARGB8888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_ARGB8888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = (Uint8)(pixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = (Uint8)(pixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_RGB888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_RGB888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_RGB888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_RGB888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_RGB888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_RGB888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_BGR888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_BGR888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_BGR888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_BGR888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_BGR888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_BGR888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_ARGB8888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); A = (Uint8)pixel; - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_ARGB8888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_ARGB8888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); A = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); A = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_RGB888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_RGB888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_RGB888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_RGB888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_RGB888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_RGB888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_BGR888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_BGR888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_BGR888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_BGR888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_BGR888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_BGR888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_ARGB8888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = (Uint8)(pixel >> 24); - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_ARGB8888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_ARGB8888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = (Uint8)(pixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = (Uint8)(pixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_RGB888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_RGB888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_RGB888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_RGB888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_RGB888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_RGB888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_BGR888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_BGR888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_BGR888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_BGR888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_BGR888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - Uint32 pixel; - Uint32 R, G, B; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_BGR888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_ARGB8888_Scale(SDL_BlitInfo *info) -{ - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); A = (Uint8)pixel; - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_ARGB8888_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_ARGB8888_Modulate(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - pixel = *src; - B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); A = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 pixel; - Uint32 R, G, B, A; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - pixel = *src; - B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); A = (Uint8)pixel; - if (flags & SDL_COPY_MODULATE_COLOR) { - R = (R * modulateR) / 255; - G = (G * modulateG) / 255; - B = (B * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - A = (A * modulateA) / 255; - } - pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B; - *dst = pixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - - while (info->dst_h--) { - Uint32 *src = (Uint32 *)info->src; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - while (n--) { - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -} - -static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint32 *src = 0; - Uint32 *dst = (Uint32 *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); - } - srcpixel = *src; - srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; - dstpixel = *dst; - dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; if (dstR > 255) dstR = 255; - dstG = srcG + dstG; if (dstG > 255) dstG = 255; - dstB = srcB + dstB; if (dstB > 255) dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB; - *dst = dstpixel; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[] = { - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Blend }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Blend_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Modulate }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Modulate_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Modulate_Blend }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Blend }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Blend_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Modulate }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Modulate_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Modulate_Blend }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Blend_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Modulate }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Blend }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Blend_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Modulate }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Modulate_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Modulate_Blend }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Blend }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Blend_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Modulate }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Modulate_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Modulate_Blend }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Blend_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Modulate }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Blend_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Modulate }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Modulate_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Modulate_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Blend_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Modulate }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Modulate_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Modulate_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Blend_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Blend_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Modulate }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Modulate_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Modulate_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Blend_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Modulate }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Modulate_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Modulate_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Blend_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Blend_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Modulate }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Modulate_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Modulate_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Blend_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Modulate }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Modulate_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Modulate_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Blend_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Blend_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Modulate }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Modulate_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Modulate_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Blend_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Modulate }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Modulate_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Modulate_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Modulate_Blend_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Blend_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale }, - { 0, 0, 0, 0, NULL } -}; - -/* *INDENT-ON* */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit_auto.h b/3rdparty/SDL2/src/video/SDL_blit_auto.h deleted file mode 100644 index 58a532db049..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit_auto.h +++ /dev/null @@ -1,30 +0,0 @@ -/* DO NOT EDIT! This file is generated by sdlgenblit.pl */ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* *INDENT-OFF* */ - -extern SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[]; - -/* *INDENT-ON* */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit_copy.c b/3rdparty/SDL2/src/video/SDL_blit_copy.c deleted file mode 100644 index 674650dd92c..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit_copy.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_video.h" -#include "SDL_blit.h" -#include "SDL_blit_copy.h" - - -#ifdef __SSE__ -/* This assumes 16-byte aligned src and dst */ -static SDL_INLINE void -SDL_memcpySSE(Uint8 * dst, const Uint8 * src, int len) -{ - int i; - - __m128 values[4]; - for (i = len / 64; i--;) { - _mm_prefetch(src, _MM_HINT_NTA); - values[0] = *(__m128 *) (src + 0); - values[1] = *(__m128 *) (src + 16); - values[2] = *(__m128 *) (src + 32); - values[3] = *(__m128 *) (src + 48); - _mm_stream_ps((float *) (dst + 0), values[0]); - _mm_stream_ps((float *) (dst + 16), values[1]); - _mm_stream_ps((float *) (dst + 32), values[2]); - _mm_stream_ps((float *) (dst + 48), values[3]); - src += 64; - dst += 64; - } - - if (len & 63) - SDL_memcpy(dst, src, len & 63); -} -#endif /* __SSE__ */ - -#ifdef __MMX__ -#ifdef _MSC_VER -#pragma warning(disable:4799) -#endif -static SDL_INLINE void -SDL_memcpyMMX(Uint8 * dst, const Uint8 * src, int len) -{ - const int remain = (len & 63); - int i; - - __m64* d64 = (__m64*)dst; - __m64* s64 = (__m64*)src; - - for(i= len / 64; i--;) { - d64[0] = s64[0]; - d64[1] = s64[1]; - d64[2] = s64[2]; - d64[3] = s64[3]; - d64[4] = s64[4]; - d64[5] = s64[5]; - d64[6] = s64[6]; - d64[7] = s64[7]; - - d64 += 8; - s64 += 8; - } - - if (remain) - { - const int skip = len - remain; - SDL_memcpy(dst + skip, src + skip, remain); - } -} -#endif /* __MMX__ */ - -void -SDL_BlitCopy(SDL_BlitInfo * info) -{ - SDL_bool overlap; - Uint8 *src, *dst; - int w, h; - int srcskip, dstskip; - - w = info->dst_w * info->dst_fmt->BytesPerPixel; - h = info->dst_h; - src = info->src; - dst = info->dst; - srcskip = info->src_pitch; - dstskip = info->dst_pitch; - - /* Properly handle overlapping blits */ - if (src < dst) { - overlap = (dst < (src + h*srcskip)); - } else { - overlap = (src < (dst + h*dstskip)); - } - if (overlap) { - if ( dst < src ) { - while ( h-- ) { - SDL_memmove(dst, src, w); - src += srcskip; - dst += dstskip; - } - } else { - src += ((h-1) * srcskip); - dst += ((h-1) * dstskip); - while ( h-- ) { - SDL_memmove(dst, src, w); - src -= srcskip; - dst -= dstskip; - } - } - return; - } - -#ifdef __SSE__ - if (SDL_HasSSE() && - !((uintptr_t) src & 15) && !(srcskip & 15) && - !((uintptr_t) dst & 15) && !(dstskip & 15)) { - while (h--) { - SDL_memcpySSE(dst, src, w); - src += srcskip; - dst += dstskip; - } - return; - } -#endif - -#ifdef __MMX__ - if (SDL_HasMMX() && !(srcskip & 7) && !(dstskip & 7)) { - while (h--) { - SDL_memcpyMMX(dst, src, w); - src += srcskip; - dst += dstskip; - } - _mm_empty(); - return; - } -#endif - - while (h--) { - SDL_memcpy(dst, src, w); - src += srcskip; - dst += dstskip; - } -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit_copy.h b/3rdparty/SDL2/src/video/SDL_blit_copy.h deleted file mode 100644 index 060026d8a7a..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit_copy.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -void SDL_BlitCopy(SDL_BlitInfo * info); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit_slow.c b/3rdparty/SDL2/src/video/SDL_blit_slow.c deleted file mode 100644 index 02ab41de724..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit_slow.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_video.h" -#include "SDL_blit.h" -#include "SDL_blit_slow.h" - -/* The ONE TRUE BLITTER - * This puppy has to handle all the unoptimized cases - yes, it's slow. - */ -void -SDL_Blit_Slow(SDL_BlitInfo * info) -{ - const int flags = info->flags; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; - const Uint32 modulateA = info->a; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; - Uint32 dstR, dstG, dstB, dstA; - int srcy, srcx; - int posy, posx; - int incy, incx; - SDL_PixelFormat *src_fmt = info->src_fmt; - SDL_PixelFormat *dst_fmt = info->dst_fmt; - int srcbpp = src_fmt->BytesPerPixel; - int dstbpp = dst_fmt->BytesPerPixel; - Uint32 rgbmask = ~src_fmt->Amask; - Uint32 ckey = info->colorkey & rgbmask; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - Uint8 *src = 0; - Uint8 *dst = (Uint8 *) info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = - (info->src + (srcy * info->src_pitch) + (srcx * srcbpp)); - } - if (src_fmt->Amask) { - DISEMBLE_RGBA(src, srcbpp, src_fmt, srcpixel, srcR, srcG, - srcB, srcA); - } else { - DISEMBLE_RGB(src, srcbpp, src_fmt, srcpixel, srcR, srcG, - srcB); - srcA = 0xFF; - } - if (flags & SDL_COPY_COLORKEY) { - /* srcpixel isn't set for 24 bpp */ - if (srcbpp == 3) { - srcpixel = (srcR << src_fmt->Rshift) | - (srcG << src_fmt->Gshift) | (srcB << src_fmt->Bshift); - } - if ((srcpixel & rgbmask) == ckey) { - posx += incx; - dst += dstbpp; - continue; - } - } - if (dst_fmt->Amask) { - DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, - dstB, dstA); - } else { - DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, - dstB); - dstA = 0xFF; - } - - if (flags & SDL_COPY_MODULATE_COLOR) { - srcR = (srcR * modulateR) / 255; - srcG = (srcG * modulateG) / 255; - srcB = (srcB * modulateB) / 255; - } - if (flags & SDL_COPY_MODULATE_ALPHA) { - srcA = (srcA * modulateA) / 255; - } - if (flags & (SDL_COPY_BLEND | SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (srcA < 255) { - srcR = (srcR * srcA) / 255; - srcG = (srcG * srcA) / 255; - srcB = (srcB * srcA) / 255; - } - } - switch (flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD)) { - case 0: - dstR = srcR; - dstG = srcG; - dstB = srcB; - dstA = srcA; - break; - case SDL_COPY_BLEND: - dstR = srcR + ((255 - srcA) * dstR) / 255; - dstG = srcG + ((255 - srcA) * dstG) / 255; - dstB = srcB + ((255 - srcA) * dstB) / 255; - dstA = srcA + ((255 - srcA) * dstA) / 255; - break; - case SDL_COPY_ADD: - dstR = srcR + dstR; - if (dstR > 255) - dstR = 255; - dstG = srcG + dstG; - if (dstG > 255) - dstG = 255; - dstB = srcB + dstB; - if (dstB > 255) - dstB = 255; - break; - case SDL_COPY_MOD: - dstR = (srcR * dstR) / 255; - dstG = (srcG * dstG) / 255; - dstB = (srcB * dstB) / 255; - break; - } - if (dst_fmt->Amask) { - ASSEMBLE_RGBA(dst, dstbpp, dst_fmt, dstR, dstG, dstB, dstA); - } else { - ASSEMBLE_RGB(dst, dstbpp, dst_fmt, dstR, dstG, dstB); - } - posx += incx; - dst += dstbpp; - } - posy += incy; - info->dst += info->dst_pitch; - } -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_blit_slow.h b/3rdparty/SDL2/src/video/SDL_blit_slow.h deleted file mode 100644 index 75005fc531b..00000000000 --- a/3rdparty/SDL2/src/video/SDL_blit_slow.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -extern void SDL_Blit_Slow(SDL_BlitInfo * info); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_bmp.c b/3rdparty/SDL2/src/video/SDL_bmp.c deleted file mode 100644 index 2d9cf240b05..00000000000 --- a/3rdparty/SDL2/src/video/SDL_bmp.c +++ /dev/null @@ -1,699 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* - Code to load and save surfaces in Windows BMP format. - - Why support BMP format? Well, it's a native format for Windows, and - most image processing programs can read and write it. It would be nice - to be able to have at least one image format that we can natively load - and save, and since PNG is so complex that it would bloat the library, - BMP is a good alternative. - - This code currently supports Win32 DIBs in uncompressed 8 and 24 bpp. -*/ - -#include "SDL_hints.h" -#include "SDL_video.h" -#include "SDL_assert.h" -#include "SDL_endian.h" -#include "SDL_pixels_c.h" - -#define SAVE_32BIT_BMP - -/* Compression encodings for BMP files */ -#ifndef BI_RGB -#define BI_RGB 0 -#define BI_RLE8 1 -#define BI_RLE4 2 -#define BI_BITFIELDS 3 -#endif - -/* Logical color space values for BMP files */ -#ifndef LCS_WINDOWS_COLOR_SPACE -/* 0x57696E20 == "Win " */ -#define LCS_WINDOWS_COLOR_SPACE 0x57696E20 -#endif - -static void CorrectAlphaChannel(SDL_Surface *surface) -{ - /* Check to see if there is any alpha channel data */ - SDL_bool hasAlpha = SDL_FALSE; -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - int alphaChannelOffset = 0; -#else - int alphaChannelOffset = 3; -#endif - Uint8 *alpha = ((Uint8*)surface->pixels) + alphaChannelOffset; - Uint8 *end = alpha + surface->h * surface->pitch; - - while (alpha < end) { - if (*alpha != 0) { - hasAlpha = SDL_TRUE; - break; - } - alpha += 4; - } - - if (!hasAlpha) { - alpha = ((Uint8*)surface->pixels) + alphaChannelOffset; - while (alpha < end) { - *alpha = SDL_ALPHA_OPAQUE; - alpha += 4; - } - } -} - -SDL_Surface * -SDL_LoadBMP_RW(SDL_RWops * src, int freesrc) -{ - SDL_bool was_error; - Sint64 fp_offset = 0; - int bmpPitch; - int i, pad; - SDL_Surface *surface; - Uint32 Rmask = 0; - Uint32 Gmask = 0; - Uint32 Bmask = 0; - Uint32 Amask = 0; - SDL_Palette *palette; - Uint8 *bits; - Uint8 *top, *end; - SDL_bool topDown; - int ExpandBMP; - SDL_bool haveRGBMasks = SDL_FALSE; - SDL_bool haveAlphaMask = SDL_FALSE; - SDL_bool correctAlpha = SDL_FALSE; - - /* The Win32 BMP file header (14 bytes) */ - char magic[2]; - /* Uint32 bfSize = 0; */ - /* Uint16 bfReserved1 = 0; */ - /* Uint16 bfReserved2 = 0; */ - Uint32 bfOffBits = 0; - - /* The Win32 BITMAPINFOHEADER struct (40 bytes) */ - Uint32 biSize = 0; - Sint32 biWidth = 0; - Sint32 biHeight = 0; - /* Uint16 biPlanes = 0; */ - Uint16 biBitCount = 0; - Uint32 biCompression = 0; - /* Uint32 biSizeImage = 0; */ - /* Sint32 biXPelsPerMeter = 0; */ - /* Sint32 biYPelsPerMeter = 0; */ - Uint32 biClrUsed = 0; - /* Uint32 biClrImportant = 0; */ - - /* Make sure we are passed a valid data source */ - surface = NULL; - was_error = SDL_FALSE; - if (src == NULL) { - was_error = SDL_TRUE; - goto done; - } - - /* Read in the BMP file header */ - fp_offset = SDL_RWtell(src); - SDL_ClearError(); - if (SDL_RWread(src, magic, 1, 2) != 2) { - SDL_Error(SDL_EFREAD); - was_error = SDL_TRUE; - goto done; - } - if (SDL_strncmp(magic, "BM", 2) != 0) { - SDL_SetError("File is not a Windows BMP file"); - was_error = SDL_TRUE; - goto done; - } - /* bfSize = */ SDL_ReadLE32(src); - /* bfReserved1 = */ SDL_ReadLE16(src); - /* bfReserved2 = */ SDL_ReadLE16(src); - bfOffBits = SDL_ReadLE32(src); - - /* Read the Win32 BITMAPINFOHEADER */ - biSize = SDL_ReadLE32(src); - if (biSize == 12) { /* really old BITMAPCOREHEADER */ - biWidth = (Uint32) SDL_ReadLE16(src); - biHeight = (Uint32) SDL_ReadLE16(src); - /* biPlanes = */ SDL_ReadLE16(src); - biBitCount = SDL_ReadLE16(src); - biCompression = BI_RGB; - } else if (biSize >= 40) { /* some version of BITMAPINFOHEADER */ - Uint32 headerSize; - biWidth = SDL_ReadLE32(src); - biHeight = SDL_ReadLE32(src); - /* biPlanes = */ SDL_ReadLE16(src); - biBitCount = SDL_ReadLE16(src); - biCompression = SDL_ReadLE32(src); - /* biSizeImage = */ SDL_ReadLE32(src); - /* biXPelsPerMeter = */ SDL_ReadLE32(src); - /* biYPelsPerMeter = */ SDL_ReadLE32(src); - biClrUsed = SDL_ReadLE32(src); - /* biClrImportant = */ SDL_ReadLE32(src); - - /* 64 == BITMAPCOREHEADER2, an incompatible OS/2 2.x extension. Skip this stuff for now. */ - if (biSize == 64) { - /* ignore these extra fields. */ - if (biCompression == BI_BITFIELDS) { - /* this value is actually huffman compression in this variant. */ - SDL_SetError("Compressed BMP files not supported"); - was_error = SDL_TRUE; - goto done; - } - } else { - /* This is complicated. If compression is BI_BITFIELDS, then - we have 3 DWORDS that specify the RGB masks. This is either - stored here in an BITMAPV2INFOHEADER (which only differs in - that it adds these RGB masks) and biSize >= 52, or we've got - these masks stored in the exact same place, but strictly - speaking, this is the bmiColors field in BITMAPINFO immediately - following the legacy v1 info header, just past biSize. */ - if (biCompression == BI_BITFIELDS) { - haveRGBMasks = SDL_TRUE; - Rmask = SDL_ReadLE32(src); - Gmask = SDL_ReadLE32(src); - Bmask = SDL_ReadLE32(src); - - /* ...v3 adds an alpha mask. */ - if (biSize >= 56) { /* BITMAPV3INFOHEADER; adds alpha mask */ - haveAlphaMask = SDL_TRUE; - Amask = SDL_ReadLE32(src); - } - } else { - /* the mask fields are ignored for v2+ headers if not BI_BITFIELD. */ - if (biSize >= 52) { /* BITMAPV2INFOHEADER; adds RGB masks */ - /*Rmask = */ SDL_ReadLE32(src); - /*Gmask = */ SDL_ReadLE32(src); - /*Bmask = */ SDL_ReadLE32(src); - } - if (biSize >= 56) { /* BITMAPV3INFOHEADER; adds alpha mask */ - /*Amask = */ SDL_ReadLE32(src); - } - } - - /* Insert other fields here; Wikipedia and MSDN say we're up to - v5 of this header, but we ignore those for now (they add gamma, - color spaces, etc). Ignoring the weird OS/2 2.x format, we - currently parse up to v3 correctly (hopefully!). */ - } - - /* skip any header bytes we didn't handle... */ - headerSize = (Uint32) (SDL_RWtell(src) - (fp_offset + 14)); - if (biSize > headerSize) { - SDL_RWseek(src, (biSize - headerSize), RW_SEEK_CUR); - } - } - if (biHeight < 0) { - topDown = SDL_TRUE; - biHeight = -biHeight; - } else { - topDown = SDL_FALSE; - } - - /* Check for read error */ - if (SDL_strcmp(SDL_GetError(), "") != 0) { - was_error = SDL_TRUE; - goto done; - } - - /* Expand 1 and 4 bit bitmaps to 8 bits per pixel */ - switch (biBitCount) { - case 1: - case 4: - ExpandBMP = biBitCount; - biBitCount = 8; - break; - default: - ExpandBMP = 0; - break; - } - - /* We don't support any BMP compression right now */ - switch (biCompression) { - case BI_RGB: - /* If there are no masks, use the defaults */ - SDL_assert(!haveRGBMasks); - SDL_assert(!haveAlphaMask); - /* Default values for the BMP format */ - switch (biBitCount) { - case 15: - case 16: - Rmask = 0x7C00; - Gmask = 0x03E0; - Bmask = 0x001F; - break; - case 24: -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - Rmask = 0x000000FF; - Gmask = 0x0000FF00; - Bmask = 0x00FF0000; -#else - Rmask = 0x00FF0000; - Gmask = 0x0000FF00; - Bmask = 0x000000FF; -#endif - break; - case 32: - /* We don't know if this has alpha channel or not */ - correctAlpha = SDL_TRUE; - Amask = 0xFF000000; - Rmask = 0x00FF0000; - Gmask = 0x0000FF00; - Bmask = 0x000000FF; - break; - default: - break; - } - break; - - case BI_BITFIELDS: - break; /* we handled this in the info header. */ - - default: - SDL_SetError("Compressed BMP files not supported"); - was_error = SDL_TRUE; - goto done; - } - - /* Create a compatible surface, note that the colors are RGB ordered */ - surface = - SDL_CreateRGBSurface(0, biWidth, biHeight, biBitCount, Rmask, Gmask, - Bmask, Amask); - if (surface == NULL) { - was_error = SDL_TRUE; - goto done; - } - - /* Load the palette, if any */ - palette = (surface->format)->palette; - if (palette) { - SDL_assert(biBitCount <= 8); - if (biClrUsed == 0) { - biClrUsed = 1 << biBitCount; - } - if ((int) biClrUsed > palette->ncolors) { - SDL_Color *colors; - int ncolors = biClrUsed; - colors = - (SDL_Color *) SDL_realloc(palette->colors, - ncolors * - sizeof(*palette->colors)); - if (!colors) { - SDL_OutOfMemory(); - was_error = SDL_TRUE; - goto done; - } - palette->ncolors = ncolors; - palette->colors = colors; - } else if ((int) biClrUsed < palette->ncolors) { - palette->ncolors = biClrUsed; - } - if (biSize == 12) { - for (i = 0; i < (int) biClrUsed; ++i) { - SDL_RWread(src, &palette->colors[i].b, 1, 1); - SDL_RWread(src, &palette->colors[i].g, 1, 1); - SDL_RWread(src, &palette->colors[i].r, 1, 1); - palette->colors[i].a = SDL_ALPHA_OPAQUE; - } - } else { - for (i = 0; i < (int) biClrUsed; ++i) { - SDL_RWread(src, &palette->colors[i].b, 1, 1); - SDL_RWread(src, &palette->colors[i].g, 1, 1); - SDL_RWread(src, &palette->colors[i].r, 1, 1); - SDL_RWread(src, &palette->colors[i].a, 1, 1); - - /* According to Microsoft documentation, the fourth element - is reserved and must be zero, so we shouldn't treat it as - alpha. - */ - palette->colors[i].a = SDL_ALPHA_OPAQUE; - } - } - } - - /* Read the surface pixels. Note that the bmp image is upside down */ - if (SDL_RWseek(src, fp_offset + bfOffBits, RW_SEEK_SET) < 0) { - SDL_Error(SDL_EFSEEK); - was_error = SDL_TRUE; - goto done; - } - top = (Uint8 *)surface->pixels; - end = (Uint8 *)surface->pixels+(surface->h*surface->pitch); - switch (ExpandBMP) { - case 1: - bmpPitch = (biWidth + 7) >> 3; - pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0); - break; - case 4: - bmpPitch = (biWidth + 1) >> 1; - pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0); - break; - default: - pad = ((surface->pitch % 4) ? (4 - (surface->pitch % 4)) : 0); - break; - } - if (topDown) { - bits = top; - } else { - bits = end - surface->pitch; - } - while (bits >= top && bits < end) { - switch (ExpandBMP) { - case 1: - case 4:{ - Uint8 pixel = 0; - int shift = (8 - ExpandBMP); - for (i = 0; i < surface->w; ++i) { - if (i % (8 / ExpandBMP) == 0) { - if (!SDL_RWread(src, &pixel, 1, 1)) { - SDL_SetError("Error reading from BMP"); - was_error = SDL_TRUE; - goto done; - } - } - *(bits + i) = (pixel >> shift); - pixel <<= ExpandBMP; - } - } - break; - - default: - if (SDL_RWread(src, bits, 1, surface->pitch) - != surface->pitch) { - SDL_Error(SDL_EFREAD); - was_error = SDL_TRUE; - goto done; - } -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - /* Byte-swap the pixels if needed. Note that the 24bpp - case has already been taken care of above. */ - switch (biBitCount) { - case 15: - case 16:{ - Uint16 *pix = (Uint16 *) bits; - for (i = 0; i < surface->w; i++) - pix[i] = SDL_Swap16(pix[i]); - break; - } - - case 32:{ - Uint32 *pix = (Uint32 *) bits; - for (i = 0; i < surface->w; i++) - pix[i] = SDL_Swap32(pix[i]); - break; - } - } -#endif - break; - } - /* Skip padding bytes, ugh */ - if (pad) { - Uint8 padbyte; - for (i = 0; i < pad; ++i) { - SDL_RWread(src, &padbyte, 1, 1); - } - } - if (topDown) { - bits += surface->pitch; - } else { - bits -= surface->pitch; - } - } - if (correctAlpha) { - CorrectAlphaChannel(surface); - } - done: - if (was_error) { - if (src) { - SDL_RWseek(src, fp_offset, RW_SEEK_SET); - } - SDL_FreeSurface(surface); - surface = NULL; - } - if (freesrc && src) { - SDL_RWclose(src); - } - return (surface); -} - -int -SDL_SaveBMP_RW(SDL_Surface * saveme, SDL_RWops * dst, int freedst) -{ - Sint64 fp_offset; - int i, pad; - SDL_Surface *surface; - Uint8 *bits; - SDL_bool save32bit = SDL_FALSE; - SDL_bool saveLegacyBMP = SDL_FALSE; - - /* The Win32 BMP file header (14 bytes) */ - char magic[2] = { 'B', 'M' }; - Uint32 bfSize; - Uint16 bfReserved1; - Uint16 bfReserved2; - Uint32 bfOffBits; - - /* The Win32 BITMAPINFOHEADER struct (40 bytes) */ - Uint32 biSize; - Sint32 biWidth; - Sint32 biHeight; - Uint16 biPlanes; - Uint16 biBitCount; - Uint32 biCompression; - Uint32 biSizeImage; - Sint32 biXPelsPerMeter; - Sint32 biYPelsPerMeter; - Uint32 biClrUsed; - Uint32 biClrImportant; - - /* The additional header members from the Win32 BITMAPV4HEADER struct (108 bytes in total) */ - Uint32 bV4RedMask = 0; - Uint32 bV4GreenMask = 0; - Uint32 bV4BlueMask = 0; - Uint32 bV4AlphaMask = 0; - Uint32 bV4CSType = 0; - Sint32 bV4Endpoints[3 * 3] = {0}; - Uint32 bV4GammaRed = 0; - Uint32 bV4GammaGreen = 0; - Uint32 bV4GammaBlue = 0; - - /* Make sure we have somewhere to save */ - surface = NULL; - if (dst) { -#ifdef SAVE_32BIT_BMP - /* We can save alpha information in a 32-bit BMP */ - if (saveme->format->BitsPerPixel >= 8 && (saveme->format->Amask || - saveme->map->info.flags & SDL_COPY_COLORKEY)) { - save32bit = SDL_TRUE; - } -#endif /* SAVE_32BIT_BMP */ - - if (saveme->format->palette && !save32bit) { - if (saveme->format->BitsPerPixel == 8) { - surface = saveme; - } else { - SDL_SetError("%d bpp BMP files not supported", - saveme->format->BitsPerPixel); - } - } else if ((saveme->format->BitsPerPixel == 24) && !save32bit && -#if SDL_BYTEORDER == SDL_LIL_ENDIAN - (saveme->format->Rmask == 0x00FF0000) && - (saveme->format->Gmask == 0x0000FF00) && - (saveme->format->Bmask == 0x000000FF) -#else - (saveme->format->Rmask == 0x000000FF) && - (saveme->format->Gmask == 0x0000FF00) && - (saveme->format->Bmask == 0x00FF0000) -#endif - ) { - surface = saveme; - } else { - SDL_PixelFormat format; - - /* If the surface has a colorkey or alpha channel we'll save a - 32-bit BMP with alpha channel, otherwise save a 24-bit BMP. */ - if (save32bit) { - SDL_InitFormat(&format, SDL_PIXELFORMAT_BGRA32); - } else { - SDL_InitFormat(&format, SDL_PIXELFORMAT_BGR24); - } - surface = SDL_ConvertSurface(saveme, &format, 0); - if (!surface) { - SDL_SetError("Couldn't convert image to %d bpp", - format.BitsPerPixel); - } - } - } else { - /* Set no error here because it may overwrite a more useful message from - SDL_RWFromFile() if SDL_SaveBMP_RW() is called from SDL_SaveBMP(). */ - return -1; - } - - if (save32bit) { - saveLegacyBMP = SDL_GetHintBoolean(SDL_HINT_BMP_SAVE_LEGACY_FORMAT, SDL_FALSE); - } - - if (surface && (SDL_LockSurface(surface) == 0)) { - const int bw = surface->w * surface->format->BytesPerPixel; - - /* Set the BMP file header values */ - bfSize = 0; /* We'll write this when we're done */ - bfReserved1 = 0; - bfReserved2 = 0; - bfOffBits = 0; /* We'll write this when we're done */ - - /* Write the BMP file header values */ - fp_offset = SDL_RWtell(dst); - SDL_ClearError(); - SDL_RWwrite(dst, magic, 2, 1); - SDL_WriteLE32(dst, bfSize); - SDL_WriteLE16(dst, bfReserved1); - SDL_WriteLE16(dst, bfReserved2); - SDL_WriteLE32(dst, bfOffBits); - - /* Set the BMP info values */ - biSize = 40; - biWidth = surface->w; - biHeight = surface->h; - biPlanes = 1; - biBitCount = surface->format->BitsPerPixel; - biCompression = BI_RGB; - biSizeImage = surface->h * surface->pitch; - biXPelsPerMeter = 0; - biYPelsPerMeter = 0; - if (surface->format->palette) { - biClrUsed = surface->format->palette->ncolors; - } else { - biClrUsed = 0; - } - biClrImportant = 0; - - /* Set the BMP info values for the version 4 header */ - if (save32bit && !saveLegacyBMP) { - biSize = 108; - biCompression = BI_BITFIELDS; - /* The BMP format is always little endian, these masks stay the same */ - bV4RedMask = 0x00ff0000; - bV4GreenMask = 0x0000ff00; - bV4BlueMask = 0x000000ff; - bV4AlphaMask = 0xff000000; - bV4CSType = LCS_WINDOWS_COLOR_SPACE; - bV4GammaRed = 0; - bV4GammaGreen = 0; - bV4GammaBlue = 0; - } - - /* Write the BMP info values */ - SDL_WriteLE32(dst, biSize); - SDL_WriteLE32(dst, biWidth); - SDL_WriteLE32(dst, biHeight); - SDL_WriteLE16(dst, biPlanes); - SDL_WriteLE16(dst, biBitCount); - SDL_WriteLE32(dst, biCompression); - SDL_WriteLE32(dst, biSizeImage); - SDL_WriteLE32(dst, biXPelsPerMeter); - SDL_WriteLE32(dst, biYPelsPerMeter); - SDL_WriteLE32(dst, biClrUsed); - SDL_WriteLE32(dst, biClrImportant); - - /* Write the BMP info values for the version 4 header */ - if (save32bit && !saveLegacyBMP) { - SDL_WriteLE32(dst, bV4RedMask); - SDL_WriteLE32(dst, bV4GreenMask); - SDL_WriteLE32(dst, bV4BlueMask); - SDL_WriteLE32(dst, bV4AlphaMask); - SDL_WriteLE32(dst, bV4CSType); - for (i = 0; i < 3 * 3; i++) { - SDL_WriteLE32(dst, bV4Endpoints[i]); - } - SDL_WriteLE32(dst, bV4GammaRed); - SDL_WriteLE32(dst, bV4GammaGreen); - SDL_WriteLE32(dst, bV4GammaBlue); - } - - /* Write the palette (in BGR color order) */ - if (surface->format->palette) { - SDL_Color *colors; - int ncolors; - - colors = surface->format->palette->colors; - ncolors = surface->format->palette->ncolors; - for (i = 0; i < ncolors; ++i) { - SDL_RWwrite(dst, &colors[i].b, 1, 1); - SDL_RWwrite(dst, &colors[i].g, 1, 1); - SDL_RWwrite(dst, &colors[i].r, 1, 1); - SDL_RWwrite(dst, &colors[i].a, 1, 1); - } - } - - /* Write the bitmap offset */ - bfOffBits = (Uint32)(SDL_RWtell(dst) - fp_offset); - if (SDL_RWseek(dst, fp_offset + 10, RW_SEEK_SET) < 0) { - SDL_Error(SDL_EFSEEK); - } - SDL_WriteLE32(dst, bfOffBits); - if (SDL_RWseek(dst, fp_offset + bfOffBits, RW_SEEK_SET) < 0) { - SDL_Error(SDL_EFSEEK); - } - - /* Write the bitmap image upside down */ - bits = (Uint8 *) surface->pixels + (surface->h * surface->pitch); - pad = ((bw % 4) ? (4 - (bw % 4)) : 0); - while (bits > (Uint8 *) surface->pixels) { - bits -= surface->pitch; - if (SDL_RWwrite(dst, bits, 1, bw) != bw) { - SDL_Error(SDL_EFWRITE); - break; - } - if (pad) { - const Uint8 padbyte = 0; - for (i = 0; i < pad; ++i) { - SDL_RWwrite(dst, &padbyte, 1, 1); - } - } - } - - /* Write the BMP file size */ - bfSize = (Uint32)(SDL_RWtell(dst) - fp_offset); - if (SDL_RWseek(dst, fp_offset + 2, RW_SEEK_SET) < 0) { - SDL_Error(SDL_EFSEEK); - } - SDL_WriteLE32(dst, bfSize); - if (SDL_RWseek(dst, fp_offset + bfSize, RW_SEEK_SET) < 0) { - SDL_Error(SDL_EFSEEK); - } - - /* Close it up.. */ - SDL_UnlockSurface(surface); - if (surface != saveme) { - SDL_FreeSurface(surface); - } - } - - if (freedst && dst) { - SDL_RWclose(dst); - } - return ((SDL_strcmp(SDL_GetError(), "") == 0) ? 0 : -1); -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_clipboard.c b/3rdparty/SDL2/src/video/SDL_clipboard.c deleted file mode 100644 index 91d1eeea04d..00000000000 --- a/3rdparty/SDL2/src/video/SDL_clipboard.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_clipboard.h" -#include "SDL_sysvideo.h" - - -int -SDL_SetClipboardText(const char *text) -{ - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - - if (!_this) { - return SDL_SetError("Video subsystem must be initialized to set clipboard text"); - } - - if (!text) { - text = ""; - } - if (_this->SetClipboardText) { - return _this->SetClipboardText(_this, text); - } else { - SDL_free(_this->clipboard_text); - _this->clipboard_text = SDL_strdup(text); - return 0; - } -} - -char * -SDL_GetClipboardText(void) -{ - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - - if (!_this) { - SDL_SetError("Video subsystem must be initialized to get clipboard text"); - return SDL_strdup(""); - } - - if (_this->GetClipboardText) { - return _this->GetClipboardText(_this); - } else { - const char *text = _this->clipboard_text; - if (!text) { - text = ""; - } - return SDL_strdup(text); - } -} - -SDL_bool -SDL_HasClipboardText(void) -{ - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - - if (!_this) { - SDL_SetError("Video subsystem must be initialized to check clipboard text"); - return SDL_FALSE; - } - - if (_this->HasClipboardText) { - return _this->HasClipboardText(_this); - } else { - if (_this->clipboard_text && _this->clipboard_text[0] != '\0') { - return SDL_TRUE; - } else { - return SDL_FALSE; - } - } -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_egl.c b/3rdparty/SDL2/src/video/SDL_egl.c deleted file mode 100644 index c9038056639..00000000000 --- a/3rdparty/SDL2/src/video/SDL_egl.c +++ /dev/null @@ -1,633 +0,0 @@ -/* - * Simple DirectMedia Layer - * Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - */ -#include "../SDL_internal.h" - -#if SDL_VIDEO_OPENGL_EGL - -#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT -#include "../core/windows/SDL_windows.h" -#endif - -#include "SDL_sysvideo.h" -#include "SDL_egl_c.h" -#include "SDL_loadso.h" -#include "SDL_hints.h" - -#ifdef EGL_KHR_create_context -/* EGL_OPENGL_ES3_BIT_KHR was added in version 13 of the extension. */ -#ifndef EGL_OPENGL_ES3_BIT_KHR -#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 -#endif -#endif /* EGL_KHR_create_context */ - -#if SDL_VIDEO_DRIVER_RPI -/* Raspbian places the OpenGL ES/EGL binaries in a non standard path */ -#define DEFAULT_EGL "/opt/vc/lib/libEGL.so" -#define DEFAULT_OGL_ES2 "/opt/vc/lib/libGLESv2.so" -#define DEFAULT_OGL_ES_PVR "/opt/vc/lib/libGLES_CM.so" -#define DEFAULT_OGL_ES "/opt/vc/lib/libGLESv1_CM.so" - -#elif SDL_VIDEO_DRIVER_ANDROID || SDL_VIDEO_DRIVER_VIVANTE -/* Android */ -#define DEFAULT_EGL "libEGL.so" -#define DEFAULT_OGL_ES2 "libGLESv2.so" -#define DEFAULT_OGL_ES_PVR "libGLES_CM.so" -#define DEFAULT_OGL_ES "libGLESv1_CM.so" - -#elif SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT -/* EGL AND OpenGL ES support via ANGLE */ -#define DEFAULT_EGL "libEGL.dll" -#define DEFAULT_OGL_ES2 "libGLESv2.dll" -#define DEFAULT_OGL_ES_PVR "libGLES_CM.dll" -#define DEFAULT_OGL_ES "libGLESv1_CM.dll" - -#else -/* Desktop Linux */ -#define DEFAULT_OGL "libGL.so.1" -#define DEFAULT_EGL "libEGL.so.1" -#define DEFAULT_OGL_ES2 "libGLESv2.so.2" -#define DEFAULT_OGL_ES_PVR "libGLES_CM.so.1" -#define DEFAULT_OGL_ES "libGLESv1_CM.so.1" -#endif /* SDL_VIDEO_DRIVER_RPI */ - -#define LOAD_FUNC(NAME) \ -_this->egl_data->NAME = SDL_LoadFunction(_this->egl_data->dll_handle, #NAME); \ -if (!_this->egl_data->NAME) \ -{ \ - return SDL_SetError("Could not retrieve EGL function " #NAME); \ -} - -/* EGL implementation of SDL OpenGL ES support */ -#ifdef EGL_KHR_create_context -static int SDL_EGL_HasExtension(_THIS, const char *ext) -{ - int i; - int len = 0; - size_t ext_len; - const char *exts; - const char *ext_word; - - ext_len = SDL_strlen(ext); - exts = _this->egl_data->eglQueryString(_this->egl_data->egl_display, EGL_EXTENSIONS); - - if (exts) { - ext_word = exts; - - for (i = 0; exts[i] != 0; i++) { - if (exts[i] == ' ') { - if (ext_len == len && !SDL_strncmp(ext_word, ext, len)) { - return 1; - } - - len = 0; - ext_word = &exts[i + 1]; - } else { - len++; - } - } - } - - return 0; -} -#endif /* EGL_KHR_create_context */ - -void * -SDL_EGL_GetProcAddress(_THIS, const char *proc) -{ - static char procname[1024]; - void *retval; - - /* eglGetProcAddress is busted on Android http://code.google.com/p/android/issues/detail?id=7681 */ -#if !defined(SDL_VIDEO_DRIVER_ANDROID) && !defined(SDL_VIDEO_DRIVER_MIR) - if (_this->egl_data->eglGetProcAddress) { - retval = _this->egl_data->eglGetProcAddress(proc); - if (retval) { - return retval; - } - } -#endif - - retval = SDL_LoadFunction(_this->egl_data->egl_dll_handle, proc); - if (!retval && SDL_strlen(proc) <= 1022) { - procname[0] = '_'; - SDL_strlcpy(procname + 1, proc, 1022); - retval = SDL_LoadFunction(_this->egl_data->egl_dll_handle, procname); - } - return retval; -} - -void -SDL_EGL_UnloadLibrary(_THIS) -{ - if (_this->egl_data) { - if (_this->egl_data->egl_display) { - _this->egl_data->eglTerminate(_this->egl_data->egl_display); - _this->egl_data->egl_display = NULL; - } - - if (_this->egl_data->dll_handle) { - SDL_UnloadObject(_this->egl_data->dll_handle); - _this->egl_data->dll_handle = NULL; - } - if (_this->egl_data->egl_dll_handle) { - SDL_UnloadObject(_this->egl_data->egl_dll_handle); - _this->egl_data->egl_dll_handle = NULL; - } - - SDL_free(_this->egl_data); - _this->egl_data = NULL; - } -} - -int -SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_display) -{ - void *dll_handle = NULL, *egl_dll_handle = NULL; /* The naming is counter intuitive, but hey, I just work here -- Gabriel */ - const char *path = NULL; -#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT - const char *d3dcompiler; -#endif - - if (_this->egl_data) { - return SDL_SetError("OpenGL ES context already created"); - } - - _this->egl_data = (struct SDL_EGL_VideoData *) SDL_calloc(1, sizeof(SDL_EGL_VideoData)); - if (!_this->egl_data) { - return SDL_OutOfMemory(); - } - -#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT - d3dcompiler = SDL_GetHint(SDL_HINT_VIDEO_WIN_D3DCOMPILER); - if (!d3dcompiler) { - if (WIN_IsWindowsVistaOrGreater()) { - d3dcompiler = "d3dcompiler_46.dll"; - } else { - d3dcompiler = "d3dcompiler_43.dll"; - } - } - if (SDL_strcasecmp(d3dcompiler, "none") != 0) { - SDL_LoadObject(d3dcompiler); - } -#endif - - /* A funny thing, loading EGL.so first does not work on the Raspberry, so we load libGL* first */ - path = SDL_getenv("SDL_VIDEO_GL_DRIVER"); - if (path != NULL) { - egl_dll_handle = SDL_LoadObject(path); - } - - if (egl_dll_handle == NULL) { - if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) { - if (_this->gl_config.major_version > 1) { - path = DEFAULT_OGL_ES2; - egl_dll_handle = SDL_LoadObject(path); - } else { - path = DEFAULT_OGL_ES; - egl_dll_handle = SDL_LoadObject(path); - if (egl_dll_handle == NULL) { - path = DEFAULT_OGL_ES_PVR; - egl_dll_handle = SDL_LoadObject(path); - } - } - } -#ifdef DEFAULT_OGL - else { - path = DEFAULT_OGL; - egl_dll_handle = SDL_LoadObject(path); - } -#endif - } - _this->egl_data->egl_dll_handle = egl_dll_handle; - - if (egl_dll_handle == NULL) { - return SDL_SetError("Could not initialize OpenGL / GLES library"); - } - - /* Loading libGL* in the previous step took care of loading libEGL.so, but we future proof by double checking */ - if (egl_path != NULL) { - dll_handle = SDL_LoadObject(egl_path); - } - /* Try loading a EGL symbol, if it does not work try the default library paths */ - if (dll_handle == NULL || SDL_LoadFunction(dll_handle, "eglChooseConfig") == NULL) { - if (dll_handle != NULL) { - SDL_UnloadObject(dll_handle); - } - path = SDL_getenv("SDL_VIDEO_EGL_DRIVER"); - if (path == NULL) { - path = DEFAULT_EGL; - } - dll_handle = SDL_LoadObject(path); - if (dll_handle == NULL || SDL_LoadFunction(dll_handle, "eglChooseConfig") == NULL) { - if (dll_handle != NULL) { - SDL_UnloadObject(dll_handle); - } - return SDL_SetError("Could not load EGL library"); - } - SDL_ClearError(); - } - - _this->egl_data->dll_handle = dll_handle; - - /* Load new function pointers */ - LOAD_FUNC(eglGetDisplay); - LOAD_FUNC(eglInitialize); - LOAD_FUNC(eglTerminate); - LOAD_FUNC(eglGetProcAddress); - LOAD_FUNC(eglChooseConfig); - LOAD_FUNC(eglGetConfigAttrib); - LOAD_FUNC(eglCreateContext); - LOAD_FUNC(eglDestroyContext); - LOAD_FUNC(eglCreateWindowSurface); - LOAD_FUNC(eglDestroySurface); - LOAD_FUNC(eglMakeCurrent); - LOAD_FUNC(eglSwapBuffers); - LOAD_FUNC(eglSwapInterval); - LOAD_FUNC(eglWaitNative); - LOAD_FUNC(eglWaitGL); - LOAD_FUNC(eglBindAPI); - LOAD_FUNC(eglQueryString); - -#if !defined(__WINRT__) - _this->egl_data->egl_display = _this->egl_data->eglGetDisplay(native_display); - if (!_this->egl_data->egl_display) { - return SDL_SetError("Could not get EGL display"); - } - - if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) { - return SDL_SetError("Could not initialize EGL"); - } -#endif - - _this->gl_config.driver_loaded = 1; - - if (path) { - SDL_strlcpy(_this->gl_config.driver_path, path, sizeof(_this->gl_config.driver_path) - 1); - } else { - *_this->gl_config.driver_path = '\0'; - } - - return 0; -} - -int -SDL_EGL_ChooseConfig(_THIS) -{ - /* 64 seems nice. */ - EGLint attribs[64]; - EGLint found_configs = 0, value; - /* 128 seems even nicer here */ - EGLConfig configs[128]; - int i, j, best_bitdiff = -1, bitdiff; - - if (!_this->egl_data) { - /* The EGL library wasn't loaded, SDL_GetError() should have info */ - return -1; - } - - /* Get a valid EGL configuration */ - i = 0; - attribs[i++] = EGL_RED_SIZE; - attribs[i++] = _this->gl_config.red_size; - attribs[i++] = EGL_GREEN_SIZE; - attribs[i++] = _this->gl_config.green_size; - attribs[i++] = EGL_BLUE_SIZE; - attribs[i++] = _this->gl_config.blue_size; - - if (_this->gl_config.alpha_size) { - attribs[i++] = EGL_ALPHA_SIZE; - attribs[i++] = _this->gl_config.alpha_size; - } - - if (_this->gl_config.buffer_size) { - attribs[i++] = EGL_BUFFER_SIZE; - attribs[i++] = _this->gl_config.buffer_size; - } - - attribs[i++] = EGL_DEPTH_SIZE; - attribs[i++] = _this->gl_config.depth_size; - - if (_this->gl_config.stencil_size) { - attribs[i++] = EGL_STENCIL_SIZE; - attribs[i++] = _this->gl_config.stencil_size; - } - - if (_this->gl_config.multisamplebuffers) { - attribs[i++] = EGL_SAMPLE_BUFFERS; - attribs[i++] = _this->gl_config.multisamplebuffers; - } - - if (_this->gl_config.multisamplesamples) { - attribs[i++] = EGL_SAMPLES; - attribs[i++] = _this->gl_config.multisamplesamples; - } - - if (_this->gl_config.framebuffer_srgb_capable) { -#ifdef EGL_KHR_gl_colorspace - if (SDL_EGL_HasExtension(_this, "EGL_KHR_gl_colorspace")) { - attribs[i++] = EGL_GL_COLORSPACE_KHR; - attribs[i++] = EGL_GL_COLORSPACE_SRGB_KHR; - } else -#endif - { - return SDL_SetError("EGL implementation does not support sRGB system framebuffers"); - } - } - - attribs[i++] = EGL_RENDERABLE_TYPE; - if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) { -#ifdef EGL_KHR_create_context - if (_this->gl_config.major_version >= 3 && - SDL_EGL_HasExtension(_this, "EGL_KHR_create_context")) { - attribs[i++] = EGL_OPENGL_ES3_BIT_KHR; - } else -#endif - if (_this->gl_config.major_version >= 2) { - attribs[i++] = EGL_OPENGL_ES2_BIT; - } else { - attribs[i++] = EGL_OPENGL_ES_BIT; - } - _this->egl_data->eglBindAPI(EGL_OPENGL_ES_API); - } else { - attribs[i++] = EGL_OPENGL_BIT; - _this->egl_data->eglBindAPI(EGL_OPENGL_API); - } - - attribs[i++] = EGL_NONE; - - if (_this->egl_data->eglChooseConfig(_this->egl_data->egl_display, - attribs, - configs, SDL_arraysize(configs), - &found_configs) == EGL_FALSE || - found_configs == 0) { - return SDL_SetError("Couldn't find matching EGL config"); - } - - /* eglChooseConfig returns a number of configurations that match or exceed the requested attribs. */ - /* From those, we select the one that matches our requirements more closely via a makeshift algorithm */ - - for (i = 0; i < found_configs; i++ ) { - bitdiff = 0; - for (j = 0; j < SDL_arraysize(attribs) - 1; j += 2) { - if (attribs[j] == EGL_NONE) { - break; - } - - if ( attribs[j+1] != EGL_DONT_CARE && ( - attribs[j] == EGL_RED_SIZE || - attribs[j] == EGL_GREEN_SIZE || - attribs[j] == EGL_BLUE_SIZE || - attribs[j] == EGL_ALPHA_SIZE || - attribs[j] == EGL_DEPTH_SIZE || - attribs[j] == EGL_STENCIL_SIZE)) { - _this->egl_data->eglGetConfigAttrib(_this->egl_data->egl_display, configs[i], attribs[j], &value); - bitdiff += value - attribs[j + 1]; /* value is always >= attrib */ - } - } - - if (bitdiff < best_bitdiff || best_bitdiff == -1) { - _this->egl_data->egl_config = configs[i]; - - best_bitdiff = bitdiff; - } - - if (bitdiff == 0) { - break; /* we found an exact match! */ - } - } - - return 0; -} - -SDL_GLContext -SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface) -{ - /* max 14 values plus terminator. */ - EGLint attribs[15]; - int attr = 0; - - EGLContext egl_context, share_context = EGL_NO_CONTEXT; - EGLint profile_mask = _this->gl_config.profile_mask; - EGLint major_version = _this->gl_config.major_version; - EGLint minor_version = _this->gl_config.minor_version; - SDL_bool profile_es = (profile_mask == SDL_GL_CONTEXT_PROFILE_ES); - - if (!_this->egl_data) { - /* The EGL library wasn't loaded, SDL_GetError() should have info */ - return NULL; - } - - if (_this->gl_config.share_with_current_context) { - share_context = (EGLContext)SDL_GL_GetCurrentContext(); - } - - /* Set the context version and other attributes. */ - if ((major_version < 3 || (minor_version == 0 && profile_es)) && - _this->gl_config.flags == 0 && - (profile_mask == 0 || profile_es)) { - /* Create a context without using EGL_KHR_create_context attribs. - * When creating a GLES context without EGL_KHR_create_context we can - * only specify the major version. When creating a desktop GL context - * we can't specify any version, so we only try in that case when the - * version is less than 3.0 (matches SDL's GLX/WGL behavior.) - */ - if (profile_es) { - attribs[attr++] = EGL_CONTEXT_CLIENT_VERSION; - attribs[attr++] = SDL_max(major_version, 1); - } - } else { -#ifdef EGL_KHR_create_context - /* The Major/minor version, context profiles, and context flags can - * only be specified when this extension is available. - */ - if (SDL_EGL_HasExtension(_this, "EGL_KHR_create_context")) { - attribs[attr++] = EGL_CONTEXT_MAJOR_VERSION_KHR; - attribs[attr++] = major_version; - attribs[attr++] = EGL_CONTEXT_MINOR_VERSION_KHR; - attribs[attr++] = minor_version; - - /* SDL profile bits match EGL profile bits. */ - if (profile_mask != 0 && profile_mask != SDL_GL_CONTEXT_PROFILE_ES) { - attribs[attr++] = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR; - attribs[attr++] = profile_mask; - } - - /* SDL flags match EGL flags. */ - if (_this->gl_config.flags != 0) { - attribs[attr++] = EGL_CONTEXT_FLAGS_KHR; - attribs[attr++] = _this->gl_config.flags; - } - } else -#endif /* EGL_KHR_create_context */ - { - SDL_SetError("Could not create EGL context (context attributes are not supported)"); - return NULL; - } - } - - attribs[attr++] = EGL_NONE; - - /* Bind the API */ - if (profile_es) { - _this->egl_data->eglBindAPI(EGL_OPENGL_ES_API); - } else { - _this->egl_data->eglBindAPI(EGL_OPENGL_API); - } - - egl_context = _this->egl_data->eglCreateContext(_this->egl_data->egl_display, - _this->egl_data->egl_config, - share_context, attribs); - - if (egl_context == EGL_NO_CONTEXT) { - SDL_SetError("Could not create EGL context"); - return NULL; - } - - _this->egl_data->egl_swapinterval = 0; - - if (SDL_EGL_MakeCurrent(_this, egl_surface, egl_context) < 0) { - SDL_EGL_DeleteContext(_this, egl_context); - SDL_SetError("Could not make EGL context current"); - return NULL; - } - - return (SDL_GLContext) egl_context; -} - -int -SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context) -{ - EGLContext egl_context = (EGLContext) context; - - if (!_this->egl_data) { - return SDL_SetError("OpenGL not initialized"); - } - - /* The android emulator crashes badly if you try to eglMakeCurrent - * with a valid context and invalid surface, so we have to check for both here. - */ - if (!egl_context || !egl_surface) { - _this->egl_data->eglMakeCurrent(_this->egl_data->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - } else { - if (!_this->egl_data->eglMakeCurrent(_this->egl_data->egl_display, - egl_surface, egl_surface, egl_context)) { - return SDL_SetError("Unable to make EGL context current"); - } - } - - return 0; -} - -int -SDL_EGL_SetSwapInterval(_THIS, int interval) -{ - EGLBoolean status; - - if (!_this->egl_data) { - return SDL_SetError("EGL not initialized"); - } - - status = _this->egl_data->eglSwapInterval(_this->egl_data->egl_display, interval); - if (status == EGL_TRUE) { - _this->egl_data->egl_swapinterval = interval; - return 0; - } - - return SDL_SetError("Unable to set the EGL swap interval"); -} - -int -SDL_EGL_GetSwapInterval(_THIS) -{ - if (!_this->egl_data) { - SDL_SetError("EGL not initialized"); - return 0; - } - - return _this->egl_data->egl_swapinterval; -} - -void -SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface) -{ - _this->egl_data->eglSwapBuffers(_this->egl_data->egl_display, egl_surface); -} - -void -SDL_EGL_DeleteContext(_THIS, SDL_GLContext context) -{ - EGLContext egl_context = (EGLContext) context; - - /* Clean up GLES and EGL */ - if (!_this->egl_data) { - return; - } - - if (egl_context != NULL && egl_context != EGL_NO_CONTEXT) { - SDL_EGL_MakeCurrent(_this, NULL, NULL); - _this->egl_data->eglDestroyContext(_this->egl_data->egl_display, egl_context); - } - -} - -EGLSurface * -SDL_EGL_CreateSurface(_THIS, NativeWindowType nw) -{ - if (SDL_EGL_ChooseConfig(_this) != 0) { - return EGL_NO_SURFACE; - } - -#if __ANDROID__ - { - /* Android docs recommend doing this! - * Ref: http://developer.android.com/reference/android/app/NativeActivity.html - */ - EGLint format; - _this->egl_data->eglGetConfigAttrib(_this->egl_data->egl_display, - _this->egl_data->egl_config, - EGL_NATIVE_VISUAL_ID, &format); - - ANativeWindow_setBuffersGeometry(nw, 0, 0, format); - } -#endif - - return _this->egl_data->eglCreateWindowSurface( - _this->egl_data->egl_display, - _this->egl_data->egl_config, - nw, NULL); -} - -void -SDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface) -{ - if (!_this->egl_data) { - return; - } - - if (egl_surface != EGL_NO_SURFACE) { - _this->egl_data->eglDestroySurface(_this->egl_data->egl_display, egl_surface); - } -} - -#endif /* SDL_VIDEO_OPENGL_EGL */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/SDL_egl_c.h b/3rdparty/SDL2/src/video/SDL_egl_c.h deleted file mode 100644 index c683dffa77f..00000000000 --- a/3rdparty/SDL2/src/video/SDL_egl_c.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#ifndef _SDL_egl_h -#define _SDL_egl_h - -#if SDL_VIDEO_OPENGL_EGL - -#include "SDL_egl.h" - -#include "SDL_sysvideo.h" - -typedef struct SDL_EGL_VideoData -{ - void *egl_dll_handle, *dll_handle; - EGLDisplay egl_display; - EGLConfig egl_config; - int egl_swapinterval; - - EGLDisplay(EGLAPIENTRY *eglGetDisplay) (NativeDisplayType display); - EGLBoolean(EGLAPIENTRY *eglInitialize) (EGLDisplay dpy, EGLint * major, - EGLint * minor); - EGLBoolean(EGLAPIENTRY *eglTerminate) (EGLDisplay dpy); - - void *(EGLAPIENTRY *eglGetProcAddress) (const char * procName); - - EGLBoolean(EGLAPIENTRY *eglChooseConfig) (EGLDisplay dpy, - const EGLint * attrib_list, - EGLConfig * configs, - EGLint config_size, EGLint * num_config); - - EGLContext(EGLAPIENTRY *eglCreateContext) (EGLDisplay dpy, - EGLConfig config, - EGLContext share_list, - const EGLint * attrib_list); - - EGLBoolean(EGLAPIENTRY *eglDestroyContext) (EGLDisplay dpy, EGLContext ctx); - - EGLSurface(EGLAPIENTRY *eglCreateWindowSurface) (EGLDisplay dpy, - EGLConfig config, - NativeWindowType window, - const EGLint * attrib_list); - EGLBoolean(EGLAPIENTRY *eglDestroySurface) (EGLDisplay dpy, EGLSurface surface); - - EGLBoolean(EGLAPIENTRY *eglMakeCurrent) (EGLDisplay dpy, EGLSurface draw, - EGLSurface read, EGLContext ctx); - - EGLBoolean(EGLAPIENTRY *eglSwapBuffers) (EGLDisplay dpy, EGLSurface draw); - - EGLBoolean(EGLAPIENTRY *eglSwapInterval) (EGLDisplay dpy, EGLint interval); - - const char *(EGLAPIENTRY *eglQueryString) (EGLDisplay dpy, EGLint name); - - EGLBoolean(EGLAPIENTRY *eglGetConfigAttrib) (EGLDisplay dpy, EGLConfig config, - EGLint attribute, EGLint * value); - - EGLBoolean(EGLAPIENTRY *eglWaitNative) (EGLint engine); - - EGLBoolean(EGLAPIENTRY *eglWaitGL)(void); - - EGLBoolean(EGLAPIENTRY *eglBindAPI)(EGLenum); - -} SDL_EGL_VideoData; - -/* OpenGLES functions */ -extern int SDL_EGL_GetAttribute(_THIS, SDL_GLattr attrib, int *value); -extern int SDL_EGL_LoadLibrary(_THIS, const char *path, NativeDisplayType native_display); -extern void *SDL_EGL_GetProcAddress(_THIS, const char *proc); -extern void SDL_EGL_UnloadLibrary(_THIS); -extern int SDL_EGL_ChooseConfig(_THIS); -extern int SDL_EGL_SetSwapInterval(_THIS, int interval); -extern int SDL_EGL_GetSwapInterval(_THIS); -extern void SDL_EGL_DeleteContext(_THIS, SDL_GLContext context); -extern EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw); -extern void SDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface); - -/* These need to be wrapped to get the surface for the window by the platform GLES implementation */ -extern SDL_GLContext SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface); -extern int SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context); -extern void SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface); - -/* A few of useful macros */ - -#define SDL_EGL_SwapWindow_impl(BACKEND) void \ -BACKEND ## _GLES_SwapWindow(_THIS, SDL_Window * window) \ -{\ - SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\ -} - -#define SDL_EGL_MakeCurrent_impl(BACKEND) int \ -BACKEND ## _GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) \ -{\ - if (window && context) { \ - return SDL_EGL_MakeCurrent(_this, ((SDL_WindowData *) window->driverdata)->egl_surface, context); \ - }\ - else {\ - return SDL_EGL_MakeCurrent(_this, NULL, NULL);\ - }\ -} - -#define SDL_EGL_CreateContext_impl(BACKEND) SDL_GLContext \ -BACKEND ## _GLES_CreateContext(_THIS, SDL_Window * window) \ -{\ - return SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\ -} - -#endif /* SDL_VIDEO_OPENGL_EGL */ - -#endif /* _SDL_egl_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_fillrect.c b/3rdparty/SDL2/src/video/SDL_fillrect.c deleted file mode 100644 index e34a43c4423..00000000000 --- a/3rdparty/SDL2/src/video/SDL_fillrect.c +++ /dev/null @@ -1,343 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_video.h" -#include "SDL_blit.h" - - -#ifdef __SSE__ -/* *INDENT-OFF* */ - -#ifdef _MSC_VER -#define SSE_BEGIN \ - __m128 c128; \ - c128.m128_u32[0] = color; \ - c128.m128_u32[1] = color; \ - c128.m128_u32[2] = color; \ - c128.m128_u32[3] = color; -#else -#define SSE_BEGIN \ - __m128 c128; \ - DECLARE_ALIGNED(Uint32, cccc[4], 16); \ - cccc[0] = color; \ - cccc[1] = color; \ - cccc[2] = color; \ - cccc[3] = color; \ - c128 = *(__m128 *)cccc; -#endif - -#define SSE_WORK \ - for (i = n / 64; i--;) { \ - _mm_stream_ps((float *)(p+0), c128); \ - _mm_stream_ps((float *)(p+16), c128); \ - _mm_stream_ps((float *)(p+32), c128); \ - _mm_stream_ps((float *)(p+48), c128); \ - p += 64; \ - } - -#define SSE_END - -#define DEFINE_SSE_FILLRECT(bpp, type) \ -static void \ -SDL_FillRect##bpp##SSE(Uint8 *pixels, int pitch, Uint32 color, int w, int h) \ -{ \ - int i, n; \ - Uint8 *p = NULL; \ - \ - SSE_BEGIN; \ - \ - while (h--) { \ - n = w * bpp; \ - p = pixels; \ - \ - if (n > 63) { \ - int adjust = 16 - ((uintptr_t)p & 15); \ - if (adjust < 16) { \ - n -= adjust; \ - adjust /= bpp; \ - while (adjust--) { \ - *((type *)p) = (type)color; \ - p += bpp; \ - } \ - } \ - SSE_WORK; \ - } \ - if (n & 63) { \ - int remainder = (n & 63); \ - remainder /= bpp; \ - while (remainder--) { \ - *((type *)p) = (type)color; \ - p += bpp; \ - } \ - } \ - pixels += pitch; \ - } \ - \ - SSE_END; \ -} - -static void -SDL_FillRect1SSE(Uint8 *pixels, int pitch, Uint32 color, int w, int h) -{ - int i, n; - - SSE_BEGIN; - while (h--) { - Uint8 *p = pixels; - n = w; - - if (n > 63) { - int adjust = 16 - ((uintptr_t)p & 15); - if (adjust) { - n -= adjust; - SDL_memset(p, color, adjust); - p += adjust; - } - SSE_WORK; - } - if (n & 63) { - int remainder = (n & 63); - SDL_memset(p, color, remainder); - } - pixels += pitch; - } - - SSE_END; -} -/* DEFINE_SSE_FILLRECT(1, Uint8) */ -DEFINE_SSE_FILLRECT(2, Uint16) -DEFINE_SSE_FILLRECT(4, Uint32) - -/* *INDENT-ON* */ -#endif /* __SSE__ */ - -static void -SDL_FillRect1(Uint8 * pixels, int pitch, Uint32 color, int w, int h) -{ - int n; - Uint8 *p = NULL; - - while (h--) { - n = w; - p = pixels; - - if (n > 3) { - switch ((uintptr_t) p & 3) { - case 1: - *p++ = (Uint8) color; - --n; - case 2: - *p++ = (Uint8) color; - --n; - case 3: - *p++ = (Uint8) color; - --n; - } - SDL_memset4(p, color, (n >> 2)); - } - if (n & 3) { - p += (n & ~3); - switch (n & 3) { - case 3: - *p++ = (Uint8) color; - case 2: - *p++ = (Uint8) color; - case 1: - *p++ = (Uint8) color; - } - } - pixels += pitch; - } -} - -static void -SDL_FillRect2(Uint8 * pixels, int pitch, Uint32 color, int w, int h) -{ - int n; - Uint16 *p = NULL; - - while (h--) { - n = w; - p = (Uint16 *) pixels; - - if (n > 1) { - if ((uintptr_t) p & 2) { - *p++ = (Uint16) color; - --n; - } - SDL_memset4(p, color, (n >> 1)); - } - if (n & 1) { - p[n - 1] = (Uint16) color; - } - pixels += pitch; - } -} - -static void -SDL_FillRect3(Uint8 * pixels, int pitch, Uint32 color, int w, int h) -{ -#if SDL_BYTEORDER == SDL_LIL_ENDIAN - Uint8 b1 = (Uint8) (color & 0xFF); - Uint8 b2 = (Uint8) ((color >> 8) & 0xFF); - Uint8 b3 = (Uint8) ((color >> 16) & 0xFF); -#elif SDL_BYTEORDER == SDL_BIG_ENDIAN - Uint8 b1 = (Uint8) ((color >> 16) & 0xFF); - Uint8 b2 = (Uint8) ((color >> 8) & 0xFF); - Uint8 b3 = (Uint8) (color & 0xFF); -#endif - int n; - Uint8 *p = NULL; - - while (h--) { - n = w; - p = pixels; - - while (n--) { - *p++ = b1; - *p++ = b2; - *p++ = b3; - } - pixels += pitch; - } -} - -static void -SDL_FillRect4(Uint8 * pixels, int pitch, Uint32 color, int w, int h) -{ - while (h--) { - SDL_memset4(pixels, color, w); - pixels += pitch; - } -} - -/* - * This function performs a fast fill of the given rectangle with 'color' - */ -int -SDL_FillRect(SDL_Surface * dst, const SDL_Rect * rect, Uint32 color) -{ - SDL_Rect clipped; - Uint8 *pixels; - - if (!dst) { - return SDL_SetError("Passed NULL destination surface"); - } - - /* This function doesn't work on surfaces < 8 bpp */ - if (dst->format->BitsPerPixel < 8) { - return SDL_SetError("SDL_FillRect(): Unsupported surface format"); - } - - /* If 'rect' == NULL, then fill the whole surface */ - if (rect) { - /* Perform clipping */ - if (!SDL_IntersectRect(rect, &dst->clip_rect, &clipped)) { - return 0; - } - rect = &clipped; - } else { - rect = &dst->clip_rect; - /* Don't attempt to fill if the surface's clip_rect is empty */ - if (SDL_RectEmpty(rect)) { - return 0; - } - } - - /* Perform software fill */ - if (!dst->pixels) { - return SDL_SetError("SDL_FillRect(): You must lock the surface"); - } - - pixels = (Uint8 *) dst->pixels + rect->y * dst->pitch + - rect->x * dst->format->BytesPerPixel; - - switch (dst->format->BytesPerPixel) { - case 1: - { - color |= (color << 8); - color |= (color << 16); -#ifdef __SSE__ - if (SDL_HasSSE()) { - SDL_FillRect1SSE(pixels, dst->pitch, color, rect->w, rect->h); - break; - } -#endif - SDL_FillRect1(pixels, dst->pitch, color, rect->w, rect->h); - break; - } - - case 2: - { - color |= (color << 16); -#ifdef __SSE__ - if (SDL_HasSSE()) { - SDL_FillRect2SSE(pixels, dst->pitch, color, rect->w, rect->h); - break; - } -#endif - SDL_FillRect2(pixels, dst->pitch, color, rect->w, rect->h); - break; - } - - case 3: - /* 24-bit RGB is a slow path, at least for now. */ - { - SDL_FillRect3(pixels, dst->pitch, color, rect->w, rect->h); - break; - } - - case 4: - { -#ifdef __SSE__ - if (SDL_HasSSE()) { - SDL_FillRect4SSE(pixels, dst->pitch, color, rect->w, rect->h); - break; - } -#endif - SDL_FillRect4(pixels, dst->pitch, color, rect->w, rect->h); - break; - } - } - - /* We're done! */ - return 0; -} - -int -SDL_FillRects(SDL_Surface * dst, const SDL_Rect * rects, int count, - Uint32 color) -{ - int i; - int status = 0; - - if (!rects) { - return SDL_SetError("SDL_FillRects() passed NULL rects"); - } - - for (i = 0; i < count; ++i) { - status += SDL_FillRect(dst, &rects[i], color); - } - return status; -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_pixels.c b/3rdparty/SDL2/src/video/SDL_pixels.c deleted file mode 100644 index d905656cad7..00000000000 --- a/3rdparty/SDL2/src/video/SDL_pixels.c +++ /dev/null @@ -1,1127 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* General (mostly internal) pixel/color manipulation routines for SDL */ - -#include "SDL_endian.h" -#include "SDL_video.h" -#include "SDL_sysvideo.h" -#include "SDL_blit.h" -#include "SDL_pixels_c.h" -#include "SDL_RLEaccel_c.h" - - -/* Lookup tables to expand partial bytes to the full 0..255 range */ - -static Uint8 lookup_0[] = { -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 -}; - -static Uint8 lookup_1[] = { -0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 255 -}; - -static Uint8 lookup_2[] = { -0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 85, 89, 93, 97, 101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 170, 174, 178, 182, 186, 190, 194, 198, 202, 206, 210, 214, 218, 222, 226, 230, 234, 238, 242, 246, 250, 255 -}; - -static Uint8 lookup_3[] = { -0, 8, 16, 24, 32, 41, 49, 57, 65, 74, 82, 90, 98, 106, 115, 123, 131, 139, 148, 156, 164, 172, 180, 189, 197, 205, 213, 222, 230, 238, 246, 255 -}; - -static Uint8 lookup_4[] = { -0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255 -}; - -static Uint8 lookup_5[] = { -0, 36, 72, 109, 145, 182, 218, 255 -}; - -static Uint8 lookup_6[] = { -0, 85, 170, 255 -}; - -static Uint8 lookup_7[] = { -0, 255 -}; - -static Uint8 lookup_8[] = { -255 -}; - -Uint8* SDL_expand_byte[9] = { - lookup_0, - lookup_1, - lookup_2, - lookup_3, - lookup_4, - lookup_5, - lookup_6, - lookup_7, - lookup_8 -}; - -/* Helper functions */ - -const char* -SDL_GetPixelFormatName(Uint32 format) -{ - switch (format) { -#define CASE(X) case X: return #X; - CASE(SDL_PIXELFORMAT_INDEX1LSB) - CASE(SDL_PIXELFORMAT_INDEX1MSB) - CASE(SDL_PIXELFORMAT_INDEX4LSB) - CASE(SDL_PIXELFORMAT_INDEX4MSB) - CASE(SDL_PIXELFORMAT_INDEX8) - CASE(SDL_PIXELFORMAT_RGB332) - CASE(SDL_PIXELFORMAT_RGB444) - CASE(SDL_PIXELFORMAT_RGB555) - CASE(SDL_PIXELFORMAT_BGR555) - CASE(SDL_PIXELFORMAT_ARGB4444) - CASE(SDL_PIXELFORMAT_RGBA4444) - CASE(SDL_PIXELFORMAT_ABGR4444) - CASE(SDL_PIXELFORMAT_BGRA4444) - CASE(SDL_PIXELFORMAT_ARGB1555) - CASE(SDL_PIXELFORMAT_RGBA5551) - CASE(SDL_PIXELFORMAT_ABGR1555) - CASE(SDL_PIXELFORMAT_BGRA5551) - CASE(SDL_PIXELFORMAT_RGB565) - CASE(SDL_PIXELFORMAT_BGR565) - CASE(SDL_PIXELFORMAT_RGB24) - CASE(SDL_PIXELFORMAT_BGR24) - CASE(SDL_PIXELFORMAT_RGB888) - CASE(SDL_PIXELFORMAT_RGBX8888) - CASE(SDL_PIXELFORMAT_BGR888) - CASE(SDL_PIXELFORMAT_BGRX8888) - CASE(SDL_PIXELFORMAT_ARGB8888) - CASE(SDL_PIXELFORMAT_RGBA8888) - CASE(SDL_PIXELFORMAT_ABGR8888) - CASE(SDL_PIXELFORMAT_BGRA8888) - CASE(SDL_PIXELFORMAT_ARGB2101010) - CASE(SDL_PIXELFORMAT_YV12) - CASE(SDL_PIXELFORMAT_IYUV) - CASE(SDL_PIXELFORMAT_YUY2) - CASE(SDL_PIXELFORMAT_UYVY) - CASE(SDL_PIXELFORMAT_YVYU) - CASE(SDL_PIXELFORMAT_NV12) - CASE(SDL_PIXELFORMAT_NV21) -#undef CASE - default: - return "SDL_PIXELFORMAT_UNKNOWN"; - } -} - -SDL_bool -SDL_PixelFormatEnumToMasks(Uint32 format, int *bpp, Uint32 * Rmask, - Uint32 * Gmask, Uint32 * Bmask, Uint32 * Amask) -{ - Uint32 masks[4]; - - /* This function doesn't work with FourCC pixel formats */ - if (SDL_ISPIXELFORMAT_FOURCC(format)) { - SDL_SetError("FOURCC pixel formats are not supported"); - return SDL_FALSE; - } - - /* Initialize the values here */ - if (SDL_BYTESPERPIXEL(format) <= 2) { - *bpp = SDL_BITSPERPIXEL(format); - } else { - *bpp = SDL_BYTESPERPIXEL(format) * 8; - } - *Rmask = *Gmask = *Bmask = *Amask = 0; - - if (format == SDL_PIXELFORMAT_RGB24) { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - *Rmask = 0x00FF0000; - *Gmask = 0x0000FF00; - *Bmask = 0x000000FF; -#else - *Rmask = 0x000000FF; - *Gmask = 0x0000FF00; - *Bmask = 0x00FF0000; -#endif - return SDL_TRUE; - } - - if (format == SDL_PIXELFORMAT_BGR24) { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - *Rmask = 0x000000FF; - *Gmask = 0x0000FF00; - *Bmask = 0x00FF0000; -#else - *Rmask = 0x00FF0000; - *Gmask = 0x0000FF00; - *Bmask = 0x000000FF; -#endif - return SDL_TRUE; - } - - if (SDL_PIXELTYPE(format) != SDL_PIXELTYPE_PACKED8 && - SDL_PIXELTYPE(format) != SDL_PIXELTYPE_PACKED16 && - SDL_PIXELTYPE(format) != SDL_PIXELTYPE_PACKED32) { - /* Not a format that uses masks */ - return SDL_TRUE; - } - - switch (SDL_PIXELLAYOUT(format)) { - case SDL_PACKEDLAYOUT_332: - masks[0] = 0x00000000; - masks[1] = 0x000000E0; - masks[2] = 0x0000001C; - masks[3] = 0x00000003; - break; - case SDL_PACKEDLAYOUT_4444: - masks[0] = 0x0000F000; - masks[1] = 0x00000F00; - masks[2] = 0x000000F0; - masks[3] = 0x0000000F; - break; - case SDL_PACKEDLAYOUT_1555: - masks[0] = 0x00008000; - masks[1] = 0x00007C00; - masks[2] = 0x000003E0; - masks[3] = 0x0000001F; - break; - case SDL_PACKEDLAYOUT_5551: - masks[0] = 0x0000F800; - masks[1] = 0x000007C0; - masks[2] = 0x0000003E; - masks[3] = 0x00000001; - break; - case SDL_PACKEDLAYOUT_565: - masks[0] = 0x00000000; - masks[1] = 0x0000F800; - masks[2] = 0x000007E0; - masks[3] = 0x0000001F; - break; - case SDL_PACKEDLAYOUT_8888: - masks[0] = 0xFF000000; - masks[1] = 0x00FF0000; - masks[2] = 0x0000FF00; - masks[3] = 0x000000FF; - break; - case SDL_PACKEDLAYOUT_2101010: - masks[0] = 0xC0000000; - masks[1] = 0x3FF00000; - masks[2] = 0x000FFC00; - masks[3] = 0x000003FF; - break; - case SDL_PACKEDLAYOUT_1010102: - masks[0] = 0xFFC00000; - masks[1] = 0x003FF000; - masks[2] = 0x00000FFC; - masks[3] = 0x00000003; - break; - default: - SDL_SetError("Unknown pixel format"); - return SDL_FALSE; - } - - switch (SDL_PIXELORDER(format)) { - case SDL_PACKEDORDER_XRGB: - *Rmask = masks[1]; - *Gmask = masks[2]; - *Bmask = masks[3]; - break; - case SDL_PACKEDORDER_RGBX: - *Rmask = masks[0]; - *Gmask = masks[1]; - *Bmask = masks[2]; - break; - case SDL_PACKEDORDER_ARGB: - *Amask = masks[0]; - *Rmask = masks[1]; - *Gmask = masks[2]; - *Bmask = masks[3]; - break; - case SDL_PACKEDORDER_RGBA: - *Rmask = masks[0]; - *Gmask = masks[1]; - *Bmask = masks[2]; - *Amask = masks[3]; - break; - case SDL_PACKEDORDER_XBGR: - *Bmask = masks[1]; - *Gmask = masks[2]; - *Rmask = masks[3]; - break; - case SDL_PACKEDORDER_BGRX: - *Bmask = masks[0]; - *Gmask = masks[1]; - *Rmask = masks[2]; - break; - case SDL_PACKEDORDER_BGRA: - *Bmask = masks[0]; - *Gmask = masks[1]; - *Rmask = masks[2]; - *Amask = masks[3]; - break; - case SDL_PACKEDORDER_ABGR: - *Amask = masks[0]; - *Bmask = masks[1]; - *Gmask = masks[2]; - *Rmask = masks[3]; - break; - default: - SDL_SetError("Unknown pixel format"); - return SDL_FALSE; - } - return SDL_TRUE; -} - -Uint32 -SDL_MasksToPixelFormatEnum(int bpp, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, - Uint32 Amask) -{ - switch (bpp) { - case 1: - /* SDL defaults to MSB ordering */ - return SDL_PIXELFORMAT_INDEX1MSB; - case 4: - /* SDL defaults to MSB ordering */ - return SDL_PIXELFORMAT_INDEX4MSB; - case 8: - if (Rmask == 0) { - return SDL_PIXELFORMAT_INDEX8; - } - if (Rmask == 0xE0 && - Gmask == 0x1C && - Bmask == 0x03 && - Amask == 0x00) { - return SDL_PIXELFORMAT_RGB332; - } - break; - case 12: - if (Rmask == 0) { - return SDL_PIXELFORMAT_RGB444; - } - if (Rmask == 0x0F00 && - Gmask == 0x00F0 && - Bmask == 0x000F && - Amask == 0x0000) { - return SDL_PIXELFORMAT_RGB444; - } - break; - case 15: - if (Rmask == 0) { - return SDL_PIXELFORMAT_RGB555; - } - /* Fall through to 16-bit checks */ - case 16: - if (Rmask == 0) { - return SDL_PIXELFORMAT_RGB565; - } - if (Rmask == 0x7C00 && - Gmask == 0x03E0 && - Bmask == 0x001F && - Amask == 0x0000) { - return SDL_PIXELFORMAT_RGB555; - } - if (Rmask == 0x001F && - Gmask == 0x03E0 && - Bmask == 0x7C00 && - Amask == 0x0000) { - return SDL_PIXELFORMAT_BGR555; - } - if (Rmask == 0x0F00 && - Gmask == 0x00F0 && - Bmask == 0x000F && - Amask == 0xF000) { - return SDL_PIXELFORMAT_ARGB4444; - } - if (Rmask == 0xF000 && - Gmask == 0x0F00 && - Bmask == 0x00F0 && - Amask == 0x000F) { - return SDL_PIXELFORMAT_RGBA4444; - } - if (Rmask == 0x000F && - Gmask == 0x00F0 && - Bmask == 0x0F00 && - Amask == 0xF000) { - return SDL_PIXELFORMAT_ABGR4444; - } - if (Rmask == 0x00F0 && - Gmask == 0x0F00 && - Bmask == 0xF000 && - Amask == 0x000F) { - return SDL_PIXELFORMAT_BGRA4444; - } - if (Rmask == 0x7C00 && - Gmask == 0x03E0 && - Bmask == 0x001F && - Amask == 0x8000) { - return SDL_PIXELFORMAT_ARGB1555; - } - if (Rmask == 0xF800 && - Gmask == 0x07C0 && - Bmask == 0x003E && - Amask == 0x0001) { - return SDL_PIXELFORMAT_RGBA5551; - } - if (Rmask == 0x001F && - Gmask == 0x03E0 && - Bmask == 0x7C00 && - Amask == 0x8000) { - return SDL_PIXELFORMAT_ABGR1555; - } - if (Rmask == 0x003E && - Gmask == 0x07C0 && - Bmask == 0xF800 && - Amask == 0x0001) { - return SDL_PIXELFORMAT_BGRA5551; - } - if (Rmask == 0xF800 && - Gmask == 0x07E0 && - Bmask == 0x001F && - Amask == 0x0000) { - return SDL_PIXELFORMAT_RGB565; - } - if (Rmask == 0x001F && - Gmask == 0x07E0 && - Bmask == 0xF800 && - Amask == 0x0000) { - return SDL_PIXELFORMAT_BGR565; - } - break; - case 24: - switch (Rmask) { - case 0: - case 0x00FF0000: -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - return SDL_PIXELFORMAT_RGB24; -#else - return SDL_PIXELFORMAT_BGR24; -#endif - case 0x000000FF: -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - return SDL_PIXELFORMAT_BGR24; -#else - return SDL_PIXELFORMAT_RGB24; -#endif - } - case 32: - if (Rmask == 0) { - return SDL_PIXELFORMAT_RGB888; - } - if (Rmask == 0x00FF0000 && - Gmask == 0x0000FF00 && - Bmask == 0x000000FF && - Amask == 0x00000000) { - return SDL_PIXELFORMAT_RGB888; - } - if (Rmask == 0xFF000000 && - Gmask == 0x00FF0000 && - Bmask == 0x0000FF00 && - Amask == 0x00000000) { - return SDL_PIXELFORMAT_RGBX8888; - } - if (Rmask == 0x000000FF && - Gmask == 0x0000FF00 && - Bmask == 0x00FF0000 && - Amask == 0x00000000) { - return SDL_PIXELFORMAT_BGR888; - } - if (Rmask == 0x0000FF00 && - Gmask == 0x00FF0000 && - Bmask == 0xFF000000 && - Amask == 0x00000000) { - return SDL_PIXELFORMAT_BGRX8888; - } - if (Rmask == 0x00FF0000 && - Gmask == 0x0000FF00 && - Bmask == 0x000000FF && - Amask == 0xFF000000) { - return SDL_PIXELFORMAT_ARGB8888; - } - if (Rmask == 0xFF000000 && - Gmask == 0x00FF0000 && - Bmask == 0x0000FF00 && - Amask == 0x000000FF) { - return SDL_PIXELFORMAT_RGBA8888; - } - if (Rmask == 0x000000FF && - Gmask == 0x0000FF00 && - Bmask == 0x00FF0000 && - Amask == 0xFF000000) { - return SDL_PIXELFORMAT_ABGR8888; - } - if (Rmask == 0x0000FF00 && - Gmask == 0x00FF0000 && - Bmask == 0xFF000000 && - Amask == 0x000000FF) { - return SDL_PIXELFORMAT_BGRA8888; - } - if (Rmask == 0x3FF00000 && - Gmask == 0x000FFC00 && - Bmask == 0x000003FF && - Amask == 0xC0000000) { - return SDL_PIXELFORMAT_ARGB2101010; - } - } - return SDL_PIXELFORMAT_UNKNOWN; -} - -static SDL_PixelFormat *formats; - -SDL_PixelFormat * -SDL_AllocFormat(Uint32 pixel_format) -{ - SDL_PixelFormat *format; - - /* Look it up in our list of previously allocated formats */ - for (format = formats; format; format = format->next) { - if (pixel_format == format->format) { - ++format->refcount; - return format; - } - } - - /* Allocate an empty pixel format structure, and initialize it */ - format = SDL_malloc(sizeof(*format)); - if (format == NULL) { - SDL_OutOfMemory(); - return NULL; - } - if (SDL_InitFormat(format, pixel_format) < 0) { - SDL_free(format); - SDL_InvalidParamError("format"); - return NULL; - } - - if (!SDL_ISPIXELFORMAT_INDEXED(pixel_format)) { - /* Cache the RGB formats */ - format->next = formats; - formats = format; - } - return format; -} - -int -SDL_InitFormat(SDL_PixelFormat * format, Uint32 pixel_format) -{ - int bpp; - Uint32 Rmask, Gmask, Bmask, Amask; - Uint32 mask; - - if (!SDL_PixelFormatEnumToMasks(pixel_format, &bpp, - &Rmask, &Gmask, &Bmask, &Amask)) { - return -1; - } - - /* Set up the format */ - SDL_zerop(format); - format->format = pixel_format; - format->BitsPerPixel = bpp; - format->BytesPerPixel = (bpp + 7) / 8; - - format->Rmask = Rmask; - format->Rshift = 0; - format->Rloss = 8; - if (Rmask) { - for (mask = Rmask; !(mask & 0x01); mask >>= 1) - ++format->Rshift; - for (; (mask & 0x01); mask >>= 1) - --format->Rloss; - } - - format->Gmask = Gmask; - format->Gshift = 0; - format->Gloss = 8; - if (Gmask) { - for (mask = Gmask; !(mask & 0x01); mask >>= 1) - ++format->Gshift; - for (; (mask & 0x01); mask >>= 1) - --format->Gloss; - } - - format->Bmask = Bmask; - format->Bshift = 0; - format->Bloss = 8; - if (Bmask) { - for (mask = Bmask; !(mask & 0x01); mask >>= 1) - ++format->Bshift; - for (; (mask & 0x01); mask >>= 1) - --format->Bloss; - } - - format->Amask = Amask; - format->Ashift = 0; - format->Aloss = 8; - if (Amask) { - for (mask = Amask; !(mask & 0x01); mask >>= 1) - ++format->Ashift; - for (; (mask & 0x01); mask >>= 1) - --format->Aloss; - } - - format->palette = NULL; - format->refcount = 1; - format->next = NULL; - - return 0; -} - -void -SDL_FreeFormat(SDL_PixelFormat *format) -{ - SDL_PixelFormat *prev; - - if (!format) { - SDL_InvalidParamError("format"); - return; - } - if (--format->refcount > 0) { - return; - } - - /* Remove this format from our list */ - if (format == formats) { - formats = format->next; - } else if (formats) { - for (prev = formats; prev->next; prev = prev->next) { - if (prev->next == format) { - prev->next = format->next; - break; - } - } - } - - if (format->palette) { - SDL_FreePalette(format->palette); - } - SDL_free(format); -} - -SDL_Palette * -SDL_AllocPalette(int ncolors) -{ - SDL_Palette *palette; - - /* Input validation */ - if (ncolors < 1) { - SDL_InvalidParamError("ncolors"); - return NULL; - } - - palette = (SDL_Palette *) SDL_malloc(sizeof(*palette)); - if (!palette) { - SDL_OutOfMemory(); - return NULL; - } - palette->colors = - (SDL_Color *) SDL_malloc(ncolors * sizeof(*palette->colors)); - if (!palette->colors) { - SDL_free(palette); - return NULL; - } - palette->ncolors = ncolors; - palette->version = 1; - palette->refcount = 1; - - SDL_memset(palette->colors, 0xFF, ncolors * sizeof(*palette->colors)); - - return palette; -} - -int -SDL_SetPixelFormatPalette(SDL_PixelFormat * format, SDL_Palette *palette) -{ - if (!format) { - return SDL_SetError("SDL_SetPixelFormatPalette() passed NULL format"); - } - - if (palette && palette->ncolors != (1 << format->BitsPerPixel)) { - return SDL_SetError("SDL_SetPixelFormatPalette() passed a palette that doesn't match the format"); - } - - if (format->palette == palette) { - return 0; - } - - if (format->palette) { - SDL_FreePalette(format->palette); - } - - format->palette = palette; - - if (format->palette) { - ++format->palette->refcount; - } - - return 0; -} - -int -SDL_SetPaletteColors(SDL_Palette * palette, const SDL_Color * colors, - int firstcolor, int ncolors) -{ - int status = 0; - - /* Verify the parameters */ - if (!palette) { - return -1; - } - if (ncolors > (palette->ncolors - firstcolor)) { - ncolors = (palette->ncolors - firstcolor); - status = -1; - } - - if (colors != (palette->colors + firstcolor)) { - SDL_memcpy(palette->colors + firstcolor, colors, - ncolors * sizeof(*colors)); - } - ++palette->version; - if (!palette->version) { - palette->version = 1; - } - - return status; -} - -void -SDL_FreePalette(SDL_Palette * palette) -{ - if (!palette) { - SDL_InvalidParamError("palette"); - return; - } - if (--palette->refcount > 0) { - return; - } - SDL_free(palette->colors); - SDL_free(palette); -} - -/* - * Calculate an 8-bit (3 red, 3 green, 2 blue) dithered palette of colors - */ -void -SDL_DitherColors(SDL_Color * colors, int bpp) -{ - int i; - if (bpp != 8) - return; /* only 8bpp supported right now */ - - for (i = 0; i < 256; i++) { - int r, g, b; - /* map each bit field to the full [0, 255] interval, - so 0 is mapped to (0, 0, 0) and 255 to (255, 255, 255) */ - r = i & 0xe0; - r |= r >> 3 | r >> 6; - colors[i].r = r; - g = (i << 3) & 0xe0; - g |= g >> 3 | g >> 6; - colors[i].g = g; - b = i & 0x3; - b |= b << 2; - b |= b << 4; - colors[i].b = b; - colors[i].a = SDL_ALPHA_OPAQUE; - } -} - -/* - * Calculate the pad-aligned scanline width of a surface - */ -int -SDL_CalculatePitch(SDL_Surface * surface) -{ - int pitch; - - /* Surface should be 4-byte aligned for speed */ - pitch = surface->w * surface->format->BytesPerPixel; - switch (surface->format->BitsPerPixel) { - case 1: - pitch = (pitch + 7) / 8; - break; - case 4: - pitch = (pitch + 1) / 2; - break; - default: - break; - } - pitch = (pitch + 3) & ~3; /* 4-byte aligning */ - return (pitch); -} - -/* - * Match an RGB value to a particular palette index - */ -Uint8 -SDL_FindColor(SDL_Palette * pal, Uint8 r, Uint8 g, Uint8 b, Uint8 a) -{ - /* Do colorspace distance matching */ - unsigned int smallest; - unsigned int distance; - int rd, gd, bd, ad; - int i; - Uint8 pixel = 0; - - smallest = ~0; - for (i = 0; i < pal->ncolors; ++i) { - rd = pal->colors[i].r - r; - gd = pal->colors[i].g - g; - bd = pal->colors[i].b - b; - ad = pal->colors[i].a - a; - distance = (rd * rd) + (gd * gd) + (bd * bd) + (ad * ad); - if (distance < smallest) { - pixel = i; - if (distance == 0) { /* Perfect match! */ - break; - } - smallest = distance; - } - } - return (pixel); -} - -/* Find the opaque pixel value corresponding to an RGB triple */ -Uint32 -SDL_MapRGB(const SDL_PixelFormat * format, Uint8 r, Uint8 g, Uint8 b) -{ - if (format->palette == NULL) { - return (r >> format->Rloss) << format->Rshift - | (g >> format->Gloss) << format->Gshift - | (b >> format->Bloss) << format->Bshift | format->Amask; - } else { - return SDL_FindColor(format->palette, r, g, b, SDL_ALPHA_OPAQUE); - } -} - -/* Find the pixel value corresponding to an RGBA quadruple */ -Uint32 -SDL_MapRGBA(const SDL_PixelFormat * format, Uint8 r, Uint8 g, Uint8 b, - Uint8 a) -{ - if (format->palette == NULL) { - return (r >> format->Rloss) << format->Rshift - | (g >> format->Gloss) << format->Gshift - | (b >> format->Bloss) << format->Bshift - | ((a >> format->Aloss) << format->Ashift & format->Amask); - } else { - return SDL_FindColor(format->palette, r, g, b, a); - } -} - -void -SDL_GetRGB(Uint32 pixel, const SDL_PixelFormat * format, Uint8 * r, Uint8 * g, - Uint8 * b) -{ - if (format->palette == NULL) { - unsigned v; - v = (pixel & format->Rmask) >> format->Rshift; - *r = SDL_expand_byte[format->Rloss][v]; - v = (pixel & format->Gmask) >> format->Gshift; - *g = SDL_expand_byte[format->Gloss][v]; - v = (pixel & format->Bmask) >> format->Bshift; - *b = SDL_expand_byte[format->Bloss][v]; - } else { - if (pixel < (unsigned)format->palette->ncolors) { - *r = format->palette->colors[pixel].r; - *g = format->palette->colors[pixel].g; - *b = format->palette->colors[pixel].b; - } else { - *r = *g = *b = 0; - } - } -} - -void -SDL_GetRGBA(Uint32 pixel, const SDL_PixelFormat * format, - Uint8 * r, Uint8 * g, Uint8 * b, Uint8 * a) -{ - if (format->palette == NULL) { - unsigned v; - v = (pixel & format->Rmask) >> format->Rshift; - *r = SDL_expand_byte[format->Rloss][v]; - v = (pixel & format->Gmask) >> format->Gshift; - *g = SDL_expand_byte[format->Gloss][v]; - v = (pixel & format->Bmask) >> format->Bshift; - *b = SDL_expand_byte[format->Bloss][v]; - v = (pixel & format->Amask) >> format->Ashift; - *a = SDL_expand_byte[format->Aloss][v]; - } else { - if (pixel < (unsigned)format->palette->ncolors) { - *r = format->palette->colors[pixel].r; - *g = format->palette->colors[pixel].g; - *b = format->palette->colors[pixel].b; - *a = format->palette->colors[pixel].a; - } else { - *r = *g = *b = *a = 0; - } - } -} - -/* Map from Palette to Palette */ -static Uint8 * -Map1to1(SDL_Palette * src, SDL_Palette * dst, int *identical) -{ - Uint8 *map; - int i; - - if (identical) { - if (src->ncolors <= dst->ncolors) { - /* If an identical palette, no need to map */ - if (src == dst - || - (SDL_memcmp - (src->colors, dst->colors, - src->ncolors * sizeof(SDL_Color)) == 0)) { - *identical = 1; - return (NULL); - } - } - *identical = 0; - } - map = (Uint8 *) SDL_malloc(src->ncolors); - if (map == NULL) { - SDL_OutOfMemory(); - return (NULL); - } - for (i = 0; i < src->ncolors; ++i) { - map[i] = SDL_FindColor(dst, - src->colors[i].r, src->colors[i].g, - src->colors[i].b, src->colors[i].a); - } - return (map); -} - -/* Map from Palette to BitField */ -static Uint8 * -Map1toN(SDL_PixelFormat * src, Uint8 Rmod, Uint8 Gmod, Uint8 Bmod, Uint8 Amod, - SDL_PixelFormat * dst) -{ - Uint8 *map; - int i; - int bpp; - SDL_Palette *pal = src->palette; - - bpp = ((dst->BytesPerPixel == 3) ? 4 : dst->BytesPerPixel); - map = (Uint8 *) SDL_malloc(pal->ncolors * bpp); - if (map == NULL) { - SDL_OutOfMemory(); - return (NULL); - } - - /* We memory copy to the pixel map so the endianness is preserved */ - for (i = 0; i < pal->ncolors; ++i) { - Uint8 R = (Uint8) ((pal->colors[i].r * Rmod) / 255); - Uint8 G = (Uint8) ((pal->colors[i].g * Gmod) / 255); - Uint8 B = (Uint8) ((pal->colors[i].b * Bmod) / 255); - Uint8 A = (Uint8) ((pal->colors[i].a * Amod) / 255); - ASSEMBLE_RGBA(&map[i * bpp], dst->BytesPerPixel, dst, R, G, B, A); - } - return (map); -} - -/* Map from BitField to Dithered-Palette to Palette */ -static Uint8 * -MapNto1(SDL_PixelFormat * src, SDL_PixelFormat * dst, int *identical) -{ - /* Generate a 256 color dither palette */ - SDL_Palette dithered; - SDL_Color colors[256]; - SDL_Palette *pal = dst->palette; - - dithered.ncolors = 256; - SDL_DitherColors(colors, 8); - dithered.colors = colors; - return (Map1to1(&dithered, pal, identical)); -} - -SDL_BlitMap * -SDL_AllocBlitMap(void) -{ - SDL_BlitMap *map; - - /* Allocate the empty map */ - map = (SDL_BlitMap *) SDL_calloc(1, sizeof(*map)); - if (map == NULL) { - SDL_OutOfMemory(); - return (NULL); - } - map->info.r = 0xFF; - map->info.g = 0xFF; - map->info.b = 0xFF; - map->info.a = 0xFF; - - /* It's ready to go */ - return (map); -} - -void -SDL_InvalidateMap(SDL_BlitMap * map) -{ - if (!map) { - return; - } - if (map->dst) { - /* Release our reference to the surface - see the note below */ - if (--map->dst->refcount <= 0) { - SDL_FreeSurface(map->dst); - } - } - map->dst = NULL; - map->src_palette_version = 0; - map->dst_palette_version = 0; - SDL_free(map->info.table); - map->info.table = NULL; -} - -int -SDL_MapSurface(SDL_Surface * src, SDL_Surface * dst) -{ - SDL_PixelFormat *srcfmt; - SDL_PixelFormat *dstfmt; - SDL_BlitMap *map; - - /* Clear out any previous mapping */ - map = src->map; - if ((src->flags & SDL_RLEACCEL) == SDL_RLEACCEL) { - SDL_UnRLESurface(src, 1); - } - SDL_InvalidateMap(map); - - /* Figure out what kind of mapping we're doing */ - map->identity = 0; - srcfmt = src->format; - dstfmt = dst->format; - if (SDL_ISPIXELFORMAT_INDEXED(srcfmt->format)) { - if (SDL_ISPIXELFORMAT_INDEXED(dstfmt->format)) { - /* Palette --> Palette */ - map->info.table = - Map1to1(srcfmt->palette, dstfmt->palette, &map->identity); - if (!map->identity) { - if (map->info.table == NULL) { - return (-1); - } - } - if (srcfmt->BitsPerPixel != dstfmt->BitsPerPixel) - map->identity = 0; - } else { - /* Palette --> BitField */ - map->info.table = - Map1toN(srcfmt, src->map->info.r, src->map->info.g, - src->map->info.b, src->map->info.a, dstfmt); - if (map->info.table == NULL) { - return (-1); - } - } - } else { - if (SDL_ISPIXELFORMAT_INDEXED(dstfmt->format)) { - /* BitField --> Palette */ - map->info.table = MapNto1(srcfmt, dstfmt, &map->identity); - if (!map->identity) { - if (map->info.table == NULL) { - return (-1); - } - } - map->identity = 0; /* Don't optimize to copy */ - } else { - /* BitField --> BitField */ - if (srcfmt == dstfmt) { - map->identity = 1; - } - } - } - - map->dst = dst; - - if (map->dst) { - /* Keep a reference to this surface so it doesn't get deleted - while we're still pointing at it. - - A better method would be for the destination surface to keep - track of surfaces that are mapped to it and automatically - invalidate them when it is freed, but this will do for now. - */ - ++map->dst->refcount; - } - - if (dstfmt->palette) { - map->dst_palette_version = dstfmt->palette->version; - } else { - map->dst_palette_version = 0; - } - - if (srcfmt->palette) { - map->src_palette_version = srcfmt->palette->version; - } else { - map->src_palette_version = 0; - } - - /* Choose your blitters wisely */ - return (SDL_CalculateBlit(src)); -} - -void -SDL_FreeBlitMap(SDL_BlitMap * map) -{ - if (map) { - SDL_InvalidateMap(map); - SDL_free(map); - } -} - -void -SDL_CalculateGammaRamp(float gamma, Uint16 * ramp) -{ - int i; - - /* Input validation */ - if (gamma < 0.0f ) { - SDL_InvalidParamError("gamma"); - return; - } - if (ramp == NULL) { - SDL_InvalidParamError("ramp"); - return; - } - - /* 0.0 gamma is all black */ - if (gamma == 0.0f) { - SDL_memset(ramp, 0, 256 * sizeof(Uint16)); - return; - } else if (gamma == 1.0f) { - /* 1.0 gamma is identity */ - for (i = 0; i < 256; ++i) { - ramp[i] = (i << 8) | i; - } - return; - } else { - /* Calculate a real gamma ramp */ - int value; - gamma = 1.0f / gamma; - for (i = 0; i < 256; ++i) { - value = - (int) (SDL_pow((double) i / 256.0, gamma) * 65535.0 + 0.5); - if (value > 65535) { - value = 65535; - } - ramp[i] = (Uint16) value; - } - } -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_pixels_c.h b/3rdparty/SDL2/src/video/SDL_pixels_c.h deleted file mode 100644 index 4ee91b8a30d..00000000000 --- a/3rdparty/SDL2/src/video/SDL_pixels_c.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* Useful functions and variables from SDL_pixel.c */ - -#include "SDL_blit.h" - -/* Pixel format functions */ -extern int SDL_InitFormat(SDL_PixelFormat * format, Uint32 pixel_format); - -/* Blit mapping functions */ -extern SDL_BlitMap *SDL_AllocBlitMap(void); -extern void SDL_InvalidateMap(SDL_BlitMap * map); -extern int SDL_MapSurface(SDL_Surface * src, SDL_Surface * dst); -extern void SDL_FreeBlitMap(SDL_BlitMap * map); - -/* Miscellaneous functions */ -extern int SDL_CalculatePitch(SDL_Surface * surface); -extern void SDL_DitherColors(SDL_Color * colors, int bpp); -extern Uint8 SDL_FindColor(SDL_Palette * pal, Uint8 r, Uint8 g, Uint8 b, Uint8 a); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_rect.c b/3rdparty/SDL2/src/video/SDL_rect.c deleted file mode 100644 index 2b29451c79b..00000000000 --- a/3rdparty/SDL2/src/video/SDL_rect.c +++ /dev/null @@ -1,525 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_rect.h" -#include "SDL_rect_c.h" - - -SDL_bool -SDL_HasIntersection(const SDL_Rect * A, const SDL_Rect * B) -{ - int Amin, Amax, Bmin, Bmax; - - if (!A) { - SDL_InvalidParamError("A"); - return SDL_FALSE; - } - - if (!B) { - SDL_InvalidParamError("B"); - return SDL_FALSE; - } - - /* Special cases for empty rects */ - if (SDL_RectEmpty(A) || SDL_RectEmpty(B)) { - return SDL_FALSE; - } - - /* Horizontal intersection */ - Amin = A->x; - Amax = Amin + A->w; - Bmin = B->x; - Bmax = Bmin + B->w; - if (Bmin > Amin) - Amin = Bmin; - if (Bmax < Amax) - Amax = Bmax; - if (Amax <= Amin) - return SDL_FALSE; - - /* Vertical intersection */ - Amin = A->y; - Amax = Amin + A->h; - Bmin = B->y; - Bmax = Bmin + B->h; - if (Bmin > Amin) - Amin = Bmin; - if (Bmax < Amax) - Amax = Bmax; - if (Amax <= Amin) - return SDL_FALSE; - - return SDL_TRUE; -} - -SDL_bool -SDL_IntersectRect(const SDL_Rect * A, const SDL_Rect * B, SDL_Rect * result) -{ - int Amin, Amax, Bmin, Bmax; - - if (!A) { - SDL_InvalidParamError("A"); - return SDL_FALSE; - } - - if (!B) { - SDL_InvalidParamError("B"); - return SDL_FALSE; - } - - if (!result) { - SDL_InvalidParamError("result"); - return SDL_FALSE; - } - - /* Special cases for empty rects */ - if (SDL_RectEmpty(A) || SDL_RectEmpty(B)) { - result->w = 0; - result->h = 0; - return SDL_FALSE; - } - - /* Horizontal intersection */ - Amin = A->x; - Amax = Amin + A->w; - Bmin = B->x; - Bmax = Bmin + B->w; - if (Bmin > Amin) - Amin = Bmin; - result->x = Amin; - if (Bmax < Amax) - Amax = Bmax; - result->w = Amax - Amin; - - /* Vertical intersection */ - Amin = A->y; - Amax = Amin + A->h; - Bmin = B->y; - Bmax = Bmin + B->h; - if (Bmin > Amin) - Amin = Bmin; - result->y = Amin; - if (Bmax < Amax) - Amax = Bmax; - result->h = Amax - Amin; - - return !SDL_RectEmpty(result); -} - -void -SDL_UnionRect(const SDL_Rect * A, const SDL_Rect * B, SDL_Rect * result) -{ - int Amin, Amax, Bmin, Bmax; - - if (!A) { - SDL_InvalidParamError("A"); - return; - } - - if (!B) { - SDL_InvalidParamError("B"); - return; - } - - if (!result) { - SDL_InvalidParamError("result"); - return; - } - - /* Special cases for empty Rects */ - if (SDL_RectEmpty(A)) { - if (SDL_RectEmpty(B)) { - /* A and B empty */ - return; - } else { - /* A empty, B not empty */ - *result = *B; - return; - } - } else { - if (SDL_RectEmpty(B)) { - /* A not empty, B empty */ - *result = *A; - return; - } - } - - /* Horizontal union */ - Amin = A->x; - Amax = Amin + A->w; - Bmin = B->x; - Bmax = Bmin + B->w; - if (Bmin < Amin) - Amin = Bmin; - result->x = Amin; - if (Bmax > Amax) - Amax = Bmax; - result->w = Amax - Amin; - - /* Vertical union */ - Amin = A->y; - Amax = Amin + A->h; - Bmin = B->y; - Bmax = Bmin + B->h; - if (Bmin < Amin) - Amin = Bmin; - result->y = Amin; - if (Bmax > Amax) - Amax = Bmax; - result->h = Amax - Amin; -} - -SDL_bool -SDL_EnclosePoints(const SDL_Point * points, int count, const SDL_Rect * clip, - SDL_Rect * result) -{ - int minx = 0; - int miny = 0; - int maxx = 0; - int maxy = 0; - int x, y, i; - - if (!points) { - SDL_InvalidParamError("points"); - return SDL_FALSE; - } - - if (count < 1) { - SDL_InvalidParamError("count"); - return SDL_FALSE; - } - - if (clip) { - SDL_bool added = SDL_FALSE; - const int clip_minx = clip->x; - const int clip_miny = clip->y; - const int clip_maxx = clip->x+clip->w-1; - const int clip_maxy = clip->y+clip->h-1; - - /* Special case for empty rectangle */ - if (SDL_RectEmpty(clip)) { - return SDL_FALSE; - } - - for (i = 0; i < count; ++i) { - x = points[i].x; - y = points[i].y; - - if (x < clip_minx || x > clip_maxx || - y < clip_miny || y > clip_maxy) { - continue; - } - if (!added) { - /* Special case: if no result was requested, we are done */ - if (result == NULL) { - return SDL_TRUE; - } - - /* First point added */ - minx = maxx = x; - miny = maxy = y; - added = SDL_TRUE; - continue; - } - if (x < minx) { - minx = x; - } else if (x > maxx) { - maxx = x; - } - if (y < miny) { - miny = y; - } else if (y > maxy) { - maxy = y; - } - } - if (!added) { - return SDL_FALSE; - } - } else { - /* Special case: if no result was requested, we are done */ - if (result == NULL) { - return SDL_TRUE; - } - - /* No clipping, always add the first point */ - minx = maxx = points[0].x; - miny = maxy = points[0].y; - - for (i = 1; i < count; ++i) { - x = points[i].x; - y = points[i].y; - - if (x < minx) { - minx = x; - } else if (x > maxx) { - maxx = x; - } - if (y < miny) { - miny = y; - } else if (y > maxy) { - maxy = y; - } - } - } - - if (result) { - result->x = minx; - result->y = miny; - result->w = (maxx-minx)+1; - result->h = (maxy-miny)+1; - } - return SDL_TRUE; -} - -/* Use the Cohen-Sutherland algorithm for line clipping */ -#define CODE_BOTTOM 1 -#define CODE_TOP 2 -#define CODE_LEFT 4 -#define CODE_RIGHT 8 - -static int -ComputeOutCode(const SDL_Rect * rect, int x, int y) -{ - int code = 0; - if (y < rect->y) { - code |= CODE_TOP; - } else if (y >= rect->y + rect->h) { - code |= CODE_BOTTOM; - } - if (x < rect->x) { - code |= CODE_LEFT; - } else if (x >= rect->x + rect->w) { - code |= CODE_RIGHT; - } - return code; -} - -SDL_bool -SDL_IntersectRectAndLine(const SDL_Rect * rect, int *X1, int *Y1, int *X2, - int *Y2) -{ - int x = 0; - int y = 0; - int x1, y1; - int x2, y2; - int rectx1; - int recty1; - int rectx2; - int recty2; - int outcode1, outcode2; - - if (!rect) { - SDL_InvalidParamError("rect"); - return SDL_FALSE; - } - - if (!X1) { - SDL_InvalidParamError("X1"); - return SDL_FALSE; - } - - if (!Y1) { - SDL_InvalidParamError("Y1"); - return SDL_FALSE; - } - - if (!X2) { - SDL_InvalidParamError("X2"); - return SDL_FALSE; - } - - if (!Y2) { - SDL_InvalidParamError("Y2"); - return SDL_FALSE; - } - - /* Special case for empty rect */ - if (SDL_RectEmpty(rect)) { - return SDL_FALSE; - } - - x1 = *X1; - y1 = *Y1; - x2 = *X2; - y2 = *Y2; - rectx1 = rect->x; - recty1 = rect->y; - rectx2 = rect->x + rect->w - 1; - recty2 = rect->y + rect->h - 1; - - /* Check to see if entire line is inside rect */ - if (x1 >= rectx1 && x1 <= rectx2 && x2 >= rectx1 && x2 <= rectx2 && - y1 >= recty1 && y1 <= recty2 && y2 >= recty1 && y2 <= recty2) { - return SDL_TRUE; - } - - /* Check to see if entire line is to one side of rect */ - if ((x1 < rectx1 && x2 < rectx1) || (x1 > rectx2 && x2 > rectx2) || - (y1 < recty1 && y2 < recty1) || (y1 > recty2 && y2 > recty2)) { - return SDL_FALSE; - } - - if (y1 == y2) { - /* Horizontal line, easy to clip */ - if (x1 < rectx1) { - *X1 = rectx1; - } else if (x1 > rectx2) { - *X1 = rectx2; - } - if (x2 < rectx1) { - *X2 = rectx1; - } else if (x2 > rectx2) { - *X2 = rectx2; - } - return SDL_TRUE; - } - - if (x1 == x2) { - /* Vertical line, easy to clip */ - if (y1 < recty1) { - *Y1 = recty1; - } else if (y1 > recty2) { - *Y1 = recty2; - } - if (y2 < recty1) { - *Y2 = recty1; - } else if (y2 > recty2) { - *Y2 = recty2; - } - return SDL_TRUE; - } - - /* More complicated Cohen-Sutherland algorithm */ - outcode1 = ComputeOutCode(rect, x1, y1); - outcode2 = ComputeOutCode(rect, x2, y2); - while (outcode1 || outcode2) { - if (outcode1 & outcode2) { - return SDL_FALSE; - } - - if (outcode1) { - if (outcode1 & CODE_TOP) { - y = recty1; - x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1); - } else if (outcode1 & CODE_BOTTOM) { - y = recty2; - x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1); - } else if (outcode1 & CODE_LEFT) { - x = rectx1; - y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1); - } else if (outcode1 & CODE_RIGHT) { - x = rectx2; - y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1); - } - x1 = x; - y1 = y; - outcode1 = ComputeOutCode(rect, x, y); - } else { - if (outcode2 & CODE_TOP) { - y = recty1; - x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1); - } else if (outcode2 & CODE_BOTTOM) { - y = recty2; - x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1); - } else if (outcode2 & CODE_LEFT) { - x = rectx1; - y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1); - } else if (outcode2 & CODE_RIGHT) { - x = rectx2; - y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1); - } - x2 = x; - y2 = y; - outcode2 = ComputeOutCode(rect, x, y); - } - } - *X1 = x1; - *Y1 = y1; - *X2 = x2; - *Y2 = y2; - return SDL_TRUE; -} - -SDL_bool -SDL_GetSpanEnclosingRect(int width, int height, - int numrects, const SDL_Rect * rects, SDL_Rect *span) -{ - int i; - int span_y1, span_y2; - int rect_y1, rect_y2; - - if (width < 1) { - SDL_InvalidParamError("width"); - return SDL_FALSE; - } - - if (height < 1) { - SDL_InvalidParamError("height"); - return SDL_FALSE; - } - - if (!rects) { - SDL_InvalidParamError("rects"); - return SDL_FALSE; - } - - if (!span) { - SDL_InvalidParamError("span"); - return SDL_FALSE; - } - - if (numrects < 1) { - SDL_InvalidParamError("numrects"); - return SDL_FALSE; - } - - /* Initialize to empty rect */ - span_y1 = height; - span_y2 = 0; - - for (i = 0; i < numrects; ++i) { - rect_y1 = rects[i].y; - rect_y2 = rect_y1 + rects[i].h; - - /* Clip out of bounds rectangles, and expand span rect */ - if (rect_y1 < 0) { - span_y1 = 0; - } else if (rect_y1 < span_y1) { - span_y1 = rect_y1; - } - if (rect_y2 > height) { - span_y2 = height; - } else if (rect_y2 > span_y2) { - span_y2 = rect_y2; - } - } - if (span_y2 > span_y1) { - span->x = 0; - span->y = span_y1; - span->w = width; - span->h = (span_y2 - span_y1); - return SDL_TRUE; - } - return SDL_FALSE; -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_rect_c.h b/3rdparty/SDL2/src/video/SDL_rect_c.h deleted file mode 100644 index aa5fbde7918..00000000000 --- a/3rdparty/SDL2/src/video/SDL_rect_c.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -extern SDL_bool SDL_GetSpanEnclosingRect(int width, int height, int numrects, const SDL_Rect * rects, SDL_Rect *span); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_shape.c b/3rdparty/SDL2/src/video/SDL_shape.c deleted file mode 100644 index 4a2e5465b6e..00000000000 --- a/3rdparty/SDL2/src/video/SDL_shape.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL.h" -#include "SDL_assert.h" -#include "SDL_video.h" -#include "SDL_sysvideo.h" -#include "SDL_pixels.h" -#include "SDL_surface.h" -#include "SDL_shape.h" -#include "SDL_shape_internals.h" - -SDL_Window* -SDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags) -{ - SDL_Window *result = NULL; - result = SDL_CreateWindow(title,-1000,-1000,w,h,(flags | SDL_WINDOW_BORDERLESS) & (~SDL_WINDOW_FULLSCREEN) & (~SDL_WINDOW_RESIZABLE) /* & (~SDL_WINDOW_SHOWN) */); - if(result != NULL) { - result->shaper = SDL_GetVideoDevice()->shape_driver.CreateShaper(result); - if(result->shaper != NULL) { - result->shaper->userx = x; - result->shaper->usery = y; - result->shaper->mode.mode = ShapeModeDefault; - result->shaper->mode.parameters.binarizationCutoff = 1; - result->shaper->hasshape = SDL_FALSE; - return result; - } - else { - SDL_DestroyWindow(result); - return NULL; - } - } - else - return NULL; -} - -SDL_bool -SDL_IsShapedWindow(const SDL_Window *window) -{ - if(window == NULL) - return SDL_FALSE; - else - return (SDL_bool)(window->shaper != NULL); -} - -/* REQUIRES that bitmap point to a w-by-h bitmap with ppb pixels-per-byte. */ -void -SDL_CalculateShapeBitmap(SDL_WindowShapeMode mode,SDL_Surface *shape,Uint8* bitmap,Uint8 ppb) -{ - int x = 0; - int y = 0; - Uint8 r = 0,g = 0,b = 0,alpha = 0; - Uint8* pixel = NULL; - Uint32 bitmap_pixel,pixel_value = 0,mask_value = 0; - SDL_Color key; - if(SDL_MUSTLOCK(shape)) - SDL_LockSurface(shape); - for(y = 0;y<shape->h;y++) { - for(x=0;x<shape->w;x++) { - alpha = 0; - pixel_value = 0; - pixel = (Uint8 *)(shape->pixels) + (y*shape->pitch) + (x*shape->format->BytesPerPixel); - switch(shape->format->BytesPerPixel) { - case(1): - pixel_value = *(Uint8*)pixel; - break; - case(2): - pixel_value = *(Uint16*)pixel; - break; - case(3): - pixel_value = *(Uint32*)pixel & (~shape->format->Amask); - break; - case(4): - pixel_value = *(Uint32*)pixel; - break; - } - SDL_GetRGBA(pixel_value,shape->format,&r,&g,&b,&alpha); - bitmap_pixel = y*shape->w + x; - switch(mode.mode) { - case(ShapeModeDefault): - mask_value = (alpha >= 1 ? 1 : 0); - break; - case(ShapeModeBinarizeAlpha): - mask_value = (alpha >= mode.parameters.binarizationCutoff ? 1 : 0); - break; - case(ShapeModeReverseBinarizeAlpha): - mask_value = (alpha <= mode.parameters.binarizationCutoff ? 1 : 0); - break; - case(ShapeModeColorKey): - key = mode.parameters.colorKey; - mask_value = ((key.r != r || key.g != g || key.b != b) ? 1 : 0); - break; - } - bitmap[bitmap_pixel / ppb] |= mask_value << (7 - ((ppb - 1) - (bitmap_pixel % ppb))); - } - } - if(SDL_MUSTLOCK(shape)) - SDL_UnlockSurface(shape); -} - -static SDL_ShapeTree* -RecursivelyCalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* mask,SDL_Rect dimensions) { - int x = 0,y = 0; - Uint8* pixel = NULL; - Uint32 pixel_value = 0; - Uint8 r = 0,g = 0,b = 0,a = 0; - SDL_bool pixel_opaque = SDL_FALSE; - int last_opaque = -1; - SDL_Color key; - SDL_ShapeTree* result = (SDL_ShapeTree*)SDL_malloc(sizeof(SDL_ShapeTree)); - SDL_Rect next = {0,0,0,0}; - - for(y=dimensions.y;y<dimensions.y + dimensions.h;y++) { - for(x=dimensions.x;x<dimensions.x + dimensions.w;x++) { - pixel_value = 0; - pixel = (Uint8 *)(mask->pixels) + (y*mask->pitch) + (x*mask->format->BytesPerPixel); - switch(mask->format->BytesPerPixel) { - case(1): - pixel_value = *(Uint8*)pixel; - break; - case(2): - pixel_value = *(Uint16*)pixel; - break; - case(3): - pixel_value = *(Uint32*)pixel & (~mask->format->Amask); - break; - case(4): - pixel_value = *(Uint32*)pixel; - break; - } - SDL_GetRGBA(pixel_value,mask->format,&r,&g,&b,&a); - switch(mode.mode) { - case(ShapeModeDefault): - pixel_opaque = (a >= 1 ? SDL_TRUE : SDL_FALSE); - break; - case(ShapeModeBinarizeAlpha): - pixel_opaque = (a >= mode.parameters.binarizationCutoff ? SDL_TRUE : SDL_FALSE); - break; - case(ShapeModeReverseBinarizeAlpha): - pixel_opaque = (a <= mode.parameters.binarizationCutoff ? SDL_TRUE : SDL_FALSE); - break; - case(ShapeModeColorKey): - key = mode.parameters.colorKey; - pixel_opaque = ((key.r != r || key.g != g || key.b != b) ? SDL_TRUE : SDL_FALSE); - break; - } - if(last_opaque == -1) - last_opaque = pixel_opaque; - if(last_opaque != pixel_opaque) { - const int halfwidth = dimensions.w / 2; - const int halfheight = dimensions.h / 2; - - result->kind = QuadShape; - - next.x = dimensions.x; - next.y = dimensions.y; - next.w = halfwidth; - next.h = halfheight; - result->data.children.upleft = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next); - - next.x = dimensions.x + halfwidth; - next.w = dimensions.w - halfwidth; - result->data.children.upright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next); - - next.x = dimensions.x; - next.w = halfwidth; - next.y = dimensions.y + halfheight; - next.h = dimensions.h - halfheight; - result->data.children.downleft = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next); - - next.x = dimensions.x + halfwidth; - next.w = dimensions.w - halfwidth; - result->data.children.downright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next); - - return result; - } - } - } - - - /* If we never recursed, all the pixels in this quadrant have the same "value". */ - result->kind = (last_opaque == SDL_TRUE ? OpaqueShape : TransparentShape); - result->data.shape = dimensions; - return result; -} - -SDL_ShapeTree* -SDL_CalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* shape) -{ - SDL_Rect dimensions = {0,0,shape->w,shape->h}; - SDL_ShapeTree* result = NULL; - if(SDL_MUSTLOCK(shape)) - SDL_LockSurface(shape); - result = RecursivelyCalculateShapeTree(mode,shape,dimensions); - if(SDL_MUSTLOCK(shape)) - SDL_UnlockSurface(shape); - return result; -} - -void -SDL_TraverseShapeTree(SDL_ShapeTree *tree,SDL_TraversalFunction function,void* closure) -{ - SDL_assert(tree != NULL); - if(tree->kind == QuadShape) { - SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.upleft,function,closure); - SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.upright,function,closure); - SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.downleft,function,closure); - SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.downright,function,closure); - } - else - function(tree,closure); -} - -void -SDL_FreeShapeTree(SDL_ShapeTree** shape_tree) -{ - if((*shape_tree)->kind == QuadShape) { - SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.upleft); - SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.upright); - SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.downleft); - SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.downright); - } - SDL_free(*shape_tree); - *shape_tree = NULL; -} - -int -SDL_SetWindowShape(SDL_Window *window,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode) -{ - int result; - if(window == NULL || !SDL_IsShapedWindow(window)) - /* The window given was not a shapeable window. */ - return SDL_NONSHAPEABLE_WINDOW; - if(shape == NULL) - /* Invalid shape argument. */ - return SDL_INVALID_SHAPE_ARGUMENT; - - if(shape_mode != NULL) - window->shaper->mode = *shape_mode; - result = SDL_GetVideoDevice()->shape_driver.SetWindowShape(window->shaper,shape,shape_mode); - window->shaper->hasshape = SDL_TRUE; - if(window->shaper->userx != 0 && window->shaper->usery != 0) { - SDL_SetWindowPosition(window,window->shaper->userx,window->shaper->usery); - window->shaper->userx = 0; - window->shaper->usery = 0; - } - return result; -} - -static SDL_bool -SDL_WindowHasAShape(SDL_Window *window) -{ - if (window == NULL || !SDL_IsShapedWindow(window)) - return SDL_FALSE; - return window->shaper->hasshape; -} - -int -SDL_GetShapedWindowMode(SDL_Window *window,SDL_WindowShapeMode *shape_mode) -{ - if(window != NULL && SDL_IsShapedWindow(window)) { - if(shape_mode == NULL) { - if(SDL_WindowHasAShape(window)) - /* The window given has a shape. */ - return 0; - else - /* The window given is shapeable but lacks a shape. */ - return SDL_WINDOW_LACKS_SHAPE; - } - else { - *shape_mode = window->shaper->mode; - return 0; - } - } - else - /* The window given is not a valid shapeable window. */ - return SDL_NONSHAPEABLE_WINDOW; -} diff --git a/3rdparty/SDL2/src/video/SDL_shape_internals.h b/3rdparty/SDL2/src/video/SDL_shape_internals.h deleted file mode 100644 index bdb0ee91be6..00000000000 --- a/3rdparty/SDL2/src/video/SDL_shape_internals.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#ifndef _SDL_shape_internals_h -#define _SDL_shape_internals_h - -#include "SDL_rect.h" -#include "SDL_shape.h" -#include "SDL_surface.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -typedef struct { - struct SDL_ShapeTree *upleft,*upright,*downleft,*downright; -} SDL_QuadTreeChildren; - -typedef union { - SDL_QuadTreeChildren children; - SDL_Rect shape; -} SDL_ShapeUnion; - -typedef enum { QuadShape,TransparentShape,OpaqueShape } SDL_ShapeKind; - -typedef struct { - SDL_ShapeKind kind; - SDL_ShapeUnion data; -} SDL_ShapeTree; - -typedef void(*SDL_TraversalFunction)(SDL_ShapeTree*,void*); - -extern void SDL_CalculateShapeBitmap(SDL_WindowShapeMode mode,SDL_Surface *shape,Uint8* bitmap,Uint8 ppb); -extern SDL_ShapeTree* SDL_CalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* shape); -extern void SDL_TraverseShapeTree(SDL_ShapeTree *tree,SDL_TraversalFunction function,void* closure); -extern void SDL_FreeShapeTree(SDL_ShapeTree** shape_tree); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif diff --git a/3rdparty/SDL2/src/video/SDL_stretch.c b/3rdparty/SDL2/src/video/SDL_stretch.c deleted file mode 100644 index bb34dffb760..00000000000 --- a/3rdparty/SDL2/src/video/SDL_stretch.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* This a stretch blit implementation based on ideas given to me by - Tomasz Cejner - thanks! :) - - April 27, 2000 - Sam Lantinga -*/ - -#include "SDL_video.h" -#include "SDL_blit.h" - -/* This isn't ready for general consumption yet - it should be folded - into the general blitting mechanism. -*/ - -#if ((defined(_MFC_VER) && defined(_M_IX86)) || \ - defined(__WATCOMC__) || \ - (defined(__GNUC__) && defined(__i386__))) && SDL_ASSEMBLY_ROUTINES -/* There's a bug with gcc 4.4.1 and -O2 where srcp doesn't get the correct - * value after the first scanline. FIXME? */ -/* #define USE_ASM_STRETCH */ -#endif - -#ifdef USE_ASM_STRETCH - -#ifdef HAVE_MPROTECT -#include <sys/types.h> -#include <sys/mman.h> -#endif -#ifdef __GNUC__ -#define PAGE_ALIGNED __attribute__((__aligned__(4096))) -#else -#define PAGE_ALIGNED -#endif - -#if defined(_M_IX86) || defined(i386) -#define PREFIX16 0x66 -#define STORE_BYTE 0xAA -#define STORE_WORD 0xAB -#define LOAD_BYTE 0xAC -#define LOAD_WORD 0xAD -#define RETURN 0xC3 -#else -#error Need assembly opcodes for this architecture -#endif - -static unsigned char copy_row[4096] PAGE_ALIGNED; - -static int -generate_rowbytes(int src_w, int dst_w, int bpp) -{ - static struct - { - int bpp; - int src_w; - int dst_w; - int status; - } last; - - int i; - int pos, inc; - unsigned char *eip, *fence; - unsigned char load, store; - - /* See if we need to regenerate the copy buffer */ - if ((src_w == last.src_w) && (dst_w == last.dst_w) && (bpp == last.bpp)) { - return (last.status); - } - last.bpp = bpp; - last.src_w = src_w; - last.dst_w = dst_w; - last.status = -1; - - switch (bpp) { - case 1: - load = LOAD_BYTE; - store = STORE_BYTE; - break; - case 2: - case 4: - load = LOAD_WORD; - store = STORE_WORD; - break; - default: - return SDL_SetError("ASM stretch of %d bytes isn't supported\n", bpp); - } -#ifdef HAVE_MPROTECT - /* Make the code writeable */ - if (mprotect(copy_row, sizeof(copy_row), PROT_READ | PROT_WRITE) < 0) { - return SDL_SetError("Couldn't make copy buffer writeable"); - } -#endif - pos = 0x10000; - inc = (src_w << 16) / dst_w; - eip = copy_row; - fence = copy_row + sizeof(copy_row)-2; - for (i = 0; i < dst_w; ++i) { - while (pos >= 0x10000L) { - if (eip == fence) { - return -1; - } - if (bpp == 2) { - *eip++ = PREFIX16; - } - *eip++ = load; - pos -= 0x10000L; - } - if (eip == fence) { - return -1; - } - if (bpp == 2) { - *eip++ = PREFIX16; - } - *eip++ = store; - pos += inc; - } - *eip++ = RETURN; - -#ifdef HAVE_MPROTECT - /* Make the code executable but not writeable */ - if (mprotect(copy_row, sizeof(copy_row), PROT_READ | PROT_EXEC) < 0) { - return SDL_SetError("Couldn't make copy buffer executable"); - } -#endif - last.status = 0; - return (0); -} - -#endif /* USE_ASM_STRETCH */ - -#define DEFINE_COPY_ROW(name, type) \ -static void name(type *src, int src_w, type *dst, int dst_w) \ -{ \ - int i; \ - int pos, inc; \ - type pixel = 0; \ - \ - pos = 0x10000; \ - inc = (src_w << 16) / dst_w; \ - for ( i=dst_w; i>0; --i ) { \ - while ( pos >= 0x10000L ) { \ - pixel = *src++; \ - pos -= 0x10000L; \ - } \ - *dst++ = pixel; \ - pos += inc; \ - } \ -} -/* *INDENT-OFF* */ -DEFINE_COPY_ROW(copy_row1, Uint8) -DEFINE_COPY_ROW(copy_row2, Uint16) -DEFINE_COPY_ROW(copy_row4, Uint32) -/* *INDENT-ON* */ - -/* The ASM code doesn't handle 24-bpp stretch blits */ -static void -copy_row3(Uint8 * src, int src_w, Uint8 * dst, int dst_w) -{ - int i; - int pos, inc; - Uint8 pixel[3] = { 0, 0, 0 }; - - pos = 0x10000; - inc = (src_w << 16) / dst_w; - for (i = dst_w; i > 0; --i) { - while (pos >= 0x10000L) { - pixel[0] = *src++; - pixel[1] = *src++; - pixel[2] = *src++; - pos -= 0x10000L; - } - *dst++ = pixel[0]; - *dst++ = pixel[1]; - *dst++ = pixel[2]; - pos += inc; - } -} - -/* Perform a stretch blit between two surfaces of the same format. - NOTE: This function is not safe to call from multiple threads! -*/ -int -SDL_SoftStretch(SDL_Surface * src, const SDL_Rect * srcrect, - SDL_Surface * dst, const SDL_Rect * dstrect) -{ - int src_locked; - int dst_locked; - int pos, inc; - int dst_maxrow; - int src_row, dst_row; - Uint8 *srcp = NULL; - Uint8 *dstp; - SDL_Rect full_src; - SDL_Rect full_dst; -#ifdef USE_ASM_STRETCH - SDL_bool use_asm = SDL_TRUE; -#ifdef __GNUC__ - int u1, u2; -#endif -#endif /* USE_ASM_STRETCH */ - const int bpp = dst->format->BytesPerPixel; - - if (src->format->format != dst->format->format) { - return SDL_SetError("Only works with same format surfaces"); - } - - /* Verify the blit rectangles */ - if (srcrect) { - if ((srcrect->x < 0) || (srcrect->y < 0) || - ((srcrect->x + srcrect->w) > src->w) || - ((srcrect->y + srcrect->h) > src->h)) { - return SDL_SetError("Invalid source blit rectangle"); - } - } else { - full_src.x = 0; - full_src.y = 0; - full_src.w = src->w; - full_src.h = src->h; - srcrect = &full_src; - } - if (dstrect) { - if ((dstrect->x < 0) || (dstrect->y < 0) || - ((dstrect->x + dstrect->w) > dst->w) || - ((dstrect->y + dstrect->h) > dst->h)) { - return SDL_SetError("Invalid destination blit rectangle"); - } - } else { - full_dst.x = 0; - full_dst.y = 0; - full_dst.w = dst->w; - full_dst.h = dst->h; - dstrect = &full_dst; - } - - /* Lock the destination if it's in hardware */ - dst_locked = 0; - if (SDL_MUSTLOCK(dst)) { - if (SDL_LockSurface(dst) < 0) { - return SDL_SetError("Unable to lock destination surface"); - } - dst_locked = 1; - } - /* Lock the source if it's in hardware */ - src_locked = 0; - if (SDL_MUSTLOCK(src)) { - if (SDL_LockSurface(src) < 0) { - if (dst_locked) { - SDL_UnlockSurface(dst); - } - return SDL_SetError("Unable to lock source surface"); - } - src_locked = 1; - } - - /* Set up the data... */ - pos = 0x10000; - inc = (srcrect->h << 16) / dstrect->h; - src_row = srcrect->y; - dst_row = dstrect->y; - -#ifdef USE_ASM_STRETCH - /* Write the opcodes for this stretch */ - if ((bpp == 3) || (generate_rowbytes(srcrect->w, dstrect->w, bpp) < 0)) { - use_asm = SDL_FALSE; - } -#endif - - /* Perform the stretch blit */ - for (dst_maxrow = dst_row + dstrect->h; dst_row < dst_maxrow; ++dst_row) { - dstp = (Uint8 *) dst->pixels + (dst_row * dst->pitch) - + (dstrect->x * bpp); - while (pos >= 0x10000L) { - srcp = (Uint8 *) src->pixels + (src_row * src->pitch) - + (srcrect->x * bpp); - ++src_row; - pos -= 0x10000L; - } -#ifdef USE_ASM_STRETCH - if (use_asm) { -#ifdef __GNUC__ - __asm__ __volatile__("call *%4":"=&D"(u1), "=&S"(u2) - :"0"(dstp), "1"(srcp), "r"(copy_row) - :"memory"); -#elif defined(_MSC_VER) || defined(__WATCOMC__) - /* *INDENT-OFF* */ - { - void *code = copy_row; - __asm { - push edi - push esi - mov edi, dstp - mov esi, srcp - call dword ptr code - pop esi - pop edi - } - } - /* *INDENT-ON* */ -#else -#error Need inline assembly for this compiler -#endif - } else -#endif - switch (bpp) { - case 1: - copy_row1(srcp, srcrect->w, dstp, dstrect->w); - break; - case 2: - copy_row2((Uint16 *) srcp, srcrect->w, - (Uint16 *) dstp, dstrect->w); - break; - case 3: - copy_row3(srcp, srcrect->w, dstp, dstrect->w); - break; - case 4: - copy_row4((Uint32 *) srcp, srcrect->w, - (Uint32 *) dstp, dstrect->w); - break; - } - pos += inc; - } - - /* We need to unlock the surfaces if they're locked */ - if (dst_locked) { - SDL_UnlockSurface(dst); - } - if (src_locked) { - SDL_UnlockSurface(src); - } - return (0); -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_surface.c b/3rdparty/SDL2/src/video/SDL_surface.c deleted file mode 100644 index 9d52e5ca4ab..00000000000 --- a/3rdparty/SDL2/src/video/SDL_surface.c +++ /dev/null @@ -1,1183 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#include "SDL_video.h" -#include "SDL_sysvideo.h" -#include "SDL_blit.h" -#include "SDL_RLEaccel_c.h" -#include "SDL_pixels_c.h" - -/* Public routines */ - -/* - * Create an empty RGB surface of the appropriate depth using the given - * enum SDL_PIXELFORMAT_* format - */ -SDL_Surface * -SDL_CreateRGBSurfaceWithFormat(Uint32 flags, int width, int height, int depth, - Uint32 format) -{ - SDL_Surface *surface; - - /* The flags are no longer used, make the compiler happy */ - (void)flags; - - /* Allocate the surface */ - surface = (SDL_Surface *) SDL_calloc(1, sizeof(*surface)); - if (surface == NULL) { - SDL_OutOfMemory(); - return NULL; - } - - surface->format = SDL_AllocFormat(format); - if (!surface->format) { - SDL_FreeSurface(surface); - return NULL; - } - surface->w = width; - surface->h = height; - surface->pitch = SDL_CalculatePitch(surface); - SDL_SetClipRect(surface, NULL); - - if (SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) { - SDL_Palette *palette = - SDL_AllocPalette((1 << surface->format->BitsPerPixel)); - if (!palette) { - SDL_FreeSurface(surface); - return NULL; - } - if (palette->ncolors == 2) { - /* Create a black and white bitmap palette */ - palette->colors[0].r = 0xFF; - palette->colors[0].g = 0xFF; - palette->colors[0].b = 0xFF; - palette->colors[1].r = 0x00; - palette->colors[1].g = 0x00; - palette->colors[1].b = 0x00; - } - SDL_SetSurfacePalette(surface, palette); - SDL_FreePalette(palette); - } - - /* Get the pixels */ - if (surface->w && surface->h) { - surface->pixels = SDL_malloc(surface->h * surface->pitch); - if (!surface->pixels) { - SDL_FreeSurface(surface); - SDL_OutOfMemory(); - return NULL; - } - /* This is important for bitmaps */ - SDL_memset(surface->pixels, 0, surface->h * surface->pitch); - } - - /* Allocate an empty mapping */ - surface->map = SDL_AllocBlitMap(); - if (!surface->map) { - SDL_FreeSurface(surface); - return NULL; - } - - /* By default surface with an alpha mask are set up for blending */ - if (surface->format->Amask) { - SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND); - } - - /* The surface is ready to go */ - surface->refcount = 1; - return surface; -} - -/* - * Create an empty RGB surface of the appropriate depth - */ -SDL_Surface * -SDL_CreateRGBSurface(Uint32 flags, - int width, int height, int depth, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) -{ - Uint32 format; - - /* Get the pixel format */ - format = SDL_MasksToPixelFormatEnum(depth, Rmask, Gmask, Bmask, Amask); - if (format == SDL_PIXELFORMAT_UNKNOWN) { - SDL_SetError("Unknown pixel format"); - return NULL; - } - - return SDL_CreateRGBSurfaceWithFormat(flags, width, height, depth, format); -} - -/* - * Create an RGB surface from an existing memory buffer - */ -SDL_Surface * -SDL_CreateRGBSurfaceFrom(void *pixels, - int width, int height, int depth, int pitch, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, - Uint32 Amask) -{ - SDL_Surface *surface; - - surface = SDL_CreateRGBSurface(0, 0, 0, depth, Rmask, Gmask, Bmask, Amask); - if (surface != NULL) { - surface->flags |= SDL_PREALLOC; - surface->pixels = pixels; - surface->w = width; - surface->h = height; - surface->pitch = pitch; - SDL_SetClipRect(surface, NULL); - } - return surface; -} - -/* - * Create an RGB surface from an existing memory buffer using the given given - * enum SDL_PIXELFORMAT_* format - */ -SDL_Surface * -SDL_CreateRGBSurfaceWithFormatFrom(void *pixels, - int width, int height, int depth, int pitch, - Uint32 format) -{ - SDL_Surface *surface; - - surface = SDL_CreateRGBSurfaceWithFormat(0, 0, 0, depth, format); - if (surface != NULL) { - surface->flags |= SDL_PREALLOC; - surface->pixels = pixels; - surface->w = width; - surface->h = height; - surface->pitch = pitch; - SDL_SetClipRect(surface, NULL); - } - return surface; -} - -int -SDL_SetSurfacePalette(SDL_Surface * surface, SDL_Palette * palette) -{ - if (!surface) { - return SDL_SetError("SDL_SetSurfacePalette() passed a NULL surface"); - } - if (SDL_SetPixelFormatPalette(surface->format, palette) < 0) { - return -1; - } - SDL_InvalidateMap(surface->map); - - return 0; -} - -int -SDL_SetSurfaceRLE(SDL_Surface * surface, int flag) -{ - int flags; - - if (!surface) { - return -1; - } - - flags = surface->map->info.flags; - if (flag) { - surface->map->info.flags |= SDL_COPY_RLE_DESIRED; - } else { - surface->map->info.flags &= ~SDL_COPY_RLE_DESIRED; - } - if (surface->map->info.flags != flags) { - SDL_InvalidateMap(surface->map); - } - return 0; -} - -int -SDL_SetColorKey(SDL_Surface * surface, int flag, Uint32 key) -{ - int flags; - - if (!surface) { - return SDL_InvalidParamError("surface"); - } - - if (surface->format->palette && key >= ((Uint32) surface->format->palette->ncolors)) { - return SDL_InvalidParamError("key"); - } - - if (flag & SDL_RLEACCEL) { - SDL_SetSurfaceRLE(surface, 1); - } - - flags = surface->map->info.flags; - if (flag) { - surface->map->info.flags |= SDL_COPY_COLORKEY; - surface->map->info.colorkey = key; - if (surface->format->palette) { - surface->format->palette->colors[surface->map->info.colorkey].a = SDL_ALPHA_TRANSPARENT; - ++surface->format->palette->version; - if (!surface->format->palette->version) { - surface->format->palette->version = 1; - } - } - } else { - if (surface->format->palette) { - surface->format->palette->colors[surface->map->info.colorkey].a = SDL_ALPHA_OPAQUE; - ++surface->format->palette->version; - if (!surface->format->palette->version) { - surface->format->palette->version = 1; - } - } - surface->map->info.flags &= ~SDL_COPY_COLORKEY; - } - if (surface->map->info.flags != flags) { - SDL_InvalidateMap(surface->map); - } - - return 0; -} - -int -SDL_GetColorKey(SDL_Surface * surface, Uint32 * key) -{ - if (!surface) { - return -1; - } - - if (!(surface->map->info.flags & SDL_COPY_COLORKEY)) { - return -1; - } - - if (key) { - *key = surface->map->info.colorkey; - } - return 0; -} - -/* This is a fairly slow function to switch from colorkey to alpha */ -static void -SDL_ConvertColorkeyToAlpha(SDL_Surface * surface) -{ - int x, y; - - if (!surface) { - return; - } - - if (!(surface->map->info.flags & SDL_COPY_COLORKEY) || - !surface->format->Amask) { - return; - } - - SDL_LockSurface(surface); - - switch (surface->format->BytesPerPixel) { - case 2: - { - Uint16 *row, *spot; - Uint16 ckey = (Uint16) surface->map->info.colorkey; - Uint16 mask = (Uint16) (~surface->format->Amask); - - /* Ignore alpha in colorkey comparison */ - ckey &= mask; - row = (Uint16 *) surface->pixels; - for (y = surface->h; y--;) { - spot = row; - for (x = surface->w; x--;) { - if ((*spot & mask) == ckey) { - *spot &= mask; - } - ++spot; - } - row += surface->pitch / 2; - } - } - break; - case 3: - /* FIXME */ - break; - case 4: - { - Uint32 *row, *spot; - Uint32 ckey = surface->map->info.colorkey; - Uint32 mask = ~surface->format->Amask; - - /* Ignore alpha in colorkey comparison */ - ckey &= mask; - row = (Uint32 *) surface->pixels; - for (y = surface->h; y--;) { - spot = row; - for (x = surface->w; x--;) { - if ((*spot & mask) == ckey) { - *spot &= mask; - } - ++spot; - } - row += surface->pitch / 4; - } - } - break; - } - - SDL_UnlockSurface(surface); - - SDL_SetColorKey(surface, 0, 0); - SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND); -} - -int -SDL_SetSurfaceColorMod(SDL_Surface * surface, Uint8 r, Uint8 g, Uint8 b) -{ - int flags; - - if (!surface) { - return -1; - } - - surface->map->info.r = r; - surface->map->info.g = g; - surface->map->info.b = b; - - flags = surface->map->info.flags; - if (r != 0xFF || g != 0xFF || b != 0xFF) { - surface->map->info.flags |= SDL_COPY_MODULATE_COLOR; - } else { - surface->map->info.flags &= ~SDL_COPY_MODULATE_COLOR; - } - if (surface->map->info.flags != flags) { - SDL_InvalidateMap(surface->map); - } - return 0; -} - - -int -SDL_GetSurfaceColorMod(SDL_Surface * surface, Uint8 * r, Uint8 * g, Uint8 * b) -{ - if (!surface) { - return -1; - } - - if (r) { - *r = surface->map->info.r; - } - if (g) { - *g = surface->map->info.g; - } - if (b) { - *b = surface->map->info.b; - } - return 0; -} - -int -SDL_SetSurfaceAlphaMod(SDL_Surface * surface, Uint8 alpha) -{ - int flags; - - if (!surface) { - return -1; - } - - surface->map->info.a = alpha; - - flags = surface->map->info.flags; - if (alpha != 0xFF) { - surface->map->info.flags |= SDL_COPY_MODULATE_ALPHA; - } else { - surface->map->info.flags &= ~SDL_COPY_MODULATE_ALPHA; - } - if (surface->map->info.flags != flags) { - SDL_InvalidateMap(surface->map); - } - return 0; -} - -int -SDL_GetSurfaceAlphaMod(SDL_Surface * surface, Uint8 * alpha) -{ - if (!surface) { - return -1; - } - - if (alpha) { - *alpha = surface->map->info.a; - } - return 0; -} - -int -SDL_SetSurfaceBlendMode(SDL_Surface * surface, SDL_BlendMode blendMode) -{ - int flags, status; - - if (!surface) { - return -1; - } - - status = 0; - flags = surface->map->info.flags; - surface->map->info.flags &= - ~(SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD); - switch (blendMode) { - case SDL_BLENDMODE_NONE: - break; - case SDL_BLENDMODE_BLEND: - surface->map->info.flags |= SDL_COPY_BLEND; - break; - case SDL_BLENDMODE_ADD: - surface->map->info.flags |= SDL_COPY_ADD; - break; - case SDL_BLENDMODE_MOD: - surface->map->info.flags |= SDL_COPY_MOD; - break; - default: - status = SDL_Unsupported(); - break; - } - - if (surface->map->info.flags != flags) { - SDL_InvalidateMap(surface->map); - } - - return status; -} - -int -SDL_GetSurfaceBlendMode(SDL_Surface * surface, SDL_BlendMode *blendMode) -{ - if (!surface) { - return -1; - } - - if (!blendMode) { - return 0; - } - - switch (surface->map-> - info.flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - *blendMode = SDL_BLENDMODE_BLEND; - break; - case SDL_COPY_ADD: - *blendMode = SDL_BLENDMODE_ADD; - break; - case SDL_COPY_MOD: - *blendMode = SDL_BLENDMODE_MOD; - break; - default: - *blendMode = SDL_BLENDMODE_NONE; - break; - } - return 0; -} - -SDL_bool -SDL_SetClipRect(SDL_Surface * surface, const SDL_Rect * rect) -{ - SDL_Rect full_rect; - - /* Don't do anything if there's no surface to act on */ - if (!surface) { - return SDL_FALSE; - } - - /* Set up the full surface rectangle */ - full_rect.x = 0; - full_rect.y = 0; - full_rect.w = surface->w; - full_rect.h = surface->h; - - /* Set the clipping rectangle */ - if (!rect) { - surface->clip_rect = full_rect; - return SDL_TRUE; - } - return SDL_IntersectRect(rect, &full_rect, &surface->clip_rect); -} - -void -SDL_GetClipRect(SDL_Surface * surface, SDL_Rect * rect) -{ - if (surface && rect) { - *rect = surface->clip_rect; - } -} - -/* - * Set up a blit between two surfaces -- split into three parts: - * The upper part, SDL_UpperBlit(), performs clipping and rectangle - * verification. The lower part is a pointer to a low level - * accelerated blitting function. - * - * These parts are separated out and each used internally by this - * library in the optimimum places. They are exported so that if - * you know exactly what you are doing, you can optimize your code - * by calling the one(s) you need. - */ -int -SDL_LowerBlit(SDL_Surface * src, SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect) -{ - /* Check to make sure the blit mapping is valid */ - if ((src->map->dst != dst) || - (dst->format->palette && - src->map->dst_palette_version != dst->format->palette->version) || - (src->format->palette && - src->map->src_palette_version != src->format->palette->version)) { - if (SDL_MapSurface(src, dst) < 0) { - return (-1); - } - /* just here for debugging */ -/* printf */ -/* ("src = 0x%08X src->flags = %08X src->map->info.flags = %08x\ndst = 0x%08X dst->flags = %08X dst->map->info.flags = %08X\nsrc->map->blit = 0x%08x\n", */ -/* src, dst->flags, src->map->info.flags, dst, dst->flags, */ -/* dst->map->info.flags, src->map->blit); */ - } - return (src->map->blit(src, srcrect, dst, dstrect)); -} - - -int -SDL_UpperBlit(SDL_Surface * src, const SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect) -{ - SDL_Rect fulldst; - int srcx, srcy, w, h; - - /* Make sure the surfaces aren't locked */ - if (!src || !dst) { - return SDL_SetError("SDL_UpperBlit: passed a NULL surface"); - } - if (src->locked || dst->locked) { - return SDL_SetError("Surfaces must not be locked during blit"); - } - - /* If the destination rectangle is NULL, use the entire dest surface */ - if (dstrect == NULL) { - fulldst.x = fulldst.y = 0; - fulldst.w = dst->w; - fulldst.h = dst->h; - dstrect = &fulldst; - } - - /* clip the source rectangle to the source surface */ - if (srcrect) { - int maxw, maxh; - - srcx = srcrect->x; - w = srcrect->w; - if (srcx < 0) { - w += srcx; - dstrect->x -= srcx; - srcx = 0; - } - maxw = src->w - srcx; - if (maxw < w) - w = maxw; - - srcy = srcrect->y; - h = srcrect->h; - if (srcy < 0) { - h += srcy; - dstrect->y -= srcy; - srcy = 0; - } - maxh = src->h - srcy; - if (maxh < h) - h = maxh; - - } else { - srcx = srcy = 0; - w = src->w; - h = src->h; - } - - /* clip the destination rectangle against the clip rectangle */ - { - SDL_Rect *clip = &dst->clip_rect; - int dx, dy; - - dx = clip->x - dstrect->x; - if (dx > 0) { - w -= dx; - dstrect->x += dx; - srcx += dx; - } - dx = dstrect->x + w - clip->x - clip->w; - if (dx > 0) - w -= dx; - - dy = clip->y - dstrect->y; - if (dy > 0) { - h -= dy; - dstrect->y += dy; - srcy += dy; - } - dy = dstrect->y + h - clip->y - clip->h; - if (dy > 0) - h -= dy; - } - - /* Switch back to a fast blit if we were previously stretching */ - if (src->map->info.flags & SDL_COPY_NEAREST) { - src->map->info.flags &= ~SDL_COPY_NEAREST; - SDL_InvalidateMap(src->map); - } - - if (w > 0 && h > 0) { - SDL_Rect sr; - sr.x = srcx; - sr.y = srcy; - sr.w = dstrect->w = w; - sr.h = dstrect->h = h; - return SDL_LowerBlit(src, &sr, dst, dstrect); - } - dstrect->w = dstrect->h = 0; - return 0; -} - -int -SDL_UpperBlitScaled(SDL_Surface * src, const SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect) -{ - double src_x0, src_y0, src_x1, src_y1; - double dst_x0, dst_y0, dst_x1, dst_y1; - SDL_Rect final_src, final_dst; - double scaling_w, scaling_h; - int src_w, src_h; - int dst_w, dst_h; - - /* Make sure the surfaces aren't locked */ - if (!src || !dst) { - return SDL_SetError("SDL_UpperBlitScaled: passed a NULL surface"); - } - if (src->locked || dst->locked) { - return SDL_SetError("Surfaces must not be locked during blit"); - } - - if (NULL == srcrect) { - src_w = src->w; - src_h = src->h; - } else { - src_w = srcrect->w; - src_h = srcrect->h; - } - - if (NULL == dstrect) { - dst_w = dst->w; - dst_h = dst->h; - } else { - dst_w = dstrect->w; - dst_h = dstrect->h; - } - - if (dst_w == src_w && dst_h == src_h) { - /* No scaling, defer to regular blit */ - return SDL_BlitSurface(src, srcrect, dst, dstrect); - } - - scaling_w = (double)dst_w / src_w; - scaling_h = (double)dst_h / src_h; - - if (NULL == dstrect) { - dst_x0 = 0; - dst_y0 = 0; - dst_x1 = dst_w - 1; - dst_y1 = dst_h - 1; - } else { - dst_x0 = dstrect->x; - dst_y0 = dstrect->y; - dst_x1 = dst_x0 + dst_w - 1; - dst_y1 = dst_y0 + dst_h - 1; - } - - if (NULL == srcrect) { - src_x0 = 0; - src_y0 = 0; - src_x1 = src_w - 1; - src_y1 = src_h - 1; - } else { - src_x0 = srcrect->x; - src_y0 = srcrect->y; - src_x1 = src_x0 + src_w - 1; - src_y1 = src_y0 + src_h - 1; - - /* Clip source rectangle to the source surface */ - - if (src_x0 < 0) { - dst_x0 -= src_x0 * scaling_w; - src_x0 = 0; - } - - if (src_x1 >= src->w) { - dst_x1 -= (src_x1 - src->w + 1) * scaling_w; - src_x1 = src->w - 1; - } - - if (src_y0 < 0) { - dst_y0 -= src_y0 * scaling_h; - src_y0 = 0; - } - - if (src_y1 >= src->h) { - dst_y1 -= (src_y1 - src->h + 1) * scaling_h; - src_y1 = src->h - 1; - } - } - - /* Clip destination rectangle to the clip rectangle */ - - /* Translate to clip space for easier calculations */ - dst_x0 -= dst->clip_rect.x; - dst_x1 -= dst->clip_rect.x; - dst_y0 -= dst->clip_rect.y; - dst_y1 -= dst->clip_rect.y; - - if (dst_x0 < 0) { - src_x0 -= dst_x0 / scaling_w; - dst_x0 = 0; - } - - if (dst_x1 >= dst->clip_rect.w) { - src_x1 -= (dst_x1 - dst->clip_rect.w + 1) / scaling_w; - dst_x1 = dst->clip_rect.w - 1; - } - - if (dst_y0 < 0) { - src_y0 -= dst_y0 / scaling_h; - dst_y0 = 0; - } - - if (dst_y1 >= dst->clip_rect.h) { - src_y1 -= (dst_y1 - dst->clip_rect.h + 1) / scaling_h; - dst_y1 = dst->clip_rect.h - 1; - } - - /* Translate back to surface coordinates */ - dst_x0 += dst->clip_rect.x; - dst_x1 += dst->clip_rect.x; - dst_y0 += dst->clip_rect.y; - dst_y1 += dst->clip_rect.y; - - final_src.x = (int)SDL_floor(src_x0 + 0.5); - final_src.y = (int)SDL_floor(src_y0 + 0.5); - final_src.w = (int)SDL_floor(src_x1 - src_x0 + 1.5); - final_src.h = (int)SDL_floor(src_y1 - src_y0 + 1.5); - - final_dst.x = (int)SDL_floor(dst_x0 + 0.5); - final_dst.y = (int)SDL_floor(dst_y0 + 0.5); - final_dst.w = (int)SDL_floor(dst_x1 - dst_x0 + 1.5); - final_dst.h = (int)SDL_floor(dst_y1 - dst_y0 + 1.5); - - if (final_dst.w < 0) - final_dst.w = 0; - if (final_dst.h < 0) - final_dst.h = 0; - - if (dstrect) - *dstrect = final_dst; - - if (final_dst.w == 0 || final_dst.h == 0 || - final_src.w <= 0 || final_src.h <= 0) { - /* No-op. */ - return 0; - } - - return SDL_LowerBlitScaled(src, &final_src, dst, &final_dst); -} - -/** - * This is a semi-private blit function and it performs low-level surface - * scaled blitting only. - */ -int -SDL_LowerBlitScaled(SDL_Surface * src, SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect) -{ - static const Uint32 complex_copy_flags = ( - SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | - SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | - SDL_COPY_COLORKEY - ); - - if (!(src->map->info.flags & SDL_COPY_NEAREST)) { - src->map->info.flags |= SDL_COPY_NEAREST; - SDL_InvalidateMap(src->map); - } - - if ( !(src->map->info.flags & complex_copy_flags) && - src->format->format == dst->format->format && - !SDL_ISPIXELFORMAT_INDEXED(src->format->format) ) { - return SDL_SoftStretch( src, srcrect, dst, dstrect ); - } else { - return SDL_LowerBlit( src, srcrect, dst, dstrect ); - } -} - -/* - * Lock a surface to directly access the pixels - */ -int -SDL_LockSurface(SDL_Surface * surface) -{ - if (!surface->locked) { - /* Perform the lock */ - if (surface->flags & SDL_RLEACCEL) { - SDL_UnRLESurface(surface, 1); - surface->flags |= SDL_RLEACCEL; /* save accel'd state */ - } - } - - /* Increment the surface lock count, for recursive locks */ - ++surface->locked; - - /* Ready to go.. */ - return (0); -} - -/* - * Unlock a previously locked surface - */ -void -SDL_UnlockSurface(SDL_Surface * surface) -{ - /* Only perform an unlock if we are locked */ - if (!surface->locked || (--surface->locked > 0)) { - return; - } - - /* Update RLE encoded surface with new data */ - if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) { - surface->flags &= ~SDL_RLEACCEL; /* stop lying */ - SDL_RLESurface(surface); - } -} - -/* - * Convert a surface into the specified pixel format. - */ -SDL_Surface * -SDL_ConvertSurface(SDL_Surface * surface, const SDL_PixelFormat * format, - Uint32 flags) -{ - SDL_Surface *convert; - Uint32 copy_flags; - SDL_Color copy_color; - SDL_Rect bounds; - - /* Check for empty destination palette! (results in empty image) */ - if (format->palette != NULL) { - int i; - for (i = 0; i < format->palette->ncolors; ++i) { - if ((format->palette->colors[i].r != 0xFF) || - (format->palette->colors[i].g != 0xFF) || - (format->palette->colors[i].b != 0xFF)) - break; - } - if (i == format->palette->ncolors) { - SDL_SetError("Empty destination palette"); - return (NULL); - } - } - - /* Create a new surface with the desired format */ - convert = SDL_CreateRGBSurface(flags, surface->w, surface->h, - format->BitsPerPixel, format->Rmask, - format->Gmask, format->Bmask, - format->Amask); - if (convert == NULL) { - return (NULL); - } - - /* Copy the palette if any */ - if (format->palette && convert->format->palette) { - SDL_memcpy(convert->format->palette->colors, - format->palette->colors, - format->palette->ncolors * sizeof(SDL_Color)); - convert->format->palette->ncolors = format->palette->ncolors; - } - - /* Save the original copy flags */ - copy_flags = surface->map->info.flags; - copy_color.r = surface->map->info.r; - copy_color.g = surface->map->info.g; - copy_color.b = surface->map->info.b; - copy_color.a = surface->map->info.a; - surface->map->info.r = 0xFF; - surface->map->info.g = 0xFF; - surface->map->info.b = 0xFF; - surface->map->info.a = 0xFF; - surface->map->info.flags = 0; - SDL_InvalidateMap(surface->map); - - /* Copy over the image data */ - bounds.x = 0; - bounds.y = 0; - bounds.w = surface->w; - bounds.h = surface->h; - SDL_LowerBlit(surface, &bounds, convert, &bounds); - - /* Clean up the original surface, and update converted surface */ - convert->map->info.r = copy_color.r; - convert->map->info.g = copy_color.g; - convert->map->info.b = copy_color.b; - convert->map->info.a = copy_color.a; - convert->map->info.flags = - (copy_flags & - ~(SDL_COPY_COLORKEY | SDL_COPY_BLEND - | SDL_COPY_RLE_DESIRED | SDL_COPY_RLE_COLORKEY | - SDL_COPY_RLE_ALPHAKEY)); - surface->map->info.r = copy_color.r; - surface->map->info.g = copy_color.g; - surface->map->info.b = copy_color.b; - surface->map->info.a = copy_color.a; - surface->map->info.flags = copy_flags; - SDL_InvalidateMap(surface->map); - if (copy_flags & SDL_COPY_COLORKEY) { - SDL_bool set_colorkey_by_color = SDL_FALSE; - - if (surface->format->palette) { - if (format->palette && - surface->format->palette->ncolors <= format->palette->ncolors && - (SDL_memcmp(surface->format->palette->colors, format->palette->colors, - surface->format->palette->ncolors * sizeof(SDL_Color)) == 0)) { - /* The palette is identical, just set the same colorkey */ - SDL_SetColorKey(convert, 1, surface->map->info.colorkey); - } else if (format->Amask) { - /* The alpha was set in the destination from the palette */ - } else { - set_colorkey_by_color = SDL_TRUE; - } - } else { - set_colorkey_by_color = SDL_TRUE; - } - - if (set_colorkey_by_color) { - /* Set the colorkey by color, which needs to be unique */ - Uint8 keyR, keyG, keyB, keyA; - - SDL_GetRGBA(surface->map->info.colorkey, surface->format, &keyR, - &keyG, &keyB, &keyA); - SDL_SetColorKey(convert, 1, - SDL_MapRGBA(convert->format, keyR, keyG, keyB, keyA)); - /* This is needed when converting for 3D texture upload */ - SDL_ConvertColorkeyToAlpha(convert); - } - } - SDL_SetClipRect(convert, &surface->clip_rect); - - /* Enable alpha blending by default if the new surface has an - * alpha channel or alpha modulation */ - if ((surface->format->Amask && format->Amask) || - (copy_flags & (SDL_COPY_COLORKEY|SDL_COPY_MODULATE_ALPHA))) { - SDL_SetSurfaceBlendMode(convert, SDL_BLENDMODE_BLEND); - } - if ((copy_flags & SDL_COPY_RLE_DESIRED) || (flags & SDL_RLEACCEL)) { - SDL_SetSurfaceRLE(convert, SDL_RLEACCEL); - } - - /* We're ready to go! */ - return (convert); -} - -SDL_Surface * -SDL_ConvertSurfaceFormat(SDL_Surface * surface, Uint32 pixel_format, - Uint32 flags) -{ - SDL_PixelFormat *fmt; - SDL_Surface *convert = NULL; - - fmt = SDL_AllocFormat(pixel_format); - if (fmt) { - convert = SDL_ConvertSurface(surface, fmt, flags); - SDL_FreeFormat(fmt); - } - return convert; -} - -/* - * Create a surface on the stack for quick blit operations - */ -static SDL_INLINE SDL_bool -SDL_CreateSurfaceOnStack(int width, int height, Uint32 pixel_format, - void * pixels, int pitch, SDL_Surface * surface, - SDL_PixelFormat * format, SDL_BlitMap * blitmap) -{ - if (SDL_ISPIXELFORMAT_INDEXED(pixel_format)) { - SDL_SetError("Indexed pixel formats not supported"); - return SDL_FALSE; - } - if (SDL_InitFormat(format, pixel_format) < 0) { - return SDL_FALSE; - } - - SDL_zerop(surface); - surface->flags = SDL_PREALLOC; - surface->format = format; - surface->pixels = pixels; - surface->w = width; - surface->h = height; - surface->pitch = pitch; - /* We don't actually need to set up the clip rect for our purposes */ - /* SDL_SetClipRect(surface, NULL); */ - - /* Allocate an empty mapping */ - SDL_zerop(blitmap); - blitmap->info.r = 0xFF; - blitmap->info.g = 0xFF; - blitmap->info.b = 0xFF; - blitmap->info.a = 0xFF; - surface->map = blitmap; - - /* The surface is ready to go */ - surface->refcount = 1; - return SDL_TRUE; -} - -/* - * Copy a block of pixels of one format to another format - */ -int SDL_ConvertPixels(int width, int height, - Uint32 src_format, const void * src, int src_pitch, - Uint32 dst_format, void * dst, int dst_pitch) -{ - SDL_Surface src_surface, dst_surface; - SDL_PixelFormat src_fmt, dst_fmt; - SDL_BlitMap src_blitmap, dst_blitmap; - SDL_Rect rect; - void *nonconst_src = (void *) src; - - /* Check to make sure we are blitting somewhere, so we don't crash */ - if (!dst) { - return SDL_InvalidParamError("dst"); - } - if (!dst_pitch) { - return SDL_InvalidParamError("dst_pitch"); - } - - /* Fast path for same format copy */ - if (src_format == dst_format) { - int bpp, i; - - if (SDL_ISPIXELFORMAT_FOURCC(src_format)) { - switch (src_format) { - case SDL_PIXELFORMAT_YUY2: - case SDL_PIXELFORMAT_UYVY: - case SDL_PIXELFORMAT_YVYU: - bpp = 2; - break; - case SDL_PIXELFORMAT_YV12: - case SDL_PIXELFORMAT_IYUV: - case SDL_PIXELFORMAT_NV12: - case SDL_PIXELFORMAT_NV21: - bpp = 1; - break; - default: - return SDL_SetError("Unknown FOURCC pixel format"); - } - } else { - bpp = SDL_BYTESPERPIXEL(src_format); - } - width *= bpp; - - for (i = height; i--;) { - SDL_memcpy(dst, src, width); - src = (Uint8*)src + src_pitch; - dst = (Uint8*)dst + dst_pitch; - } - - if (src_format == SDL_PIXELFORMAT_YV12 || src_format == SDL_PIXELFORMAT_IYUV) { - /* U and V planes are a quarter the size of the Y plane */ - width /= 2; - height /= 2; - src_pitch /= 2; - dst_pitch /= 2; - for (i = height * 2; i--;) { - SDL_memcpy(dst, src, width); - src = (Uint8*)src + src_pitch; - dst = (Uint8*)dst + dst_pitch; - } - } else if (src_format == SDL_PIXELFORMAT_NV12 || src_format == SDL_PIXELFORMAT_NV21) { - /* U/V plane is half the height of the Y plane */ - height /= 2; - for (i = height; i--;) { - SDL_memcpy(dst, src, width); - src = (Uint8*)src + src_pitch; - dst = (Uint8*)dst + dst_pitch; - } - } - return 0; - } - - if (!SDL_CreateSurfaceOnStack(width, height, src_format, nonconst_src, - src_pitch, - &src_surface, &src_fmt, &src_blitmap)) { - return -1; - } - if (!SDL_CreateSurfaceOnStack(width, height, dst_format, dst, dst_pitch, - &dst_surface, &dst_fmt, &dst_blitmap)) { - return -1; - } - - /* Set up the rect and go! */ - rect.x = 0; - rect.y = 0; - rect.w = width; - rect.h = height; - return SDL_LowerBlit(&src_surface, &rect, &dst_surface, &rect); -} - -/* - * Free a surface created by the above function. - */ -void -SDL_FreeSurface(SDL_Surface * surface) -{ - if (surface == NULL) { - return; - } - if (surface->flags & SDL_DONTFREE) { - return; - } - if (--surface->refcount > 0) { - return; - } - while (surface->locked > 0) { - SDL_UnlockSurface(surface); - } - if (surface->flags & SDL_RLEACCEL) { - SDL_UnRLESurface(surface, 0); - } - if (surface->format) { - SDL_SetSurfacePalette(surface, NULL); - SDL_FreeFormat(surface->format); - surface->format = NULL; - } - if (surface->map != NULL) { - SDL_FreeBlitMap(surface->map); - surface->map = NULL; - } - if (!(surface->flags & SDL_PREALLOC)) { - SDL_free(surface->pixels); - } - SDL_free(surface); -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_sysvideo.h b/3rdparty/SDL2/src/video/SDL_sysvideo.h deleted file mode 100644 index cd2ed2a7e21..00000000000 --- a/3rdparty/SDL2/src/video/SDL_sysvideo.h +++ /dev/null @@ -1,448 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -#ifndef _SDL_sysvideo_h -#define _SDL_sysvideo_h - -#include "SDL_messagebox.h" -#include "SDL_shape.h" -#include "SDL_thread.h" - -/* The SDL video driver */ - -typedef struct SDL_WindowShaper SDL_WindowShaper; -typedef struct SDL_ShapeDriver SDL_ShapeDriver; -typedef struct SDL_VideoDisplay SDL_VideoDisplay; -typedef struct SDL_VideoDevice SDL_VideoDevice; - -/* Define the SDL window-shaper structure */ -struct SDL_WindowShaper -{ - /* The window associated with the shaper */ - SDL_Window *window; - - /* The user's specified coordinates for the window, for once we give it a shape. */ - Uint32 userx,usery; - - /* The parameters for shape calculation. */ - SDL_WindowShapeMode mode; - - /* Has this window been assigned a shape? */ - SDL_bool hasshape; - - void *driverdata; -}; - -/* Define the SDL shape driver structure */ -struct SDL_ShapeDriver -{ - SDL_WindowShaper *(*CreateShaper)(SDL_Window * window); - int (*SetWindowShape)(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode); - int (*ResizeWindowShape)(SDL_Window *window); -}; - -typedef struct SDL_WindowUserData -{ - char *name; - void *data; - struct SDL_WindowUserData *next; -} SDL_WindowUserData; - -/* Define the SDL window structure, corresponding to toplevel windows */ -struct SDL_Window -{ - const void *magic; - Uint32 id; - char *title; - SDL_Surface *icon; - int x, y; - int w, h; - int min_w, min_h; - int max_w, max_h; - Uint32 flags; - Uint32 last_fullscreen_flags; - - /* Stored position and size for windowed mode */ - SDL_Rect windowed; - - SDL_DisplayMode fullscreen_mode; - - float opacity; - - float brightness; - Uint16 *gamma; - Uint16 *saved_gamma; /* (just offset into gamma) */ - - SDL_Surface *surface; - SDL_bool surface_valid; - - SDL_bool is_hiding; - SDL_bool is_destroying; - SDL_bool is_dropping; /* drag/drop in progress, expecting SDL_SendDropComplete(). */ - - SDL_WindowShaper *shaper; - - SDL_HitTest hit_test; - void *hit_test_data; - - SDL_WindowUserData *data; - - void *driverdata; - - SDL_Window *prev; - SDL_Window *next; -}; -#define FULLSCREEN_VISIBLE(W) \ - (((W)->flags & SDL_WINDOW_FULLSCREEN) && \ - ((W)->flags & SDL_WINDOW_SHOWN) && \ - !((W)->flags & SDL_WINDOW_MINIMIZED)) - -/* - * Define the SDL display structure This corresponds to physical monitors - * attached to the system. - */ -struct SDL_VideoDisplay -{ - char *name; - int max_display_modes; - int num_display_modes; - SDL_DisplayMode *display_modes; - SDL_DisplayMode desktop_mode; - SDL_DisplayMode current_mode; - - SDL_Window *fullscreen_window; - - SDL_VideoDevice *device; - - void *driverdata; -}; - -/* Forward declaration */ -struct SDL_SysWMinfo; - -/* Define the SDL video driver structure */ -#define _THIS SDL_VideoDevice *_this - -struct SDL_VideoDevice -{ - /* * * */ - /* The name of this video driver */ - const char *name; - - /* * * */ - /* Initialization/Query functions */ - - /* - * Initialize the native video subsystem, filling in the list of - * displays for this driver, returning 0 or -1 if there's an error. - */ - int (*VideoInit) (_THIS); - - /* - * Reverse the effects VideoInit() -- called if VideoInit() fails or - * if the application is shutting down the video subsystem. - */ - void (*VideoQuit) (_THIS); - - /* * * */ - /* - * Display functions - */ - - /* - * Get the bounds of a display - */ - int (*GetDisplayBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect); - - /* - * Get the dots/pixels-per-inch of a display - */ - int (*GetDisplayDPI) (_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi); - - /* - * Get the usable bounds of a display (bounds minus menubar or whatever) - */ - int (*GetDisplayUsableBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect); - - /* - * Get a list of the available display modes for a display. - */ - void (*GetDisplayModes) (_THIS, SDL_VideoDisplay * display); - - /* - * Setting the display mode is independent of creating windows, so - * when the display mode is changed, all existing windows should have - * their data updated accordingly, including the display surfaces - * associated with them. - */ - int (*SetDisplayMode) (_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); - - /* * * */ - /* - * Window functions - */ - int (*CreateWindow) (_THIS, SDL_Window * window); - int (*CreateWindowFrom) (_THIS, SDL_Window * window, const void *data); - void (*SetWindowTitle) (_THIS, SDL_Window * window); - void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon); - void (*SetWindowPosition) (_THIS, SDL_Window * window); - void (*SetWindowSize) (_THIS, SDL_Window * window); - void (*SetWindowMinimumSize) (_THIS, SDL_Window * window); - void (*SetWindowMaximumSize) (_THIS, SDL_Window * window); - int (*GetWindowBordersSize) (_THIS, SDL_Window * window, int *top, int *left, int *bottom, int *right); - int (*SetWindowOpacity) (_THIS, SDL_Window * window, float opacity); - int (*SetWindowModalFor) (_THIS, SDL_Window * modal_window, SDL_Window * parent_window); - int (*SetWindowInputFocus) (_THIS, SDL_Window * window); - void (*ShowWindow) (_THIS, SDL_Window * window); - void (*HideWindow) (_THIS, SDL_Window * window); - void (*RaiseWindow) (_THIS, SDL_Window * window); - void (*MaximizeWindow) (_THIS, SDL_Window * window); - void (*MinimizeWindow) (_THIS, SDL_Window * window); - void (*RestoreWindow) (_THIS, SDL_Window * window); - void (*SetWindowBordered) (_THIS, SDL_Window * window, SDL_bool bordered); - void (*SetWindowResizable) (_THIS, SDL_Window * window, SDL_bool resizable); - void (*SetWindowFullscreen) (_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen); - int (*SetWindowGammaRamp) (_THIS, SDL_Window * window, const Uint16 * ramp); - int (*GetWindowGammaRamp) (_THIS, SDL_Window * window, Uint16 * ramp); - void (*SetWindowGrab) (_THIS, SDL_Window * window, SDL_bool grabbed); - void (*DestroyWindow) (_THIS, SDL_Window * window); - int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch); - int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects); - void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window); - void (*OnWindowEnter) (_THIS, SDL_Window * window); - - /* * * */ - /* - * Shaped-window functions - */ - SDL_ShapeDriver shape_driver; - - /* Get some platform dependent window information */ - SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window, - struct SDL_SysWMinfo * info); - - /* * * */ - /* - * OpenGL support - */ - int (*GL_LoadLibrary) (_THIS, const char *path); - void *(*GL_GetProcAddress) (_THIS, const char *proc); - void (*GL_UnloadLibrary) (_THIS); - SDL_GLContext(*GL_CreateContext) (_THIS, SDL_Window * window); - int (*GL_MakeCurrent) (_THIS, SDL_Window * window, SDL_GLContext context); - void (*GL_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h); - int (*GL_SetSwapInterval) (_THIS, int interval); - int (*GL_GetSwapInterval) (_THIS); - void (*GL_SwapWindow) (_THIS, SDL_Window * window); - void (*GL_DeleteContext) (_THIS, SDL_GLContext context); - - /* * * */ - /* - * Event manager functions - */ - void (*PumpEvents) (_THIS); - - /* Suspend the screensaver */ - void (*SuspendScreenSaver) (_THIS); - - /* Text input */ - void (*StartTextInput) (_THIS); - void (*StopTextInput) (_THIS); - void (*SetTextInputRect) (_THIS, SDL_Rect *rect); - - /* Screen keyboard */ - SDL_bool (*HasScreenKeyboardSupport) (_THIS); - void (*ShowScreenKeyboard) (_THIS, SDL_Window *window); - void (*HideScreenKeyboard) (_THIS, SDL_Window *window); - SDL_bool (*IsScreenKeyboardShown) (_THIS, SDL_Window *window); - - /* Clipboard */ - int (*SetClipboardText) (_THIS, const char *text); - char * (*GetClipboardText) (_THIS); - SDL_bool (*HasClipboardText) (_THIS); - - /* MessageBox */ - int (*ShowMessageBox) (_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid); - - /* Hit-testing */ - int (*SetWindowHitTest)(SDL_Window * window, SDL_bool enabled); - - /* * * */ - /* Data common to all drivers */ - SDL_bool suspend_screensaver; - int num_displays; - SDL_VideoDisplay *displays; - SDL_Window *windows; - SDL_Window *grabbed_window; - Uint8 window_magic; - Uint32 next_object_id; - char * clipboard_text; - - /* * * */ - /* Data used by the GL drivers */ - struct - { - int red_size; - int green_size; - int blue_size; - int alpha_size; - int depth_size; - int buffer_size; - int stencil_size; - int double_buffer; - int accum_red_size; - int accum_green_size; - int accum_blue_size; - int accum_alpha_size; - int stereo; - int multisamplebuffers; - int multisamplesamples; - int accelerated; - int major_version; - int minor_version; - int flags; - int profile_mask; - int share_with_current_context; - int release_behavior; - int framebuffer_srgb_capable; - int retained_backing; - int driver_loaded; - char driver_path[256]; - void *dll_handle; - } gl_config; - - /* * * */ - /* Cache current GL context; don't call the OS when it hasn't changed. */ - /* We have the global pointers here so Cocoa continues to work the way - it always has, and the thread-local storage for the general case. - */ - SDL_Window *current_glwin; - SDL_GLContext current_glctx; - SDL_TLSID current_glwin_tls; - SDL_TLSID current_glctx_tls; - - /* * * */ - /* Data private to this driver */ - void *driverdata; - struct SDL_GLDriverData *gl_data; - -#if SDL_VIDEO_OPENGL_EGL - struct SDL_EGL_VideoData *egl_data; -#endif - -#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2 - struct SDL_PrivateGLESData *gles_data; -#endif - - /* * * */ - /* The function used to dispose of this structure */ - void (*free) (_THIS); -}; - -typedef struct VideoBootStrap -{ - const char *name; - const char *desc; - int (*available) (void); - SDL_VideoDevice *(*create) (int devindex); -} VideoBootStrap; - -#if SDL_VIDEO_DRIVER_COCOA -extern VideoBootStrap COCOA_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_X11 -extern VideoBootStrap X11_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_MIR -extern VideoBootStrap MIR_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_DIRECTFB -extern VideoBootStrap DirectFB_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_WINDOWS -extern VideoBootStrap WINDOWS_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_WINRT -extern VideoBootStrap WINRT_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_HAIKU -extern VideoBootStrap HAIKU_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_PANDORA -extern VideoBootStrap PND_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_UIKIT -extern VideoBootStrap UIKIT_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_ANDROID -extern VideoBootStrap Android_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_PSP -extern VideoBootStrap PSP_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_RPI -extern VideoBootStrap RPI_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_DUMMY -extern VideoBootStrap DUMMY_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_WAYLAND -extern VideoBootStrap Wayland_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_NACL -extern VideoBootStrap NACL_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_VIVANTE -extern VideoBootStrap VIVANTE_bootstrap; -#endif -#if SDL_VIDEO_DRIVER_EMSCRIPTEN -extern VideoBootStrap Emscripten_bootstrap; -#endif - -extern SDL_VideoDevice *SDL_GetVideoDevice(void); -extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode); -extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display); -extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode); -extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window); -extern void *SDL_GetDisplayDriverData( int displayIndex ); - -extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags); - -extern void SDL_OnWindowShown(SDL_Window * window); -extern void SDL_OnWindowHidden(SDL_Window * window); -extern void SDL_OnWindowResized(SDL_Window * window); -extern void SDL_OnWindowMinimized(SDL_Window * window); -extern void SDL_OnWindowRestored(SDL_Window * window); -extern void SDL_OnWindowEnter(SDL_Window * window); -extern void SDL_OnWindowLeave(SDL_Window * window); -extern void SDL_OnWindowFocusGained(SDL_Window * window); -extern void SDL_OnWindowFocusLost(SDL_Window * window); -extern void SDL_UpdateWindowGrab(SDL_Window * window); -extern SDL_Window * SDL_GetFocusWindow(void); - -extern SDL_bool SDL_ShouldAllowTopmost(void); - -extern float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches); - -#endif /* _SDL_sysvideo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/SDL_video.c b/3rdparty/SDL2/src/video/SDL_video.c deleted file mode 100644 index 0a21ef5fc7c..00000000000 --- a/3rdparty/SDL2/src/video/SDL_video.c +++ /dev/null @@ -1,3794 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* The high-level video driver subsystem */ - -#include "SDL.h" -#include "SDL_video.h" -#include "SDL_sysvideo.h" -#include "SDL_blit.h" -#include "SDL_pixels_c.h" -#include "SDL_rect_c.h" -#include "../events/SDL_events_c.h" -#include "../timer/SDL_timer_c.h" - -#include "SDL_syswm.h" - -#if SDL_VIDEO_OPENGL -#include "SDL_opengl.h" -#endif /* SDL_VIDEO_OPENGL */ - -#if SDL_VIDEO_OPENGL_ES -#include "SDL_opengles.h" -#endif /* SDL_VIDEO_OPENGL_ES */ - -/* GL and GLES2 headers conflict on Linux 32 bits */ -#if SDL_VIDEO_OPENGL_ES2 && !SDL_VIDEO_OPENGL -#include "SDL_opengles2.h" -#endif /* SDL_VIDEO_OPENGL_ES2 && !SDL_VIDEO_OPENGL */ - -#ifndef GL_CONTEXT_RELEASE_BEHAVIOR_KHR -#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB -#endif - -/* On Windows, windows.h defines CreateWindow */ -#ifdef CreateWindow -#undef CreateWindow -#endif - -#ifdef __EMSCRIPTEN__ -#include <emscripten.h> -#endif - -/* Available video drivers */ -static VideoBootStrap *bootstrap[] = { -#if SDL_VIDEO_DRIVER_COCOA - &COCOA_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_X11 - &X11_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_MIR - &MIR_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_WAYLAND - &Wayland_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_VIVANTE - &VIVANTE_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_DIRECTFB - &DirectFB_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_WINDOWS - &WINDOWS_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_WINRT - &WINRT_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_HAIKU - &HAIKU_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_PANDORA - &PND_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_UIKIT - &UIKIT_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_ANDROID - &Android_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_PSP - &PSP_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_RPI - &RPI_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_NACL - &NACL_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_EMSCRIPTEN - &Emscripten_bootstrap, -#endif -#if SDL_VIDEO_DRIVER_DUMMY - &DUMMY_bootstrap, -#endif - NULL -}; - -static SDL_VideoDevice *_this = NULL; - -#define CHECK_WINDOW_MAGIC(window, retval) \ - if (!_this) { \ - SDL_UninitializedVideo(); \ - return retval; \ - } \ - if (!window || window->magic != &_this->window_magic) { \ - SDL_SetError("Invalid window"); \ - return retval; \ - } - -#define CHECK_DISPLAY_INDEX(displayIndex, retval) \ - if (!_this) { \ - SDL_UninitializedVideo(); \ - return retval; \ - } \ - SDL_assert(_this->displays != NULL); \ - if (displayIndex < 0 || displayIndex >= _this->num_displays) { \ - SDL_SetError("displayIndex must be in the range 0 - %d", \ - _this->num_displays - 1); \ - return retval; \ - } - -#define FULLSCREEN_MASK (SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN) - -#ifdef __MACOSX__ -/* Support for Mac OS X fullscreen spaces */ -extern SDL_bool Cocoa_IsWindowInFullscreenSpace(SDL_Window * window); -extern SDL_bool Cocoa_SetWindowFullscreenSpace(SDL_Window * window, SDL_bool state); -#endif - - -/* Support for framebuffer emulation using an accelerated renderer */ - -#define SDL_WINDOWTEXTUREDATA "_SDL_WindowTextureData" - -typedef struct { - SDL_Renderer *renderer; - SDL_Texture *texture; - void *pixels; - int pitch; - int bytes_per_pixel; -} SDL_WindowTextureData; - -static SDL_bool -ShouldUseTextureFramebuffer() -{ - const char *hint; - - /* If there's no native framebuffer support then there's no option */ - if (!_this->CreateWindowFramebuffer) { - return SDL_TRUE; - } - - /* If the user has specified a software renderer we can't use a - texture framebuffer, or renderer creation will go recursive. - */ - hint = SDL_GetHint(SDL_HINT_RENDER_DRIVER); - if (hint && SDL_strcasecmp(hint, "software") == 0) { - return SDL_FALSE; - } - - /* See if the user or application wants a specific behavior */ - hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION); - if (hint) { - if (*hint == '0' || SDL_strcasecmp(hint, "false") == 0) { - return SDL_FALSE; - } else { - return SDL_TRUE; - } - } - - /* Each platform has different performance characteristics */ -#if defined(__WIN32__) - /* GDI BitBlt() is way faster than Direct3D dynamic textures right now. - */ - return SDL_FALSE; - -#elif defined(__MACOSX__) - /* Mac OS X uses OpenGL as the native fast path */ - return SDL_TRUE; - -#elif defined(__LINUX__) - /* Properly configured OpenGL drivers are faster than MIT-SHM */ -#if SDL_VIDEO_OPENGL - /* Ugh, find a way to cache this value! */ - { - SDL_Window *window; - SDL_GLContext context; - SDL_bool hasAcceleratedOpenGL = SDL_FALSE; - - window = SDL_CreateWindow("OpenGL test", -32, -32, 32, 32, SDL_WINDOW_OPENGL|SDL_WINDOW_HIDDEN); - if (window) { - context = SDL_GL_CreateContext(window); - if (context) { - const GLubyte *(APIENTRY * glGetStringFunc) (GLenum); - const char *vendor = NULL; - - glGetStringFunc = SDL_GL_GetProcAddress("glGetString"); - if (glGetStringFunc) { - vendor = (const char *) glGetStringFunc(GL_VENDOR); - } - /* Add more vendors here at will... */ - if (vendor && - (SDL_strstr(vendor, "ATI Technologies") || - SDL_strstr(vendor, "NVIDIA"))) { - hasAcceleratedOpenGL = SDL_TRUE; - } - SDL_GL_DeleteContext(context); - } - SDL_DestroyWindow(window); - } - return hasAcceleratedOpenGL; - } -#elif SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2 - /* Let's be optimistic about this! */ - return SDL_TRUE; -#else - return SDL_FALSE; -#endif - -#else - /* Play it safe, assume that if there is a framebuffer driver that it's - optimized for the current platform. - */ - return SDL_FALSE; -#endif -} - -static int -SDL_CreateWindowTexture(SDL_VideoDevice *unused, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch) -{ - SDL_WindowTextureData *data; - - data = SDL_GetWindowData(window, SDL_WINDOWTEXTUREDATA); - if (!data) { - SDL_Renderer *renderer = NULL; - int i; - const char *hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION); - - /* Check to see if there's a specific driver requested */ - if (hint && *hint != '0' && *hint != '1' && - SDL_strcasecmp(hint, "true") != 0 && - SDL_strcasecmp(hint, "false") != 0 && - SDL_strcasecmp(hint, "software") != 0) { - for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) { - SDL_RendererInfo info; - SDL_GetRenderDriverInfo(i, &info); - if (SDL_strcasecmp(info.name, hint) == 0) { - renderer = SDL_CreateRenderer(window, i, 0); - break; - } - } - } - - if (!renderer) { - for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) { - SDL_RendererInfo info; - SDL_GetRenderDriverInfo(i, &info); - if (SDL_strcmp(info.name, "software") != 0) { - renderer = SDL_CreateRenderer(window, i, 0); - if (renderer) { - break; - } - } - } - } - if (!renderer) { - return SDL_SetError("No hardware accelerated renderers available"); - } - - /* Create the data after we successfully create the renderer (bug #1116) */ - data = (SDL_WindowTextureData *)SDL_calloc(1, sizeof(*data)); - if (!data) { - SDL_DestroyRenderer(renderer); - return SDL_OutOfMemory(); - } - SDL_SetWindowData(window, SDL_WINDOWTEXTUREDATA, data); - - data->renderer = renderer; - } - - /* Free any old texture and pixel data */ - if (data->texture) { - SDL_DestroyTexture(data->texture); - data->texture = NULL; - } - SDL_free(data->pixels); - data->pixels = NULL; - - { - SDL_RendererInfo info; - Uint32 i; - - if (SDL_GetRendererInfo(data->renderer, &info) < 0) { - return -1; - } - - /* Find the first format without an alpha channel */ - *format = info.texture_formats[0]; - - for (i = 0; i < info.num_texture_formats; ++i) { - if (!SDL_ISPIXELFORMAT_FOURCC(info.texture_formats[i]) && - !SDL_ISPIXELFORMAT_ALPHA(info.texture_formats[i])) { - *format = info.texture_formats[i]; - break; - } - } - } - - data->texture = SDL_CreateTexture(data->renderer, *format, - SDL_TEXTUREACCESS_STREAMING, - window->w, window->h); - if (!data->texture) { - return -1; - } - - /* Create framebuffer data */ - data->bytes_per_pixel = SDL_BYTESPERPIXEL(*format); - data->pitch = (((window->w * data->bytes_per_pixel) + 3) & ~3); - data->pixels = SDL_malloc(window->h * data->pitch); - if (!data->pixels) { - return SDL_OutOfMemory(); - } - - *pixels = data->pixels; - *pitch = data->pitch; - - /* Make sure we're not double-scaling the viewport */ - SDL_RenderSetViewport(data->renderer, NULL); - - return 0; -} - -static int -SDL_UpdateWindowTexture(SDL_VideoDevice *unused, SDL_Window * window, const SDL_Rect * rects, int numrects) -{ - SDL_WindowTextureData *data; - SDL_Rect rect; - void *src; - - data = SDL_GetWindowData(window, SDL_WINDOWTEXTUREDATA); - if (!data || !data->texture) { - return SDL_SetError("No window texture data"); - } - - /* Update a single rect that contains subrects for best DMA performance */ - if (SDL_GetSpanEnclosingRect(window->w, window->h, numrects, rects, &rect)) { - src = (void *)((Uint8 *)data->pixels + - rect.y * data->pitch + - rect.x * data->bytes_per_pixel); - if (SDL_UpdateTexture(data->texture, &rect, src, data->pitch) < 0) { - return -1; - } - - if (SDL_RenderCopy(data->renderer, data->texture, NULL, NULL) < 0) { - return -1; - } - - SDL_RenderPresent(data->renderer); - } - return 0; -} - -static void -SDL_DestroyWindowTexture(SDL_VideoDevice *unused, SDL_Window * window) -{ - SDL_WindowTextureData *data; - - data = SDL_SetWindowData(window, SDL_WINDOWTEXTUREDATA, NULL); - if (!data) { - return; - } - if (data->texture) { - SDL_DestroyTexture(data->texture); - } - if (data->renderer) { - SDL_DestroyRenderer(data->renderer); - } - SDL_free(data->pixels); - SDL_free(data); -} - - -static int -cmpmodes(const void *A, const void *B) -{ - const SDL_DisplayMode *a = (const SDL_DisplayMode *) A; - const SDL_DisplayMode *b = (const SDL_DisplayMode *) B; - if (a == b) { - return 0; - } else if (a->w != b->w) { - return b->w - a->w; - } else if (a->h != b->h) { - return b->h - a->h; - } else if (SDL_BITSPERPIXEL(a->format) != SDL_BITSPERPIXEL(b->format)) { - return SDL_BITSPERPIXEL(b->format) - SDL_BITSPERPIXEL(a->format); - } else if (SDL_PIXELLAYOUT(a->format) != SDL_PIXELLAYOUT(b->format)) { - return SDL_PIXELLAYOUT(b->format) - SDL_PIXELLAYOUT(a->format); - } else if (a->refresh_rate != b->refresh_rate) { - return b->refresh_rate - a->refresh_rate; - } - return 0; -} - -static int -SDL_UninitializedVideo() -{ - return SDL_SetError("Video subsystem has not been initialized"); -} - -int -SDL_GetNumVideoDrivers(void) -{ - return SDL_arraysize(bootstrap) - 1; -} - -const char * -SDL_GetVideoDriver(int index) -{ - if (index >= 0 && index < SDL_GetNumVideoDrivers()) { - return bootstrap[index]->name; - } - return NULL; -} - -/* - * Initialize the video and event subsystems -- determine native pixel format - */ -int -SDL_VideoInit(const char *driver_name) -{ - SDL_VideoDevice *video; - int index; - int i; - - /* Check to make sure we don't overwrite '_this' */ - if (_this != NULL) { - SDL_VideoQuit(); - } - -#if !SDL_TIMERS_DISABLED - SDL_TicksInit(); -#endif - - /* Start the event loop */ - if (SDL_InitSubSystem(SDL_INIT_EVENTS) < 0 || - SDL_KeyboardInit() < 0 || - SDL_MouseInit() < 0 || - SDL_TouchInit() < 0) { - return -1; - } - - /* Select the proper video driver */ - index = 0; - video = NULL; - if (driver_name == NULL) { - driver_name = SDL_getenv("SDL_VIDEODRIVER"); - } - if (driver_name != NULL) { - for (i = 0; bootstrap[i]; ++i) { - if (SDL_strncasecmp(bootstrap[i]->name, driver_name, SDL_strlen(driver_name)) == 0) { - if (bootstrap[i]->available()) { - video = bootstrap[i]->create(index); - break; - } - } - } - } else { - for (i = 0; bootstrap[i]; ++i) { - if (bootstrap[i]->available()) { - video = bootstrap[i]->create(index); - if (video != NULL) { - break; - } - } - } - } - if (video == NULL) { - if (driver_name) { - return SDL_SetError("%s not available", driver_name); - } - return SDL_SetError("No available video device"); - } - _this = video; - _this->name = bootstrap[i]->name; - _this->next_object_id = 1; - - - /* Set some very sane GL defaults */ - _this->gl_config.driver_loaded = 0; - _this->gl_config.dll_handle = NULL; - SDL_GL_ResetAttributes(); - - _this->current_glwin_tls = SDL_TLSCreate(); - _this->current_glctx_tls = SDL_TLSCreate(); - - /* Initialize the video subsystem */ - if (_this->VideoInit(_this) < 0) { - SDL_VideoQuit(); - return -1; - } - - /* Make sure some displays were added */ - if (_this->num_displays == 0) { - SDL_VideoQuit(); - return SDL_SetError("The video driver did not add any displays"); - } - - /* Add the renderer framebuffer emulation if desired */ - if (ShouldUseTextureFramebuffer()) { - _this->CreateWindowFramebuffer = SDL_CreateWindowTexture; - _this->UpdateWindowFramebuffer = SDL_UpdateWindowTexture; - _this->DestroyWindowFramebuffer = SDL_DestroyWindowTexture; - } - - /* Disable the screen saver by default. This is a change from <= 2.0.1, - but most things using SDL are games or media players; you wouldn't - want a screensaver to trigger if you're playing exclusively with a - joystick, or passively watching a movie. Things that use SDL but - function more like a normal desktop app should explicitly reenable the - screensaver. */ - if (!SDL_GetHintBoolean(SDL_HINT_VIDEO_ALLOW_SCREENSAVER, SDL_FALSE)) { - SDL_DisableScreenSaver(); - } - - /* If we don't use a screen keyboard, turn on text input by default, - otherwise programs that expect to get text events without enabling - UNICODE input won't get any events. - - Actually, come to think of it, you needed to call SDL_EnableUNICODE(1) - in SDL 1.2 before you got text input events. Hmm... - */ - if (!SDL_HasScreenKeyboardSupport()) { - SDL_StartTextInput(); - } - - /* We're ready to go! */ - return 0; -} - -const char * -SDL_GetCurrentVideoDriver() -{ - if (!_this) { - SDL_UninitializedVideo(); - return NULL; - } - return _this->name; -} - -SDL_VideoDevice * -SDL_GetVideoDevice(void) -{ - return _this; -} - -int -SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode) -{ - SDL_VideoDisplay display; - - SDL_zero(display); - if (desktop_mode) { - display.desktop_mode = *desktop_mode; - } - display.current_mode = display.desktop_mode; - - return SDL_AddVideoDisplay(&display); -} - -int -SDL_AddVideoDisplay(const SDL_VideoDisplay * display) -{ - SDL_VideoDisplay *displays; - int index = -1; - - displays = - SDL_realloc(_this->displays, - (_this->num_displays + 1) * sizeof(*displays)); - if (displays) { - index = _this->num_displays++; - displays[index] = *display; - displays[index].device = _this; - _this->displays = displays; - - if (display->name) { - displays[index].name = SDL_strdup(display->name); - } else { - char name[32]; - - SDL_itoa(index, name, 10); - displays[index].name = SDL_strdup(name); - } - } else { - SDL_OutOfMemory(); - } - return index; -} - -int -SDL_GetNumVideoDisplays(void) -{ - if (!_this) { - SDL_UninitializedVideo(); - return 0; - } - return _this->num_displays; -} - -static int -SDL_GetIndexOfDisplay(SDL_VideoDisplay *display) -{ - int displayIndex; - - for (displayIndex = 0; displayIndex < _this->num_displays; ++displayIndex) { - if (display == &_this->displays[displayIndex]) { - return displayIndex; - } - } - - /* Couldn't find the display, just use index 0 */ - return 0; -} - -void * -SDL_GetDisplayDriverData(int displayIndex) -{ - CHECK_DISPLAY_INDEX(displayIndex, NULL); - - return _this->displays[displayIndex].driverdata; -} - -const char * -SDL_GetDisplayName(int displayIndex) -{ - CHECK_DISPLAY_INDEX(displayIndex, NULL); - - return _this->displays[displayIndex].name; -} - -int -SDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect) -{ - CHECK_DISPLAY_INDEX(displayIndex, -1); - - if (rect) { - SDL_VideoDisplay *display = &_this->displays[displayIndex]; - - if (_this->GetDisplayBounds) { - if (_this->GetDisplayBounds(_this, display, rect) == 0) { - return 0; - } - } - - /* Assume that the displays are left to right */ - if (displayIndex == 0) { - rect->x = 0; - rect->y = 0; - } else { - SDL_GetDisplayBounds(displayIndex-1, rect); - rect->x += rect->w; - } - rect->w = display->current_mode.w; - rect->h = display->current_mode.h; - } - return 0; /* !!! FIXME: should this be an error if (rect==NULL) ? */ -} - -int SDL_GetDisplayUsableBounds(int displayIndex, SDL_Rect * rect) -{ - CHECK_DISPLAY_INDEX(displayIndex, -1); - - if (rect) { - SDL_VideoDisplay *display = &_this->displays[displayIndex]; - - if (_this->GetDisplayUsableBounds) { - if (_this->GetDisplayUsableBounds(_this, display, rect) == 0) { - return 0; - } - } - - /* Oh well, just give the entire display bounds. */ - return SDL_GetDisplayBounds(displayIndex, rect); - } - return 0; /* !!! FIXME: should this be an error if (rect==NULL) ? */ -} - -int -SDL_GetDisplayDPI(int displayIndex, float * ddpi, float * hdpi, float * vdpi) -{ - SDL_VideoDisplay *display; - - CHECK_DISPLAY_INDEX(displayIndex, -1); - - display = &_this->displays[displayIndex]; - - if (_this->GetDisplayDPI) { - if (_this->GetDisplayDPI(_this, display, ddpi, hdpi, vdpi) == 0) { - return 0; - } - } else { - return SDL_Unsupported(); - } - - return -1; -} - -SDL_bool -SDL_AddDisplayMode(SDL_VideoDisplay * display, const SDL_DisplayMode * mode) -{ - SDL_DisplayMode *modes; - int i, nmodes; - - /* Make sure we don't already have the mode in the list */ - modes = display->display_modes; - nmodes = display->num_display_modes; - for (i = 0; i < nmodes; ++i) { - if (cmpmodes(mode, &modes[i]) == 0) { - return SDL_FALSE; - } - } - - /* Go ahead and add the new mode */ - if (nmodes == display->max_display_modes) { - modes = - SDL_realloc(modes, - (display->max_display_modes + 32) * sizeof(*modes)); - if (!modes) { - return SDL_FALSE; - } - display->display_modes = modes; - display->max_display_modes += 32; - } - modes[nmodes] = *mode; - display->num_display_modes++; - - /* Re-sort video modes */ - SDL_qsort(display->display_modes, display->num_display_modes, - sizeof(SDL_DisplayMode), cmpmodes); - - return SDL_TRUE; -} - -static int -SDL_GetNumDisplayModesForDisplay(SDL_VideoDisplay * display) -{ - if (!display->num_display_modes && _this->GetDisplayModes) { - _this->GetDisplayModes(_this, display); - SDL_qsort(display->display_modes, display->num_display_modes, - sizeof(SDL_DisplayMode), cmpmodes); - } - return display->num_display_modes; -} - -int -SDL_GetNumDisplayModes(int displayIndex) -{ - CHECK_DISPLAY_INDEX(displayIndex, -1); - - return SDL_GetNumDisplayModesForDisplay(&_this->displays[displayIndex]); -} - -int -SDL_GetDisplayMode(int displayIndex, int index, SDL_DisplayMode * mode) -{ - SDL_VideoDisplay *display; - - CHECK_DISPLAY_INDEX(displayIndex, -1); - - display = &_this->displays[displayIndex]; - if (index < 0 || index >= SDL_GetNumDisplayModesForDisplay(display)) { - return SDL_SetError("index must be in the range of 0 - %d", - SDL_GetNumDisplayModesForDisplay(display) - 1); - } - if (mode) { - *mode = display->display_modes[index]; - } - return 0; -} - -int -SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode * mode) -{ - SDL_VideoDisplay *display; - - CHECK_DISPLAY_INDEX(displayIndex, -1); - - display = &_this->displays[displayIndex]; - if (mode) { - *mode = display->desktop_mode; - } - return 0; -} - -int -SDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode * mode) -{ - SDL_VideoDisplay *display; - - CHECK_DISPLAY_INDEX(displayIndex, -1); - - display = &_this->displays[displayIndex]; - if (mode) { - *mode = display->current_mode; - } - return 0; -} - -static SDL_DisplayMode * -SDL_GetClosestDisplayModeForDisplay(SDL_VideoDisplay * display, - const SDL_DisplayMode * mode, - SDL_DisplayMode * closest) -{ - Uint32 target_format; - int target_refresh_rate; - int i; - SDL_DisplayMode *current, *match; - - if (!mode || !closest) { - SDL_SetError("Missing desired mode or closest mode parameter"); - return NULL; - } - - /* Default to the desktop format */ - if (mode->format) { - target_format = mode->format; - } else { - target_format = display->desktop_mode.format; - } - - /* Default to the desktop refresh rate */ - if (mode->refresh_rate) { - target_refresh_rate = mode->refresh_rate; - } else { - target_refresh_rate = display->desktop_mode.refresh_rate; - } - - match = NULL; - for (i = 0; i < SDL_GetNumDisplayModesForDisplay(display); ++i) { - current = &display->display_modes[i]; - - if (current->w && (current->w < mode->w)) { - /* Out of sorted modes large enough here */ - break; - } - if (current->h && (current->h < mode->h)) { - if (current->w && (current->w == mode->w)) { - /* Out of sorted modes large enough here */ - break; - } - /* Wider, but not tall enough, due to a different - aspect ratio. This mode must be skipped, but closer - modes may still follow. */ - continue; - } - if (!match || current->w < match->w || current->h < match->h) { - match = current; - continue; - } - if (current->format != match->format) { - /* Sorted highest depth to lowest */ - if (current->format == target_format || - (SDL_BITSPERPIXEL(current->format) >= - SDL_BITSPERPIXEL(target_format) - && SDL_PIXELTYPE(current->format) == - SDL_PIXELTYPE(target_format))) { - match = current; - } - continue; - } - if (current->refresh_rate != match->refresh_rate) { - /* Sorted highest refresh to lowest */ - if (current->refresh_rate >= target_refresh_rate) { - match = current; - } - } - } - if (match) { - if (match->format) { - closest->format = match->format; - } else { - closest->format = mode->format; - } - if (match->w && match->h) { - closest->w = match->w; - closest->h = match->h; - } else { - closest->w = mode->w; - closest->h = mode->h; - } - if (match->refresh_rate) { - closest->refresh_rate = match->refresh_rate; - } else { - closest->refresh_rate = mode->refresh_rate; - } - closest->driverdata = match->driverdata; - - /* - * Pick some reasonable defaults if the app and driver don't - * care - */ - if (!closest->format) { - closest->format = SDL_PIXELFORMAT_RGB888; - } - if (!closest->w) { - closest->w = 640; - } - if (!closest->h) { - closest->h = 480; - } - return closest; - } - return NULL; -} - -SDL_DisplayMode * -SDL_GetClosestDisplayMode(int displayIndex, - const SDL_DisplayMode * mode, - SDL_DisplayMode * closest) -{ - SDL_VideoDisplay *display; - - CHECK_DISPLAY_INDEX(displayIndex, NULL); - - display = &_this->displays[displayIndex]; - return SDL_GetClosestDisplayModeForDisplay(display, mode, closest); -} - -static int -SDL_SetDisplayModeForDisplay(SDL_VideoDisplay * display, const SDL_DisplayMode * mode) -{ - SDL_DisplayMode display_mode; - SDL_DisplayMode current_mode; - - if (mode) { - display_mode = *mode; - - /* Default to the current mode */ - if (!display_mode.format) { - display_mode.format = display->current_mode.format; - } - if (!display_mode.w) { - display_mode.w = display->current_mode.w; - } - if (!display_mode.h) { - display_mode.h = display->current_mode.h; - } - if (!display_mode.refresh_rate) { - display_mode.refresh_rate = display->current_mode.refresh_rate; - } - - /* Get a good video mode, the closest one possible */ - if (!SDL_GetClosestDisplayModeForDisplay(display, &display_mode, &display_mode)) { - return SDL_SetError("No video mode large enough for %dx%d", - display_mode.w, display_mode.h); - } - } else { - display_mode = display->desktop_mode; - } - - /* See if there's anything left to do */ - current_mode = display->current_mode; - if (SDL_memcmp(&display_mode, ¤t_mode, sizeof(display_mode)) == 0) { - return 0; - } - - /* Actually change the display mode */ - if (!_this->SetDisplayMode) { - return SDL_SetError("Video driver doesn't support changing display mode"); - } - if (_this->SetDisplayMode(_this, display, &display_mode) < 0) { - return -1; - } - display->current_mode = display_mode; - return 0; -} - -int -SDL_GetWindowDisplayIndex(SDL_Window * window) -{ - int displayIndex; - int i, dist; - int closest = -1; - int closest_dist = 0x7FFFFFFF; - SDL_Point center; - SDL_Point delta; - SDL_Rect rect; - - CHECK_WINDOW_MAGIC(window, -1); - - if (SDL_WINDOWPOS_ISUNDEFINED(window->x) || - SDL_WINDOWPOS_ISCENTERED(window->x)) { - displayIndex = (window->x & 0xFFFF); - if (displayIndex >= _this->num_displays) { - displayIndex = 0; - } - return displayIndex; - } - if (SDL_WINDOWPOS_ISUNDEFINED(window->y) || - SDL_WINDOWPOS_ISCENTERED(window->y)) { - displayIndex = (window->y & 0xFFFF); - if (displayIndex >= _this->num_displays) { - displayIndex = 0; - } - return displayIndex; - } - - /* Find the display containing the window */ - for (i = 0; i < _this->num_displays; ++i) { - SDL_VideoDisplay *display = &_this->displays[i]; - - if (display->fullscreen_window == window) { - return i; - } - } - center.x = window->x + window->w / 2; - center.y = window->y + window->h / 2; - for (i = 0; i < _this->num_displays; ++i) { - SDL_GetDisplayBounds(i, &rect); - if (SDL_EnclosePoints(¢er, 1, &rect, NULL)) { - return i; - } - - delta.x = center.x - (rect.x + rect.w / 2); - delta.y = center.y - (rect.y + rect.h / 2); - dist = (delta.x*delta.x + delta.y*delta.y); - if (dist < closest_dist) { - closest = i; - closest_dist = dist; - } - } - if (closest < 0) { - SDL_SetError("Couldn't find any displays"); - } - return closest; -} - -SDL_VideoDisplay * -SDL_GetDisplayForWindow(SDL_Window *window) -{ - int displayIndex = SDL_GetWindowDisplayIndex(window); - if (displayIndex >= 0) { - return &_this->displays[displayIndex]; - } else { - return NULL; - } -} - -int -SDL_SetWindowDisplayMode(SDL_Window * window, const SDL_DisplayMode * mode) -{ - CHECK_WINDOW_MAGIC(window, -1); - - if (mode) { - window->fullscreen_mode = *mode; - } else { - SDL_zero(window->fullscreen_mode); - } - - if (FULLSCREEN_VISIBLE(window) && (window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP) { - SDL_DisplayMode fullscreen_mode; - if (SDL_GetWindowDisplayMode(window, &fullscreen_mode) == 0) { - SDL_SetDisplayModeForDisplay(SDL_GetDisplayForWindow(window), &fullscreen_mode); - } - } - return 0; -} - -int -SDL_GetWindowDisplayMode(SDL_Window * window, SDL_DisplayMode * mode) -{ - SDL_DisplayMode fullscreen_mode; - SDL_VideoDisplay *display; - - CHECK_WINDOW_MAGIC(window, -1); - - if (!mode) { - return SDL_InvalidParamError("mode"); - } - - fullscreen_mode = window->fullscreen_mode; - if (!fullscreen_mode.w) { - fullscreen_mode.w = window->windowed.w; - } - if (!fullscreen_mode.h) { - fullscreen_mode.h = window->windowed.h; - } - - display = SDL_GetDisplayForWindow(window); - - /* if in desktop size mode, just return the size of the desktop */ - if ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) { - fullscreen_mode = display->desktop_mode; - } else if (!SDL_GetClosestDisplayModeForDisplay(SDL_GetDisplayForWindow(window), - &fullscreen_mode, - &fullscreen_mode)) { - return SDL_SetError("Couldn't find display mode match"); - } - - if (mode) { - *mode = fullscreen_mode; - } - return 0; -} - -Uint32 -SDL_GetWindowPixelFormat(SDL_Window * window) -{ - SDL_VideoDisplay *display; - - CHECK_WINDOW_MAGIC(window, SDL_PIXELFORMAT_UNKNOWN); - - display = SDL_GetDisplayForWindow(window); - return display->current_mode.format; -} - -static void -SDL_RestoreMousePosition(SDL_Window *window) -{ - int x, y; - - if (window == SDL_GetMouseFocus()) { - SDL_GetMouseState(&x, &y); - SDL_WarpMouseInWindow(window, x, y); - } -} - -#if __WINRT__ -extern Uint32 WINRT_DetectWindowFlags(SDL_Window * window); -#endif - -static int -SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool fullscreen) -{ - SDL_VideoDisplay *display; - SDL_Window *other; - - CHECK_WINDOW_MAGIC(window,-1); - - /* if we are in the process of hiding don't go back to fullscreen */ - if ( window->is_hiding && fullscreen ) - return 0; - -#ifdef __MACOSX__ - /* if the window is going away and no resolution change is necessary, - do nothing, or else we may trigger an ugly double-transition - */ - if (window->is_destroying && (window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP) - return 0; - - /* If we're switching between a fullscreen Space and "normal" fullscreen, we need to get back to normal first. */ - if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN)) { - if (!Cocoa_SetWindowFullscreenSpace(window, SDL_FALSE)) { - return -1; - } - } else if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)) { - display = SDL_GetDisplayForWindow(window); - SDL_SetDisplayModeForDisplay(display, NULL); - if (_this->SetWindowFullscreen) { - _this->SetWindowFullscreen(_this, window, display, SDL_FALSE); - } - } - - if (Cocoa_SetWindowFullscreenSpace(window, fullscreen)) { - if (Cocoa_IsWindowInFullscreenSpace(window) != fullscreen) { - return -1; - } - window->last_fullscreen_flags = window->flags; - return 0; - } -#elif __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10) - /* HACK: WinRT 8.x apps can't choose whether or not they are fullscreen - or not. The user can choose this, via OS-provided UI, but this can't - be set programmatically. - - Just look at what SDL's WinRT video backend code detected with regards - to fullscreen (being active, or not), and figure out a return/error code - from that. - */ - if (fullscreen == !(WINRT_DetectWindowFlags(window) & FULLSCREEN_MASK)) { - /* Uh oh, either: - 1. fullscreen was requested, and we're already windowed - 2. windowed-mode was requested, and we're already fullscreen - - WinRT 8.x can't resolve either programmatically, so we're - giving up. - */ - return -1; - } else { - /* Whatever was requested, fullscreen or windowed mode, is already - in-place. - */ - return 0; - } -#endif - - display = SDL_GetDisplayForWindow(window); - - if (fullscreen) { - /* Hide any other fullscreen windows */ - if (display->fullscreen_window && - display->fullscreen_window != window) { - SDL_MinimizeWindow(display->fullscreen_window); - } - } - - /* See if anything needs to be done now */ - if ((display->fullscreen_window == window) == fullscreen) { - if ((window->last_fullscreen_flags & FULLSCREEN_MASK) == (window->flags & FULLSCREEN_MASK)) { - return 0; - } - } - - /* See if there are any fullscreen windows */ - for (other = _this->windows; other; other = other->next) { - SDL_bool setDisplayMode = SDL_FALSE; - - if (other == window) { - setDisplayMode = fullscreen; - } else if (FULLSCREEN_VISIBLE(other) && - SDL_GetDisplayForWindow(other) == display) { - setDisplayMode = SDL_TRUE; - } - - if (setDisplayMode) { - SDL_DisplayMode fullscreen_mode; - - SDL_zero(fullscreen_mode); - - if (SDL_GetWindowDisplayMode(other, &fullscreen_mode) == 0) { - SDL_bool resized = SDL_TRUE; - - if (other->w == fullscreen_mode.w && other->h == fullscreen_mode.h) { - resized = SDL_FALSE; - } - - /* only do the mode change if we want exclusive fullscreen */ - if ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP) { - if (SDL_SetDisplayModeForDisplay(display, &fullscreen_mode) < 0) { - return -1; - } - } else { - if (SDL_SetDisplayModeForDisplay(display, NULL) < 0) { - return -1; - } - } - - if (_this->SetWindowFullscreen) { - _this->SetWindowFullscreen(_this, other, display, SDL_TRUE); - } - display->fullscreen_window = other; - - /* Generate a mode change event here */ - if (resized) { - SDL_SendWindowEvent(other, SDL_WINDOWEVENT_RESIZED, - fullscreen_mode.w, fullscreen_mode.h); - } else { - SDL_OnWindowResized(other); - } - - SDL_RestoreMousePosition(other); - - window->last_fullscreen_flags = window->flags; - return 0; - } - } - } - - /* Nope, restore the desktop mode */ - SDL_SetDisplayModeForDisplay(display, NULL); - - if (_this->SetWindowFullscreen) { - _this->SetWindowFullscreen(_this, window, display, SDL_FALSE); - } - display->fullscreen_window = NULL; - - /* Generate a mode change event here */ - SDL_OnWindowResized(window); - - /* Restore the cursor position */ - SDL_RestoreMousePosition(window); - - window->last_fullscreen_flags = window->flags; - return 0; -} - -#define CREATE_FLAGS \ - (SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_ALWAYS_ON_TOP | SDL_WINDOW_SKIP_TASKBAR | SDL_WINDOW_POPUP_MENU | SDL_WINDOW_UTILITY | SDL_WINDOW_TOOLTIP) - -static void -SDL_FinishWindowCreation(SDL_Window *window, Uint32 flags) -{ - if (flags & SDL_WINDOW_MAXIMIZED) { - SDL_MaximizeWindow(window); - } - if (flags & SDL_WINDOW_MINIMIZED) { - SDL_MinimizeWindow(window); - } - if (flags & SDL_WINDOW_FULLSCREEN) { - SDL_SetWindowFullscreen(window, flags); - } - if (flags & SDL_WINDOW_INPUT_GRABBED) { - SDL_SetWindowGrab(window, SDL_TRUE); - } - if (!(flags & SDL_WINDOW_HIDDEN)) { - SDL_ShowWindow(window); - } -} - -SDL_Window * -SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags) -{ - SDL_Window *window; - - if (!_this) { - /* Initialize the video system if needed */ - if (SDL_VideoInit(NULL) < 0) { - return NULL; - } - } - - if ( (((flags & SDL_WINDOW_UTILITY) != 0) + ((flags & SDL_WINDOW_TOOLTIP) != 0) + ((flags & SDL_WINDOW_POPUP_MENU) != 0)) > 1 ) { - SDL_SetError("Conflicting window flags specified"); - return NULL; - } - - /* Some platforms can't create zero-sized windows */ - if (w < 1) { - w = 1; - } - if (h < 1) { - h = 1; - } - - /* Some platforms blow up if the windows are too large. Raise it later? */ - if ((w > 16384) || (h > 16384)) { - SDL_SetError("Window is too large."); - return NULL; - } - - /* Some platforms have OpenGL enabled by default */ -#if (SDL_VIDEO_OPENGL && __MACOSX__) || __IPHONEOS__ || __ANDROID__ || __NACL__ - if (SDL_strcmp(_this->name, "dummy") != 0) { - flags |= SDL_WINDOW_OPENGL; - } -#endif - if (flags & SDL_WINDOW_OPENGL) { - if (!_this->GL_CreateContext) { - SDL_SetError("No OpenGL support in video driver"); - return NULL; - } - if (SDL_GL_LoadLibrary(NULL) < 0) { - return NULL; - } - } - - /* Unless the user has specified the high-DPI disabling hint, respect the - * SDL_WINDOW_ALLOW_HIGHDPI flag. - */ - if (flags & SDL_WINDOW_ALLOW_HIGHDPI) { - if (SDL_GetHintBoolean(SDL_HINT_VIDEO_HIGHDPI_DISABLED, SDL_FALSE)) { - flags &= ~SDL_WINDOW_ALLOW_HIGHDPI; - } - } - - window = (SDL_Window *)SDL_calloc(1, sizeof(*window)); - if (!window) { - SDL_OutOfMemory(); - return NULL; - } - window->magic = &_this->window_magic; - window->id = _this->next_object_id++; - window->x = x; - window->y = y; - window->w = w; - window->h = h; - if (SDL_WINDOWPOS_ISUNDEFINED(x) || SDL_WINDOWPOS_ISUNDEFINED(y) || - SDL_WINDOWPOS_ISCENTERED(x) || SDL_WINDOWPOS_ISCENTERED(y)) { - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - int displayIndex; - SDL_Rect bounds; - - displayIndex = SDL_GetIndexOfDisplay(display); - SDL_GetDisplayBounds(displayIndex, &bounds); - if (SDL_WINDOWPOS_ISUNDEFINED(x) || SDL_WINDOWPOS_ISCENTERED(x)) { - window->x = bounds.x + (bounds.w - w) / 2; - } - if (SDL_WINDOWPOS_ISUNDEFINED(y) || SDL_WINDOWPOS_ISCENTERED(y)) { - window->y = bounds.y + (bounds.h - h) / 2; - } - } - window->windowed.x = window->x; - window->windowed.y = window->y; - window->windowed.w = window->w; - window->windowed.h = window->h; - - if (flags & SDL_WINDOW_FULLSCREEN) { - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - int displayIndex; - SDL_Rect bounds; - - displayIndex = SDL_GetIndexOfDisplay(display); - SDL_GetDisplayBounds(displayIndex, &bounds); - - window->x = bounds.x; - window->y = bounds.y; - window->w = bounds.w; - window->h = bounds.h; - } - - window->flags = ((flags & CREATE_FLAGS) | SDL_WINDOW_HIDDEN); - window->last_fullscreen_flags = window->flags; - window->opacity = 1.0f; - window->brightness = 1.0f; - window->next = _this->windows; - window->is_destroying = SDL_FALSE; - - if (_this->windows) { - _this->windows->prev = window; - } - _this->windows = window; - - if (_this->CreateWindow && _this->CreateWindow(_this, window) < 0) { - SDL_DestroyWindow(window); - return NULL; - } - -#if __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10) - /* HACK: WinRT 8.x apps can't choose whether or not they are fullscreen - or not. The user can choose this, via OS-provided UI, but this can't - be set programmatically. - - Just look at what SDL's WinRT video backend code detected with regards - to fullscreen (being active, or not), and figure out a return/error code - from that. - */ - flags = window->flags; -#endif - - if (title) { - SDL_SetWindowTitle(window, title); - } - SDL_FinishWindowCreation(window, flags); - - /* If the window was created fullscreen, make sure the mode code matches */ - SDL_UpdateFullscreenMode(window, FULLSCREEN_VISIBLE(window)); - - return window; -} - -SDL_Window * -SDL_CreateWindowFrom(const void *data) -{ - SDL_Window *window; - - if (!_this) { - SDL_UninitializedVideo(); - return NULL; - } - if (!_this->CreateWindowFrom) { - SDL_Unsupported(); - return NULL; - } - window = (SDL_Window *)SDL_calloc(1, sizeof(*window)); - if (!window) { - SDL_OutOfMemory(); - return NULL; - } - window->magic = &_this->window_magic; - window->id = _this->next_object_id++; - window->flags = SDL_WINDOW_FOREIGN; - window->last_fullscreen_flags = window->flags; - window->is_destroying = SDL_FALSE; - window->opacity = 1.0f; - window->brightness = 1.0f; - window->next = _this->windows; - if (_this->windows) { - _this->windows->prev = window; - } - _this->windows = window; - - if (_this->CreateWindowFrom(_this, window, data) < 0) { - SDL_DestroyWindow(window); - return NULL; - } - return window; -} - -int -SDL_RecreateWindow(SDL_Window * window, Uint32 flags) -{ - SDL_bool loaded_opengl = SDL_FALSE; - - if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) { - return SDL_SetError("No OpenGL support in video driver"); - } - - if (window->flags & SDL_WINDOW_FOREIGN) { - /* Can't destroy and re-create foreign windows, hrm */ - flags |= SDL_WINDOW_FOREIGN; - } else { - flags &= ~SDL_WINDOW_FOREIGN; - } - - /* Restore video mode, etc. */ - SDL_HideWindow(window); - - /* Tear down the old native window */ - if (window->surface) { - window->surface->flags &= ~SDL_DONTFREE; - SDL_FreeSurface(window->surface); - window->surface = NULL; - } - if (_this->DestroyWindowFramebuffer) { - _this->DestroyWindowFramebuffer(_this, window); - } - if (_this->DestroyWindow && !(flags & SDL_WINDOW_FOREIGN)) { - _this->DestroyWindow(_this, window); - } - - if ((window->flags & SDL_WINDOW_OPENGL) != (flags & SDL_WINDOW_OPENGL)) { - if (flags & SDL_WINDOW_OPENGL) { - if (SDL_GL_LoadLibrary(NULL) < 0) { - return -1; - } - loaded_opengl = SDL_TRUE; - } else { - SDL_GL_UnloadLibrary(); - } - } - - window->flags = ((flags & CREATE_FLAGS) | SDL_WINDOW_HIDDEN); - window->last_fullscreen_flags = window->flags; - window->is_destroying = SDL_FALSE; - - if (_this->CreateWindow && !(flags & SDL_WINDOW_FOREIGN)) { - if (_this->CreateWindow(_this, window) < 0) { - if (loaded_opengl) { - SDL_GL_UnloadLibrary(); - window->flags &= ~SDL_WINDOW_OPENGL; - } - return -1; - } - } - - if (flags & SDL_WINDOW_FOREIGN) { - window->flags |= SDL_WINDOW_FOREIGN; - } - - if (_this->SetWindowTitle && window->title) { - _this->SetWindowTitle(_this, window); - } - - if (_this->SetWindowIcon && window->icon) { - _this->SetWindowIcon(_this, window, window->icon); - } - - if (window->hit_test) { - _this->SetWindowHitTest(window, SDL_TRUE); - } - - SDL_FinishWindowCreation(window, flags); - - return 0; -} - -Uint32 -SDL_GetWindowID(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window, 0); - - return window->id; -} - -SDL_Window * -SDL_GetWindowFromID(Uint32 id) -{ - SDL_Window *window; - - if (!_this) { - return NULL; - } - for (window = _this->windows; window; window = window->next) { - if (window->id == id) { - return window; - } - } - return NULL; -} - -Uint32 -SDL_GetWindowFlags(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window, 0); - - return window->flags; -} - -void -SDL_SetWindowTitle(SDL_Window * window, const char *title) -{ - CHECK_WINDOW_MAGIC(window,); - - if (title == window->title) { - return; - } - SDL_free(window->title); - - window->title = SDL_strdup(title ? title : ""); - - if (_this->SetWindowTitle) { - _this->SetWindowTitle(_this, window); - } -} - -const char * -SDL_GetWindowTitle(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window, ""); - - return window->title ? window->title : ""; -} - -void -SDL_SetWindowIcon(SDL_Window * window, SDL_Surface * icon) -{ - CHECK_WINDOW_MAGIC(window,); - - if (!icon) { - return; - } - - SDL_FreeSurface(window->icon); - - /* Convert the icon into ARGB8888 */ - window->icon = SDL_ConvertSurfaceFormat(icon, SDL_PIXELFORMAT_ARGB8888, 0); - if (!window->icon) { - return; - } - - if (_this->SetWindowIcon) { - _this->SetWindowIcon(_this, window, window->icon); - } -} - -void* -SDL_SetWindowData(SDL_Window * window, const char *name, void *userdata) -{ - SDL_WindowUserData *prev, *data; - - CHECK_WINDOW_MAGIC(window, NULL); - - /* Input validation */ - if (name == NULL || name[0] == '\0') { - SDL_InvalidParamError("name"); - return NULL; - } - - /* See if the named data already exists */ - prev = NULL; - for (data = window->data; data; prev = data, data = data->next) { - if (data->name && SDL_strcmp(data->name, name) == 0) { - void *last_value = data->data; - - if (userdata) { - /* Set the new value */ - data->data = userdata; - } else { - /* Delete this value */ - if (prev) { - prev->next = data->next; - } else { - window->data = data->next; - } - SDL_free(data->name); - SDL_free(data); - } - return last_value; - } - } - - /* Add new data to the window */ - if (userdata) { - data = (SDL_WindowUserData *)SDL_malloc(sizeof(*data)); - data->name = SDL_strdup(name); - data->data = userdata; - data->next = window->data; - window->data = data; - } - return NULL; -} - -void * -SDL_GetWindowData(SDL_Window * window, const char *name) -{ - SDL_WindowUserData *data; - - CHECK_WINDOW_MAGIC(window, NULL); - - /* Input validation */ - if (name == NULL || name[0] == '\0') { - SDL_InvalidParamError("name"); - return NULL; - } - - for (data = window->data; data; data = data->next) { - if (data->name && SDL_strcmp(data->name, name) == 0) { - return data->data; - } - } - return NULL; -} - -void -SDL_SetWindowPosition(SDL_Window * window, int x, int y) -{ - CHECK_WINDOW_MAGIC(window,); - - if (SDL_WINDOWPOS_ISCENTERED(x) || SDL_WINDOWPOS_ISCENTERED(y)) { - int displayIndex = (x & 0xFFFF); - SDL_Rect bounds; - if (displayIndex > _this->num_displays) { - displayIndex = 0; - } - - SDL_zero(bounds); - - SDL_GetDisplayBounds(displayIndex, &bounds); - if (SDL_WINDOWPOS_ISCENTERED(x)) { - x = bounds.x + (bounds.w - window->w) / 2; - } - if (SDL_WINDOWPOS_ISCENTERED(y)) { - y = bounds.y + (bounds.h - window->h) / 2; - } - } - - if ((window->flags & SDL_WINDOW_FULLSCREEN)) { - if (!SDL_WINDOWPOS_ISUNDEFINED(x)) { - window->windowed.x = x; - } - if (!SDL_WINDOWPOS_ISUNDEFINED(y)) { - window->windowed.y = y; - } - } else { - if (!SDL_WINDOWPOS_ISUNDEFINED(x)) { - window->x = x; - } - if (!SDL_WINDOWPOS_ISUNDEFINED(y)) { - window->y = y; - } - - if (_this->SetWindowPosition) { - _this->SetWindowPosition(_this, window); - } - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MOVED, x, y); - } -} - -void -SDL_GetWindowPosition(SDL_Window * window, int *x, int *y) -{ - CHECK_WINDOW_MAGIC(window,); - - /* Fullscreen windows are always at their display's origin */ - if (window->flags & SDL_WINDOW_FULLSCREEN) { - int displayIndex; - - if (x) { - *x = 0; - } - if (y) { - *y = 0; - } - - /* Find the window's monitor and update to the - monitor offset. */ - displayIndex = SDL_GetWindowDisplayIndex(window); - if (displayIndex >= 0) { - SDL_Rect bounds; - - SDL_zero(bounds); - - SDL_GetDisplayBounds(displayIndex, &bounds); - if (x) { - *x = bounds.x; - } - if (y) { - *y = bounds.y; - } - } - } else { - if (x) { - *x = window->x; - } - if (y) { - *y = window->y; - } - } -} - -void -SDL_SetWindowBordered(SDL_Window * window, SDL_bool bordered) -{ - CHECK_WINDOW_MAGIC(window,); - if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { - const int want = (bordered != SDL_FALSE); /* normalize the flag. */ - const int have = ((window->flags & SDL_WINDOW_BORDERLESS) == 0); - if ((want != have) && (_this->SetWindowBordered)) { - if (want) { - window->flags &= ~SDL_WINDOW_BORDERLESS; - } else { - window->flags |= SDL_WINDOW_BORDERLESS; - } - _this->SetWindowBordered(_this, window, (SDL_bool) want); - } - } -} - -void -SDL_SetWindowResizable(SDL_Window * window, SDL_bool resizable) -{ - CHECK_WINDOW_MAGIC(window,); - if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { - const int want = (resizable != SDL_FALSE); /* normalize the flag. */ - const int have = ((window->flags & SDL_WINDOW_RESIZABLE) != 0); - if ((want != have) && (_this->SetWindowResizable)) { - if (want) { - window->flags |= SDL_WINDOW_RESIZABLE; - } else { - window->flags &= ~SDL_WINDOW_RESIZABLE; - } - _this->SetWindowResizable(_this, window, (SDL_bool) want); - } - } -} - -void -SDL_SetWindowSize(SDL_Window * window, int w, int h) -{ - CHECK_WINDOW_MAGIC(window,); - if (w <= 0) { - SDL_InvalidParamError("w"); - return; - } - if (h <= 0) { - SDL_InvalidParamError("h"); - return; - } - - /* Make sure we don't exceed any window size limits */ - if (window->min_w && w < window->min_w) - { - w = window->min_w; - } - if (window->max_w && w > window->max_w) - { - w = window->max_w; - } - if (window->min_h && h < window->min_h) - { - h = window->min_h; - } - if (window->max_h && h > window->max_h) - { - h = window->max_h; - } - - window->windowed.w = w; - window->windowed.h = h; - - if (window->flags & SDL_WINDOW_FULLSCREEN) { - if (FULLSCREEN_VISIBLE(window) && (window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP) { - window->last_fullscreen_flags = 0; - SDL_UpdateFullscreenMode(window, SDL_TRUE); - } - } else { - window->w = w; - window->h = h; - if (_this->SetWindowSize) { - _this->SetWindowSize(_this, window); - } - if (window->w == w && window->h == h) { - /* We didn't get a SDL_WINDOWEVENT_RESIZED event (by design) */ - SDL_OnWindowResized(window); - } - } -} - -void -SDL_GetWindowSize(SDL_Window * window, int *w, int *h) -{ - CHECK_WINDOW_MAGIC(window,); - if (w) { - *w = window->w; - } - if (h) { - *h = window->h; - } -} - -void -SDL_SetWindowMinimumSize(SDL_Window * window, int min_w, int min_h) -{ - CHECK_WINDOW_MAGIC(window,); - if (min_w <= 0) { - SDL_InvalidParamError("min_w"); - return; - } - if (min_h <= 0) { - SDL_InvalidParamError("min_h"); - return; - } - - if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { - window->min_w = min_w; - window->min_h = min_h; - if (_this->SetWindowMinimumSize) { - _this->SetWindowMinimumSize(_this, window); - } - /* Ensure that window is not smaller than minimal size */ - SDL_SetWindowSize(window, SDL_max(window->w, window->min_w), SDL_max(window->h, window->min_h)); - } -} - -int -SDL_GetWindowBordersSize(SDL_Window * window, int *top, int *left, int *bottom, int *right) -{ - int dummy = 0; - - if (!top) { top = &dummy; } - if (!left) { left = &dummy; } - if (!right) { right = &dummy; } - if (!bottom) { bottom = &dummy; } - - /* Always initialize, so applications don't have to care */ - *top = *left = *bottom = *right = 0; - - CHECK_WINDOW_MAGIC(window, -1); - - if (!_this->GetWindowBordersSize) { - return SDL_Unsupported(); - } - - return _this->GetWindowBordersSize(_this, window, top, left, bottom, right); -} - -void -SDL_GetWindowMinimumSize(SDL_Window * window, int *min_w, int *min_h) -{ - CHECK_WINDOW_MAGIC(window,); - if (min_w) { - *min_w = window->min_w; - } - if (min_h) { - *min_h = window->min_h; - } -} - -void -SDL_SetWindowMaximumSize(SDL_Window * window, int max_w, int max_h) -{ - CHECK_WINDOW_MAGIC(window,); - if (max_w <= 0) { - SDL_InvalidParamError("max_w"); - return; - } - if (max_h <= 0) { - SDL_InvalidParamError("max_h"); - return; - } - - if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { - window->max_w = max_w; - window->max_h = max_h; - if (_this->SetWindowMaximumSize) { - _this->SetWindowMaximumSize(_this, window); - } - /* Ensure that window is not larger than maximal size */ - SDL_SetWindowSize(window, SDL_min(window->w, window->max_w), SDL_min(window->h, window->max_h)); - } -} - -void -SDL_GetWindowMaximumSize(SDL_Window * window, int *max_w, int *max_h) -{ - CHECK_WINDOW_MAGIC(window,); - if (max_w) { - *max_w = window->max_w; - } - if (max_h) { - *max_h = window->max_h; - } -} - -void -SDL_ShowWindow(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window,); - - if (window->flags & SDL_WINDOW_SHOWN) { - return; - } - - if (_this->ShowWindow) { - _this->ShowWindow(_this, window); - } - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SHOWN, 0, 0); -} - -void -SDL_HideWindow(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window,); - - if (!(window->flags & SDL_WINDOW_SHOWN)) { - return; - } - - window->is_hiding = SDL_TRUE; - SDL_UpdateFullscreenMode(window, SDL_FALSE); - - if (_this->HideWindow) { - _this->HideWindow(_this, window); - } - window->is_hiding = SDL_FALSE; - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_HIDDEN, 0, 0); -} - -void -SDL_RaiseWindow(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window,); - - if (!(window->flags & SDL_WINDOW_SHOWN)) { - return; - } - if (_this->RaiseWindow) { - _this->RaiseWindow(_this, window); - } -} - -void -SDL_MaximizeWindow(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window,); - - if (window->flags & SDL_WINDOW_MAXIMIZED) { - return; - } - - /* !!! FIXME: should this check if the window is resizable? */ - - if (_this->MaximizeWindow) { - _this->MaximizeWindow(_this, window); - } -} - -void -SDL_MinimizeWindow(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window,); - - if (window->flags & SDL_WINDOW_MINIMIZED) { - return; - } - - SDL_UpdateFullscreenMode(window, SDL_FALSE); - - if (_this->MinimizeWindow) { - _this->MinimizeWindow(_this, window); - } -} - -void -SDL_RestoreWindow(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window,); - - if (!(window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED))) { - return; - } - - if (_this->RestoreWindow) { - _this->RestoreWindow(_this, window); - } -} - -int -SDL_SetWindowFullscreen(SDL_Window * window, Uint32 flags) -{ - Uint32 oldflags; - CHECK_WINDOW_MAGIC(window, -1); - - flags &= FULLSCREEN_MASK; - - if (flags == (window->flags & FULLSCREEN_MASK)) { - return 0; - } - - /* clear the previous flags and OR in the new ones */ - oldflags = window->flags & FULLSCREEN_MASK; - window->flags &= ~FULLSCREEN_MASK; - window->flags |= flags; - - if (SDL_UpdateFullscreenMode(window, FULLSCREEN_VISIBLE(window)) == 0) { - return 0; - } - - window->flags &= ~FULLSCREEN_MASK; - window->flags |= oldflags; - return -1; -} - -static SDL_Surface * -SDL_CreateWindowFramebuffer(SDL_Window * window) -{ - Uint32 format; - void *pixels; - int pitch; - int bpp; - Uint32 Rmask, Gmask, Bmask, Amask; - - if (!_this->CreateWindowFramebuffer || !_this->UpdateWindowFramebuffer) { - return NULL; - } - - if (_this->CreateWindowFramebuffer(_this, window, &format, &pixels, &pitch) < 0) { - return NULL; - } - - if (!SDL_PixelFormatEnumToMasks(format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) { - return NULL; - } - - return SDL_CreateRGBSurfaceFrom(pixels, window->w, window->h, bpp, pitch, Rmask, Gmask, Bmask, Amask); -} - -SDL_Surface * -SDL_GetWindowSurface(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window, NULL); - - if (!window->surface_valid) { - if (window->surface) { - window->surface->flags &= ~SDL_DONTFREE; - SDL_FreeSurface(window->surface); - } - window->surface = SDL_CreateWindowFramebuffer(window); - if (window->surface) { - window->surface_valid = SDL_TRUE; - window->surface->flags |= SDL_DONTFREE; - } - } - return window->surface; -} - -int -SDL_UpdateWindowSurface(SDL_Window * window) -{ - SDL_Rect full_rect; - - CHECK_WINDOW_MAGIC(window, -1); - - full_rect.x = 0; - full_rect.y = 0; - full_rect.w = window->w; - full_rect.h = window->h; - return SDL_UpdateWindowSurfaceRects(window, &full_rect, 1); -} - -int -SDL_UpdateWindowSurfaceRects(SDL_Window * window, const SDL_Rect * rects, - int numrects) -{ - CHECK_WINDOW_MAGIC(window, -1); - - if (!window->surface_valid) { - return SDL_SetError("Window surface is invalid, please call SDL_GetWindowSurface() to get a new surface"); - } - - return _this->UpdateWindowFramebuffer(_this, window, rects, numrects); -} - -int -SDL_SetWindowBrightness(SDL_Window * window, float brightness) -{ - Uint16 ramp[256]; - int status; - - CHECK_WINDOW_MAGIC(window, -1); - - SDL_CalculateGammaRamp(brightness, ramp); - status = SDL_SetWindowGammaRamp(window, ramp, ramp, ramp); - if (status == 0) { - window->brightness = brightness; - } - return status; -} - -float -SDL_GetWindowBrightness(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window, 1.0f); - - return window->brightness; -} - -int -SDL_SetWindowOpacity(SDL_Window * window, float opacity) -{ - int retval; - CHECK_WINDOW_MAGIC(window, -1); - - if (!_this->SetWindowOpacity) { - return SDL_Unsupported(); - } - - if (opacity < 0.0f) { - opacity = 0.0f; - } else if (opacity > 1.0f) { - opacity = 1.0f; - } - - retval = _this->SetWindowOpacity(_this, window, opacity); - if (retval == 0) { - window->opacity = opacity; - } - - return retval; -} - -int -SDL_GetWindowOpacity(SDL_Window * window, float * out_opacity) -{ - CHECK_WINDOW_MAGIC(window, -1); - - if (out_opacity) { - *out_opacity = window->opacity; - } - - return 0; -} - -int -SDL_SetWindowModalFor(SDL_Window * modal_window, SDL_Window * parent_window) -{ - CHECK_WINDOW_MAGIC(modal_window, -1); - CHECK_WINDOW_MAGIC(parent_window, -1); - - if (!_this->SetWindowModalFor) { - return SDL_Unsupported(); - } - - return _this->SetWindowModalFor(_this, modal_window, parent_window); -} - -int -SDL_SetWindowInputFocus(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window, -1); - - if (!_this->SetWindowInputFocus) { - return SDL_Unsupported(); - } - - return _this->SetWindowInputFocus(_this, window); -} - - -int -SDL_SetWindowGammaRamp(SDL_Window * window, const Uint16 * red, - const Uint16 * green, - const Uint16 * blue) -{ - CHECK_WINDOW_MAGIC(window, -1); - - if (!_this->SetWindowGammaRamp) { - return SDL_Unsupported(); - } - - if (!window->gamma) { - if (SDL_GetWindowGammaRamp(window, NULL, NULL, NULL) < 0) { - return -1; - } - SDL_assert(window->gamma != NULL); - } - - if (red) { - SDL_memcpy(&window->gamma[0*256], red, 256*sizeof(Uint16)); - } - if (green) { - SDL_memcpy(&window->gamma[1*256], green, 256*sizeof(Uint16)); - } - if (blue) { - SDL_memcpy(&window->gamma[2*256], blue, 256*sizeof(Uint16)); - } - if (window->flags & SDL_WINDOW_INPUT_FOCUS) { - return _this->SetWindowGammaRamp(_this, window, window->gamma); - } else { - return 0; - } -} - -int -SDL_GetWindowGammaRamp(SDL_Window * window, Uint16 * red, - Uint16 * green, - Uint16 * blue) -{ - CHECK_WINDOW_MAGIC(window, -1); - - if (!window->gamma) { - int i; - - window->gamma = (Uint16 *)SDL_malloc(256*6*sizeof(Uint16)); - if (!window->gamma) { - return SDL_OutOfMemory(); - } - window->saved_gamma = window->gamma + 3*256; - - if (_this->GetWindowGammaRamp) { - if (_this->GetWindowGammaRamp(_this, window, window->gamma) < 0) { - return -1; - } - } else { - /* Create an identity gamma ramp */ - for (i = 0; i < 256; ++i) { - Uint16 value = (Uint16)((i << 8) | i); - - window->gamma[0*256+i] = value; - window->gamma[1*256+i] = value; - window->gamma[2*256+i] = value; - } - } - SDL_memcpy(window->saved_gamma, window->gamma, 3*256*sizeof(Uint16)); - } - - if (red) { - SDL_memcpy(red, &window->gamma[0*256], 256*sizeof(Uint16)); - } - if (green) { - SDL_memcpy(green, &window->gamma[1*256], 256*sizeof(Uint16)); - } - if (blue) { - SDL_memcpy(blue, &window->gamma[2*256], 256*sizeof(Uint16)); - } - return 0; -} - -void -SDL_UpdateWindowGrab(SDL_Window * window) -{ - SDL_Window *grabbed_window; - SDL_bool grabbed; - if ((SDL_GetMouse()->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) && - (window->flags & SDL_WINDOW_INPUT_FOCUS)) { - grabbed = SDL_TRUE; - } else { - grabbed = SDL_FALSE; - } - - grabbed_window = _this->grabbed_window; - if (grabbed) { - if (grabbed_window && (grabbed_window != window)) { - /* stealing a grab from another window! */ - grabbed_window->flags &= ~SDL_WINDOW_INPUT_GRABBED; - if (_this->SetWindowGrab) { - _this->SetWindowGrab(_this, grabbed_window, SDL_FALSE); - } - } - _this->grabbed_window = window; - } else if (grabbed_window == window) { - _this->grabbed_window = NULL; /* ungrabbing. */ - } - - if (_this->SetWindowGrab) { - _this->SetWindowGrab(_this, window, grabbed); - } -} - -void -SDL_SetWindowGrab(SDL_Window * window, SDL_bool grabbed) -{ - CHECK_WINDOW_MAGIC(window,); - - if (!!grabbed == !!(window->flags & SDL_WINDOW_INPUT_GRABBED)) { - return; - } - if (grabbed) { - window->flags |= SDL_WINDOW_INPUT_GRABBED; - } else { - window->flags &= ~SDL_WINDOW_INPUT_GRABBED; - } - SDL_UpdateWindowGrab(window); -} - -SDL_bool -SDL_GetWindowGrab(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window, SDL_FALSE); - SDL_assert(!_this->grabbed_window || ((_this->grabbed_window->flags & SDL_WINDOW_INPUT_GRABBED) != 0)); - return window == _this->grabbed_window; -} - -SDL_Window * -SDL_GetGrabbedWindow(void) -{ - SDL_assert(!_this->grabbed_window || ((_this->grabbed_window->flags & SDL_WINDOW_INPUT_GRABBED) != 0)); - return _this->grabbed_window; -} - -void -SDL_OnWindowShown(SDL_Window * window) -{ - SDL_OnWindowRestored(window); -} - -void -SDL_OnWindowHidden(SDL_Window * window) -{ - SDL_UpdateFullscreenMode(window, SDL_FALSE); -} - -void -SDL_OnWindowResized(SDL_Window * window) -{ - window->surface_valid = SDL_FALSE; - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SIZE_CHANGED, window->w, window->h); -} - -void -SDL_OnWindowMinimized(SDL_Window * window) -{ - SDL_UpdateFullscreenMode(window, SDL_FALSE); -} - -void -SDL_OnWindowRestored(SDL_Window * window) -{ - /* - * FIXME: Is this fine to just remove this, or should it be preserved just - * for the fullscreen case? In principle it seems like just hiding/showing - * windows shouldn't affect the stacking order; maybe the right fix is to - * re-decouple OnWindowShown and OnWindowRestored. - */ - /*SDL_RaiseWindow(window);*/ - - if (FULLSCREEN_VISIBLE(window)) { - SDL_UpdateFullscreenMode(window, SDL_TRUE); - } -} - -void -SDL_OnWindowEnter(SDL_Window * window) -{ - if (_this->OnWindowEnter) { - _this->OnWindowEnter(_this, window); - } -} - -void -SDL_OnWindowLeave(SDL_Window * window) -{ -} - -void -SDL_OnWindowFocusGained(SDL_Window * window) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - - if (window->gamma && _this->SetWindowGammaRamp) { - _this->SetWindowGammaRamp(_this, window, window->gamma); - } - - if (mouse && mouse->relative_mode) { - SDL_SetMouseFocus(window); - SDL_WarpMouseInWindow(window, window->w/2, window->h/2); - } - - SDL_UpdateWindowGrab(window); -} - -static SDL_bool -ShouldMinimizeOnFocusLoss(SDL_Window * window) -{ - if (!(window->flags & SDL_WINDOW_FULLSCREEN) || window->is_destroying) { - return SDL_FALSE; - } - -#ifdef __MACOSX__ - if (Cocoa_IsWindowInFullscreenSpace(window)) { - return SDL_FALSE; - } -#endif - - return SDL_GetHintBoolean(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, SDL_TRUE); -} - -void -SDL_OnWindowFocusLost(SDL_Window * window) -{ - if (window->gamma && _this->SetWindowGammaRamp) { - _this->SetWindowGammaRamp(_this, window, window->saved_gamma); - } - - SDL_UpdateWindowGrab(window); - - if (ShouldMinimizeOnFocusLoss(window)) { - SDL_MinimizeWindow(window); - } -} - -/* !!! FIXME: is this different than SDL_GetKeyboardFocus()? - !!! FIXME: Also, SDL_GetKeyboardFocus() is O(1), this isn't. */ -SDL_Window * -SDL_GetFocusWindow(void) -{ - SDL_Window *window; - - if (!_this) { - return NULL; - } - for (window = _this->windows; window; window = window->next) { - if (window->flags & SDL_WINDOW_INPUT_FOCUS) { - return window; - } - } - return NULL; -} - -void -SDL_DestroyWindow(SDL_Window * window) -{ - SDL_VideoDisplay *display; - - CHECK_WINDOW_MAGIC(window,); - - window->is_destroying = SDL_TRUE; - - /* Restore video mode, etc. */ - SDL_HideWindow(window); - - /* Make sure this window no longer has focus */ - if (SDL_GetKeyboardFocus() == window) { - SDL_SetKeyboardFocus(NULL); - } - if (SDL_GetMouseFocus() == window) { - SDL_SetMouseFocus(NULL); - } - - /* make no context current if this is the current context window. */ - if (window->flags & SDL_WINDOW_OPENGL) { - if (_this->current_glwin == window) { - SDL_GL_MakeCurrent(window, NULL); - } - } - - if (window->surface) { - window->surface->flags &= ~SDL_DONTFREE; - SDL_FreeSurface(window->surface); - } - if (_this->DestroyWindowFramebuffer) { - _this->DestroyWindowFramebuffer(_this, window); - } - if (_this->DestroyWindow) { - _this->DestroyWindow(_this, window); - } - if (window->flags & SDL_WINDOW_OPENGL) { - SDL_GL_UnloadLibrary(); - } - - display = SDL_GetDisplayForWindow(window); - if (display->fullscreen_window == window) { - display->fullscreen_window = NULL; - } - - /* Now invalidate magic */ - window->magic = NULL; - - /* Free memory associated with the window */ - SDL_free(window->title); - SDL_FreeSurface(window->icon); - SDL_free(window->gamma); - while (window->data) { - SDL_WindowUserData *data = window->data; - - window->data = data->next; - SDL_free(data->name); - SDL_free(data); - } - - /* Unlink the window from the list */ - if (window->next) { - window->next->prev = window->prev; - } - if (window->prev) { - window->prev->next = window->next; - } else { - _this->windows = window->next; - } - - SDL_free(window); -} - -SDL_bool -SDL_IsScreenSaverEnabled() -{ - if (!_this) { - return SDL_TRUE; - } - return _this->suspend_screensaver ? SDL_FALSE : SDL_TRUE; -} - -void -SDL_EnableScreenSaver() -{ - if (!_this) { - return; - } - if (!_this->suspend_screensaver) { - return; - } - _this->suspend_screensaver = SDL_FALSE; - if (_this->SuspendScreenSaver) { - _this->SuspendScreenSaver(_this); - } -} - -void -SDL_DisableScreenSaver() -{ - if (!_this) { - return; - } - if (_this->suspend_screensaver) { - return; - } - _this->suspend_screensaver = SDL_TRUE; - if (_this->SuspendScreenSaver) { - _this->SuspendScreenSaver(_this); - } -} - -void -SDL_VideoQuit(void) -{ - int i, j; - - if (!_this) { - return; - } - - /* Halt event processing before doing anything else */ - SDL_TouchQuit(); - SDL_MouseQuit(); - SDL_KeyboardQuit(); - SDL_QuitSubSystem(SDL_INIT_EVENTS); - - SDL_EnableScreenSaver(); - - /* Clean up the system video */ - while (_this->windows) { - SDL_DestroyWindow(_this->windows); - } - _this->VideoQuit(_this); - - for (i = 0; i < _this->num_displays; ++i) { - SDL_VideoDisplay *display = &_this->displays[i]; - for (j = display->num_display_modes; j--;) { - SDL_free(display->display_modes[j].driverdata); - display->display_modes[j].driverdata = NULL; - } - SDL_free(display->display_modes); - display->display_modes = NULL; - SDL_free(display->desktop_mode.driverdata); - display->desktop_mode.driverdata = NULL; - SDL_free(display->driverdata); - display->driverdata = NULL; - } - if (_this->displays) { - for (i = 0; i < _this->num_displays; ++i) { - SDL_free(_this->displays[i].name); - } - SDL_free(_this->displays); - _this->displays = NULL; - _this->num_displays = 0; - } - SDL_free(_this->clipboard_text); - _this->clipboard_text = NULL; - _this->free(_this); - _this = NULL; -} - -int -SDL_GL_LoadLibrary(const char *path) -{ - int retval; - - if (!_this) { - return SDL_UninitializedVideo(); - } - if (_this->gl_config.driver_loaded) { - if (path && SDL_strcmp(path, _this->gl_config.driver_path) != 0) { - return SDL_SetError("OpenGL library already loaded"); - } - retval = 0; - } else { - if (!_this->GL_LoadLibrary) { - return SDL_SetError("No dynamic GL support in video driver"); - } - retval = _this->GL_LoadLibrary(_this, path); - } - if (retval == 0) { - ++_this->gl_config.driver_loaded; - } else { - if (_this->GL_UnloadLibrary) { - _this->GL_UnloadLibrary(_this); - } - } - return (retval); -} - -void * -SDL_GL_GetProcAddress(const char *proc) -{ - void *func; - - if (!_this) { - SDL_UninitializedVideo(); - return NULL; - } - func = NULL; - if (_this->GL_GetProcAddress) { - if (_this->gl_config.driver_loaded) { - func = _this->GL_GetProcAddress(_this, proc); - } else { - SDL_SetError("No GL driver has been loaded"); - } - } else { - SDL_SetError("No dynamic GL support in video driver"); - } - return func; -} - -void -SDL_GL_UnloadLibrary(void) -{ - if (!_this) { - SDL_UninitializedVideo(); - return; - } - if (_this->gl_config.driver_loaded > 0) { - if (--_this->gl_config.driver_loaded > 0) { - return; - } - if (_this->GL_UnloadLibrary) { - _this->GL_UnloadLibrary(_this); - } - } -} - -static SDL_INLINE SDL_bool -isAtLeastGL3(const char *verstr) -{ - return (verstr && (SDL_atoi(verstr) >= 3)); -} - -SDL_bool -SDL_GL_ExtensionSupported(const char *extension) -{ -#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2 - const GLubyte *(APIENTRY * glGetStringFunc) (GLenum); - const char *extensions; - const char *start; - const char *where, *terminator; - - /* Extension names should not have spaces. */ - where = SDL_strchr(extension, ' '); - if (where || *extension == '\0') { - return SDL_FALSE; - } - /* See if there's an environment variable override */ - start = SDL_getenv(extension); - if (start && *start == '0') { - return SDL_FALSE; - } - - /* Lookup the available extensions */ - - glGetStringFunc = SDL_GL_GetProcAddress("glGetString"); - if (!glGetStringFunc) { - return SDL_FALSE; - } - - if (isAtLeastGL3((const char *) glGetStringFunc(GL_VERSION))) { - const GLubyte *(APIENTRY * glGetStringiFunc) (GLenum, GLuint); - void (APIENTRY * glGetIntegervFunc) (GLenum pname, GLint * params); - GLint num_exts = 0; - GLint i; - - glGetStringiFunc = SDL_GL_GetProcAddress("glGetStringi"); - glGetIntegervFunc = SDL_GL_GetProcAddress("glGetIntegerv"); - if ((!glGetStringiFunc) || (!glGetIntegervFunc)) { - return SDL_FALSE; - } - - #ifndef GL_NUM_EXTENSIONS - #define GL_NUM_EXTENSIONS 0x821D - #endif - glGetIntegervFunc(GL_NUM_EXTENSIONS, &num_exts); - for (i = 0; i < num_exts; i++) { - const char *thisext = (const char *) glGetStringiFunc(GL_EXTENSIONS, i); - if (SDL_strcmp(thisext, extension) == 0) { - return SDL_TRUE; - } - } - - return SDL_FALSE; - } - - /* Try the old way with glGetString(GL_EXTENSIONS) ... */ - - extensions = (const char *) glGetStringFunc(GL_EXTENSIONS); - if (!extensions) { - return SDL_FALSE; - } - /* - * It takes a bit of care to be fool-proof about parsing the OpenGL - * extensions string. Don't be fooled by sub-strings, etc. - */ - - start = extensions; - - for (;;) { - where = SDL_strstr(start, extension); - if (!where) - break; - - terminator = where + SDL_strlen(extension); - if (where == start || *(where - 1) == ' ') - if (*terminator == ' ' || *terminator == '\0') - return SDL_TRUE; - - start = terminator; - } - return SDL_FALSE; -#else - return SDL_FALSE; -#endif -} - -void -SDL_GL_ResetAttributes() -{ - if (!_this) { - return; - } - - _this->gl_config.red_size = 3; - _this->gl_config.green_size = 3; - _this->gl_config.blue_size = 2; - _this->gl_config.alpha_size = 0; - _this->gl_config.buffer_size = 0; - _this->gl_config.depth_size = 16; - _this->gl_config.stencil_size = 0; - _this->gl_config.double_buffer = 1; - _this->gl_config.accum_red_size = 0; - _this->gl_config.accum_green_size = 0; - _this->gl_config.accum_blue_size = 0; - _this->gl_config.accum_alpha_size = 0; - _this->gl_config.stereo = 0; - _this->gl_config.multisamplebuffers = 0; - _this->gl_config.multisamplesamples = 0; - _this->gl_config.retained_backing = 1; - _this->gl_config.accelerated = -1; /* accelerated or not, both are fine */ - _this->gl_config.profile_mask = 0; -#if SDL_VIDEO_OPENGL - _this->gl_config.major_version = 2; - _this->gl_config.minor_version = 1; -#elif SDL_VIDEO_OPENGL_ES2 - _this->gl_config.major_version = 2; - _this->gl_config.minor_version = 0; - _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES; -#elif SDL_VIDEO_OPENGL_ES - _this->gl_config.major_version = 1; - _this->gl_config.minor_version = 1; - _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES; -#endif - _this->gl_config.flags = 0; - _this->gl_config.framebuffer_srgb_capable = 0; - _this->gl_config.release_behavior = SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH; - - _this->gl_config.share_with_current_context = 0; -} - -int -SDL_GL_SetAttribute(SDL_GLattr attr, int value) -{ -#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2 - int retval; - - if (!_this) { - return SDL_UninitializedVideo(); - } - retval = 0; - switch (attr) { - case SDL_GL_RED_SIZE: - _this->gl_config.red_size = value; - break; - case SDL_GL_GREEN_SIZE: - _this->gl_config.green_size = value; - break; - case SDL_GL_BLUE_SIZE: - _this->gl_config.blue_size = value; - break; - case SDL_GL_ALPHA_SIZE: - _this->gl_config.alpha_size = value; - break; - case SDL_GL_DOUBLEBUFFER: - _this->gl_config.double_buffer = value; - break; - case SDL_GL_BUFFER_SIZE: - _this->gl_config.buffer_size = value; - break; - case SDL_GL_DEPTH_SIZE: - _this->gl_config.depth_size = value; - break; - case SDL_GL_STENCIL_SIZE: - _this->gl_config.stencil_size = value; - break; - case SDL_GL_ACCUM_RED_SIZE: - _this->gl_config.accum_red_size = value; - break; - case SDL_GL_ACCUM_GREEN_SIZE: - _this->gl_config.accum_green_size = value; - break; - case SDL_GL_ACCUM_BLUE_SIZE: - _this->gl_config.accum_blue_size = value; - break; - case SDL_GL_ACCUM_ALPHA_SIZE: - _this->gl_config.accum_alpha_size = value; - break; - case SDL_GL_STEREO: - _this->gl_config.stereo = value; - break; - case SDL_GL_MULTISAMPLEBUFFERS: - _this->gl_config.multisamplebuffers = value; - break; - case SDL_GL_MULTISAMPLESAMPLES: - _this->gl_config.multisamplesamples = value; - break; - case SDL_GL_ACCELERATED_VISUAL: - _this->gl_config.accelerated = value; - break; - case SDL_GL_RETAINED_BACKING: - _this->gl_config.retained_backing = value; - break; - case SDL_GL_CONTEXT_MAJOR_VERSION: - _this->gl_config.major_version = value; - break; - case SDL_GL_CONTEXT_MINOR_VERSION: - _this->gl_config.minor_version = value; - break; - case SDL_GL_CONTEXT_EGL: - /* FIXME: SDL_GL_CONTEXT_EGL to be deprecated in SDL 2.1 */ - if (value != 0) { - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); - } else { - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0); - }; - break; - case SDL_GL_CONTEXT_FLAGS: - if (value & ~(SDL_GL_CONTEXT_DEBUG_FLAG | - SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG | - SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG | - SDL_GL_CONTEXT_RESET_ISOLATION_FLAG)) { - retval = SDL_SetError("Unknown OpenGL context flag %d", value); - break; - } - _this->gl_config.flags = value; - break; - case SDL_GL_CONTEXT_PROFILE_MASK: - if (value != 0 && - value != SDL_GL_CONTEXT_PROFILE_CORE && - value != SDL_GL_CONTEXT_PROFILE_COMPATIBILITY && - value != SDL_GL_CONTEXT_PROFILE_ES) { - retval = SDL_SetError("Unknown OpenGL context profile %d", value); - break; - } - _this->gl_config.profile_mask = value; - break; - case SDL_GL_SHARE_WITH_CURRENT_CONTEXT: - _this->gl_config.share_with_current_context = value; - break; - case SDL_GL_FRAMEBUFFER_SRGB_CAPABLE: - _this->gl_config.framebuffer_srgb_capable = value; - break; - case SDL_GL_CONTEXT_RELEASE_BEHAVIOR: - _this->gl_config.release_behavior = value; - break; - default: - retval = SDL_SetError("Unknown OpenGL attribute"); - break; - } - return retval; -#else - return SDL_Unsupported(); -#endif /* SDL_VIDEO_OPENGL */ -} - -int -SDL_GL_GetAttribute(SDL_GLattr attr, int *value) -{ -#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2 - GLenum (APIENTRY *glGetErrorFunc) (void); - GLenum attrib = 0; - GLenum error = 0; - - /* - * Some queries in Core Profile desktop OpenGL 3+ contexts require - * glGetFramebufferAttachmentParameteriv instead of glGetIntegerv. Note that - * the enums we use for the former function don't exist in OpenGL ES 2, and - * the function itself doesn't exist prior to OpenGL 3 and OpenGL ES 2. - */ -#if SDL_VIDEO_OPENGL - const GLubyte *(APIENTRY *glGetStringFunc) (GLenum name); - void (APIENTRY *glGetFramebufferAttachmentParameterivFunc) (GLenum target, GLenum attachment, GLenum pname, GLint* params); - GLenum attachment = GL_BACK_LEFT; - GLenum attachmentattrib = 0; -#endif - - /* Clear value in any case */ - *value = 0; - - switch (attr) { - case SDL_GL_RED_SIZE: -#if SDL_VIDEO_OPENGL - attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE; -#endif - attrib = GL_RED_BITS; - break; - case SDL_GL_BLUE_SIZE: -#if SDL_VIDEO_OPENGL - attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE; -#endif - attrib = GL_BLUE_BITS; - break; - case SDL_GL_GREEN_SIZE: -#if SDL_VIDEO_OPENGL - attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE; -#endif - attrib = GL_GREEN_BITS; - break; - case SDL_GL_ALPHA_SIZE: -#if SDL_VIDEO_OPENGL - attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE; -#endif - attrib = GL_ALPHA_BITS; - break; - case SDL_GL_DOUBLEBUFFER: -#if SDL_VIDEO_OPENGL - attrib = GL_DOUBLEBUFFER; - break; -#else - /* OpenGL ES 1.0 and above specifications have EGL_SINGLE_BUFFER */ - /* parameter which switches double buffer to single buffer. OpenGL ES */ - /* SDL driver must set proper value after initialization */ - *value = _this->gl_config.double_buffer; - return 0; -#endif - case SDL_GL_DEPTH_SIZE: -#if SDL_VIDEO_OPENGL - attachment = GL_DEPTH; - attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE; -#endif - attrib = GL_DEPTH_BITS; - break; - case SDL_GL_STENCIL_SIZE: -#if SDL_VIDEO_OPENGL - attachment = GL_STENCIL; - attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE; -#endif - attrib = GL_STENCIL_BITS; - break; -#if SDL_VIDEO_OPENGL - case SDL_GL_ACCUM_RED_SIZE: - attrib = GL_ACCUM_RED_BITS; - break; - case SDL_GL_ACCUM_GREEN_SIZE: - attrib = GL_ACCUM_GREEN_BITS; - break; - case SDL_GL_ACCUM_BLUE_SIZE: - attrib = GL_ACCUM_BLUE_BITS; - break; - case SDL_GL_ACCUM_ALPHA_SIZE: - attrib = GL_ACCUM_ALPHA_BITS; - break; - case SDL_GL_STEREO: - attrib = GL_STEREO; - break; -#else - case SDL_GL_ACCUM_RED_SIZE: - case SDL_GL_ACCUM_GREEN_SIZE: - case SDL_GL_ACCUM_BLUE_SIZE: - case SDL_GL_ACCUM_ALPHA_SIZE: - case SDL_GL_STEREO: - /* none of these are supported in OpenGL ES */ - *value = 0; - return 0; -#endif - case SDL_GL_MULTISAMPLEBUFFERS: - attrib = GL_SAMPLE_BUFFERS; - break; - case SDL_GL_MULTISAMPLESAMPLES: - attrib = GL_SAMPLES; - break; - case SDL_GL_CONTEXT_RELEASE_BEHAVIOR: -#if SDL_VIDEO_OPENGL - attrib = GL_CONTEXT_RELEASE_BEHAVIOR; -#else - attrib = GL_CONTEXT_RELEASE_BEHAVIOR_KHR; -#endif - break; - case SDL_GL_BUFFER_SIZE: - { - int rsize = 0, gsize = 0, bsize = 0, asize = 0; - - /* There doesn't seem to be a single flag in OpenGL for this! */ - if (SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &rsize) < 0) { - return -1; - } - if (SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &gsize) < 0) { - return -1; - } - if (SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &bsize) < 0) { - return -1; - } - if (SDL_GL_GetAttribute(SDL_GL_ALPHA_SIZE, &asize) < 0) { - return -1; - } - - *value = rsize + gsize + bsize + asize; - return 0; - } - case SDL_GL_ACCELERATED_VISUAL: - { - /* FIXME: How do we get this information? */ - *value = (_this->gl_config.accelerated != 0); - return 0; - } - case SDL_GL_RETAINED_BACKING: - { - *value = _this->gl_config.retained_backing; - return 0; - } - case SDL_GL_CONTEXT_MAJOR_VERSION: - { - *value = _this->gl_config.major_version; - return 0; - } - case SDL_GL_CONTEXT_MINOR_VERSION: - { - *value = _this->gl_config.minor_version; - return 0; - } - case SDL_GL_CONTEXT_EGL: - /* FIXME: SDL_GL_CONTEXT_EGL to be deprecated in SDL 2.1 */ - { - if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) { - *value = 1; - } - else { - *value = 0; - } - return 0; - } - case SDL_GL_CONTEXT_FLAGS: - { - *value = _this->gl_config.flags; - return 0; - } - case SDL_GL_CONTEXT_PROFILE_MASK: - { - *value = _this->gl_config.profile_mask; - return 0; - } - case SDL_GL_SHARE_WITH_CURRENT_CONTEXT: - { - *value = _this->gl_config.share_with_current_context; - return 0; - } - case SDL_GL_FRAMEBUFFER_SRGB_CAPABLE: - { - *value = _this->gl_config.framebuffer_srgb_capable; - return 0; - } - default: - return SDL_SetError("Unknown OpenGL attribute"); - } - -#if SDL_VIDEO_OPENGL - glGetStringFunc = SDL_GL_GetProcAddress("glGetString"); - if (!glGetStringFunc) { - return SDL_SetError("Failed getting OpenGL glGetString entry point"); - } - - if (attachmentattrib && isAtLeastGL3((const char *) glGetStringFunc(GL_VERSION))) { - glGetFramebufferAttachmentParameterivFunc = SDL_GL_GetProcAddress("glGetFramebufferAttachmentParameteriv"); - - if (glGetFramebufferAttachmentParameterivFunc) { - glGetFramebufferAttachmentParameterivFunc(GL_FRAMEBUFFER, attachment, attachmentattrib, (GLint *) value); - } else { - return SDL_SetError("Failed getting OpenGL glGetFramebufferAttachmentParameteriv entry point"); - } - } else -#endif - { - void (APIENTRY *glGetIntegervFunc) (GLenum pname, GLint * params); - glGetIntegervFunc = SDL_GL_GetProcAddress("glGetIntegerv"); - if (glGetIntegervFunc) { - glGetIntegervFunc(attrib, (GLint *) value); - } else { - return SDL_SetError("Failed getting OpenGL glGetIntegerv entry point"); - } - } - - glGetErrorFunc = SDL_GL_GetProcAddress("glGetError"); - if (!glGetErrorFunc) { - return SDL_SetError("Failed getting OpenGL glGetError entry point"); - } - - error = glGetErrorFunc(); - if (error != GL_NO_ERROR) { - if (error == GL_INVALID_ENUM) { - return SDL_SetError("OpenGL error: GL_INVALID_ENUM"); - } else if (error == GL_INVALID_VALUE) { - return SDL_SetError("OpenGL error: GL_INVALID_VALUE"); - } - return SDL_SetError("OpenGL error: %08X", error); - } - return 0; -#else - return SDL_Unsupported(); -#endif /* SDL_VIDEO_OPENGL */ -} - -SDL_GLContext -SDL_GL_CreateContext(SDL_Window * window) -{ - SDL_GLContext ctx = NULL; - CHECK_WINDOW_MAGIC(window, NULL); - - if (!(window->flags & SDL_WINDOW_OPENGL)) { - SDL_SetError("The specified window isn't an OpenGL window"); - return NULL; - } - - ctx = _this->GL_CreateContext(_this, window); - - /* Creating a context is assumed to make it current in the SDL driver. */ - if (ctx) { - _this->current_glwin = window; - _this->current_glctx = ctx; - SDL_TLSSet(_this->current_glwin_tls, window, NULL); - SDL_TLSSet(_this->current_glctx_tls, ctx, NULL); - } - return ctx; -} - -int -SDL_GL_MakeCurrent(SDL_Window * window, SDL_GLContext ctx) -{ - int retval; - - if (window == SDL_GL_GetCurrentWindow() && - ctx == SDL_GL_GetCurrentContext()) { - /* We're already current. */ - return 0; - } - - if (!ctx) { - window = NULL; - } else { - CHECK_WINDOW_MAGIC(window, -1); - - if (!(window->flags & SDL_WINDOW_OPENGL)) { - return SDL_SetError("The specified window isn't an OpenGL window"); - } - } - - retval = _this->GL_MakeCurrent(_this, window, ctx); - if (retval == 0) { - _this->current_glwin = window; - _this->current_glctx = ctx; - SDL_TLSSet(_this->current_glwin_tls, window, NULL); - SDL_TLSSet(_this->current_glctx_tls, ctx, NULL); - } - return retval; -} - -SDL_Window * -SDL_GL_GetCurrentWindow(void) -{ - if (!_this) { - SDL_UninitializedVideo(); - return NULL; - } - return (SDL_Window *)SDL_TLSGet(_this->current_glwin_tls); -} - -SDL_GLContext -SDL_GL_GetCurrentContext(void) -{ - if (!_this) { - SDL_UninitializedVideo(); - return NULL; - } - return (SDL_GLContext)SDL_TLSGet(_this->current_glctx_tls); -} - -void SDL_GL_GetDrawableSize(SDL_Window * window, int *w, int *h) -{ - CHECK_WINDOW_MAGIC(window,); - - if (_this->GL_GetDrawableSize) { - _this->GL_GetDrawableSize(_this, window, w, h); - } else { - SDL_GetWindowSize(window, w, h); - } -} - -int -SDL_GL_SetSwapInterval(int interval) -{ - if (!_this) { - return SDL_UninitializedVideo(); - } else if (SDL_GL_GetCurrentContext() == NULL) { - return SDL_SetError("No OpenGL context has been made current"); - } else if (_this->GL_SetSwapInterval) { - return _this->GL_SetSwapInterval(_this, interval); - } else { - return SDL_SetError("Setting the swap interval is not supported"); - } -} - -int -SDL_GL_GetSwapInterval(void) -{ - if (!_this) { - return 0; - } else if (SDL_GL_GetCurrentContext() == NULL) { - return 0; - } else if (_this->GL_GetSwapInterval) { - return _this->GL_GetSwapInterval(_this); - } else { - return 0; - } -} - -void -SDL_GL_SwapWindow(SDL_Window * window) -{ - CHECK_WINDOW_MAGIC(window,); - - if (!(window->flags & SDL_WINDOW_OPENGL)) { - SDL_SetError("The specified window isn't an OpenGL window"); - return; - } - - if (SDL_GL_GetCurrentWindow() != window) { - SDL_SetError("The specified window has not been made current"); - return; - } - - _this->GL_SwapWindow(_this, window); -} - -void -SDL_GL_DeleteContext(SDL_GLContext context) -{ - if (!_this || !context) { - return; - } - - if (SDL_GL_GetCurrentContext() == context) { - SDL_GL_MakeCurrent(NULL, NULL); - } - - _this->GL_DeleteContext(_this, context); -} - -#if 0 /* FIXME */ -/* - * Utility function used by SDL_WM_SetIcon(); flags & 1 for color key, flags - * & 2 for alpha channel. - */ -static void -CreateMaskFromColorKeyOrAlpha(SDL_Surface * icon, Uint8 * mask, int flags) -{ - int x, y; - Uint32 colorkey; -#define SET_MASKBIT(icon, x, y, mask) \ - mask[(y*((icon->w+7)/8))+(x/8)] &= ~(0x01<<(7-(x%8))) - - colorkey = icon->format->colorkey; - switch (icon->format->BytesPerPixel) { - case 1: - { - Uint8 *pixels; - for (y = 0; y < icon->h; ++y) { - pixels = (Uint8 *) icon->pixels + y * icon->pitch; - for (x = 0; x < icon->w; ++x) { - if (*pixels++ == colorkey) { - SET_MASKBIT(icon, x, y, mask); - } - } - } - } - break; - - case 2: - { - Uint16 *pixels; - for (y = 0; y < icon->h; ++y) { - pixels = (Uint16 *) icon->pixels + y * icon->pitch / 2; - for (x = 0; x < icon->w; ++x) { - if ((flags & 1) && *pixels == colorkey) { - SET_MASKBIT(icon, x, y, mask); - } else if ((flags & 2) - && (*pixels & icon->format->Amask) == 0) { - SET_MASKBIT(icon, x, y, mask); - } - pixels++; - } - } - } - break; - - case 4: - { - Uint32 *pixels; - for (y = 0; y < icon->h; ++y) { - pixels = (Uint32 *) icon->pixels + y * icon->pitch / 4; - for (x = 0; x < icon->w; ++x) { - if ((flags & 1) && *pixels == colorkey) { - SET_MASKBIT(icon, x, y, mask); - } else if ((flags & 2) - && (*pixels & icon->format->Amask) == 0) { - SET_MASKBIT(icon, x, y, mask); - } - pixels++; - } - } - } - break; - } -} - -/* - * Sets the window manager icon for the display window. - */ -void -SDL_WM_SetIcon(SDL_Surface * icon, Uint8 * mask) -{ - if (icon && _this->SetIcon) { - /* Generate a mask if necessary, and create the icon! */ - if (mask == NULL) { - int mask_len = icon->h * (icon->w + 7) / 8; - int flags = 0; - mask = (Uint8 *) SDL_malloc(mask_len); - if (mask == NULL) { - return; - } - SDL_memset(mask, ~0, mask_len); - if (icon->flags & SDL_SRCCOLORKEY) - flags |= 1; - if (icon->flags & SDL_SRCALPHA) - flags |= 2; - if (flags) { - CreateMaskFromColorKeyOrAlpha(icon, mask, flags); - } - _this->SetIcon(_this, icon, mask); - SDL_free(mask); - } else { - _this->SetIcon(_this, icon, mask); - } - } -} -#endif - -SDL_bool -SDL_GetWindowWMInfo(SDL_Window * window, struct SDL_SysWMinfo *info) -{ - CHECK_WINDOW_MAGIC(window, SDL_FALSE); - - if (!info) { - SDL_InvalidParamError("info"); - return SDL_FALSE; - } - info->subsystem = SDL_SYSWM_UNKNOWN; - - if (!_this->GetWindowWMInfo) { - SDL_Unsupported(); - return SDL_FALSE; - } - return (_this->GetWindowWMInfo(_this, window, info)); -} - -void -SDL_StartTextInput(void) -{ - SDL_Window *window; - - /* First, enable text events */ - SDL_EventState(SDL_TEXTINPUT, SDL_ENABLE); - SDL_EventState(SDL_TEXTEDITING, SDL_ENABLE); - - /* Then show the on-screen keyboard, if any */ - window = SDL_GetFocusWindow(); - if (window && _this && _this->ShowScreenKeyboard) { - _this->ShowScreenKeyboard(_this, window); - } - - /* Finally start the text input system */ - if (_this && _this->StartTextInput) { - _this->StartTextInput(_this); - } -} - -SDL_bool -SDL_IsTextInputActive(void) -{ - return (SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE); -} - -void -SDL_StopTextInput(void) -{ - SDL_Window *window; - - /* Stop the text input system */ - if (_this && _this->StopTextInput) { - _this->StopTextInput(_this); - } - - /* Hide the on-screen keyboard, if any */ - window = SDL_GetFocusWindow(); - if (window && _this && _this->HideScreenKeyboard) { - _this->HideScreenKeyboard(_this, window); - } - - /* Finally disable text events */ - SDL_EventState(SDL_TEXTINPUT, SDL_DISABLE); - SDL_EventState(SDL_TEXTEDITING, SDL_DISABLE); -} - -void -SDL_SetTextInputRect(SDL_Rect *rect) -{ - if (_this && _this->SetTextInputRect) { - _this->SetTextInputRect(_this, rect); - } -} - -SDL_bool -SDL_HasScreenKeyboardSupport(void) -{ - if (_this && _this->HasScreenKeyboardSupport) { - return _this->HasScreenKeyboardSupport(_this); - } - return SDL_FALSE; -} - -SDL_bool -SDL_IsScreenKeyboardShown(SDL_Window *window) -{ - if (window && _this && _this->IsScreenKeyboardShown) { - return _this->IsScreenKeyboardShown(_this, window); - } - return SDL_FALSE; -} - -#if SDL_VIDEO_DRIVER_ANDROID -#include "android/SDL_androidmessagebox.h" -#endif -#if SDL_VIDEO_DRIVER_WINDOWS -#include "windows/SDL_windowsmessagebox.h" -#endif -#if SDL_VIDEO_DRIVER_WINRT -#include "winrt/SDL_winrtmessagebox.h" -#endif -#if SDL_VIDEO_DRIVER_COCOA -#include "cocoa/SDL_cocoamessagebox.h" -#endif -#if SDL_VIDEO_DRIVER_UIKIT -#include "uikit/SDL_uikitmessagebox.h" -#endif -#if SDL_VIDEO_DRIVER_X11 -#include "x11/SDL_x11messagebox.h" -#endif - -// This function will be unused if none of the above video drivers are present. -SDL_UNUSED static SDL_bool SDL_MessageboxValidForDriver(const SDL_MessageBoxData *messageboxdata, SDL_SYSWM_TYPE drivertype) -{ - SDL_SysWMinfo info; - SDL_Window *window = messageboxdata->window; - - if (!window) { - return SDL_TRUE; - } - - SDL_VERSION(&info.version); - if (!SDL_GetWindowWMInfo(window, &info)) { - return SDL_TRUE; - } else { - return (info.subsystem == drivertype); - } -} - -int -SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ - int dummybutton; - int retval = -1; - SDL_bool relative_mode; - int show_cursor_prev; - SDL_bool mouse_captured; - SDL_Window *current_window; - - if (!messageboxdata) { - return SDL_InvalidParamError("messageboxdata"); - } - - current_window = SDL_GetKeyboardFocus(); - mouse_captured = current_window && ((SDL_GetWindowFlags(current_window) & SDL_WINDOW_MOUSE_CAPTURE) != 0); - relative_mode = SDL_GetRelativeMouseMode(); - SDL_CaptureMouse(SDL_FALSE); - SDL_SetRelativeMouseMode(SDL_FALSE); - show_cursor_prev = SDL_ShowCursor(1); - SDL_ResetKeyboard(); - - if (!buttonid) { - buttonid = &dummybutton; - } - - if (_this && _this->ShowMessageBox) { - retval = _this->ShowMessageBox(_this, messageboxdata, buttonid); - } - - /* It's completely fine to call this function before video is initialized */ -#if SDL_VIDEO_DRIVER_ANDROID - if (retval == -1 && - Android_ShowMessageBox(messageboxdata, buttonid) == 0) { - retval = 0; - } -#endif -#if SDL_VIDEO_DRIVER_WINDOWS - if (retval == -1 && - SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_WINDOWS) && - WIN_ShowMessageBox(messageboxdata, buttonid) == 0) { - retval = 0; - } -#endif -#if SDL_VIDEO_DRIVER_WINRT - if (retval == -1 && - SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_WINRT) && - WINRT_ShowMessageBox(messageboxdata, buttonid) == 0) { - retval = 0; - } -#endif -#if SDL_VIDEO_DRIVER_COCOA - if (retval == -1 && - SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_COCOA) && - Cocoa_ShowMessageBox(messageboxdata, buttonid) == 0) { - retval = 0; - } -#endif -#if SDL_VIDEO_DRIVER_UIKIT - if (retval == -1 && - SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_UIKIT) && - UIKit_ShowMessageBox(messageboxdata, buttonid) == 0) { - retval = 0; - } -#endif -#if SDL_VIDEO_DRIVER_X11 - if (retval == -1 && - SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_X11) && - X11_ShowMessageBox(messageboxdata, buttonid) == 0) { - retval = 0; - } -#endif - if (retval == -1) { - SDL_SetError("No message system available"); - } - - if (current_window) { - SDL_RaiseWindow(current_window); - if (mouse_captured) { - SDL_CaptureMouse(SDL_TRUE); - } - } - - SDL_ShowCursor(show_cursor_prev); - SDL_SetRelativeMouseMode(relative_mode); - - return retval; -} - -int -SDL_ShowSimpleMessageBox(Uint32 flags, const char *title, const char *message, SDL_Window *window) -{ -#ifdef __EMSCRIPTEN__ - /* !!! FIXME: propose a browser API for this, get this #ifdef out of here? */ - /* Web browsers don't (currently) have an API for a custom message box - that can block, but for the most common case (SDL_ShowSimpleMessageBox), - we can use the standard Javascript alert() function. */ - EM_ASM_({ - alert(UTF8ToString($0) + "\n\n" + UTF8ToString($1)); - }, title, message); - return 0; -#else - SDL_MessageBoxData data; - SDL_MessageBoxButtonData button; - - SDL_zero(data); - data.flags = flags; - data.title = title; - data.message = message; - data.numbuttons = 1; - data.buttons = &button; - data.window = window; - - SDL_zero(button); - button.flags |= SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT; - button.flags |= SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT; - button.text = "OK"; - - return SDL_ShowMessageBox(&data, NULL); -#endif -} - -SDL_bool -SDL_ShouldAllowTopmost(void) -{ - return SDL_GetHintBoolean(SDL_HINT_ALLOW_TOPMOST, SDL_TRUE); -} - -int -SDL_SetWindowHitTest(SDL_Window * window, SDL_HitTest callback, void *userdata) -{ - CHECK_WINDOW_MAGIC(window, -1); - - if (!_this->SetWindowHitTest) { - return SDL_Unsupported(); - } else if (_this->SetWindowHitTest(window, callback != NULL) == -1) { - return -1; - } - - window->hit_test = callback; - window->hit_test_data = userdata; - - return 0; -} - -float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches) -{ - float den2 = hinches * hinches + vinches * vinches; - if ( den2 <= 0.0f ) { - return 0.0f; - } - - return (float)(SDL_sqrt((double)hpix * (double)hpix + (double)vpix * (double)vpix) / - SDL_sqrt((double)den2)); -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidclipboard.c b/3rdparty/SDL2/src/video/android/SDL_androidclipboard.c deleted file mode 100644 index b996e7a409f..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidclipboard.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_ANDROID - -#include "SDL_androidvideo.h" - -#include "../../core/android/SDL_android.h" - -int -Android_SetClipboardText(_THIS, const char *text) -{ - return Android_JNI_SetClipboardText(text); -} - -char * -Android_GetClipboardText(_THIS) -{ - return Android_JNI_GetClipboardText(); -} - -SDL_bool Android_HasClipboardText(_THIS) -{ - return Android_JNI_HasClipboardText(); -} - -#endif /* SDL_VIDEO_DRIVER_ANDROID */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidclipboard.h b/3rdparty/SDL2/src/video/android/SDL_androidclipboard.h deleted file mode 100644 index a61045ae8f5..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidclipboard.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_androidclipboard_h -#define _SDL_androidclipboard_h - -extern int Android_SetClipboardText(_THIS, const char *text); -extern char *Android_GetClipboardText(_THIS); -extern SDL_bool Android_HasClipboardText(_THIS); - -#endif /* _SDL_androidclipboard_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidevents.c b/3rdparty/SDL2/src/video/android/SDL_androidevents.c deleted file mode 100644 index c3cd4cc1b5b..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidevents.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_ANDROID - -/* We're going to do this by default */ -#define SDL_ANDROID_BLOCK_ON_PAUSE 1 - -#include "SDL_androidevents.h" -#include "SDL_events.h" -#include "SDL_androidwindow.h" - - -void android_egl_context_backup(); -void android_egl_context_restore(); - -#if SDL_AUDIO_DRIVER_ANDROID -void ANDROIDAUDIO_ResumeDevices(void); -void ANDROIDAUDIO_PauseDevices(void); -#else -static void ANDROIDAUDIO_ResumeDevices(void) {} -static void ANDROIDAUDIO_PauseDevices(void) {} -#endif - -void -android_egl_context_restore() -{ - SDL_Event event; - SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata; - if (SDL_GL_MakeCurrent(Android_Window, (SDL_GLContext) data->egl_context) < 0) { - /* The context is no longer valid, create a new one */ - data->egl_context = (EGLContext) SDL_GL_CreateContext(Android_Window); - SDL_GL_MakeCurrent(Android_Window, (SDL_GLContext) data->egl_context); - event.type = SDL_RENDER_DEVICE_RESET; - SDL_PushEvent(&event); - } -} - -void -android_egl_context_backup() -{ - /* Keep a copy of the EGL Context so we can try to restore it when we resume */ - SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata; - data->egl_context = SDL_GL_GetCurrentContext(); - /* We need to do this so the EGLSurface can be freed */ - SDL_GL_MakeCurrent(Android_Window, NULL); -} - -void -Android_PumpEvents(_THIS) -{ - static int isPaused = 0; -#if SDL_ANDROID_BLOCK_ON_PAUSE - static int isPausing = 0; -#endif - /* No polling necessary */ - - /* - * Android_ResumeSem and Android_PauseSem are signaled from Java_org_libsdl_app_SDLActivity_nativePause and Java_org_libsdl_app_SDLActivity_nativeResume - * When the pause semaphore is signaled, if SDL_ANDROID_BLOCK_ON_PAUSE is defined the event loop will block until the resume signal is emitted. - */ - -#if SDL_ANDROID_BLOCK_ON_PAUSE - if (isPaused && !isPausing) { - /* Make sure this is the last thing we do before pausing */ - android_egl_context_backup(); - ANDROIDAUDIO_PauseDevices(); - if(SDL_SemWait(Android_ResumeSem) == 0) { -#else - if (isPaused) { - if(SDL_SemTryWait(Android_ResumeSem) == 0) { -#endif - isPaused = 0; - ANDROIDAUDIO_ResumeDevices(); - /* Restore the GL Context from here, as this operation is thread dependent */ - if (!SDL_HasEvent(SDL_QUIT)) { - android_egl_context_restore(); - } - } - } - else { -#if SDL_ANDROID_BLOCK_ON_PAUSE - if( isPausing || SDL_SemTryWait(Android_PauseSem) == 0 ) { - /* We've been signaled to pause, but before we block ourselves, - we need to make sure that certain key events have reached the app */ - if (SDL_HasEvent(SDL_WINDOWEVENT) || SDL_HasEvent(SDL_APP_WILLENTERBACKGROUND) || SDL_HasEvent(SDL_APP_DIDENTERBACKGROUND) ) { - isPausing = 1; - } - else { - isPausing = 0; - isPaused = 1; - } - } -#else - if(SDL_SemTryWait(Android_PauseSem) == 0) { - android_egl_context_backup(); - ANDROIDAUDIO_PauseDevices(); - isPaused = 1; - } -#endif - } -} - -#endif /* SDL_VIDEO_DRIVER_ANDROID */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidevents.h b/3rdparty/SDL2/src/video/android/SDL_androidevents.h deleted file mode 100644 index 4a2230e2055..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidevents.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#include "SDL_androidvideo.h" - -extern void Android_PumpEvents(_THIS); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidgl.c b/3rdparty/SDL2/src/video/android/SDL_androidgl.c deleted file mode 100644 index 4cfe86357c0..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidgl.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_ANDROID - -/* Android SDL video driver implementation */ - -#include "SDL_video.h" -#include "../SDL_egl_c.h" -#include "SDL_androidwindow.h" - -#include "SDL_androidvideo.h" -#include "../../core/android/SDL_android.h" - -#include <android/log.h> - -#include <dlfcn.h> - -SDL_EGL_CreateContext_impl(Android) -SDL_EGL_MakeCurrent_impl(Android) - -void -Android_GLES_SwapWindow(_THIS, SDL_Window * window) -{ - /* The following two calls existed in the original Java code - * If you happen to have a device that's affected by their removal, - * please report to Bugzilla. -- Gabriel - */ - - /*_this->egl_data->eglWaitNative(EGL_CORE_NATIVE_ENGINE); - _this->egl_data->eglWaitGL();*/ - SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface); -} - -int -Android_GLES_LoadLibrary(_THIS, const char *path) { - return SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) 0); -} - -#endif /* SDL_VIDEO_DRIVER_ANDROID */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidkeyboard.c b/3rdparty/SDL2/src/video/android/SDL_androidkeyboard.c deleted file mode 100644 index 652e0cca701..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidkeyboard.c +++ /dev/null @@ -1,391 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_ANDROID - -#include <android/log.h> - -#include "../../events/SDL_events_c.h" - -#include "SDL_androidkeyboard.h" - -#include "../../core/android/SDL_android.h" - -void Android_InitKeyboard(void) -{ - SDL_Keycode keymap[SDL_NUM_SCANCODES]; - - /* Add default scancode to key mapping */ - SDL_GetDefaultKeymap(keymap); - SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); -} - -static SDL_Scancode Android_Keycodes[] = { - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_UNKNOWN */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SOFT_LEFT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SOFT_RIGHT */ - SDL_SCANCODE_AC_HOME, /* AKEYCODE_HOME */ - SDL_SCANCODE_AC_BACK, /* AKEYCODE_BACK */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CALL */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ENDCALL */ - SDL_SCANCODE_0, /* AKEYCODE_0 */ - SDL_SCANCODE_1, /* AKEYCODE_1 */ - SDL_SCANCODE_2, /* AKEYCODE_2 */ - SDL_SCANCODE_3, /* AKEYCODE_3 */ - SDL_SCANCODE_4, /* AKEYCODE_4 */ - SDL_SCANCODE_5, /* AKEYCODE_5 */ - SDL_SCANCODE_6, /* AKEYCODE_6 */ - SDL_SCANCODE_7, /* AKEYCODE_7 */ - SDL_SCANCODE_8, /* AKEYCODE_8 */ - SDL_SCANCODE_9, /* AKEYCODE_9 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STAR */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_POUND */ - SDL_SCANCODE_UP, /* AKEYCODE_DPAD_UP */ - SDL_SCANCODE_DOWN, /* AKEYCODE_DPAD_DOWN */ - SDL_SCANCODE_LEFT, /* AKEYCODE_DPAD_LEFT */ - SDL_SCANCODE_RIGHT, /* AKEYCODE_DPAD_RIGHT */ - SDL_SCANCODE_SELECT, /* AKEYCODE_DPAD_CENTER */ - SDL_SCANCODE_VOLUMEUP, /* AKEYCODE_VOLUME_UP */ - SDL_SCANCODE_VOLUMEDOWN, /* AKEYCODE_VOLUME_DOWN */ - SDL_SCANCODE_POWER, /* AKEYCODE_POWER */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CAMERA */ - SDL_SCANCODE_CLEAR, /* AKEYCODE_CLEAR */ - SDL_SCANCODE_A, /* AKEYCODE_A */ - SDL_SCANCODE_B, /* AKEYCODE_B */ - SDL_SCANCODE_C, /* AKEYCODE_C */ - SDL_SCANCODE_D, /* AKEYCODE_D */ - SDL_SCANCODE_E, /* AKEYCODE_E */ - SDL_SCANCODE_F, /* AKEYCODE_F */ - SDL_SCANCODE_G, /* AKEYCODE_G */ - SDL_SCANCODE_H, /* AKEYCODE_H */ - SDL_SCANCODE_I, /* AKEYCODE_I */ - SDL_SCANCODE_J, /* AKEYCODE_J */ - SDL_SCANCODE_K, /* AKEYCODE_K */ - SDL_SCANCODE_L, /* AKEYCODE_L */ - SDL_SCANCODE_M, /* AKEYCODE_M */ - SDL_SCANCODE_N, /* AKEYCODE_N */ - SDL_SCANCODE_O, /* AKEYCODE_O */ - SDL_SCANCODE_P, /* AKEYCODE_P */ - SDL_SCANCODE_Q, /* AKEYCODE_Q */ - SDL_SCANCODE_R, /* AKEYCODE_R */ - SDL_SCANCODE_S, /* AKEYCODE_S */ - SDL_SCANCODE_T, /* AKEYCODE_T */ - SDL_SCANCODE_U, /* AKEYCODE_U */ - SDL_SCANCODE_V, /* AKEYCODE_V */ - SDL_SCANCODE_W, /* AKEYCODE_W */ - SDL_SCANCODE_X, /* AKEYCODE_X */ - SDL_SCANCODE_Y, /* AKEYCODE_Y */ - SDL_SCANCODE_Z, /* AKEYCODE_Z */ - SDL_SCANCODE_COMMA, /* AKEYCODE_COMMA */ - SDL_SCANCODE_PERIOD, /* AKEYCODE_PERIOD */ - SDL_SCANCODE_LALT, /* AKEYCODE_ALT_LEFT */ - SDL_SCANCODE_RALT, /* AKEYCODE_ALT_RIGHT */ - SDL_SCANCODE_LSHIFT, /* AKEYCODE_SHIFT_LEFT */ - SDL_SCANCODE_RSHIFT, /* AKEYCODE_SHIFT_RIGHT */ - SDL_SCANCODE_TAB, /* AKEYCODE_TAB */ - SDL_SCANCODE_SPACE, /* AKEYCODE_SPACE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SYM */ - SDL_SCANCODE_WWW, /* AKEYCODE_EXPLORER */ - SDL_SCANCODE_MAIL, /* AKEYCODE_ENVELOPE */ - SDL_SCANCODE_RETURN, /* AKEYCODE_ENTER */ - SDL_SCANCODE_BACKSPACE, /* AKEYCODE_DEL */ - SDL_SCANCODE_GRAVE, /* AKEYCODE_GRAVE */ - SDL_SCANCODE_MINUS, /* AKEYCODE_MINUS */ - SDL_SCANCODE_EQUALS, /* AKEYCODE_EQUALS */ - SDL_SCANCODE_LEFTBRACKET, /* AKEYCODE_LEFT_BRACKET */ - SDL_SCANCODE_RIGHTBRACKET, /* AKEYCODE_RIGHT_BRACKET */ - SDL_SCANCODE_BACKSLASH, /* AKEYCODE_BACKSLASH */ - SDL_SCANCODE_SEMICOLON, /* AKEYCODE_SEMICOLON */ - SDL_SCANCODE_APOSTROPHE, /* AKEYCODE_APOSTROPHE */ - SDL_SCANCODE_SLASH, /* AKEYCODE_SLASH */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_AT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NUM */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_HEADSETHOOK */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_FOCUS */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PLUS */ - SDL_SCANCODE_MENU, /* AKEYCODE_MENU */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NOTIFICATION */ - SDL_SCANCODE_AC_SEARCH, /* AKEYCODE_SEARCH */ - SDL_SCANCODE_AUDIOPLAY, /* AKEYCODE_MEDIA_PLAY_PAUSE */ - SDL_SCANCODE_AUDIOSTOP, /* AKEYCODE_MEDIA_STOP */ - SDL_SCANCODE_AUDIONEXT, /* AKEYCODE_MEDIA_NEXT */ - SDL_SCANCODE_AUDIOPREV, /* AKEYCODE_MEDIA_PREVIOUS */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_REWIND */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_FAST_FORWARD */ - SDL_SCANCODE_MUTE, /* AKEYCODE_MUTE */ - SDL_SCANCODE_PAGEUP, /* AKEYCODE_PAGE_UP */ - SDL_SCANCODE_PAGEDOWN, /* AKEYCODE_PAGE_DOWN */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PICTSYMBOLS */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SWITCH_CHARSET */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_A */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_B */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_C */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_X */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_Y */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_Z */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_L1 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_R1 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_L2 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_R2 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_THUMBL */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_THUMBR */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_START */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_SELECT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_MODE */ - SDL_SCANCODE_ESCAPE, /* AKEYCODE_ESCAPE */ - SDL_SCANCODE_DELETE, /* AKEYCODE_FORWARD_DEL */ - SDL_SCANCODE_LCTRL, /* AKEYCODE_CTRL_LEFT */ - SDL_SCANCODE_RCTRL, /* AKEYCODE_CTRL_RIGHT */ - SDL_SCANCODE_CAPSLOCK, /* AKEYCODE_CAPS_LOCK */ - SDL_SCANCODE_SCROLLLOCK, /* AKEYCODE_SCROLL_LOCK */ - SDL_SCANCODE_LGUI, /* AKEYCODE_META_LEFT */ - SDL_SCANCODE_RGUI, /* AKEYCODE_META_RIGHT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_FUNCTION */ - SDL_SCANCODE_PRINTSCREEN, /* AKEYCODE_SYSRQ */ - SDL_SCANCODE_PAUSE, /* AKEYCODE_BREAK */ - SDL_SCANCODE_HOME, /* AKEYCODE_MOVE_HOME */ - SDL_SCANCODE_END, /* AKEYCODE_MOVE_END */ - SDL_SCANCODE_INSERT, /* AKEYCODE_INSERT */ - SDL_SCANCODE_AC_FORWARD, /* AKEYCODE_FORWARD */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_PLAY */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_PAUSE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_CLOSE */ - SDL_SCANCODE_EJECT, /* AKEYCODE_MEDIA_EJECT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_RECORD */ - SDL_SCANCODE_F1, /* AKEYCODE_F1 */ - SDL_SCANCODE_F2, /* AKEYCODE_F2 */ - SDL_SCANCODE_F3, /* AKEYCODE_F3 */ - SDL_SCANCODE_F4, /* AKEYCODE_F4 */ - SDL_SCANCODE_F5, /* AKEYCODE_F5 */ - SDL_SCANCODE_F6, /* AKEYCODE_F6 */ - SDL_SCANCODE_F7, /* AKEYCODE_F7 */ - SDL_SCANCODE_F8, /* AKEYCODE_F8 */ - SDL_SCANCODE_F9, /* AKEYCODE_F9 */ - SDL_SCANCODE_F10, /* AKEYCODE_F10 */ - SDL_SCANCODE_F11, /* AKEYCODE_F11 */ - SDL_SCANCODE_F12, /* AKEYCODE_F12 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NUM_LOCK */ - SDL_SCANCODE_KP_0, /* AKEYCODE_NUMPAD_0 */ - SDL_SCANCODE_KP_1, /* AKEYCODE_NUMPAD_1 */ - SDL_SCANCODE_KP_2, /* AKEYCODE_NUMPAD_2 */ - SDL_SCANCODE_KP_3, /* AKEYCODE_NUMPAD_3 */ - SDL_SCANCODE_KP_4, /* AKEYCODE_NUMPAD_4 */ - SDL_SCANCODE_KP_5, /* AKEYCODE_NUMPAD_5 */ - SDL_SCANCODE_KP_6, /* AKEYCODE_NUMPAD_6 */ - SDL_SCANCODE_KP_7, /* AKEYCODE_NUMPAD_7 */ - SDL_SCANCODE_KP_8, /* AKEYCODE_NUMPAD_8 */ - SDL_SCANCODE_KP_9, /* AKEYCODE_NUMPAD_9 */ - SDL_SCANCODE_KP_DIVIDE, /* AKEYCODE_NUMPAD_DIVIDE */ - SDL_SCANCODE_KP_MULTIPLY, /* AKEYCODE_NUMPAD_MULTIPLY */ - SDL_SCANCODE_KP_MINUS, /* AKEYCODE_NUMPAD_SUBTRACT */ - SDL_SCANCODE_KP_PLUS, /* AKEYCODE_NUMPAD_ADD */ - SDL_SCANCODE_KP_PERIOD, /* AKEYCODE_NUMPAD_DOT */ - SDL_SCANCODE_KP_COMMA, /* AKEYCODE_NUMPAD_COMMA */ - SDL_SCANCODE_KP_ENTER, /* AKEYCODE_NUMPAD_ENTER */ - SDL_SCANCODE_KP_EQUALS, /* AKEYCODE_NUMPAD_EQUALS */ - SDL_SCANCODE_KP_LEFTPAREN, /* AKEYCODE_NUMPAD_LEFT_PAREN */ - SDL_SCANCODE_KP_RIGHTPAREN, /* AKEYCODE_NUMPAD_RIGHT_PAREN */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_VOLUME_MUTE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_INFO */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CHANNEL_UP */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CHANNEL_DOWN */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ZOOM_IN */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ZOOM_OUT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_WINDOW */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_GUIDE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DVR */ - SDL_SCANCODE_AC_BOOKMARKS, /* AKEYCODE_BOOKMARK */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CAPTIONS */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SETTINGS */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_POWER */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STB_POWER */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STB_INPUT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_AVR_POWER */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_AVR_INPUT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_RED */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_GREEN */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_YELLOW */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_BLUE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_APP_SWITCH */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_1 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_2 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_3 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_4 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_5 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_6 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_7 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_8 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_9 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_10 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_11 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_12 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_13 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_14 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_15 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_16 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_LANGUAGE_SWITCH */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MANNER_MODE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_3D_MODE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CONTACTS */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CALENDAR */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MUSIC */ - SDL_SCANCODE_CALCULATOR, /* AKEYCODE_CALCULATOR */ - SDL_SCANCODE_LANG5, /* AKEYCODE_ZENKAKU_HANKAKU */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_EISU */ - SDL_SCANCODE_INTERNATIONAL5, /* AKEYCODE_MUHENKAN */ - SDL_SCANCODE_INTERNATIONAL4, /* AKEYCODE_HENKAN */ - SDL_SCANCODE_LANG3, /* AKEYCODE_KATAKANA_HIRAGANA */ - SDL_SCANCODE_INTERNATIONAL3, /* AKEYCODE_YEN */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_RO */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_KANA */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ASSIST */ - SDL_SCANCODE_BRIGHTNESSDOWN, /* AKEYCODE_BRIGHTNESS_DOWN */ - SDL_SCANCODE_BRIGHTNESSUP, /* AKEYCODE_BRIGHTNESS_UP */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_AUDIO_TRACK */ - SDL_SCANCODE_SLEEP, /* AKEYCODE_SLEEP */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_WAKEUP */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PAIRING */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_TOP_MENU */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_11 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_12 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_LAST_CHANNEL */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_DATA_SERVICE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_VOICE_ASSIST */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_RADIO_SERVICE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_TELETEXT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_NUMBER_ENTRY */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_TERRESTRIAL_ANALOG */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_TERRESTRIAL_DIGITAL */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_SATELLITE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_SATELLITE_BS */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_SATELLITE_CS */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_SATELLITE_SERVICE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_NETWORK */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_ANTENNA_CABLE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_HDMI_1 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_HDMI_2 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_HDMI_3 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_HDMI_4 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_COMPOSITE_1 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_COMPOSITE_2 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_COMPONENT_1 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_COMPONENT_2 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_VGA_1 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_AUDIO_DESCRIPTION */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_ZOOM_MODE */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_CONTENTS_MENU */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_MEDIA_CONTEXT_MENU */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_TIMER_PROGRAMMING */ - SDL_SCANCODE_HELP, /* AKEYCODE_HELP */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NAVIGATE_PREVIOUS */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NAVIGATE_NEXT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NAVIGATE_IN */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NAVIGATE_OUT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STEM_PRIMARY */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STEM_1 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STEM_2 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STEM_3 */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DPAD_UP_LEFT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DPAD_DOWN_LEFT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DPAD_UP_RIGHT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DPAD_DOWN_RIGHT */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_SKIP_FORWARD */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_SKIP_BACKWARD */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_STEP_FORWARD */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_STEP_BACKWARD */ - SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SOFT_SLEEP */ - SDL_SCANCODE_CUT, /* AKEYCODE_CUT */ - SDL_SCANCODE_COPY, /* AKEYCODE_COPY */ - SDL_SCANCODE_PASTE, /* AKEYCODE_PASTE */ -}; - -static SDL_Scancode -TranslateKeycode(int keycode) -{ - SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN; - - if (keycode < SDL_arraysize(Android_Keycodes)) { - scancode = Android_Keycodes[keycode]; - } - if (scancode == SDL_SCANCODE_UNKNOWN) { - __android_log_print(ANDROID_LOG_INFO, "SDL", "Unknown keycode %d", keycode); - } - return scancode; -} - -int -Android_OnKeyDown(int keycode) -{ - return SDL_SendKeyboardKey(SDL_PRESSED, TranslateKeycode(keycode)); -} - -int -Android_OnKeyUp(int keycode) -{ - return SDL_SendKeyboardKey(SDL_RELEASED, TranslateKeycode(keycode)); -} - -SDL_bool -Android_HasScreenKeyboardSupport(_THIS) -{ - return SDL_TRUE; -} - -SDL_bool -Android_IsScreenKeyboardShown(_THIS, SDL_Window * window) -{ - return SDL_IsTextInputActive(); -} - -void -Android_StartTextInput(_THIS) -{ - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - Android_JNI_ShowTextInput(&videodata->textRect); -} - -void -Android_StopTextInput(_THIS) -{ - Android_JNI_HideTextInput(); -} - -void -Android_SetTextInputRect(_THIS, SDL_Rect *rect) -{ - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - - if (!rect) { - SDL_InvalidParamError("rect"); - return; - } - - videodata->textRect = *rect; -} - -#endif /* SDL_VIDEO_DRIVER_ANDROID */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidkeyboard.h b/3rdparty/SDL2/src/video/android/SDL_androidkeyboard.h deleted file mode 100644 index ced9bc24e97..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidkeyboard.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#include "SDL_androidvideo.h" - -extern void Android_InitKeyboard(void); -extern int Android_OnKeyDown(int keycode); -extern int Android_OnKeyUp(int keycode); - -extern SDL_bool Android_HasScreenKeyboardSupport(_THIS); -extern SDL_bool Android_IsScreenKeyboardShown(_THIS, SDL_Window * window); - -extern void Android_StartTextInput(_THIS); -extern void Android_StopTextInput(_THIS); -extern void Android_SetTextInputRect(_THIS, SDL_Rect *rect); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidmessagebox.c b/3rdparty/SDL2/src/video/android/SDL_androidmessagebox.c deleted file mode 100644 index 61f67636a19..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidmessagebox.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_ANDROID - -#include "SDL_messagebox.h" - -int -Android_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ - int Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); - - return Android_JNI_ShowMessageBox(messageboxdata, buttonid); -} - -#endif /* SDL_VIDEO_DRIVER_ANDROID */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidmessagebox.h b/3rdparty/SDL2/src/video/android/SDL_androidmessagebox.h deleted file mode 100644 index 3c680c62ffd..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidmessagebox.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_ANDROID - -extern int Android_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); - -#endif /* SDL_VIDEO_DRIVER_ANDROID */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidmouse.c b/3rdparty/SDL2/src/video/android/SDL_androidmouse.c deleted file mode 100644 index 883fa8d226f..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidmouse.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_ANDROID - -#include "SDL_androidmouse.h" - -#include "SDL_events.h" -#include "../../events/SDL_mouse_c.h" - -#include "../../core/android/SDL_android.h" - -#define ACTION_DOWN 0 -#define ACTION_UP 1 -#define ACTION_MOVE 2 -#define ACTION_HOVER_MOVE 7 -#define ACTION_SCROLL 8 -#define BUTTON_PRIMARY 1 -#define BUTTON_SECONDARY 2 -#define BUTTON_TERTIARY 4 -#define BUTTON_BACK 8 -#define BUTTON_FORWARD 16 - -static Uint8 SDLButton; - -void -Android_InitMouse(void) -{ - SDLButton = 0; -} - -void Android_OnMouse( int androidButton, int action, float x, float y) { - if (!Android_Window) { - return; - } - - switch(action) { - case ACTION_DOWN: - // Determine which button originated the event, and store it for ACTION_UP - SDLButton = SDL_BUTTON_LEFT; - if (androidButton == BUTTON_SECONDARY) { - SDLButton = SDL_BUTTON_RIGHT; - } else if (androidButton == BUTTON_TERTIARY) { - SDLButton = SDL_BUTTON_MIDDLE; - } else if (androidButton == BUTTON_FORWARD) { - SDLButton = SDL_BUTTON_X1; - } else if (androidButton == BUTTON_BACK) { - SDLButton = SDL_BUTTON_X2; - } - SDL_SendMouseMotion(Android_Window, 0, 0, x, y); - SDL_SendMouseButton(Android_Window, 0, SDL_PRESSED, SDLButton); - break; - - case ACTION_UP: - // Android won't give us the button that originated the ACTION_DOWN event, so we'll - // assume it's the one we stored - SDL_SendMouseMotion(Android_Window, 0, 0, x, y); - SDL_SendMouseButton(Android_Window, 0, SDL_RELEASED, SDLButton); - break; - - case ACTION_MOVE: - case ACTION_HOVER_MOVE: - SDL_SendMouseMotion(Android_Window, 0, 0, x, y); - break; - - case ACTION_SCROLL: - SDL_SendMouseWheel(Android_Window, 0, x, y, SDL_MOUSEWHEEL_NORMAL); - break; - - default: - break; - } -} - -#endif /* SDL_VIDEO_DRIVER_ANDROID */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/android/SDL_androidmouse.h b/3rdparty/SDL2/src/video/android/SDL_androidmouse.h deleted file mode 100644 index a64e06d5183..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidmouse.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_androidmouse_h -#define _SDL_androidmouse_h - -#include "SDL_androidvideo.h" - -extern void Android_InitMouse(void); -extern void Android_OnMouse( int button, int action, float x, float y); - -#endif /* _SDL_androidmouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidtouch.c b/3rdparty/SDL2/src/video/android/SDL_androidtouch.c deleted file mode 100644 index 0ff11ef576f..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidtouch.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_ANDROID - -#include <android/log.h> - -#include "SDL_hints.h" -#include "SDL_events.h" -#include "SDL_log.h" -#include "SDL_androidtouch.h" -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_touch_c.h" -#include "../../core/android/SDL_android.h" - -#define ACTION_DOWN 0 -#define ACTION_UP 1 -#define ACTION_MOVE 2 -#define ACTION_CANCEL 3 -#define ACTION_OUTSIDE 4 -#define ACTION_POINTER_DOWN 5 -#define ACTION_POINTER_UP 6 - -static void Android_GetWindowCoordinates(float x, float y, - int *window_x, int *window_y) -{ - int window_w, window_h; - - SDL_GetWindowSize(Android_Window, &window_w, &window_h); - *window_x = (int)(x * window_w); - *window_y = (int)(y * window_h); -} - -static SDL_bool separate_mouse_and_touch = SDL_FALSE; - -static void -SeparateEventsHintWatcher(void *userdata, const char *name, - const char *oldValue, const char *newValue) -{ - jclass mActivityClass = Android_JNI_GetActivityClass(); - JNIEnv *env = Android_JNI_GetEnv(); - jfieldID fid = (*env)->GetStaticFieldID(env, mActivityClass, "mSeparateMouseAndTouch", "Z"); - - separate_mouse_and_touch = (newValue && (SDL_strcmp(newValue, "1") == 0)); - (*env)->SetStaticBooleanField(env, mActivityClass, fid, separate_mouse_and_touch ? JNI_TRUE : JNI_FALSE); -} - -void Android_InitTouch(void) -{ - int i; - int* ids; - const int number = Android_JNI_GetTouchDeviceIds(&ids); - - SDL_AddHintCallback(SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH, - SeparateEventsHintWatcher, NULL); - - if (0 < number) { - for (i = 0; i < number; ++i) { - SDL_AddTouch((SDL_TouchID) ids[i], ""); /* no error handling */ - } - SDL_free(ids); - } -} - -void Android_QuitTouch(void) -{ - SDL_DelHintCallback(SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH, - SeparateEventsHintWatcher, NULL); - separate_mouse_and_touch = SDL_FALSE; -} - -void Android_OnTouch(int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p) -{ - SDL_TouchID touchDeviceId = 0; - SDL_FingerID fingerId = 0; - int window_x, window_y; - static SDL_FingerID pointerFingerID = 0; - - if (!Android_Window) { - return; - } - - touchDeviceId = (SDL_TouchID)touch_device_id_in; - if (SDL_AddTouch(touchDeviceId, "") < 0) { - SDL_Log("error: can't add touch %s, %d", __FILE__, __LINE__); - } - - fingerId = (SDL_FingerID)pointer_finger_id_in; - switch (action) { - case ACTION_DOWN: - /* Primary pointer down */ - if (!separate_mouse_and_touch) { - Android_GetWindowCoordinates(x, y, &window_x, &window_y); - /* send moved event */ - SDL_SendMouseMotion(Android_Window, SDL_TOUCH_MOUSEID, 0, window_x, window_y); - /* send mouse down event */ - SDL_SendMouseButton(Android_Window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT); - } - pointerFingerID = fingerId; - case ACTION_POINTER_DOWN: - /* Non primary pointer down */ - SDL_SendTouch(touchDeviceId, fingerId, SDL_TRUE, x, y, p); - break; - - case ACTION_MOVE: - if (!pointerFingerID) { - if (!separate_mouse_and_touch) { - Android_GetWindowCoordinates(x, y, &window_x, &window_y); - /* send moved event */ - SDL_SendMouseMotion(Android_Window, SDL_TOUCH_MOUSEID, 0, window_x, window_y); - } - } - SDL_SendTouchMotion(touchDeviceId, fingerId, x, y, p); - break; - - case ACTION_UP: - /* Primary pointer up */ - if (!separate_mouse_and_touch) { - /* send mouse up */ - SDL_SendMouseButton(Android_Window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT); - } - pointerFingerID = (SDL_FingerID) 0; - case ACTION_POINTER_UP: - /* Non primary pointer up */ - SDL_SendTouch(touchDeviceId, fingerId, SDL_FALSE, x, y, p); - break; - - default: - break; - } -} - -#endif /* SDL_VIDEO_DRIVER_ANDROID */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidtouch.h b/3rdparty/SDL2/src/video/android/SDL_androidtouch.h deleted file mode 100644 index 2ad096ce80e..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidtouch.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#include "SDL_androidvideo.h" - -extern void Android_InitTouch(void); -extern void Android_QuitTouch(void); -extern void Android_OnTouch( int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidvideo.c b/3rdparty/SDL2/src/video/android/SDL_androidvideo.c deleted file mode 100644 index 178a3e69166..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidvideo.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_ANDROID - -/* Android SDL video driver implementation -*/ - -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../../events/SDL_events_c.h" -#include "../../events/SDL_windowevents_c.h" - -#include "SDL_androidvideo.h" -#include "SDL_androidclipboard.h" -#include "SDL_androidevents.h" -#include "SDL_androidkeyboard.h" -#include "SDL_androidmouse.h" -#include "SDL_androidtouch.h" -#include "SDL_androidwindow.h" - -#define ANDROID_VID_DRIVER_NAME "Android" - -/* Initialization/Query functions */ -static int Android_VideoInit(_THIS); -static void Android_VideoQuit(_THIS); - -#include "../SDL_egl_c.h" -/* GL functions (SDL_androidgl.c) */ -extern SDL_GLContext Android_GLES_CreateContext(_THIS, SDL_Window * window); -extern int Android_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); -extern void Android_GLES_SwapWindow(_THIS, SDL_Window * window); -extern int Android_GLES_LoadLibrary(_THIS, const char *path); -#define Android_GLES_GetProcAddress SDL_EGL_GetProcAddress -#define Android_GLES_UnloadLibrary SDL_EGL_UnloadLibrary -#define Android_GLES_SetSwapInterval SDL_EGL_SetSwapInterval -#define Android_GLES_GetSwapInterval SDL_EGL_GetSwapInterval -#define Android_GLES_DeleteContext SDL_EGL_DeleteContext - -/* Android driver bootstrap functions */ - - -/* These are filled in with real values in Android_SetScreenResolution on init (before SDL_main()) */ -int Android_ScreenWidth = 0; -int Android_ScreenHeight = 0; -Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN; -int Android_ScreenRate = 0; - -SDL_sem *Android_PauseSem = NULL, *Android_ResumeSem = NULL; - -/* Currently only one window */ -SDL_Window *Android_Window = NULL; - -static int -Android_Available(void) -{ - return 1; -} - -static void -Android_SuspendScreenSaver(_THIS) -{ - Android_JNI_SuspendScreenSaver(_this->suspend_screensaver); -} - -static void -Android_DeleteDevice(SDL_VideoDevice * device) -{ - SDL_free(device->driverdata); - SDL_free(device); -} - -static SDL_VideoDevice * -Android_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - SDL_VideoData *data; - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (!device) { - SDL_OutOfMemory(); - return NULL; - } - - data = (SDL_VideoData*) SDL_calloc(1, sizeof(SDL_VideoData)); - if (!data) { - SDL_OutOfMemory(); - SDL_free(device); - return NULL; - } - - device->driverdata = data; - - /* Set the function pointers */ - device->VideoInit = Android_VideoInit; - device->VideoQuit = Android_VideoQuit; - device->PumpEvents = Android_PumpEvents; - - device->CreateWindow = Android_CreateWindow; - device->SetWindowTitle = Android_SetWindowTitle; - device->DestroyWindow = Android_DestroyWindow; - device->GetWindowWMInfo = Android_GetWindowWMInfo; - - device->free = Android_DeleteDevice; - - /* GL pointers */ - device->GL_LoadLibrary = Android_GLES_LoadLibrary; - device->GL_GetProcAddress = Android_GLES_GetProcAddress; - device->GL_UnloadLibrary = Android_GLES_UnloadLibrary; - device->GL_CreateContext = Android_GLES_CreateContext; - device->GL_MakeCurrent = Android_GLES_MakeCurrent; - device->GL_SetSwapInterval = Android_GLES_SetSwapInterval; - device->GL_GetSwapInterval = Android_GLES_GetSwapInterval; - device->GL_SwapWindow = Android_GLES_SwapWindow; - device->GL_DeleteContext = Android_GLES_DeleteContext; - - /* Screensaver */ - device->SuspendScreenSaver = Android_SuspendScreenSaver; - - /* Text input */ - device->StartTextInput = Android_StartTextInput; - device->StopTextInput = Android_StopTextInput; - device->SetTextInputRect = Android_SetTextInputRect; - - /* Screen keyboard */ - device->HasScreenKeyboardSupport = Android_HasScreenKeyboardSupport; - device->IsScreenKeyboardShown = Android_IsScreenKeyboardShown; - - /* Clipboard */ - device->SetClipboardText = Android_SetClipboardText; - device->GetClipboardText = Android_GetClipboardText; - device->HasClipboardText = Android_HasClipboardText; - - return device; -} - -VideoBootStrap Android_bootstrap = { - ANDROID_VID_DRIVER_NAME, "SDL Android video driver", - Android_Available, Android_CreateDevice -}; - - -int -Android_VideoInit(_THIS) -{ - SDL_DisplayMode mode; - - mode.format = Android_ScreenFormat; - mode.w = Android_ScreenWidth; - mode.h = Android_ScreenHeight; - mode.refresh_rate = Android_ScreenRate; - mode.driverdata = NULL; - if (SDL_AddBasicVideoDisplay(&mode) < 0) { - return -1; - } - - SDL_AddDisplayMode(&_this->displays[0], &mode); - - Android_InitKeyboard(); - - Android_InitTouch(); - - Android_InitMouse(); - - /* We're done! */ - return 0; -} - -void -Android_VideoQuit(_THIS) -{ - Android_QuitTouch(); -} - -void -Android_SetScreenResolution(int width, int height, Uint32 format, float rate) -{ - Android_ScreenWidth = width; - Android_ScreenHeight = height; - Android_ScreenFormat = format; - Android_ScreenRate = rate; - - /* - Update the resolution of the desktop mode, so that the window - can be properly resized. The screen resolution change can for - example happen when the Activity enters or exists immersive mode, - which can happen after VideoInit(). - */ - SDL_VideoDevice* device = SDL_GetVideoDevice(); - if (device && device->num_displays > 0) - { - SDL_VideoDisplay* display = &device->displays[0]; - display->desktop_mode.format = Android_ScreenFormat; - display->desktop_mode.w = Android_ScreenWidth; - display->desktop_mode.h = Android_ScreenHeight; - display->desktop_mode.refresh_rate = Android_ScreenRate; - } - - if (Android_Window) { - SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESIZED, width, height); - - /* Force the current mode to match the resize otherwise the SDL_WINDOWEVENT_RESTORED event - * will fall back to the old mode */ - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(Android_Window); - - display->current_mode.format = format; - display->current_mode.w = width; - display->current_mode.h = height; - display->current_mode.refresh_rate = rate; - } -} - -#endif /* SDL_VIDEO_DRIVER_ANDROID */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidvideo.h b/3rdparty/SDL2/src/video/android/SDL_androidvideo.h deleted file mode 100644 index 0f76a91b179..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidvideo.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_androidvideo_h -#define _SDL_androidvideo_h - -#include "SDL_mutex.h" -#include "SDL_rect.h" -#include "../SDL_sysvideo.h" - -/* Called by the JNI layer when the screen changes size or format */ -extern void Android_SetScreenResolution(int width, int height, Uint32 format, float rate); - -/* Private display data */ - -typedef struct SDL_VideoData -{ - SDL_Rect textRect; -} SDL_VideoData; - -extern int Android_ScreenWidth; -extern int Android_ScreenHeight; -extern Uint32 Android_ScreenFormat; -extern SDL_sem *Android_PauseSem, *Android_ResumeSem; -extern SDL_Window *Android_Window; - - -#endif /* _SDL_androidvideo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidwindow.c b/3rdparty/SDL2/src/video/android/SDL_androidwindow.c deleted file mode 100644 index 37a928faf0d..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidwindow.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_ANDROID - -#include "SDL_syswm.h" -#include "../SDL_sysvideo.h" -#include "../../events/SDL_keyboard_c.h" -#include "../../events/SDL_mouse_c.h" - -#include "SDL_androidvideo.h" -#include "SDL_androidwindow.h" - -int -Android_CreateWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data; - - if (Android_Window) { - return SDL_SetError("Android only supports one window"); - } - - Android_PauseSem = SDL_CreateSemaphore(0); - Android_ResumeSem = SDL_CreateSemaphore(0); - - /* Adjust the window data to match the screen */ - window->x = 0; - window->y = 0; - window->w = Android_ScreenWidth; - window->h = Android_ScreenHeight; - - window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */ - window->flags |= SDL_WINDOW_FULLSCREEN; /* window is always fullscreen */ - window->flags &= ~SDL_WINDOW_HIDDEN; - window->flags |= SDL_WINDOW_SHOWN; /* only one window on Android */ - window->flags |= SDL_WINDOW_INPUT_FOCUS; /* always has input focus */ - - /* One window, it always has focus */ - SDL_SetMouseFocus(window); - SDL_SetKeyboardFocus(window); - - data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data)); - if (!data) { - return SDL_OutOfMemory(); - } - - data->native_window = Android_JNI_GetNativeWindow(); - - if (!data->native_window) { - SDL_free(data); - return SDL_SetError("Could not fetch native window"); - } - - data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->native_window); - - if (data->egl_surface == EGL_NO_SURFACE) { - ANativeWindow_release(data->native_window); - SDL_free(data); - return SDL_SetError("Could not create GLES window surface"); - } - - window->driverdata = data; - Android_Window = window; - - return 0; -} - -void -Android_SetWindowTitle(_THIS, SDL_Window * window) -{ - Android_JNI_SetActivityTitle(window->title); -} - -void -Android_DestroyWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data; - - if (window == Android_Window) { - Android_Window = NULL; - if (Android_PauseSem) SDL_DestroySemaphore(Android_PauseSem); - if (Android_ResumeSem) SDL_DestroySemaphore(Android_ResumeSem); - Android_PauseSem = NULL; - Android_ResumeSem = NULL; - - if(window->driverdata) { - data = (SDL_WindowData *) window->driverdata; - if (data->egl_surface != EGL_NO_SURFACE) { - SDL_EGL_DestroySurface(_this, data->egl_surface); - } - if (data->native_window) { - ANativeWindow_release(data->native_window); - } - SDL_free(window->driverdata); - window->driverdata = NULL; - } - } -} - -SDL_bool -Android_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - - if (info->version.major == SDL_MAJOR_VERSION && - info->version.minor == SDL_MINOR_VERSION) { - info->subsystem = SDL_SYSWM_ANDROID; - info->info.android.window = data->native_window; - info->info.android.surface = data->egl_surface; - return SDL_TRUE; - } else { - SDL_SetError("Application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } -} - -#endif /* SDL_VIDEO_DRIVER_ANDROID */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/android/SDL_androidwindow.h b/3rdparty/SDL2/src/video/android/SDL_androidwindow.h deleted file mode 100644 index 3ac99f42bec..00000000000 --- a/3rdparty/SDL2/src/video/android/SDL_androidwindow.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_androidwindow_h -#define _SDL_androidwindow_h - -#include "../../core/android/SDL_android.h" -#include "../SDL_egl_c.h" - -extern int Android_CreateWindow(_THIS, SDL_Window * window); -extern void Android_SetWindowTitle(_THIS, SDL_Window * window); -extern void Android_DestroyWindow(_THIS, SDL_Window * window); -extern SDL_bool Android_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo * info); - -typedef struct -{ - EGLSurface egl_surface; - EGLContext egl_context; /* We use this to preserve the context when losing focus */ - ANativeWindow* native_window; - -} SDL_WindowData; - -#endif /* _SDL_androidwindow_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaclipboard.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoaclipboard.h deleted file mode 100644 index 871b394f538..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaclipboard.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_cocoaclipboard_h -#define _SDL_cocoaclipboard_h - -/* Forward declaration */ -struct SDL_VideoData; - -extern int Cocoa_SetClipboardText(_THIS, const char *text); -extern char *Cocoa_GetClipboardText(_THIS); -extern SDL_bool Cocoa_HasClipboardText(_THIS); -extern void Cocoa_CheckClipboardUpdate(struct SDL_VideoData * data); - -#endif /* _SDL_cocoaclipboard_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaclipboard.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoaclipboard.m deleted file mode 100644 index fd8680925b2..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaclipboard.m +++ /dev/null @@ -1,103 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_COCOA - -#include "SDL_cocoavideo.h" -#include "../../events/SDL_clipboardevents_c.h" - -int -Cocoa_SetClipboardText(_THIS, const char *text) -{ @autoreleasepool -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - NSPasteboard *pasteboard; - NSString *format = NSPasteboardTypeString; - - pasteboard = [NSPasteboard generalPasteboard]; - data->clipboard_count = [pasteboard declareTypes:[NSArray arrayWithObject:format] owner:nil]; - [pasteboard setString:[NSString stringWithUTF8String:text] forType:format]; - - return 0; -}} - -char * -Cocoa_GetClipboardText(_THIS) -{ @autoreleasepool -{ - NSPasteboard *pasteboard; - NSString *format = NSPasteboardTypeString; - NSString *available; - char *text; - - pasteboard = [NSPasteboard generalPasteboard]; - available = [pasteboard availableTypeFromArray:[NSArray arrayWithObject:format]]; - if ([available isEqualToString:format]) { - NSString* string; - const char *utf8; - - string = [pasteboard stringForType:format]; - if (string == nil) { - utf8 = ""; - } else { - utf8 = [string UTF8String]; - } - text = SDL_strdup(utf8); - } else { - text = SDL_strdup(""); - } - - return text; -}} - -SDL_bool -Cocoa_HasClipboardText(_THIS) -{ - SDL_bool result = SDL_FALSE; - char *text = Cocoa_GetClipboardText(_this); - if (text) { - result = text[0] != '\0' ? SDL_TRUE : SDL_FALSE; - SDL_free(text); - } - return result; -} - -void -Cocoa_CheckClipboardUpdate(struct SDL_VideoData * data) -{ @autoreleasepool -{ - NSPasteboard *pasteboard; - NSInteger count; - - pasteboard = [NSPasteboard generalPasteboard]; - count = [pasteboard changeCount]; - if (count != data->clipboard_count) { - if (data->clipboard_count) { - SDL_SendClipboardUpdate(); - } - data->clipboard_count = count; - } -}} - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaevents.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoaevents.h deleted file mode 100644 index ea40e531702..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaevents.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_cocoaevents_h -#define _SDL_cocoaevents_h - -extern void Cocoa_RegisterApp(void); -extern void Cocoa_PumpEvents(_THIS); -extern void Cocoa_SuspendScreenSaver(_THIS); - -#endif /* _SDL_cocoaevents_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaevents.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoaevents.m deleted file mode 100644 index 17a3183b779..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaevents.m +++ /dev/null @@ -1,454 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_COCOA -#include "SDL_timer.h" - -#include "SDL_cocoavideo.h" -#include "../../events/SDL_events_c.h" -#include "SDL_assert.h" -#include "SDL_hints.h" - -/* This define was added in the 10.9 SDK. */ -#ifndef kIOPMAssertPreventUserIdleDisplaySleep -#define kIOPMAssertPreventUserIdleDisplaySleep kIOPMAssertionTypePreventUserIdleDisplaySleep -#endif - -@interface SDLApplication : NSApplication - -- (void)terminate:(id)sender; -- (void)sendEvent:(NSEvent *)theEvent; - -@end - -@implementation SDLApplication - -// Override terminate to handle Quit and System Shutdown smoothly. -- (void)terminate:(id)sender -{ - SDL_SendQuit(); -} - -static SDL_bool s_bShouldHandleEventsInSDLApplication = SDL_FALSE; - -static void Cocoa_DispatchEvent(NSEvent *theEvent) -{ - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - - switch ([theEvent type]) { - case NSLeftMouseDown: - case NSOtherMouseDown: - case NSRightMouseDown: - case NSLeftMouseUp: - case NSOtherMouseUp: - case NSRightMouseUp: - case NSLeftMouseDragged: - case NSRightMouseDragged: - case NSOtherMouseDragged: /* usually middle mouse dragged */ - case NSMouseMoved: - case NSScrollWheel: - Cocoa_HandleMouseEvent(_this, theEvent); - break; - case NSKeyDown: - case NSKeyUp: - case NSFlagsChanged: - Cocoa_HandleKeyEvent(_this, theEvent); - break; - default: - break; - } -} - -// Dispatch events here so that we can handle events caught by -// nextEventMatchingMask in SDL, as well as events caught by other -// processes (such as CEF) that are passed down to NSApp. -- (void)sendEvent:(NSEvent *)theEvent -{ - if (s_bShouldHandleEventsInSDLApplication) { - Cocoa_DispatchEvent(theEvent); - } - - [super sendEvent:theEvent]; -} - -@end // SDLApplication - -/* setAppleMenu disappeared from the headers in 10.4 */ -@interface NSApplication(NSAppleMenu) -- (void)setAppleMenu:(NSMenu *)menu; -@end - -@interface SDLAppDelegate : NSObject <NSApplicationDelegate> { -@public - BOOL seenFirstActivate; -} - -- (id)init; -@end - -@implementation SDLAppDelegate : NSObject -- (id)init -{ - self = [super init]; - if (self) { - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - - seenFirstActivate = NO; - - [center addObserver:self - selector:@selector(windowWillClose:) - name:NSWindowWillCloseNotification - object:nil]; - - [center addObserver:self - selector:@selector(focusSomeWindow:) - name:NSApplicationDidBecomeActiveNotification - object:nil]; - } - - return self; -} - -- (void)dealloc -{ - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - - [center removeObserver:self name:NSWindowWillCloseNotification object:nil]; - [center removeObserver:self name:NSApplicationDidBecomeActiveNotification object:nil]; - - [super dealloc]; -} - -- (void)windowWillClose:(NSNotification *)notification; -{ - NSWindow *win = (NSWindow*)[notification object]; - - if (![win isKeyWindow]) { - return; - } - - /* HACK: Make the next window in the z-order key when the key window is - * closed. The custom event loop and/or windowing code we have seems to - * prevent the normal behavior: https://bugzilla.libsdl.org/show_bug.cgi?id=1825 - */ - - /* +[NSApp orderedWindows] never includes the 'About' window, but we still - * want to try its list first since the behavior in other apps is to only - * make the 'About' window key if no other windows are on-screen. - */ - for (NSWindow *window in [NSApp orderedWindows]) { - if (window != win && [window canBecomeKeyWindow]) { - if (![window isOnActiveSpace]) { - continue; - } - [window makeKeyAndOrderFront:self]; - return; - } - } - - /* If a window wasn't found above, iterate through all visible windows in - * the active Space in z-order (including the 'About' window, if it's shown) - * and make the first one key. - */ - for (NSNumber *num in [NSWindow windowNumbersWithOptions:0]) { - NSWindow *window = [NSApp windowWithWindowNumber:[num integerValue]]; - if (window && window != win && [window canBecomeKeyWindow]) { - [window makeKeyAndOrderFront:self]; - return; - } - } -} - -- (void)focusSomeWindow:(NSNotification *)aNotification -{ - /* HACK: Ignore the first call. The application gets a - * applicationDidBecomeActive: a little bit after the first window is - * created, and if we don't ignore it, a window that has been created with - * SDL_WINDOW_MINIMIZED will ~immediately be restored. - */ - if (!seenFirstActivate) { - seenFirstActivate = YES; - return; - } - - SDL_VideoDevice *device = SDL_GetVideoDevice(); - if (device && device->windows) { - SDL_Window *window = device->windows; - int i; - for (i = 0; i < device->num_displays; ++i) { - SDL_Window *fullscreen_window = device->displays[i].fullscreen_window; - if (fullscreen_window) { - if (fullscreen_window->flags & SDL_WINDOW_MINIMIZED) { - SDL_RestoreWindow(fullscreen_window); - } - return; - } - } - - if (window->flags & SDL_WINDOW_MINIMIZED) { - SDL_RestoreWindow(window); - } else { - SDL_RaiseWindow(window); - } - } -} - -- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename -{ - return (BOOL)SDL_SendDropFile(NULL, [filename UTF8String]) && SDL_SendDropComplete(NULL); -} -@end - -static SDLAppDelegate *appDelegate = nil; - -static NSString * -GetApplicationName(void) -{ - NSString *appName; - - /* Determine the application name */ - appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"]; - if (!appName) { - appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; - } - - if (![appName length]) { - appName = [[NSProcessInfo processInfo] processName]; - } - - return appName; -} - -static void -CreateApplicationMenus(void) -{ - NSString *appName; - NSString *title; - NSMenu *appleMenu; - NSMenu *serviceMenu; - NSMenu *windowMenu; - NSMenu *viewMenu; - NSMenuItem *menuItem; - NSMenu *mainMenu; - - if (NSApp == nil) { - return; - } - - mainMenu = [[NSMenu alloc] init]; - - /* Create the main menu bar */ - [NSApp setMainMenu:mainMenu]; - - [mainMenu release]; /* we're done with it, let NSApp own it. */ - mainMenu = nil; - - /* Create the application menu */ - appName = GetApplicationName(); - appleMenu = [[NSMenu alloc] initWithTitle:@""]; - - /* Add menu items */ - title = [@"About " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - [appleMenu addItemWithTitle:@"Preferences…" action:nil keyEquivalent:@","]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - serviceMenu = [[NSMenu alloc] initWithTitle:@""]; - menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Services" action:nil keyEquivalent:@""]; - [menuItem setSubmenu:serviceMenu]; - - [NSApp setServicesMenu:serviceMenu]; - [serviceMenu release]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Hide " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"]; - - menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; - [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; - - [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Quit " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"]; - - /* Put menu into the menubar */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; - [menuItem setSubmenu:appleMenu]; - [[NSApp mainMenu] addItem:menuItem]; - [menuItem release]; - - /* Tell the application object that this is now the application menu */ - [NSApp setAppleMenu:appleMenu]; - [appleMenu release]; - - - /* Create the window menu */ - windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; - - /* Add menu items */ - [windowMenu addItemWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; - - [windowMenu addItemWithTitle:@"Zoom" action:@selector(performZoom:) keyEquivalent:@""]; - - /* Put menu into the menubar */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; - [menuItem setSubmenu:windowMenu]; - [[NSApp mainMenu] addItem:menuItem]; - [menuItem release]; - - /* Tell the application object that this is now the window menu */ - [NSApp setWindowsMenu:windowMenu]; - [windowMenu release]; - - - /* Add the fullscreen view toggle menu option, if supported */ - if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) { - /* Create the view menu */ - viewMenu = [[NSMenu alloc] initWithTitle:@"View"]; - - /* Add menu items */ - menuItem = [viewMenu addItemWithTitle:@"Toggle Full Screen" action:@selector(toggleFullScreen:) keyEquivalent:@"f"]; - [menuItem setKeyEquivalentModifierMask:NSControlKeyMask | NSCommandKeyMask]; - - /* Put menu into the menubar */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"View" action:nil keyEquivalent:@""]; - [menuItem setSubmenu:viewMenu]; - [[NSApp mainMenu] addItem:menuItem]; - [menuItem release]; - - [viewMenu release]; - } -} - -void -Cocoa_RegisterApp(void) -{ @autoreleasepool -{ - /* This can get called more than once! Be careful what you initialize! */ - - if (NSApp == nil) { - [SDLApplication sharedApplication]; - SDL_assert(NSApp != nil); - - s_bShouldHandleEventsInSDLApplication = SDL_TRUE; - - if (!SDL_GetHintBoolean(SDL_HINT_MAC_BACKGROUND_APP, SDL_FALSE)) { - [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; - [NSApp activateIgnoringOtherApps:YES]; - } - - if ([NSApp mainMenu] == nil) { - CreateApplicationMenus(); - } - [NSApp finishLaunching]; - NSDictionary *appDefaults = [[NSDictionary alloc] initWithObjectsAndKeys: - [NSNumber numberWithBool:NO], @"AppleMomentumScrollSupported", - [NSNumber numberWithBool:NO], @"ApplePressAndHoldEnabled", - [NSNumber numberWithBool:YES], @"ApplePersistenceIgnoreState", - nil]; - [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; - [appDefaults release]; - } - if (NSApp && !appDelegate) { - appDelegate = [[SDLAppDelegate alloc] init]; - - /* If someone else has an app delegate, it means we can't turn a - * termination into SDL_Quit, and we can't handle application:openFile: - */ - if (![NSApp delegate]) { - [(NSApplication *)NSApp setDelegate:appDelegate]; - } else { - appDelegate->seenFirstActivate = YES; - } - } -}} - -void -Cocoa_PumpEvents(_THIS) -{ @autoreleasepool -{ - /* Update activity every 30 seconds to prevent screensaver */ - SDL_VideoData *data = (SDL_VideoData *)_this->driverdata; - if (_this->suspend_screensaver && !data->screensaver_use_iopm) { - Uint32 now = SDL_GetTicks(); - if (!data->screensaver_activity || - SDL_TICKS_PASSED(now, data->screensaver_activity + 30000)) { - UpdateSystemActivity(UsrActivity); - data->screensaver_activity = now; - } - } - - for ( ; ; ) { - NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES ]; - if ( event == nil ) { - break; - } - - if (!s_bShouldHandleEventsInSDLApplication) { - Cocoa_DispatchEvent(event); - } - - // Pass events down to SDLApplication to be handled in sendEvent: - [NSApp sendEvent:event]; - } -}} - -void -Cocoa_SuspendScreenSaver(_THIS) -{ @autoreleasepool -{ - SDL_VideoData *data = (SDL_VideoData *)_this->driverdata; - - if (!data->screensaver_use_iopm) { - return; - } - - if (data->screensaver_assertion) { - IOPMAssertionRelease(data->screensaver_assertion); - data->screensaver_assertion = 0; - } - - if (_this->suspend_screensaver) { - /* FIXME: this should ideally describe the real reason why the game - * called SDL_DisableScreenSaver. Note that the name is only meant to be - * seen by OS X power users. there's an additional optional human-readable - * (localized) reason parameter which we don't set. - */ - NSString *name = [GetApplicationName() stringByAppendingString:@" using SDL_DisableScreenSaver"]; - IOPMAssertionCreateWithDescription(kIOPMAssertPreventUserIdleDisplaySleep, - (CFStringRef) name, - NULL, NULL, NULL, 0, NULL, - &data->screensaver_assertion); - } -}} - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoakeyboard.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoakeyboard.h deleted file mode 100644 index 4f9da0185c6..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoakeyboard.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_cocoakeyboard_h -#define _SDL_cocoakeyboard_h - -extern void Cocoa_InitKeyboard(_THIS); -extern void Cocoa_HandleKeyEvent(_THIS, NSEvent * event); -extern void Cocoa_QuitKeyboard(_THIS); - -extern void Cocoa_StartTextInput(_THIS); -extern void Cocoa_StopTextInput(_THIS); -extern void Cocoa_SetTextInputRect(_THIS, SDL_Rect *rect); - -#endif /* _SDL_cocoakeyboard_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoakeyboard.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoakeyboard.m deleted file mode 100644 index 8b2ed91c285..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoakeyboard.m +++ /dev/null @@ -1,717 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_COCOA - -#include "SDL_cocoavideo.h" - -#include "../../events/SDL_events_c.h" -#include "../../events/SDL_keyboard_c.h" -#include "../../events/scancodes_darwin.h" - -#include <Carbon/Carbon.h> -#include <IOKit/hid/IOHIDLib.h> - -/*#define DEBUG_IME NSLog */ -#define DEBUG_IME(...) - -@interface SDLTranslatorResponder : NSView <NSTextInputClient> { - NSString *_markedText; - NSRange _markedRange; - NSRange _selectedRange; - SDL_Rect _inputRect; -} -- (void)doCommandBySelector:(SEL)myselector; -- (void)setInputRect:(SDL_Rect *)rect; -@end - -@implementation SDLTranslatorResponder - -- (void)setInputRect:(SDL_Rect *)rect -{ - _inputRect = *rect; -} - -- (void)insertText:(id)aString replacementRange:(NSRange)replacementRange -{ - /* TODO: Make use of replacementRange? */ - - const char *str; - - DEBUG_IME(@"insertText: %@", aString); - - /* Could be NSString or NSAttributedString, so we have - * to test and convert it before return as SDL event */ - if ([aString isKindOfClass: [NSAttributedString class]]) { - str = [[aString string] UTF8String]; - } else { - str = [aString UTF8String]; - } - - SDL_SendKeyboardText(str); -} - -- (void)doCommandBySelector:(SEL)myselector -{ - /* No need to do anything since we are not using Cocoa - selectors to handle special keys, instead we use SDL - key events to do the same job. - */ -} - -- (BOOL)hasMarkedText -{ - return _markedText != nil; -} - -- (NSRange)markedRange -{ - return _markedRange; -} - -- (NSRange)selectedRange -{ - return _selectedRange; -} - -- (void)setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange; -{ - if ([aString isKindOfClass:[NSAttributedString class]]) { - aString = [aString string]; - } - - if ([aString length] == 0) { - [self unmarkText]; - return; - } - - if (_markedText != aString) { - [_markedText release]; - _markedText = [aString retain]; - } - - _selectedRange = selectedRange; - _markedRange = NSMakeRange(0, [aString length]); - - SDL_SendEditingText([aString UTF8String], - (int) selectedRange.location, (int) selectedRange.length); - - DEBUG_IME(@"setMarkedText: %@, (%d, %d)", _markedText, - selRange.location, selRange.length); -} - -- (void)unmarkText -{ - [_markedText release]; - _markedText = nil; - - SDL_SendEditingText("", 0, 0); -} - -- (NSRect)firstRectForCharacterRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange; -{ - NSWindow *window = [self window]; - NSRect contentRect = [window contentRectForFrameRect:[window frame]]; - float windowHeight = contentRect.size.height; - NSRect rect = NSMakeRect(_inputRect.x, windowHeight - _inputRect.y - _inputRect.h, - _inputRect.w, _inputRect.h); - - if (actualRange) { - *actualRange = aRange; - } - - DEBUG_IME(@"firstRectForCharacterRange: (%d, %d): windowHeight = %g, rect = %@", - aRange.location, aRange.length, windowHeight, - NSStringFromRect(rect)); - - if ([window respondsToSelector:@selector(convertRectToScreen:)]) { - rect = [window convertRectToScreen:rect]; - } else { - rect.origin = [window convertBaseToScreen:rect.origin]; - } - - return rect; -} - -- (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange; -{ - DEBUG_IME(@"attributedSubstringFromRange: (%d, %d)", aRange.location, aRange.length); - return nil; -} - -- (NSInteger)conversationIdentifier -{ - return (NSInteger) self; -} - -/* This method returns the index for character that is - * nearest to thePoint. thPoint is in screen coordinate system. - */ -- (NSUInteger)characterIndexForPoint:(NSPoint)thePoint -{ - DEBUG_IME(@"characterIndexForPoint: (%g, %g)", thePoint.x, thePoint.y); - return 0; -} - -/* This method is the key to attribute extension. - * We could add new attributes through this method. - * NSInputServer examines the return value of this - * method & constructs appropriate attributed string. - */ -- (NSArray *)validAttributesForMarkedText -{ - return [NSArray array]; -} - -@end - -/*------------------------------------------------------------------------------ -Set up a HID callback to properly detect Caps Lock up/down events. -Derived from: -http://stackoverflow.com/questions/7190852/using-iohidmanager-to-get-modifier-key-events -*/ - -static IOHIDManagerRef s_hidManager = NULL; - -static void -HIDCallback(void *context, IOReturn result, void *sender, IOHIDValueRef value) -{ - if (context != s_hidManager) { - /* An old callback, ignore it (related to bug 2157 below) */ - return; - } - - IOHIDElementRef elem = IOHIDValueGetElement(value); - if (IOHIDElementGetUsagePage(elem) != kHIDPage_KeyboardOrKeypad - || IOHIDElementGetUsage(elem) != kHIDUsage_KeyboardCapsLock) { - return; - } - CFIndex pressed = IOHIDValueGetIntegerValue(value); - SDL_SendKeyboardKey(pressed ? SDL_PRESSED : SDL_RELEASED, SDL_SCANCODE_CAPSLOCK); -} - -static CFDictionaryRef -CreateHIDDeviceMatchingDictionary(UInt32 usagePage, UInt32 usage) -{ - CFMutableDictionaryRef dict = CFDictionaryCreateMutable(kCFAllocatorDefault, - 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - if (dict) { - CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usagePage); - if (number) { - CFDictionarySetValue(dict, CFSTR(kIOHIDDeviceUsagePageKey), number); - CFRelease(number); - number = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usage); - if (number) { - CFDictionarySetValue(dict, CFSTR(kIOHIDDeviceUsageKey), number); - CFRelease(number); - return dict; - } - } - CFRelease(dict); - } - return NULL; -} - -static void -QuitHIDCallback() -{ - if (!s_hidManager) { - return; - } - -#if 0 /* Releasing here causes a crash on Mac OS X 10.10 and earlier, - * so just leak it for now. See bug 2157 for details. - */ - IOHIDManagerUnscheduleFromRunLoop(s_hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); - IOHIDManagerRegisterInputValueCallback(s_hidManager, NULL, NULL); - IOHIDManagerClose(s_hidManager, 0); - - CFRelease(s_hidManager); -#endif - s_hidManager = NULL; -} - -static void -InitHIDCallback() -{ - s_hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); - if (!s_hidManager) { - return; - } - CFDictionaryRef keyboard = NULL, keypad = NULL; - CFArrayRef matches = NULL; - keyboard = CreateHIDDeviceMatchingDictionary(kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard); - if (!keyboard) { - goto fail; - } - keypad = CreateHIDDeviceMatchingDictionary(kHIDPage_GenericDesktop, kHIDUsage_GD_Keypad); - if (!keypad) { - goto fail; - } - CFDictionaryRef matchesList[] = { keyboard, keypad }; - matches = CFArrayCreate(kCFAllocatorDefault, (const void **)matchesList, 2, NULL); - if (!matches) { - goto fail; - } - IOHIDManagerSetDeviceMatchingMultiple(s_hidManager, matches); - IOHIDManagerRegisterInputValueCallback(s_hidManager, HIDCallback, s_hidManager); - IOHIDManagerScheduleWithRunLoop(s_hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode); - if (IOHIDManagerOpen(s_hidManager, kIOHIDOptionsTypeNone) == kIOReturnSuccess) { - goto cleanup; - } - -fail: - QuitHIDCallback(); - -cleanup: - if (matches) { - CFRelease(matches); - } - if (keypad) { - CFRelease(keypad); - } - if (keyboard) { - CFRelease(keyboard); - } -} - -/* This is a helper function for HandleModifierSide. This - * function reverts back to behavior before the distinction between - * sides was made. - */ -static void -HandleNonDeviceModifier(unsigned int device_independent_mask, - unsigned int oldMods, - unsigned int newMods, - SDL_Scancode scancode) -{ - unsigned int oldMask, newMask; - - /* Isolate just the bits we care about in the depedent bits so we can - * figure out what changed - */ - oldMask = oldMods & device_independent_mask; - newMask = newMods & device_independent_mask; - - if (oldMask && oldMask != newMask) { - SDL_SendKeyboardKey(SDL_RELEASED, scancode); - } else if (newMask && oldMask != newMask) { - SDL_SendKeyboardKey(SDL_PRESSED, scancode); - } -} - -/* This is a helper function for HandleModifierSide. - * This function sets the actual SDL_PrivateKeyboard event. - */ -static void -HandleModifierOneSide(unsigned int oldMods, unsigned int newMods, - SDL_Scancode scancode, - unsigned int sided_device_dependent_mask) -{ - unsigned int old_dep_mask, new_dep_mask; - - /* Isolate just the bits we care about in the depedent bits so we can - * figure out what changed - */ - old_dep_mask = oldMods & sided_device_dependent_mask; - new_dep_mask = newMods & sided_device_dependent_mask; - - /* We now know that this side bit flipped. But we don't know if - * it went pressed to released or released to pressed, so we must - * find out which it is. - */ - if (new_dep_mask && old_dep_mask != new_dep_mask) { - SDL_SendKeyboardKey(SDL_PRESSED, scancode); - } else { - SDL_SendKeyboardKey(SDL_RELEASED, scancode); - } -} - -/* This is a helper function for DoSidedModifiers. - * This function will figure out if the modifier key is the left or right side, - * e.g. left-shift vs right-shift. - */ -static void -HandleModifierSide(int device_independent_mask, - unsigned int oldMods, unsigned int newMods, - SDL_Scancode left_scancode, - SDL_Scancode right_scancode, - unsigned int left_device_dependent_mask, - unsigned int right_device_dependent_mask) -{ - unsigned int device_dependent_mask = (left_device_dependent_mask | - right_device_dependent_mask); - unsigned int diff_mod; - - /* On the basis that the device independent mask is set, but there are - * no device dependent flags set, we'll assume that we can't detect this - * keyboard and revert to the unsided behavior. - */ - if ((device_dependent_mask & newMods) == 0) { - /* Revert to the old behavior */ - HandleNonDeviceModifier(device_independent_mask, oldMods, newMods, left_scancode); - return; - } - - /* XOR the previous state against the new state to see if there's a change */ - diff_mod = (device_dependent_mask & oldMods) ^ - (device_dependent_mask & newMods); - if (diff_mod) { - /* A change in state was found. Isolate the left and right bits - * to handle them separately just in case the values can simulataneously - * change or if the bits don't both exist. - */ - if (left_device_dependent_mask & diff_mod) { - HandleModifierOneSide(oldMods, newMods, left_scancode, left_device_dependent_mask); - } - if (right_device_dependent_mask & diff_mod) { - HandleModifierOneSide(oldMods, newMods, right_scancode, right_device_dependent_mask); - } - } -} - -/* This is a helper function for DoSidedModifiers. - * This function will release a key press in the case that - * it is clear that the modifier has been released (i.e. one side - * can't still be down). - */ -static void -ReleaseModifierSide(unsigned int device_independent_mask, - unsigned int oldMods, unsigned int newMods, - SDL_Scancode left_scancode, - SDL_Scancode right_scancode, - unsigned int left_device_dependent_mask, - unsigned int right_device_dependent_mask) -{ - unsigned int device_dependent_mask = (left_device_dependent_mask | - right_device_dependent_mask); - - /* On the basis that the device independent mask is set, but there are - * no device dependent flags set, we'll assume that we can't detect this - * keyboard and revert to the unsided behavior. - */ - if ((device_dependent_mask & oldMods) == 0) { - /* In this case, we can't detect the keyboard, so use the left side - * to represent both, and release it. - */ - SDL_SendKeyboardKey(SDL_RELEASED, left_scancode); - return; - } - - /* - * This could have been done in an if-else case because at this point, - * we know that all keys have been released when calling this function. - * But I'm being paranoid so I want to handle each separately, - * so I hope this doesn't cause other problems. - */ - if ( left_device_dependent_mask & oldMods ) { - SDL_SendKeyboardKey(SDL_RELEASED, left_scancode); - } - if ( right_device_dependent_mask & oldMods ) { - SDL_SendKeyboardKey(SDL_RELEASED, right_scancode); - } -} - -/* This function will handle the modifier keys and also determine the - * correct side of the key. - */ -static void -DoSidedModifiers(unsigned short scancode, - unsigned int oldMods, unsigned int newMods) -{ - /* Set up arrays for the key syms for the left and right side. */ - const SDL_Scancode left_mapping[] = { - SDL_SCANCODE_LSHIFT, - SDL_SCANCODE_LCTRL, - SDL_SCANCODE_LALT, - SDL_SCANCODE_LGUI - }; - const SDL_Scancode right_mapping[] = { - SDL_SCANCODE_RSHIFT, - SDL_SCANCODE_RCTRL, - SDL_SCANCODE_RALT, - SDL_SCANCODE_RGUI - }; - /* Set up arrays for the device dependent masks with indices that - * correspond to the _mapping arrays - */ - const unsigned int left_device_mapping[] = { NX_DEVICELSHIFTKEYMASK, NX_DEVICELCTLKEYMASK, NX_DEVICELALTKEYMASK, NX_DEVICELCMDKEYMASK }; - const unsigned int right_device_mapping[] = { NX_DEVICERSHIFTKEYMASK, NX_DEVICERCTLKEYMASK, NX_DEVICERALTKEYMASK, NX_DEVICERCMDKEYMASK }; - - unsigned int i, bit; - - /* Iterate through the bits, testing each against the old modifiers */ - for (i = 0, bit = NSShiftKeyMask; bit <= NSCommandKeyMask; bit <<= 1, ++i) { - unsigned int oldMask, newMask; - - oldMask = oldMods & bit; - newMask = newMods & bit; - - /* If the bit is set, we must always examine it because the left - * and right side keys may alternate or both may be pressed. - */ - if (newMask) { - HandleModifierSide(bit, oldMods, newMods, - left_mapping[i], right_mapping[i], - left_device_mapping[i], right_device_mapping[i]); - } - /* If the state changed from pressed to unpressed, we must examine - * the device dependent bits to release the correct keys. - */ - else if (oldMask && oldMask != newMask) { - ReleaseModifierSide(bit, oldMods, newMods, - left_mapping[i], right_mapping[i], - left_device_mapping[i], right_device_mapping[i]); - } - } -} - -static void -HandleModifiers(_THIS, unsigned short scancode, unsigned int modifierFlags) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - if (modifierFlags == data->modifierFlags) { - return; - } - - DoSidedModifiers(scancode, data->modifierFlags, modifierFlags); - data->modifierFlags = modifierFlags; -} - -static void -UpdateKeymap(SDL_VideoData *data, SDL_bool send_event) -{ - TISInputSourceRef key_layout; - const void *chr_data; - int i; - SDL_Scancode scancode; - SDL_Keycode keymap[SDL_NUM_SCANCODES]; - - /* See if the keymap needs to be updated */ - key_layout = TISCopyCurrentKeyboardLayoutInputSource(); - if (key_layout == data->key_layout) { - return; - } - data->key_layout = key_layout; - - SDL_GetDefaultKeymap(keymap); - - /* Try Unicode data first */ - CFDataRef uchrDataRef = TISGetInputSourceProperty(key_layout, kTISPropertyUnicodeKeyLayoutData); - if (uchrDataRef) { - chr_data = CFDataGetBytePtr(uchrDataRef); - } else { - goto cleanup; - } - - if (chr_data) { - UInt32 keyboard_type = LMGetKbdType(); - OSStatus err; - - for (i = 0; i < SDL_arraysize(darwin_scancode_table); i++) { - UniChar s[8]; - UniCharCount len; - UInt32 dead_key_state; - - /* Make sure this scancode is a valid character scancode */ - scancode = darwin_scancode_table[i]; - if (scancode == SDL_SCANCODE_UNKNOWN || - (keymap[scancode] & SDLK_SCANCODE_MASK)) { - continue; - } - - dead_key_state = 0; - err = UCKeyTranslate ((UCKeyboardLayout *) chr_data, - i, kUCKeyActionDown, - 0, keyboard_type, - kUCKeyTranslateNoDeadKeysMask, - &dead_key_state, 8, &len, s); - if (err != noErr) { - continue; - } - - if (len > 0 && s[0] != 0x10) { - keymap[scancode] = s[0]; - } - } - SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); - if (send_event) { - SDL_SendKeymapChangedEvent(); - } - return; - } - -cleanup: - CFRelease(key_layout); -} - -void -Cocoa_InitKeyboard(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - UpdateKeymap(data, SDL_FALSE); - - /* Set our own names for the platform-dependent but layout-independent keys */ - /* This key is NumLock on the MacBook keyboard. :) */ - /*SDL_SetScancodeName(SDL_SCANCODE_NUMLOCKCLEAR, "Clear");*/ - SDL_SetScancodeName(SDL_SCANCODE_LALT, "Left Option"); - SDL_SetScancodeName(SDL_SCANCODE_LGUI, "Left Command"); - SDL_SetScancodeName(SDL_SCANCODE_RALT, "Right Option"); - SDL_SetScancodeName(SDL_SCANCODE_RGUI, "Right Command"); - - data->modifierFlags = [NSEvent modifierFlags]; - SDL_ToggleModState(KMOD_CAPS, (data->modifierFlags & NSAlphaShiftKeyMask) != 0); - - InitHIDCallback(); -} - -void -Cocoa_StartTextInput(_THIS) -{ @autoreleasepool -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - SDL_Window *window = SDL_GetKeyboardFocus(); - NSWindow *nswindow = nil; - if (window) { - nswindow = ((SDL_WindowData*)window->driverdata)->nswindow; - } - - NSView *parentView = [nswindow contentView]; - - /* We only keep one field editor per process, since only the front most - * window can receive text input events, so it make no sense to keep more - * than one copy. When we switched to another window and requesting for - * text input, simply remove the field editor from its superview then add - * it to the front most window's content view */ - if (!data->fieldEdit) { - data->fieldEdit = - [[SDLTranslatorResponder alloc] initWithFrame: NSMakeRect(0.0, 0.0, 0.0, 0.0)]; - } - - if (![[data->fieldEdit superview] isEqual:parentView]) { - /* DEBUG_IME(@"add fieldEdit to window contentView"); */ - [data->fieldEdit removeFromSuperview]; - [parentView addSubview: data->fieldEdit]; - [nswindow makeFirstResponder: data->fieldEdit]; - } -}} - -void -Cocoa_StopTextInput(_THIS) -{ @autoreleasepool -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - if (data && data->fieldEdit) { - [data->fieldEdit removeFromSuperview]; - [data->fieldEdit release]; - data->fieldEdit = nil; - } -}} - -void -Cocoa_SetTextInputRect(_THIS, SDL_Rect *rect) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - if (!rect) { - SDL_InvalidParamError("rect"); - return; - } - - [data->fieldEdit setInputRect:rect]; -} - -void -Cocoa_HandleKeyEvent(_THIS, NSEvent *event) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - if (!data) { - return; /* can happen when returning from fullscreen Space on shutdown */ - } - - unsigned short scancode = [event keyCode]; - SDL_Scancode code; -#if 0 - const char *text; -#endif - - if ((scancode == 10 || scancode == 50) && KBGetLayoutType(LMGetKbdType()) == kKeyboardISO) { - /* see comments in SDL_cocoakeys.h */ - scancode = 60 - scancode; - } - - if (scancode < SDL_arraysize(darwin_scancode_table)) { - code = darwin_scancode_table[scancode]; - } else { - /* Hmm, does this ever happen? If so, need to extend the keymap... */ - code = SDL_SCANCODE_UNKNOWN; - } - - switch ([event type]) { - case NSKeyDown: - if (![event isARepeat]) { - /* See if we need to rebuild the keyboard layout */ - UpdateKeymap(data, SDL_TRUE); - } - - SDL_SendKeyboardKey(SDL_PRESSED, code); -#if 1 - if (code == SDL_SCANCODE_UNKNOWN) { - fprintf(stderr, "The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL mailing list <sdl@libsdl.org> or to Christian Walther <cwalther@gmx.ch>. Mac virtual key code is %d.\n", scancode); - } -#endif - if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) { - /* FIXME CW 2007-08-16: only send those events to the field editor for which we actually want text events, not e.g. esc or function keys. Arrow keys in particular seem to produce crashes sometimes. */ - [data->fieldEdit interpretKeyEvents:[NSArray arrayWithObject:event]]; -#if 0 - text = [[event characters] UTF8String]; - if(text && *text) { - SDL_SendKeyboardText(text); - [data->fieldEdit setString:@""]; - } -#endif - } - break; - case NSKeyUp: - SDL_SendKeyboardKey(SDL_RELEASED, code); - break; - case NSFlagsChanged: - /* FIXME CW 2007-08-14: check if this whole mess that takes up half of this file is really necessary */ - HandleModifiers(_this, scancode, [event modifierFlags]); - break; - default: /* just to avoid compiler warnings */ - break; - } -} - -void -Cocoa_QuitKeyboard(_THIS) -{ - QuitHIDCallback(); -} - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamessagebox.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoamessagebox.h deleted file mode 100644 index d1ca7882e7e..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamessagebox.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_COCOA - -extern int Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamessagebox.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoamessagebox.m deleted file mode 100644 index ed59e728c60..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamessagebox.m +++ /dev/null @@ -1,132 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_COCOA - -#include "SDL_events.h" -#include "SDL_timer.h" -#include "SDL_messagebox.h" -#include "SDL_cocoavideo.h" - -@interface SDLMessageBoxPresenter : NSObject { -@public - NSInteger clicked; - NSWindow *nswindow; -} -- (id) initWithParentWindow:(SDL_Window *)window; -- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; -@end - -@implementation SDLMessageBoxPresenter -- (id) initWithParentWindow:(SDL_Window *)window -{ - self = [super init]; - if (self) { - clicked = -1; - - /* Retain the NSWindow because we'll show the alert later on the main thread */ - if (window) { - nswindow = [((SDL_WindowData *) window->driverdata)->nswindow retain]; - } else { - nswindow = NULL; - } - } - - return self; -} - -- (void)showAlert:(NSAlert*)alert -{ - if (nswindow) { - [alert beginSheetModalForWindow:nswindow modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil]; - while (clicked < 0) { - SDL_PumpEvents(); - SDL_Delay(100); - } - [nswindow release]; - } else { - clicked = [alert runModal]; - } -} - -- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo -{ - clicked = returnCode; -} - -@end - - -/* Display a Cocoa message box */ -int -Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ @autoreleasepool -{ - Cocoa_RegisterApp(); - - NSAlert* alert = [[[NSAlert alloc] init] autorelease]; - - if (messageboxdata->flags & SDL_MESSAGEBOX_ERROR) { - [alert setAlertStyle:NSCriticalAlertStyle]; - } else if (messageboxdata->flags & SDL_MESSAGEBOX_WARNING) { - [alert setAlertStyle:NSWarningAlertStyle]; - } else { - [alert setAlertStyle:NSInformationalAlertStyle]; - } - - [alert setMessageText:[NSString stringWithUTF8String:messageboxdata->title]]; - [alert setInformativeText:[NSString stringWithUTF8String:messageboxdata->message]]; - - const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons; - int i; - for (i = 0; i < messageboxdata->numbuttons; ++i) { - NSButton *button = [alert addButtonWithTitle:[NSString stringWithUTF8String:buttons[i].text]]; - if (buttons[i].flags & SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT) { - [button setKeyEquivalent:@"\r"]; - } else if (buttons[i].flags & SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT) { - [button setKeyEquivalent:@"\033"]; - } else { - [button setKeyEquivalent:@""]; - } - } - - SDLMessageBoxPresenter* presenter = [[[SDLMessageBoxPresenter alloc] initWithParentWindow:messageboxdata->window] autorelease]; - - [presenter performSelectorOnMainThread:@selector(showAlert:) - withObject:alert - waitUntilDone:YES]; - - int returnValue = 0; - NSInteger clicked = presenter->clicked; - if (clicked >= NSAlertFirstButtonReturn) { - clicked -= NSAlertFirstButtonReturn; - *buttonid = buttons[clicked].buttonid; - } else { - returnValue = SDL_SetError("Did not get a valid `clicked button' id: %ld", (long)clicked); - } - - return returnValue; -}} - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.h deleted file mode 100644 index ce8601cbab8..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_cocoamodes_h -#define _SDL_cocoamodes_h - -typedef struct -{ - CGDirectDisplayID display; -} SDL_DisplayData; - -typedef struct -{ - CGDisplayModeRef moderef; -} SDL_DisplayModeData; - -extern void Cocoa_InitModes(_THIS); -extern int Cocoa_GetDisplayBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect); -extern int Cocoa_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect); -extern void Cocoa_GetDisplayModes(_THIS, SDL_VideoDisplay * display); -extern int Cocoa_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hpdi, float * vdpi); -extern int Cocoa_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -extern void Cocoa_QuitModes(_THIS); - -#endif /* _SDL_cocoamodes_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.m deleted file mode 100644 index 6ae9decbc2b..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.m +++ /dev/null @@ -1,464 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" -#include "SDL_assert.h" - -#if SDL_VIDEO_DRIVER_COCOA - -#include "SDL_cocoavideo.h" - -/* We need this for IODisplayCreateInfoDictionary and kIODisplayOnlyPreferredName */ -#include <IOKit/graphics/IOGraphicsLib.h> - -/* We need this for CVDisplayLinkGetNominalOutputVideoRefreshPeriod */ -#include <CoreVideo/CVBase.h> -#include <CoreVideo/CVDisplayLink.h> - -/* we need this for ShowMenuBar() and HideMenuBar(). */ -#include <Carbon/Carbon.h> - -/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */ -#include <AvailabilityMacros.h> - - -static void -Cocoa_ToggleMenuBar(const BOOL show) -{ - /* !!! FIXME: keep an eye on this. - * ShowMenuBar/HideMenuBar is officially unavailable for 64-bit binaries. - * It happens to work, as of 10.7, but we're going to see if - * we can just simply do without it on newer OSes... - */ -#if (MAC_OS_X_VERSION_MIN_REQUIRED < 1070) && !defined(__LP64__) - if (show) { - ShowMenuBar(); - } else { - HideMenuBar(); - } -#endif -} - -static int -CG_SetError(const char *prefix, CGDisplayErr result) -{ - const char *error; - - switch (result) { - case kCGErrorFailure: - error = "kCGErrorFailure"; - break; - case kCGErrorIllegalArgument: - error = "kCGErrorIllegalArgument"; - break; - case kCGErrorInvalidConnection: - error = "kCGErrorInvalidConnection"; - break; - case kCGErrorInvalidContext: - error = "kCGErrorInvalidContext"; - break; - case kCGErrorCannotComplete: - error = "kCGErrorCannotComplete"; - break; - case kCGErrorNotImplemented: - error = "kCGErrorNotImplemented"; - break; - case kCGErrorRangeCheck: - error = "kCGErrorRangeCheck"; - break; - case kCGErrorTypeCheck: - error = "kCGErrorTypeCheck"; - break; - case kCGErrorInvalidOperation: - error = "kCGErrorInvalidOperation"; - break; - case kCGErrorNoneAvailable: - error = "kCGErrorNoneAvailable"; - break; - default: - error = "Unknown Error"; - break; - } - return SDL_SetError("%s: %s", prefix, error); -} - -static SDL_bool -GetDisplayMode(_THIS, CGDisplayModeRef vidmode, CVDisplayLinkRef link, SDL_DisplayMode *mode) -{ - SDL_DisplayModeData *data; - int width = 0; - int height = 0; - int bpp = 0; - int refreshRate = 0; - CFStringRef fmt; - - data = (SDL_DisplayModeData *) SDL_malloc(sizeof(*data)); - if (!data) { - return SDL_FALSE; - } - data->moderef = vidmode; - - fmt = CGDisplayModeCopyPixelEncoding(vidmode); - width = (int) CGDisplayModeGetWidth(vidmode); - height = (int) CGDisplayModeGetHeight(vidmode); - refreshRate = (int) (CGDisplayModeGetRefreshRate(vidmode) + 0.5); - - if (CFStringCompare(fmt, CFSTR(IO32BitDirectPixels), - kCFCompareCaseInsensitive) == kCFCompareEqualTo) { - bpp = 32; - } else if (CFStringCompare(fmt, CFSTR(IO16BitDirectPixels), - kCFCompareCaseInsensitive) == kCFCompareEqualTo) { - bpp = 16; - } else if (CFStringCompare(fmt, CFSTR(kIO30BitDirectPixels), - kCFCompareCaseInsensitive) == kCFCompareEqualTo) { - bpp = 30; - } else { - bpp = 0; /* ignore 8-bit and such for now. */ - } - - CFRelease(fmt); - - /* CGDisplayModeGetRefreshRate returns 0 for many non-CRT displays. */ - if (refreshRate == 0 && link != NULL) { - CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link); - if ((time.flags & kCVTimeIsIndefinite) == 0 && time.timeValue != 0) { - refreshRate = (int) ((time.timeScale / (double) time.timeValue) + 0.5); - } - } - - mode->format = SDL_PIXELFORMAT_UNKNOWN; - switch (bpp) { - case 16: - mode->format = SDL_PIXELFORMAT_ARGB1555; - break; - case 30: - mode->format = SDL_PIXELFORMAT_ARGB2101010; - break; - case 32: - mode->format = SDL_PIXELFORMAT_ARGB8888; - break; - case 8: /* We don't support palettized modes now */ - default: /* Totally unrecognizable bit depth. */ - SDL_free(data); - return SDL_FALSE; - } - mode->w = width; - mode->h = height; - mode->refresh_rate = refreshRate; - mode->driverdata = data; - return SDL_TRUE; -} - -static const char * -Cocoa_GetDisplayName(CGDirectDisplayID displayID) -{ - CFDictionaryRef deviceInfo = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID), kIODisplayOnlyPreferredName); - NSDictionary *localizedNames = [(NSDictionary *)deviceInfo objectForKey:[NSString stringWithUTF8String:kDisplayProductName]]; - const char* displayName = NULL; - - if ([localizedNames count] > 0) { - displayName = SDL_strdup([[localizedNames objectForKey:[[localizedNames allKeys] objectAtIndex:0]] UTF8String]); - } - CFRelease(deviceInfo); - return displayName; -} - -void -Cocoa_InitModes(_THIS) -{ @autoreleasepool -{ - CGDisplayErr result; - CGDirectDisplayID *displays; - CGDisplayCount numDisplays; - int pass, i; - - result = CGGetOnlineDisplayList(0, NULL, &numDisplays); - if (result != kCGErrorSuccess) { - CG_SetError("CGGetOnlineDisplayList()", result); - return; - } - displays = SDL_stack_alloc(CGDirectDisplayID, numDisplays); - result = CGGetOnlineDisplayList(numDisplays, displays, &numDisplays); - if (result != kCGErrorSuccess) { - CG_SetError("CGGetOnlineDisplayList()", result); - SDL_stack_free(displays); - return; - } - - /* Pick up the primary display in the first pass, then get the rest */ - for (pass = 0; pass < 2; ++pass) { - for (i = 0; i < numDisplays; ++i) { - SDL_VideoDisplay display; - SDL_DisplayData *displaydata; - SDL_DisplayMode mode; - CGDisplayModeRef moderef = NULL; - CVDisplayLinkRef link = NULL; - - if (pass == 0) { - if (!CGDisplayIsMain(displays[i])) { - continue; - } - } else { - if (CGDisplayIsMain(displays[i])) { - continue; - } - } - - if (CGDisplayMirrorsDisplay(displays[i]) != kCGNullDirectDisplay) { - continue; - } - - moderef = CGDisplayCopyDisplayMode(displays[i]); - - if (!moderef) { - continue; - } - - displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata)); - if (!displaydata) { - CGDisplayModeRelease(moderef); - continue; - } - displaydata->display = displays[i]; - - CVDisplayLinkCreateWithCGDisplay(displays[i], &link); - - SDL_zero(display); - /* this returns a stddup'ed string */ - display.name = (char *)Cocoa_GetDisplayName(displays[i]); - if (!GetDisplayMode(_this, moderef, link, &mode)) { - CVDisplayLinkRelease(link); - CGDisplayModeRelease(moderef); - SDL_free(display.name); - SDL_free(displaydata); - continue; - } - - CVDisplayLinkRelease(link); - - display.desktop_mode = mode; - display.current_mode = mode; - display.driverdata = displaydata; - SDL_AddVideoDisplay(&display); - SDL_free(display.name); - } - } - SDL_stack_free(displays); -}} - -int -Cocoa_GetDisplayBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect) -{ - SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata; - CGRect cgrect; - - cgrect = CGDisplayBounds(displaydata->display); - rect->x = (int)cgrect.origin.x; - rect->y = (int)cgrect.origin.y; - rect->w = (int)cgrect.size.width; - rect->h = (int)cgrect.size.height; - return 0; -} - -int -Cocoa_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect) -{ - SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata; - const CGDirectDisplayID cgdisplay = displaydata->display; - NSArray *screens = [NSScreen screens]; - NSScreen *screen = nil; - - /* !!! FIXME: maybe track the NSScreen in SDL_DisplayData? */ - for (NSScreen *i in screens) { - const CGDirectDisplayID thisDisplay = (CGDirectDisplayID) [[[i deviceDescription] objectForKey:@"NSScreenNumber"] unsignedIntValue]; - if (thisDisplay == cgdisplay) { - screen = i; - break; - } - } - - SDL_assert(screen != nil); /* didn't find it?! */ - if (screen == nil) { - return -1; - } - - const CGRect cgrect = CGDisplayBounds(cgdisplay); - const NSRect frame = [screen visibleFrame]; - - // !!! FIXME: I assume -[NSScreen visibleFrame] is relative to the origin of the screen in question and not the whole desktop. - // !!! FIXME: The math vs CGDisplayBounds might be incorrect if that's not the case, though. Check this. - rect->x = (int)(cgrect.origin.x + frame.origin.x); - rect->y = (int)(cgrect.origin.y + frame.origin.y); - rect->w = (int)frame.size.width; - rect->h = (int)frame.size.height; - - return 0; -} - -int -Cocoa_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi) -{ - const float MM_IN_INCH = 25.4f; - - SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata; - - CGSize displaySize = CGDisplayScreenSize(data->display); - int pixelWidth = (int) CGDisplayPixelsWide(data->display); - int pixelHeight = (int) CGDisplayPixelsHigh(data->display); - - if (ddpi) { - *ddpi = SDL_ComputeDiagonalDPI(pixelWidth, pixelHeight, displaySize.width / MM_IN_INCH, displaySize.height / MM_IN_INCH); - } - if (hdpi) { - *hdpi = pixelWidth * MM_IN_INCH / displaySize.width; - } - if (vdpi) { - *vdpi = pixelHeight * MM_IN_INCH / displaySize.height; - } - - return 0; -} - -void -Cocoa_GetDisplayModes(_THIS, SDL_VideoDisplay * display) -{ - SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata; - CFArrayRef modes = CGDisplayCopyAllDisplayModes(data->display, NULL); - - if (modes) { - CVDisplayLinkRef link = NULL; - const CFIndex count = CFArrayGetCount(modes); - CFIndex i; - - CVDisplayLinkCreateWithCGDisplay(data->display, &link); - - for (i = 0; i < count; i++) { - CGDisplayModeRef moderef = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); - SDL_DisplayMode mode; - if (GetDisplayMode(_this, moderef, link, &mode)) { - CGDisplayModeRetain(moderef); - SDL_AddDisplayMode(display, &mode); - } - } - - CVDisplayLinkRelease(link); - CFRelease(modes); - } -} - -int -Cocoa_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata; - SDL_DisplayModeData *data = (SDL_DisplayModeData *) mode->driverdata; - CGDisplayFadeReservationToken fade_token = kCGDisplayFadeReservationInvalidToken; - CGError result; - - /* Fade to black to hide resolution-switching flicker */ - if (CGAcquireDisplayFadeReservation(5, &fade_token) == kCGErrorSuccess) { - CGDisplayFade(fade_token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE); - } - - if (data == display->desktop_mode.driverdata) { - /* Restoring desktop mode */ - CGDisplaySetDisplayMode(displaydata->display, data->moderef, NULL); - - if (CGDisplayIsMain(displaydata->display)) { - CGReleaseAllDisplays(); - } else { - CGDisplayRelease(displaydata->display); - } - - if (CGDisplayIsMain(displaydata->display)) { - Cocoa_ToggleMenuBar(YES); - } - } else { - /* Put up the blanking window (a window above all other windows) */ - if (CGDisplayIsMain(displaydata->display)) { - /* If we don't capture all displays, Cocoa tries to rearrange windows... *sigh* */ - result = CGCaptureAllDisplays(); - } else { - result = CGDisplayCapture(displaydata->display); - } - if (result != kCGErrorSuccess) { - CG_SetError("CGDisplayCapture()", result); - goto ERR_NO_CAPTURE; - } - - /* Do the physical switch */ - result = CGDisplaySetDisplayMode(displaydata->display, data->moderef, NULL); - if (result != kCGErrorSuccess) { - CG_SetError("CGDisplaySwitchToMode()", result); - goto ERR_NO_SWITCH; - } - - /* Hide the menu bar so it doesn't intercept events */ - if (CGDisplayIsMain(displaydata->display)) { - Cocoa_ToggleMenuBar(NO); - } - } - - /* Fade in again (asynchronously) */ - if (fade_token != kCGDisplayFadeReservationInvalidToken) { - CGDisplayFade(fade_token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE); - CGReleaseDisplayFadeReservation(fade_token); - } - - return 0; - - /* Since the blanking window covers *all* windows (even force quit) correct recovery is crucial */ -ERR_NO_SWITCH: - CGDisplayRelease(displaydata->display); -ERR_NO_CAPTURE: - if (fade_token != kCGDisplayFadeReservationInvalidToken) { - CGDisplayFade (fade_token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE); - CGReleaseDisplayFadeReservation(fade_token); - } - return -1; -} - -void -Cocoa_QuitModes(_THIS) -{ - int i, j; - - for (i = 0; i < _this->num_displays; ++i) { - SDL_VideoDisplay *display = &_this->displays[i]; - SDL_DisplayModeData *mode; - - if (display->current_mode.driverdata != display->desktop_mode.driverdata) { - Cocoa_SetDisplayMode(_this, display, &display->desktop_mode); - } - - mode = (SDL_DisplayModeData *) display->desktop_mode.driverdata; - CGDisplayModeRelease(mode->moderef); - - for (j = 0; j < display->num_display_modes; j++) { - mode = (SDL_DisplayModeData*) display->display_modes[j].driverdata; - CGDisplayModeRelease(mode->moderef); - } - - } - Cocoa_ToggleMenuBar(YES); -} - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamouse.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoamouse.h deleted file mode 100644 index 4f60c8372bc..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamouse.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_cocoamouse_h -#define _SDL_cocoamouse_h - -#include "SDL_cocoavideo.h" - -extern void Cocoa_InitMouse(_THIS); -extern void Cocoa_HandleMouseEvent(_THIS, NSEvent * event); -extern void Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent * event); -extern void Cocoa_HandleMouseWarp(CGFloat x, CGFloat y); -extern void Cocoa_QuitMouse(_THIS); - -typedef struct { - /* Wether we've seen a cursor warp since the last move event. */ - SDL_bool seenWarp; - /* What location our last cursor warp was to. */ - CGFloat lastWarpX; - CGFloat lastWarpY; - /* What location we last saw the cursor move to. */ - CGFloat lastMoveX; - CGFloat lastMoveY; - void *tapdata; -} SDL_MouseData; - -@interface NSCursor (InvisibleCursor) -+ (NSCursor *)invisibleCursor; -@end - -#endif /* _SDL_cocoamouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamouse.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoamouse.m deleted file mode 100644 index 0a27549ae46..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamouse.m +++ /dev/null @@ -1,476 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_COCOA - -#include "SDL_assert.h" -#include "SDL_events.h" -#include "SDL_cocoamouse.h" -#include "SDL_cocoamousetap.h" - -#include "../../events/SDL_mouse_c.h" - -/* #define DEBUG_COCOAMOUSE */ - -#ifdef DEBUG_COCOAMOUSE -#define DLog(fmt, ...) printf("%s: " fmt "\n", __func__, ##__VA_ARGS__) -#else -#define DLog(...) do { } while (0) -#endif - -@implementation NSCursor (InvisibleCursor) -+ (NSCursor *)invisibleCursor -{ - static NSCursor *invisibleCursor = NULL; - if (!invisibleCursor) { - /* RAW 16x16 transparent GIF */ - static unsigned char cursorBytes[] = { - 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x10, 0x00, 0x10, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xF9, 0x04, - 0x01, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x10, 0x00, 0x00, 0x02, 0x0E, 0x8C, 0x8F, 0xA9, 0xCB, 0xED, - 0x0F, 0xA3, 0x9C, 0xB4, 0xDA, 0x8B, 0xB3, 0x3E, 0x05, 0x00, 0x3B - }; - - NSData *cursorData = [NSData dataWithBytesNoCopy:&cursorBytes[0] - length:sizeof(cursorBytes) - freeWhenDone:NO]; - NSImage *cursorImage = [[[NSImage alloc] initWithData:cursorData] autorelease]; - invisibleCursor = [[NSCursor alloc] initWithImage:cursorImage - hotSpot:NSZeroPoint]; - } - - return invisibleCursor; -} -@end - - -static SDL_Cursor * -Cocoa_CreateDefaultCursor() -{ @autoreleasepool -{ - NSCursor *nscursor; - SDL_Cursor *cursor = NULL; - - nscursor = [NSCursor arrowCursor]; - - if (nscursor) { - cursor = SDL_calloc(1, sizeof(*cursor)); - if (cursor) { - cursor->driverdata = nscursor; - [nscursor retain]; - } - } - - return cursor; -}} - -static SDL_Cursor * -Cocoa_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y) -{ @autoreleasepool -{ - NSImage *nsimage; - NSCursor *nscursor = NULL; - SDL_Cursor *cursor = NULL; - - nsimage = Cocoa_CreateImage(surface); - if (nsimage) { - nscursor = [[NSCursor alloc] initWithImage: nsimage hotSpot: NSMakePoint(hot_x, hot_y)]; - } - - if (nscursor) { - cursor = SDL_calloc(1, sizeof(*cursor)); - if (cursor) { - cursor->driverdata = nscursor; - } else { - [nscursor release]; - } - } - - return cursor; -}} - -static SDL_Cursor * -Cocoa_CreateSystemCursor(SDL_SystemCursor id) -{ @autoreleasepool -{ - NSCursor *nscursor = NULL; - SDL_Cursor *cursor = NULL; - - switch(id) { - case SDL_SYSTEM_CURSOR_ARROW: - nscursor = [NSCursor arrowCursor]; - break; - case SDL_SYSTEM_CURSOR_IBEAM: - nscursor = [NSCursor IBeamCursor]; - break; - case SDL_SYSTEM_CURSOR_WAIT: - nscursor = [NSCursor arrowCursor]; - break; - case SDL_SYSTEM_CURSOR_CROSSHAIR: - nscursor = [NSCursor crosshairCursor]; - break; - case SDL_SYSTEM_CURSOR_WAITARROW: - nscursor = [NSCursor arrowCursor]; - break; - case SDL_SYSTEM_CURSOR_SIZENWSE: - case SDL_SYSTEM_CURSOR_SIZENESW: - nscursor = [NSCursor closedHandCursor]; - break; - case SDL_SYSTEM_CURSOR_SIZEWE: - nscursor = [NSCursor resizeLeftRightCursor]; - break; - case SDL_SYSTEM_CURSOR_SIZENS: - nscursor = [NSCursor resizeUpDownCursor]; - break; - case SDL_SYSTEM_CURSOR_SIZEALL: - nscursor = [NSCursor closedHandCursor]; - break; - case SDL_SYSTEM_CURSOR_NO: - nscursor = [NSCursor operationNotAllowedCursor]; - break; - case SDL_SYSTEM_CURSOR_HAND: - nscursor = [NSCursor pointingHandCursor]; - break; - default: - SDL_assert(!"Unknown system cursor"); - return NULL; - } - - if (nscursor) { - cursor = SDL_calloc(1, sizeof(*cursor)); - if (cursor) { - /* We'll free it later, so retain it here */ - [nscursor retain]; - cursor->driverdata = nscursor; - } - } - - return cursor; -}} - -static void -Cocoa_FreeCursor(SDL_Cursor * cursor) -{ @autoreleasepool -{ - NSCursor *nscursor = (NSCursor *)cursor->driverdata; - - [nscursor release]; - SDL_free(cursor); -}} - -static int -Cocoa_ShowCursor(SDL_Cursor * cursor) -{ @autoreleasepool -{ - SDL_VideoDevice *device = SDL_GetVideoDevice(); - SDL_Window *window = (device ? device->windows : NULL); - for (; window != NULL; window = window->next) { - SDL_WindowData *driverdata = (SDL_WindowData *)window->driverdata; - if (driverdata) { - [driverdata->nswindow performSelectorOnMainThread:@selector(invalidateCursorRectsForView:) - withObject:[driverdata->nswindow contentView] - waitUntilDone:NO]; - } - } - return 0; -}} - -static SDL_Window * -SDL_FindWindowAtPoint(const int x, const int y) -{ - const SDL_Point pt = { x, y }; - SDL_Window *i; - for (i = SDL_GetVideoDevice()->windows; i; i = i->next) { - const SDL_Rect r = { i->x, i->y, i->w, i->h }; - if (SDL_PointInRect(&pt, &r)) { - return i; - } - } - - return NULL; -} - -static int -Cocoa_WarpMouseGlobal(int x, int y) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - if (mouse->focus) { - SDL_WindowData *data = (SDL_WindowData *) mouse->focus->driverdata; - if ([data->listener isMoving]) { - DLog("Postponing warp, window being moved."); - [data->listener setPendingMoveX:x Y:y]; - return 0; - } - } - const CGPoint point = CGPointMake((float)x, (float)y); - - Cocoa_HandleMouseWarp(point.x, point.y); - - CGWarpMouseCursorPosition(point); - - /* CGWarpMouse causes a short delay by default, which is preventable by - * Calling this directly after. CGSetLocalEventsSuppressionInterval can also - * prevent it, but it's deprecated as of OS X 10.6. - */ - if (!mouse->relative_mode) { - CGAssociateMouseAndMouseCursorPosition(YES); - } - - /* CGWarpMouseCursorPosition doesn't generate a window event, unlike our - * other implementations' APIs. Send what's appropriate. - */ - if (!mouse->relative_mode) { - SDL_Window *win = SDL_FindWindowAtPoint(x, y); - SDL_SetMouseFocus(win); - if (win) { - SDL_assert(win == mouse->focus); - SDL_SendMouseMotion(win, mouse->mouseID, 0, x - win->x, y - win->y); - } - } - - return 0; -} - -static void -Cocoa_WarpMouse(SDL_Window * window, int x, int y) -{ - Cocoa_WarpMouseGlobal(x + window->x, y + window->y); -} - -static int -Cocoa_SetRelativeMouseMode(SDL_bool enabled) -{ - /* We will re-apply the relative mode when the window gets focus, if it - * doesn't have focus right now. - */ - SDL_Window *window = SDL_GetMouseFocus(); - if (!window) { - return 0; - } - - /* We will re-apply the relative mode when the window finishes being moved, - * if it is being moved right now. - */ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - if ([data->listener isMoving]) { - return 0; - } - - CGError result; - if (enabled) { - DLog("Turning on."); - result = CGAssociateMouseAndMouseCursorPosition(NO); - } else { - DLog("Turning off."); - result = CGAssociateMouseAndMouseCursorPosition(YES); - } - if (result != kCGErrorSuccess) { - return SDL_SetError("CGAssociateMouseAndMouseCursorPosition() failed"); - } - - /* The hide/unhide calls are redundant most of the time, but they fix - * https://bugzilla.libsdl.org/show_bug.cgi?id=2550 - */ - if (enabled) { - [NSCursor hide]; - } else { - [NSCursor unhide]; - } - return 0; -} - -static int -Cocoa_CaptureMouse(SDL_Window *window) -{ - /* our Cocoa event code already tracks the mouse outside the window, - so all we have to do here is say "okay" and do what we always do. */ - return 0; -} - -static Uint32 -Cocoa_GetGlobalMouseState(int *x, int *y) -{ - const NSUInteger cocoaButtons = [NSEvent pressedMouseButtons]; - const NSPoint cocoaLocation = [NSEvent mouseLocation]; - Uint32 retval = 0; - - for (NSScreen *screen in [NSScreen screens]) { - NSRect frame = [screen frame]; - if (NSMouseInRect(cocoaLocation, frame, NO)) { - *x = (int) cocoaLocation.x; - *y = (int) ((frame.origin.y + frame.size.height) - cocoaLocation.y); - break; - } - } - - retval |= (cocoaButtons & (1 << 0)) ? SDL_BUTTON_LMASK : 0; - retval |= (cocoaButtons & (1 << 1)) ? SDL_BUTTON_RMASK : 0; - retval |= (cocoaButtons & (1 << 2)) ? SDL_BUTTON_MMASK : 0; - retval |= (cocoaButtons & (1 << 3)) ? SDL_BUTTON_X1MASK : 0; - retval |= (cocoaButtons & (1 << 4)) ? SDL_BUTTON_X2MASK : 0; - - return retval; -} - -void -Cocoa_InitMouse(_THIS) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - - mouse->driverdata = SDL_calloc(1, sizeof(SDL_MouseData)); - - mouse->CreateCursor = Cocoa_CreateCursor; - mouse->CreateSystemCursor = Cocoa_CreateSystemCursor; - mouse->ShowCursor = Cocoa_ShowCursor; - mouse->FreeCursor = Cocoa_FreeCursor; - mouse->WarpMouse = Cocoa_WarpMouse; - mouse->WarpMouseGlobal = Cocoa_WarpMouseGlobal; - mouse->SetRelativeMouseMode = Cocoa_SetRelativeMouseMode; - mouse->CaptureMouse = Cocoa_CaptureMouse; - mouse->GetGlobalMouseState = Cocoa_GetGlobalMouseState; - - SDL_SetDefaultCursor(Cocoa_CreateDefaultCursor()); - - Cocoa_InitMouseEventTap(mouse->driverdata); - - SDL_MouseData *driverdata = (SDL_MouseData*)mouse->driverdata; - const NSPoint location = [NSEvent mouseLocation]; - driverdata->lastMoveX = location.x; - driverdata->lastMoveY = location.y; -} - -void -Cocoa_HandleMouseEvent(_THIS, NSEvent *event) -{ - switch ([event type]) { - case NSMouseMoved: - case NSLeftMouseDragged: - case NSRightMouseDragged: - case NSOtherMouseDragged: - break; - - default: - /* Ignore any other events. */ - return; - } - - SDL_Mouse *mouse = SDL_GetMouse(); - SDL_MouseData *driverdata = (SDL_MouseData*)mouse->driverdata; - if (!driverdata) { - return; /* can happen when returning from fullscreen Space on shutdown */ - } - - const SDL_bool seenWarp = driverdata->seenWarp; - driverdata->seenWarp = NO; - - const NSPoint location = [NSEvent mouseLocation]; - const CGFloat lastMoveX = driverdata->lastMoveX; - const CGFloat lastMoveY = driverdata->lastMoveY; - driverdata->lastMoveX = location.x; - driverdata->lastMoveY = location.y; - DLog("Last seen mouse: (%g, %g)", location.x, location.y); - - /* Non-relative movement is handled in -[Cocoa_WindowListener mouseMoved:] */ - if (!mouse->relative_mode) { - return; - } - - /* Ignore events that aren't inside the client area (i.e. title bar.) */ - if ([event window]) { - NSRect windowRect = [[[event window] contentView] frame]; - if (!NSMouseInRect([event locationInWindow], windowRect, NO)) { - return; - } - } - - float deltaX = [event deltaX]; - float deltaY = [event deltaY]; - - if (seenWarp) { - deltaX += (lastMoveX - driverdata->lastWarpX); - deltaY += ((CGDisplayPixelsHigh(kCGDirectMainDisplay) - lastMoveY) - driverdata->lastWarpY); - - DLog("Motion was (%g, %g), offset to (%g, %g)", [event deltaX], [event deltaY], deltaX, deltaY); - } - - SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 1, (int)deltaX, (int)deltaY); -} - -void -Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent *event) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - - CGFloat x = -[event deltaX]; - CGFloat y = [event deltaY]; - SDL_MouseWheelDirection direction = SDL_MOUSEWHEEL_NORMAL; - - if ([event respondsToSelector:@selector(isDirectionInvertedFromDevice)]) { - if ([event isDirectionInvertedFromDevice] == YES) { - direction = SDL_MOUSEWHEEL_FLIPPED; - } - } - - if (x > 0) { - x = SDL_ceil(x); - } else if (x < 0) { - x = SDL_floor(x); - } - if (y > 0) { - y = SDL_ceil(y); - } else if (y < 0) { - y = SDL_floor(y); - } - SDL_SendMouseWheel(window, mouse->mouseID, (int)x, (int)y, direction); -} - -void -Cocoa_HandleMouseWarp(CGFloat x, CGFloat y) -{ - /* This makes Cocoa_HandleMouseEvent ignore the delta caused by the warp, - * since it gets included in the next movement event. - */ - SDL_MouseData *driverdata = (SDL_MouseData*)SDL_GetMouse()->driverdata; - driverdata->lastWarpX = x; - driverdata->lastWarpY = y; - driverdata->seenWarp = SDL_TRUE; - - DLog("(%g, %g)", x, y); -} - -void -Cocoa_QuitMouse(_THIS) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - if (mouse) { - if (mouse->driverdata) { - Cocoa_QuitMouseEventTap(((SDL_MouseData*)mouse->driverdata)); - } - - SDL_free(mouse->driverdata); - } -} - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamousetap.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoamousetap.h deleted file mode 100644 index af92314b64e..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamousetap.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_cocoamousetap_h -#define _SDL_cocoamousetap_h - -#include "SDL_cocoamouse.h" - -extern void Cocoa_InitMouseEventTap(SDL_MouseData *driverdata); -extern void Cocoa_QuitMouseEventTap(SDL_MouseData *driverdata); - -#endif /* _SDL_cocoamousetap_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamousetap.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoamousetap.m deleted file mode 100644 index 48abbca9cbe..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamousetap.m +++ /dev/null @@ -1,257 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_COCOA - -#include "SDL_cocoamousetap.h" - -/* Event taps are forbidden in the Mac App Store, so we can only enable this - * code if your app doesn't need to ship through the app store. - * This code makes it so that a grabbed cursor cannot "leak" a mouse click - * past the edge of the window if moving the cursor too fast. - */ -#if SDL_MAC_NO_SANDBOX - -#include "SDL_keyboard.h" -#include "SDL_cocoavideo.h" -#include "../../thread/SDL_systhread.h" - -#include "../../events/SDL_mouse_c.h" - -typedef struct { - CFMachPortRef tap; - CFRunLoopRef runloop; - CFRunLoopSourceRef runloopSource; - SDL_Thread *thread; - SDL_sem *runloopStartedSemaphore; -} SDL_MouseEventTapData; - -static const CGEventMask movementEventsMask = - CGEventMaskBit(kCGEventLeftMouseDragged) - | CGEventMaskBit(kCGEventRightMouseDragged) - | CGEventMaskBit(kCGEventMouseMoved); - -static const CGEventMask allGrabbedEventsMask = - CGEventMaskBit(kCGEventLeftMouseDown) | CGEventMaskBit(kCGEventLeftMouseUp) - | CGEventMaskBit(kCGEventRightMouseDown) | CGEventMaskBit(kCGEventRightMouseUp) - | CGEventMaskBit(kCGEventOtherMouseDown) | CGEventMaskBit(kCGEventOtherMouseUp) - | CGEventMaskBit(kCGEventLeftMouseDragged) | CGEventMaskBit(kCGEventRightMouseDragged) - | CGEventMaskBit(kCGEventMouseMoved); - -static CGEventRef -Cocoa_MouseTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) -{ - SDL_MouseEventTapData *tapdata = (SDL_MouseEventTapData*)refcon; - SDL_Mouse *mouse = SDL_GetMouse(); - SDL_Window *window = SDL_GetKeyboardFocus(); - NSWindow *nswindow; - NSRect windowRect; - CGPoint eventLocation; - - switch (type) { - case kCGEventTapDisabledByTimeout: - case kCGEventTapDisabledByUserInput: - { - CGEventTapEnable(tapdata->tap, true); - return NULL; - } - default: - break; - } - - - if (!window || !mouse) { - return event; - } - - if (mouse->relative_mode) { - return event; - } - - if (!(window->flags & SDL_WINDOW_INPUT_GRABBED)) { - return event; - } - - /* This is the same coordinate system as Cocoa uses. */ - nswindow = ((SDL_WindowData *) window->driverdata)->nswindow; - eventLocation = CGEventGetUnflippedLocation(event); - windowRect = [nswindow contentRectForFrameRect:[nswindow frame]]; - - if (!NSMouseInRect(NSPointFromCGPoint(eventLocation), windowRect, NO)) { - - /* This is in CGs global screenspace coordinate system, which has a - * flipped Y. - */ - CGPoint newLocation = CGEventGetLocation(event); - - if (eventLocation.x < NSMinX(windowRect)) { - newLocation.x = NSMinX(windowRect); - } else if (eventLocation.x >= NSMaxX(windowRect)) { - newLocation.x = NSMaxX(windowRect) - 1.0; - } - - if (eventLocation.y <= NSMinY(windowRect)) { - newLocation.y -= (NSMinY(windowRect) - eventLocation.y + 1); - } else if (eventLocation.y > NSMaxY(windowRect)) { - newLocation.y += (eventLocation.y - NSMaxY(windowRect)); - } - - CGWarpMouseCursorPosition(newLocation); - CGAssociateMouseAndMouseCursorPosition(YES); - - if ((CGEventMaskBit(type) & movementEventsMask) == 0) { - /* For click events, we just constrain the event to the window, so - * no other app receives the click event. We can't due the same to - * movement events, since they mean that our warp cursor above - * behaves strangely. - */ - CGEventSetLocation(event, newLocation); - } - } - - return event; -} - -static void -SemaphorePostCallback(CFRunLoopTimerRef timer, void *info) -{ - SDL_SemPost((SDL_sem*)info); -} - -static int -Cocoa_MouseTapThread(void *data) -{ - SDL_MouseEventTapData *tapdata = (SDL_MouseEventTapData*)data; - - /* Create a tap. */ - CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, - kCGEventTapOptionDefault, allGrabbedEventsMask, - &Cocoa_MouseTapCallback, tapdata); - if (eventTap) { - /* Try to create a runloop source we can schedule. */ - CFRunLoopSourceRef runloopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0); - if (runloopSource) { - tapdata->tap = eventTap; - tapdata->runloopSource = runloopSource; - } else { - CFRelease(eventTap); - SDL_SemPost(tapdata->runloopStartedSemaphore); - /* TODO: Both here and in the return below, set some state in - * tapdata to indicate that initialization failed, which we should - * check in InitMouseEventTap, after we move the semaphore check - * from Quit to Init. - */ - return 1; - } - } else { - SDL_SemPost(tapdata->runloopStartedSemaphore); - return 1; - } - - tapdata->runloop = CFRunLoopGetCurrent(); - CFRunLoopAddSource(tapdata->runloop, tapdata->runloopSource, kCFRunLoopCommonModes); - CFRunLoopTimerContext context = {.info = tapdata->runloopStartedSemaphore}; - /* We signal the runloop started semaphore *after* the run loop has started, indicating it's safe to CFRunLoopStop it. */ - CFRunLoopTimerRef timer = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent(), 0, 0, 0, &SemaphorePostCallback, &context); - CFRunLoopAddTimer(tapdata->runloop, timer, kCFRunLoopCommonModes); - CFRelease(timer); - - /* Run the event loop to handle events in the event tap. */ - CFRunLoopRun(); - /* Make sure this is signaled so that SDL_QuitMouseEventTap knows it can safely SDL_WaitThread for us. */ - if (SDL_SemValue(tapdata->runloopStartedSemaphore) < 1) { - SDL_SemPost(tapdata->runloopStartedSemaphore); - } - CFRunLoopRemoveSource(tapdata->runloop, tapdata->runloopSource, kCFRunLoopCommonModes); - - /* Clean up. */ - CGEventTapEnable(tapdata->tap, false); - CFRelease(tapdata->runloopSource); - CFRelease(tapdata->tap); - tapdata->runloopSource = NULL; - tapdata->tap = NULL; - - return 0; -} - -void -Cocoa_InitMouseEventTap(SDL_MouseData* driverdata) -{ - SDL_MouseEventTapData *tapdata; - driverdata->tapdata = SDL_calloc(1, sizeof(SDL_MouseEventTapData)); - tapdata = (SDL_MouseEventTapData*)driverdata->tapdata; - - tapdata->runloopStartedSemaphore = SDL_CreateSemaphore(0); - if (tapdata->runloopStartedSemaphore) { - tapdata->thread = SDL_CreateThreadInternal(&Cocoa_MouseTapThread, "Event Tap Loop", 512 * 1024, tapdata); - if (!tapdata->thread) { - SDL_DestroySemaphore(tapdata->runloopStartedSemaphore); - } - } - - if (!tapdata->thread) { - SDL_free(driverdata->tapdata); - driverdata->tapdata = NULL; - } -} - -void -Cocoa_QuitMouseEventTap(SDL_MouseData *driverdata) -{ - SDL_MouseEventTapData *tapdata = (SDL_MouseEventTapData*)driverdata->tapdata; - int status; - - /* Ensure that the runloop has been started first. - * TODO: Move this to InitMouseEventTap, check for error conditions that can - * happen in Cocoa_MouseTapThread, and fall back to the non-EventTap way of - * grabbing the mouse if it fails to Init. - */ - status = SDL_SemWaitTimeout(tapdata->runloopStartedSemaphore, 5000); - if (status > -1) { - /* Then stop it, which will cause Cocoa_MouseTapThread to return. */ - CFRunLoopStop(tapdata->runloop); - /* And then wait for Cocoa_MouseTapThread to finish cleaning up. It - * releases some of the pointers in tapdata. */ - SDL_WaitThread(tapdata->thread, &status); - } - - SDL_free(driverdata->tapdata); - driverdata->tapdata = NULL; -} - -#else /* SDL_MAC_NO_SANDBOX */ - -void -Cocoa_InitMouseEventTap(SDL_MouseData *unused) -{ -} - -void -Cocoa_QuitMouseEventTap(SDL_MouseData *driverdata) -{ -} - -#endif /* !SDL_MAC_NO_SANDBOX */ - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaopengl.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoaopengl.h deleted file mode 100644 index 1f7bd57f057..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaopengl.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_cocoaopengl_h -#define _SDL_cocoaopengl_h - -#if SDL_VIDEO_OPENGL_CGL - -#include "SDL_atomic.h" -#import <Cocoa/Cocoa.h> - -struct SDL_GLDriverData -{ - int initialized; -}; - -@interface SDLOpenGLContext : NSOpenGLContext { - SDL_atomic_t dirty; - SDL_Window *window; -} - -- (id)initWithFormat:(NSOpenGLPixelFormat *)format - shareContext:(NSOpenGLContext *)share; -- (void)scheduleUpdate; -- (void)updateIfNeeded; -- (void)setWindow:(SDL_Window *)window; - -@end - - -/* OpenGL functions */ -extern int Cocoa_GL_LoadLibrary(_THIS, const char *path); -extern void *Cocoa_GL_GetProcAddress(_THIS, const char *proc); -extern void Cocoa_GL_UnloadLibrary(_THIS); -extern SDL_GLContext Cocoa_GL_CreateContext(_THIS, SDL_Window * window); -extern int Cocoa_GL_MakeCurrent(_THIS, SDL_Window * window, - SDL_GLContext context); -extern void Cocoa_GL_GetDrawableSize(_THIS, SDL_Window * window, - int * w, int * h); -extern int Cocoa_GL_SetSwapInterval(_THIS, int interval); -extern int Cocoa_GL_GetSwapInterval(_THIS); -extern void Cocoa_GL_SwapWindow(_THIS, SDL_Window * window); -extern void Cocoa_GL_DeleteContext(_THIS, SDL_GLContext context); - -#endif /* SDL_VIDEO_OPENGL_CGL */ - -#endif /* _SDL_cocoaopengl_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaopengl.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoaopengl.m deleted file mode 100644 index 645e5ba45dc..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoaopengl.m +++ /dev/null @@ -1,407 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -/* NSOpenGL implementation of SDL OpenGL support */ - -#if SDL_VIDEO_OPENGL_CGL -#include "SDL_cocoavideo.h" -#include "SDL_cocoaopengl.h" - -#include <OpenGL/CGLTypes.h> -#include <OpenGL/OpenGL.h> -#include <OpenGL/CGLRenderers.h> - -#include "SDL_loadso.h" -#include "SDL_opengl.h" - -#define DEFAULT_OPENGL "/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib" - -@implementation SDLOpenGLContext : NSOpenGLContext - -- (id)initWithFormat:(NSOpenGLPixelFormat *)format - shareContext:(NSOpenGLContext *)share -{ - self = [super initWithFormat:format shareContext:share]; - if (self) { - SDL_AtomicSet(&self->dirty, 0); - self->window = NULL; - } - return self; -} - -- (void)scheduleUpdate -{ - SDL_AtomicAdd(&self->dirty, 1); -} - -/* This should only be called on the thread on which a user is using the context. */ -- (void)updateIfNeeded -{ - int value = SDL_AtomicSet(&self->dirty, 0); - if (value > 0) { - /* We call the real underlying update here, since -[SDLOpenGLContext update] just calls us. */ - [super update]; - } -} - -/* This should only be called on the thread on which a user is using the context. */ -- (void)update -{ - /* This ensures that regular 'update' calls clear the atomic dirty flag. */ - [self scheduleUpdate]; - [self updateIfNeeded]; -} - -/* Updates the drawable for the contexts and manages related state. */ -- (void)setWindow:(SDL_Window *)newWindow -{ - if (self->window) { - SDL_WindowData *oldwindowdata = (SDL_WindowData *)self->window->driverdata; - - /* Make sure to remove us from the old window's context list, or we'll get scheduled updates from it too. */ - NSMutableArray *contexts = oldwindowdata->nscontexts; - @synchronized (contexts) { - [contexts removeObject:self]; - } - } - - self->window = newWindow; - - if (newWindow) { - SDL_WindowData *windowdata = (SDL_WindowData *)newWindow->driverdata; - - /* Now sign up for scheduled updates for the new window. */ - NSMutableArray *contexts = windowdata->nscontexts; - @synchronized (contexts) { - [contexts addObject:self]; - } - - if ([self view] != [windowdata->nswindow contentView]) { - [self setView:[windowdata->nswindow contentView]]; - if (self == [NSOpenGLContext currentContext]) { - [self update]; - } else { - [self scheduleUpdate]; - } - } - } else { - [self clearDrawable]; - if (self == [NSOpenGLContext currentContext]) { - [self update]; - } else { - [self scheduleUpdate]; - } - } -} - -@end - - -int -Cocoa_GL_LoadLibrary(_THIS, const char *path) -{ - /* Load the OpenGL library */ - if (path == NULL) { - path = SDL_getenv("SDL_OPENGL_LIBRARY"); - } - if (path == NULL) { - path = DEFAULT_OPENGL; - } - _this->gl_config.dll_handle = SDL_LoadObject(path); - if (!_this->gl_config.dll_handle) { - return -1; - } - SDL_strlcpy(_this->gl_config.driver_path, path, - SDL_arraysize(_this->gl_config.driver_path)); - return 0; -} - -void * -Cocoa_GL_GetProcAddress(_THIS, const char *proc) -{ - return SDL_LoadFunction(_this->gl_config.dll_handle, proc); -} - -void -Cocoa_GL_UnloadLibrary(_THIS) -{ - SDL_UnloadObject(_this->gl_config.dll_handle); - _this->gl_config.dll_handle = NULL; -} - -SDL_GLContext -Cocoa_GL_CreateContext(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - SDL_DisplayData *displaydata = (SDL_DisplayData *)display->driverdata; - SDL_bool lion_or_later = floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6; - NSOpenGLPixelFormatAttribute attr[32]; - NSOpenGLPixelFormat *fmt; - SDLOpenGLContext *context; - NSOpenGLContext *share_context = nil; - int i = 0; - const char *glversion; - int glversion_major; - int glversion_minor; - - if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) { - SDL_SetError ("OpenGL ES is not supported on this platform"); - return NULL; - } - if ((_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_CORE) && !lion_or_later) { - SDL_SetError ("OpenGL Core Profile is not supported on this platform version"); - return NULL; - } - - attr[i++] = NSOpenGLPFAAllowOfflineRenderers; - - /* specify a profile if we're on Lion (10.7) or later. */ - if (lion_or_later) { - NSOpenGLPixelFormatAttribute profile = NSOpenGLProfileVersionLegacy; - if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_CORE) { - profile = NSOpenGLProfileVersion3_2Core; - } - attr[i++] = NSOpenGLPFAOpenGLProfile; - attr[i++] = profile; - } - - attr[i++] = NSOpenGLPFAColorSize; - attr[i++] = SDL_BYTESPERPIXEL(display->current_mode.format)*8; - - attr[i++] = NSOpenGLPFADepthSize; - attr[i++] = _this->gl_config.depth_size; - - if (_this->gl_config.double_buffer) { - attr[i++] = NSOpenGLPFADoubleBuffer; - } - - if (_this->gl_config.stereo) { - attr[i++] = NSOpenGLPFAStereo; - } - - if (_this->gl_config.stencil_size) { - attr[i++] = NSOpenGLPFAStencilSize; - attr[i++] = _this->gl_config.stencil_size; - } - - if ((_this->gl_config.accum_red_size + - _this->gl_config.accum_green_size + - _this->gl_config.accum_blue_size + - _this->gl_config.accum_alpha_size) > 0) { - attr[i++] = NSOpenGLPFAAccumSize; - attr[i++] = _this->gl_config.accum_red_size + _this->gl_config.accum_green_size + _this->gl_config.accum_blue_size + _this->gl_config.accum_alpha_size; - } - - if (_this->gl_config.multisamplebuffers) { - attr[i++] = NSOpenGLPFASampleBuffers; - attr[i++] = _this->gl_config.multisamplebuffers; - } - - if (_this->gl_config.multisamplesamples) { - attr[i++] = NSOpenGLPFASamples; - attr[i++] = _this->gl_config.multisamplesamples; - attr[i++] = NSOpenGLPFANoRecovery; - } - - if (_this->gl_config.accelerated >= 0) { - if (_this->gl_config.accelerated) { - attr[i++] = NSOpenGLPFAAccelerated; - } else { - attr[i++] = NSOpenGLPFARendererID; - attr[i++] = kCGLRendererGenericFloatID; - } - } - - attr[i++] = NSOpenGLPFAScreenMask; - attr[i++] = CGDisplayIDToOpenGLDisplayMask(displaydata->display); - attr[i] = 0; - - fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr]; - if (fmt == nil) { - SDL_SetError("Failed creating OpenGL pixel format"); - return NULL; - } - - if (_this->gl_config.share_with_current_context) { - share_context = (NSOpenGLContext*)SDL_GL_GetCurrentContext(); - } - - context = [[SDLOpenGLContext alloc] initWithFormat:fmt shareContext:share_context]; - - [fmt release]; - - if (context == nil) { - SDL_SetError("Failed creating OpenGL context"); - return NULL; - } - - if ( Cocoa_GL_MakeCurrent(_this, window, context) < 0 ) { - Cocoa_GL_DeleteContext(_this, context); - SDL_SetError("Failed making OpenGL context current"); - return NULL; - } - - if (_this->gl_config.major_version < 3 && - _this->gl_config.profile_mask == 0 && - _this->gl_config.flags == 0) { - /* This is a legacy profile, so to match other backends, we're done. */ - } else { - const GLubyte *(APIENTRY * glGetStringFunc)(GLenum); - - glGetStringFunc = (const GLubyte *(APIENTRY *)(GLenum)) SDL_GL_GetProcAddress("glGetString"); - if (!glGetStringFunc) { - Cocoa_GL_DeleteContext(_this, context); - SDL_SetError ("Failed getting OpenGL glGetString entry point"); - return NULL; - } - - glversion = (const char *)glGetStringFunc(GL_VERSION); - if (glversion == NULL) { - Cocoa_GL_DeleteContext(_this, context); - SDL_SetError ("Failed getting OpenGL context version"); - return NULL; - } - - if (SDL_sscanf(glversion, "%d.%d", &glversion_major, &glversion_minor) != 2) { - Cocoa_GL_DeleteContext(_this, context); - SDL_SetError ("Failed parsing OpenGL context version"); - return NULL; - } - - if ((glversion_major < _this->gl_config.major_version) || - ((glversion_major == _this->gl_config.major_version) && (glversion_minor < _this->gl_config.minor_version))) { - Cocoa_GL_DeleteContext(_this, context); - SDL_SetError ("Failed creating OpenGL context at version requested"); - return NULL; - } - - /* In the future we'll want to do this, but to match other platforms - we'll leave the OpenGL version the way it is for now - */ - /*_this->gl_config.major_version = glversion_major;*/ - /*_this->gl_config.minor_version = glversion_minor;*/ - } - return context; -}} - -int -Cocoa_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) -{ @autoreleasepool -{ - if (context) { - SDLOpenGLContext *nscontext = (SDLOpenGLContext *)context; - [nscontext setWindow:window]; - [nscontext updateIfNeeded]; - [nscontext makeCurrentContext]; - } else { - [NSOpenGLContext clearCurrentContext]; - } - - return 0; -}} - -void -Cocoa_GL_GetDrawableSize(_THIS, SDL_Window * window, int * w, int * h) -{ - SDL_WindowData *windata = (SDL_WindowData *) window->driverdata; - NSView *contentView = [windata->nswindow contentView]; - NSRect viewport = [contentView bounds]; - - /* This gives us the correct viewport for a Retina-enabled view, only - * supported on 10.7+. */ - if ([contentView respondsToSelector:@selector(convertRectToBacking:)]) { - viewport = [contentView convertRectToBacking:viewport]; - } - - if (w) { - *w = viewport.size.width; - } - - if (h) { - *h = viewport.size.height; - } -} - -int -Cocoa_GL_SetSwapInterval(_THIS, int interval) -{ @autoreleasepool -{ - NSOpenGLContext *nscontext; - GLint value; - int status; - - if (interval < 0) { /* no extension for this on Mac OS X at the moment. */ - return SDL_SetError("Late swap tearing currently unsupported"); - } - - nscontext = (NSOpenGLContext*)SDL_GL_GetCurrentContext(); - if (nscontext != nil) { - value = interval; - [nscontext setValues:&value forParameter:NSOpenGLCPSwapInterval]; - status = 0; - } else { - status = SDL_SetError("No current OpenGL context"); - } - - return status; -}} - -int -Cocoa_GL_GetSwapInterval(_THIS) -{ @autoreleasepool -{ - NSOpenGLContext *nscontext; - GLint value; - int status = 0; - - nscontext = (NSOpenGLContext*)SDL_GL_GetCurrentContext(); - if (nscontext != nil) { - [nscontext getValues:&value forParameter:NSOpenGLCPSwapInterval]; - status = (int)value; - } - - return status; -}} - -void -Cocoa_GL_SwapWindow(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDLOpenGLContext* nscontext = (SDLOpenGLContext*)SDL_GL_GetCurrentContext(); - [nscontext flushBuffer]; - [nscontext updateIfNeeded]; -}} - -void -Cocoa_GL_DeleteContext(_THIS, SDL_GLContext context) -{ @autoreleasepool -{ - SDLOpenGLContext *nscontext = (SDLOpenGLContext *)context; - - [nscontext setWindow:NULL]; - [nscontext release]; -}} - -#endif /* SDL_VIDEO_OPENGL_CGL */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoashape.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoashape.h deleted file mode 100644 index f64b59178b0..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoashape.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#ifndef _SDL_cocoashape_h -#define _SDL_cocoashape_h - -#include "SDL_stdinc.h" -#include "SDL_video.h" -#include "SDL_shape.h" -#include "../SDL_shape_internals.h" - -typedef struct { - NSGraphicsContext* context; - SDL_bool saved; - - SDL_ShapeTree* shape; -} SDL_ShapeData; - -extern SDL_WindowShaper* Cocoa_CreateShaper(SDL_Window* window); -extern int Cocoa_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode); -extern int Cocoa_ResizeWindowShape(SDL_Window *window); - -#endif diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoashape.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoashape.m deleted file mode 100644 index fc8a2775c01..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoashape.m +++ /dev/null @@ -1,113 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_COCOA - -#include "SDL_cocoavideo.h" -#include "SDL_shape.h" -#include "SDL_cocoashape.h" -#include "../SDL_sysvideo.h" -#include "SDL_assert.h" - -SDL_WindowShaper* -Cocoa_CreateShaper(SDL_Window* window) -{ - SDL_WindowData* windata = (SDL_WindowData*)window->driverdata; - [windata->nswindow setOpaque:NO]; - - [windata->nswindow setStyleMask:NSBorderlessWindowMask]; - - SDL_WindowShaper* result = result = malloc(sizeof(SDL_WindowShaper)); - result->window = window; - result->mode.mode = ShapeModeDefault; - result->mode.parameters.binarizationCutoff = 1; - result->userx = result->usery = 0; - window->shaper = result; - - SDL_ShapeData* data = malloc(sizeof(SDL_ShapeData)); - result->driverdata = data; - data->context = [windata->nswindow graphicsContext]; - data->saved = SDL_FALSE; - data->shape = NULL; - - int resized_properly = Cocoa_ResizeWindowShape(window); - SDL_assert(resized_properly == 0); - return result; -} - -typedef struct { - NSView* view; - NSBezierPath* path; - SDL_Window* window; -} SDL_CocoaClosure; - -void -ConvertRects(SDL_ShapeTree* tree, void* closure) -{ - SDL_CocoaClosure* data = (SDL_CocoaClosure*)closure; - if(tree->kind == OpaqueShape) { - NSRect rect = NSMakeRect(tree->data.shape.x,data->window->h - tree->data.shape.y,tree->data.shape.w,tree->data.shape.h); - [data->path appendBezierPathWithRect:[data->view convertRect:rect toView:nil]]; - } -} - -int -Cocoa_SetWindowShape(SDL_WindowShaper *shaper, SDL_Surface *shape, SDL_WindowShapeMode *shape_mode) -{ @autoreleasepool -{ - SDL_ShapeData* data = (SDL_ShapeData*)shaper->driverdata; - SDL_WindowData* windata = (SDL_WindowData*)shaper->window->driverdata; - SDL_CocoaClosure closure; - if(data->saved == SDL_TRUE) { - [data->context restoreGraphicsState]; - data->saved = SDL_FALSE; - } - - /*[data->context saveGraphicsState];*/ - /*data->saved = SDL_TRUE;*/ - [NSGraphicsContext setCurrentContext:data->context]; - - [[NSColor clearColor] set]; - NSRectFill([[windata->nswindow contentView] frame]); - data->shape = SDL_CalculateShapeTree(*shape_mode,shape); - - closure.view = [windata->nswindow contentView]; - closure.path = [NSBezierPath bezierPath]; - closure.window = shaper->window; - SDL_TraverseShapeTree(data->shape,&ConvertRects,&closure); - [closure.path addClip]; - - return 0; -}} - -int -Cocoa_ResizeWindowShape(SDL_Window *window) -{ - SDL_ShapeData* data = window->shaper->driverdata; - SDL_assert(data != NULL); - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoavideo.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoavideo.h deleted file mode 100644 index 498ce6ccaa9..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoavideo.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_cocoavideo_h -#define _SDL_cocoavideo_h - -#include "SDL_opengl.h" - -#include <ApplicationServices/ApplicationServices.h> -#include <IOKit/pwr_mgt/IOPMLib.h> -#include <Cocoa/Cocoa.h> - -#include "SDL_keycode.h" -#include "../SDL_sysvideo.h" - -#include "SDL_cocoaclipboard.h" -#include "SDL_cocoaevents.h" -#include "SDL_cocoakeyboard.h" -#include "SDL_cocoamodes.h" -#include "SDL_cocoamouse.h" -#include "SDL_cocoaopengl.h" -#include "SDL_cocoawindow.h" - -/* Private display data */ - -@class SDLTranslatorResponder; - -typedef struct SDL_VideoData -{ - int allow_spaces; - unsigned int modifierFlags; - void *key_layout; - SDLTranslatorResponder *fieldEdit; - NSInteger clipboard_count; - Uint32 screensaver_activity; - BOOL screensaver_use_iopm; - IOPMAssertionID screensaver_assertion; - -} SDL_VideoData; - -/* Utility functions */ -extern NSImage * Cocoa_CreateImage(SDL_Surface * surface); - -#endif /* _SDL_cocoavideo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoavideo.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoavideo.m deleted file mode 100644 index e436e652107..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoavideo.m +++ /dev/null @@ -1,234 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_COCOA - -#include "SDL.h" -#include "SDL_endian.h" -#include "SDL_cocoavideo.h" -#include "SDL_cocoashape.h" -#include "SDL_assert.h" - -/* Initialization/Query functions */ -static int Cocoa_VideoInit(_THIS); -static void Cocoa_VideoQuit(_THIS); - -/* Cocoa driver bootstrap functions */ - -static int -Cocoa_Available(void) -{ - return (1); -} - -static void -Cocoa_DeleteDevice(SDL_VideoDevice * device) -{ - SDL_free(device->driverdata); - SDL_free(device); -} - -static SDL_VideoDevice * -Cocoa_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - SDL_VideoData *data; - - Cocoa_RegisterApp(); - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (device) { - data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); - } else { - data = NULL; - } - if (!data) { - SDL_OutOfMemory(); - SDL_free(device); - return NULL; - } - device->driverdata = data; - - /* Set the function pointers */ - device->VideoInit = Cocoa_VideoInit; - device->VideoQuit = Cocoa_VideoQuit; - device->GetDisplayBounds = Cocoa_GetDisplayBounds; - device->GetDisplayUsableBounds = Cocoa_GetDisplayUsableBounds; - device->GetDisplayDPI = Cocoa_GetDisplayDPI; - device->GetDisplayModes = Cocoa_GetDisplayModes; - device->SetDisplayMode = Cocoa_SetDisplayMode; - device->PumpEvents = Cocoa_PumpEvents; - device->SuspendScreenSaver = Cocoa_SuspendScreenSaver; - - device->CreateWindow = Cocoa_CreateWindow; - device->CreateWindowFrom = Cocoa_CreateWindowFrom; - device->SetWindowTitle = Cocoa_SetWindowTitle; - device->SetWindowIcon = Cocoa_SetWindowIcon; - device->SetWindowPosition = Cocoa_SetWindowPosition; - device->SetWindowSize = Cocoa_SetWindowSize; - device->SetWindowMinimumSize = Cocoa_SetWindowMinimumSize; - device->SetWindowMaximumSize = Cocoa_SetWindowMaximumSize; - device->SetWindowOpacity = Cocoa_SetWindowOpacity; - device->ShowWindow = Cocoa_ShowWindow; - device->HideWindow = Cocoa_HideWindow; - device->RaiseWindow = Cocoa_RaiseWindow; - device->MaximizeWindow = Cocoa_MaximizeWindow; - device->MinimizeWindow = Cocoa_MinimizeWindow; - device->RestoreWindow = Cocoa_RestoreWindow; - device->SetWindowBordered = Cocoa_SetWindowBordered; - device->SetWindowResizable = Cocoa_SetWindowResizable; - device->SetWindowFullscreen = Cocoa_SetWindowFullscreen; - device->SetWindowGammaRamp = Cocoa_SetWindowGammaRamp; - device->GetWindowGammaRamp = Cocoa_GetWindowGammaRamp; - device->SetWindowGrab = Cocoa_SetWindowGrab; - device->DestroyWindow = Cocoa_DestroyWindow; - device->GetWindowWMInfo = Cocoa_GetWindowWMInfo; - device->SetWindowHitTest = Cocoa_SetWindowHitTest; - - device->shape_driver.CreateShaper = Cocoa_CreateShaper; - device->shape_driver.SetWindowShape = Cocoa_SetWindowShape; - device->shape_driver.ResizeWindowShape = Cocoa_ResizeWindowShape; - -#if SDL_VIDEO_OPENGL_CGL - device->GL_LoadLibrary = Cocoa_GL_LoadLibrary; - device->GL_GetProcAddress = Cocoa_GL_GetProcAddress; - device->GL_UnloadLibrary = Cocoa_GL_UnloadLibrary; - device->GL_CreateContext = Cocoa_GL_CreateContext; - device->GL_MakeCurrent = Cocoa_GL_MakeCurrent; - device->GL_GetDrawableSize = Cocoa_GL_GetDrawableSize; - device->GL_SetSwapInterval = Cocoa_GL_SetSwapInterval; - device->GL_GetSwapInterval = Cocoa_GL_GetSwapInterval; - device->GL_SwapWindow = Cocoa_GL_SwapWindow; - device->GL_DeleteContext = Cocoa_GL_DeleteContext; -#endif - - device->StartTextInput = Cocoa_StartTextInput; - device->StopTextInput = Cocoa_StopTextInput; - device->SetTextInputRect = Cocoa_SetTextInputRect; - - device->SetClipboardText = Cocoa_SetClipboardText; - device->GetClipboardText = Cocoa_GetClipboardText; - device->HasClipboardText = Cocoa_HasClipboardText; - - device->free = Cocoa_DeleteDevice; - - return device; -} - -VideoBootStrap COCOA_bootstrap = { - "cocoa", "SDL Cocoa video driver", - Cocoa_Available, Cocoa_CreateDevice -}; - - -int -Cocoa_VideoInit(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - Cocoa_InitModes(_this); - Cocoa_InitKeyboard(_this); - Cocoa_InitMouse(_this); - - data->allow_spaces = ((floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) && SDL_GetHintBoolean(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES, SDL_TRUE)); - - /* The IOPM assertion API can disable the screensaver as of 10.7. */ - data->screensaver_use_iopm = floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6; - - return 0; -} - -void -Cocoa_VideoQuit(_THIS) -{ - Cocoa_QuitModes(_this); - Cocoa_QuitKeyboard(_this); - Cocoa_QuitMouse(_this); -} - -/* This function assumes that it's called from within an autorelease pool */ -NSImage * -Cocoa_CreateImage(SDL_Surface * surface) -{ - SDL_Surface *converted; - NSBitmapImageRep *imgrep; - Uint8 *pixels; - int i; - NSImage *img; - - converted = SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_RGBA32, 0); - if (!converted) { - return nil; - } - - imgrep = [[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL - pixelsWide: converted->w - pixelsHigh: converted->h - bitsPerSample: 8 - samplesPerPixel: 4 - hasAlpha: YES - isPlanar: NO - colorSpaceName: NSDeviceRGBColorSpace - bytesPerRow: converted->pitch - bitsPerPixel: converted->format->BitsPerPixel] autorelease]; - if (imgrep == nil) { - SDL_FreeSurface(converted); - return nil; - } - - /* Copy the pixels */ - pixels = [imgrep bitmapData]; - SDL_memcpy(pixels, converted->pixels, converted->h * converted->pitch); - SDL_FreeSurface(converted); - - /* Premultiply the alpha channel */ - for (i = (surface->h * surface->w); i--; ) { - Uint8 alpha = pixels[3]; - pixels[0] = (Uint8)(((Uint16)pixels[0] * alpha) / 255); - pixels[1] = (Uint8)(((Uint16)pixels[1] * alpha) / 255); - pixels[2] = (Uint8)(((Uint16)pixels[2] * alpha) / 255); - pixels += 4; - } - - img = [[[NSImage alloc] initWithSize: NSMakeSize(surface->w, surface->h)] autorelease]; - if (img != nil) { - [img addRepresentation: imgrep]; - } - return img; -} - -/* - * Mac OS X log support. - * - * This doesn't really have aything to do with the interfaces of the SDL video - * subsystem, but we need to stuff this into an Objective-C source code file. - */ - -void SDL_NSLog(const char *text) -{ - NSLog(@"%s", text); -} - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vim: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoawindow.h b/3rdparty/SDL2/src/video/cocoa/SDL_cocoawindow.h deleted file mode 100644 index a32de83877f..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoawindow.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_cocoawindow_h -#define _SDL_cocoawindow_h - -#import <Cocoa/Cocoa.h> - -typedef struct SDL_WindowData SDL_WindowData; - -typedef enum -{ - PENDING_OPERATION_NONE, - PENDING_OPERATION_ENTER_FULLSCREEN, - PENDING_OPERATION_LEAVE_FULLSCREEN, - PENDING_OPERATION_MINIMIZE -} PendingWindowOperation; - -@interface Cocoa_WindowListener : NSResponder <NSWindowDelegate> { - SDL_WindowData *_data; - BOOL observingVisible; - BOOL wasCtrlLeft; - BOOL wasVisible; - BOOL isFullscreenSpace; - BOOL inFullscreenTransition; - PendingWindowOperation pendingWindowOperation; - BOOL isMoving; - int pendingWindowWarpX, pendingWindowWarpY; - BOOL isDragAreaRunning; -} - --(void) listen:(SDL_WindowData *) data; --(void) pauseVisibleObservation; --(void) resumeVisibleObservation; --(BOOL) setFullscreenSpace:(BOOL) state; --(BOOL) isInFullscreenSpace; --(BOOL) isInFullscreenSpaceTransition; --(void) addPendingWindowOperation:(PendingWindowOperation) operation; --(void) close; - --(BOOL) isMoving; --(void) setPendingMoveX:(int)x Y:(int)y; --(void) windowDidFinishMoving; - -/* Window delegate functionality */ --(BOOL) windowShouldClose:(id) sender; --(void) windowDidExpose:(NSNotification *) aNotification; --(void) windowDidMove:(NSNotification *) aNotification; --(void) windowDidResize:(NSNotification *) aNotification; --(void) windowDidMiniaturize:(NSNotification *) aNotification; --(void) windowDidDeminiaturize:(NSNotification *) aNotification; --(void) windowDidBecomeKey:(NSNotification *) aNotification; --(void) windowDidResignKey:(NSNotification *) aNotification; --(void) windowDidChangeBackingProperties:(NSNotification *) aNotification; --(void) windowWillEnterFullScreen:(NSNotification *) aNotification; --(void) windowDidEnterFullScreen:(NSNotification *) aNotification; --(void) windowWillExitFullScreen:(NSNotification *) aNotification; --(void) windowDidExitFullScreen:(NSNotification *) aNotification; --(NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions; - -/* See if event is in a drag area, toggle on window dragging. */ --(BOOL) processHitTest:(NSEvent *)theEvent; - -/* Window event handling */ --(void) mouseDown:(NSEvent *) theEvent; --(void) rightMouseDown:(NSEvent *) theEvent; --(void) otherMouseDown:(NSEvent *) theEvent; --(void) mouseUp:(NSEvent *) theEvent; --(void) rightMouseUp:(NSEvent *) theEvent; --(void) otherMouseUp:(NSEvent *) theEvent; --(void) mouseMoved:(NSEvent *) theEvent; --(void) mouseDragged:(NSEvent *) theEvent; --(void) rightMouseDragged:(NSEvent *) theEvent; --(void) otherMouseDragged:(NSEvent *) theEvent; --(void) scrollWheel:(NSEvent *) theEvent; --(void) touchesBeganWithEvent:(NSEvent *) theEvent; --(void) touchesMovedWithEvent:(NSEvent *) theEvent; --(void) touchesEndedWithEvent:(NSEvent *) theEvent; --(void) touchesCancelledWithEvent:(NSEvent *) theEvent; - -/* Touch event handling */ --(void) handleTouches:(NSTouchPhase) phase withEvent:(NSEvent*) theEvent; - -@end -/* *INDENT-ON* */ - -@class SDLOpenGLContext; - -struct SDL_WindowData -{ - SDL_Window *window; - NSWindow *nswindow; - NSMutableArray *nscontexts; - SDL_bool created; - SDL_bool inWindowMove; - Cocoa_WindowListener *listener; - struct SDL_VideoData *videodata; -}; - -extern int Cocoa_CreateWindow(_THIS, SDL_Window * window); -extern int Cocoa_CreateWindowFrom(_THIS, SDL_Window * window, - const void *data); -extern void Cocoa_SetWindowTitle(_THIS, SDL_Window * window); -extern void Cocoa_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon); -extern void Cocoa_SetWindowPosition(_THIS, SDL_Window * window); -extern void Cocoa_SetWindowSize(_THIS, SDL_Window * window); -extern void Cocoa_SetWindowMinimumSize(_THIS, SDL_Window * window); -extern void Cocoa_SetWindowMaximumSize(_THIS, SDL_Window * window); -extern int Cocoa_SetWindowOpacity(_THIS, SDL_Window * window, float opacity); -extern void Cocoa_ShowWindow(_THIS, SDL_Window * window); -extern void Cocoa_HideWindow(_THIS, SDL_Window * window); -extern void Cocoa_RaiseWindow(_THIS, SDL_Window * window); -extern void Cocoa_MaximizeWindow(_THIS, SDL_Window * window); -extern void Cocoa_MinimizeWindow(_THIS, SDL_Window * window); -extern void Cocoa_RestoreWindow(_THIS, SDL_Window * window); -extern void Cocoa_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered); -extern void Cocoa_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable); -extern void Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen); -extern int Cocoa_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp); -extern int Cocoa_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp); -extern void Cocoa_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed); -extern void Cocoa_DestroyWindow(_THIS, SDL_Window * window); -extern SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info); -extern int Cocoa_SetWindowHitTest(SDL_Window *window, SDL_bool enabled); - -#endif /* _SDL_cocoawindow_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoawindow.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoawindow.m deleted file mode 100644 index cfad5485426..00000000000 --- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoawindow.m +++ /dev/null @@ -1,1774 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_COCOA - -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070 -# error SDL for Mac OS X must be built with a 10.7 SDK or above. -#endif /* MAC_OS_X_VERSION_MAX_ALLOWED < 1070 */ - -#include "SDL_syswm.h" -#include "SDL_timer.h" /* For SDL_GetTicks() */ -#include "SDL_hints.h" -#include "../SDL_sysvideo.h" -#include "../../events/SDL_keyboard_c.h" -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_touch_c.h" -#include "../../events/SDL_windowevents_c.h" -#include "../../events/SDL_dropevents_c.h" -#include "SDL_cocoavideo.h" -#include "SDL_cocoashape.h" -#include "SDL_cocoamouse.h" -#include "SDL_cocoaopengl.h" -#include "SDL_assert.h" - -/* #define DEBUG_COCOAWINDOW */ - -#ifdef DEBUG_COCOAWINDOW -#define DLog(fmt, ...) printf("%s: " fmt "\n", __func__, ##__VA_ARGS__) -#else -#define DLog(...) do { } while (0) -#endif - - -#define FULLSCREEN_MASK (SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN) - - -@interface SDLWindow : NSWindow <NSDraggingDestination> -/* These are needed for borderless/fullscreen windows */ -- (BOOL)canBecomeKeyWindow; -- (BOOL)canBecomeMainWindow; -- (void)sendEvent:(NSEvent *)event; -- (void)doCommandBySelector:(SEL)aSelector; - -/* Handle drag-and-drop of files onto the SDL window. */ -- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender; -- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender; -- (BOOL)wantsPeriodicDraggingUpdates; -@end - -@implementation SDLWindow - -- (BOOL)canBecomeKeyWindow -{ - return YES; -} - -- (BOOL)canBecomeMainWindow -{ - return YES; -} - -- (void)sendEvent:(NSEvent *)event -{ - [super sendEvent:event]; - - if ([event type] != NSLeftMouseUp) { - return; - } - - id delegate = [self delegate]; - if (![delegate isKindOfClass:[Cocoa_WindowListener class]]) { - return; - } - - if ([delegate isMoving]) { - [delegate windowDidFinishMoving]; - } -} - -/* We'll respond to selectors by doing nothing so we don't beep. - * The escape key gets converted to a "cancel" selector, etc. - */ -- (void)doCommandBySelector:(SEL)aSelector -{ - /*NSLog(@"doCommandBySelector: %@\n", NSStringFromSelector(aSelector));*/ -} - -- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender -{ - if (([sender draggingSourceOperationMask] & NSDragOperationGeneric) == NSDragOperationGeneric) { - return NSDragOperationGeneric; - } - - return NSDragOperationNone; /* no idea what to do with this, reject it. */ -} - -- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender -{ @autoreleasepool -{ - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - NSPasteboard *pasteboard = [sender draggingPasteboard]; - NSArray *types = [NSArray arrayWithObject:NSFilenamesPboardType]; - NSString *desiredType = [pasteboard availableTypeFromArray:types]; - SDL_Window *sdlwindow = nil; - - if (desiredType == nil) { - return NO; /* can't accept anything that's being dropped here. */ - } - - NSData *data = [pasteboard dataForType:desiredType]; - if (data == nil) { - return NO; - } - - SDL_assert([desiredType isEqualToString:NSFilenamesPboardType]); - NSArray *array = [pasteboard propertyListForType:@"NSFilenamesPboardType"]; - - for (NSString *path in array) { - NSURL *fileURL = [NSURL fileURLWithPath:path]; - NSNumber *isAlias = nil; - - [fileURL getResourceValue:&isAlias forKey:NSURLIsAliasFileKey error:nil]; - - /* If the URL is an alias, resolve it. */ - if ([isAlias boolValue]) { - NSURLBookmarkResolutionOptions opts = NSURLBookmarkResolutionWithoutMounting | NSURLBookmarkResolutionWithoutUI; - NSData *bookmark = [NSURL bookmarkDataWithContentsOfURL:fileURL error:nil]; - if (bookmark != nil) { - NSURL *resolvedURL = [NSURL URLByResolvingBookmarkData:bookmark - options:opts - relativeToURL:nil - bookmarkDataIsStale:nil - error:nil]; - - if (resolvedURL != nil) { - fileURL = resolvedURL; - } - } - } - - /* !!! FIXME: is there a better way to do this? */ - if (_this) { - for (sdlwindow = _this->windows; sdlwindow; sdlwindow = sdlwindow->next) { - NSWindow *nswindow = ((SDL_WindowData *) sdlwindow->driverdata)->nswindow; - if (nswindow == self) { - break; - } - } - } - - if (!SDL_SendDropFile(sdlwindow, [[fileURL path] UTF8String])) { - return NO; - } - } - - SDL_SendDropComplete(sdlwindow); - return YES; -}} - -- (BOOL)wantsPeriodicDraggingUpdates -{ - return NO; -} - -@end - - -static Uint32 s_moveHack; - -static void ConvertNSRect(NSScreen *screen, BOOL fullscreen, NSRect *r) -{ - r->origin.y = CGDisplayPixelsHigh(kCGDirectMainDisplay) - r->origin.y - r->size.height; -} - -static void -ScheduleContextUpdates(SDL_WindowData *data) -{ - NSOpenGLContext *currentContext = [NSOpenGLContext currentContext]; - NSMutableArray *contexts = data->nscontexts; - @synchronized (contexts) { - for (SDLOpenGLContext *context in contexts) { - if (context == currentContext) { - [context update]; - } else { - [context scheduleUpdate]; - } - } - } -} - -/* !!! FIXME: this should use a hint callback. */ -static int -GetHintCtrlClickEmulateRightClick() -{ - return SDL_GetHintBoolean(SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK, SDL_FALSE); -} - -static NSUInteger -GetWindowStyle(SDL_Window * window) -{ - NSUInteger style = 0; - - if (window->flags & SDL_WINDOW_FULLSCREEN) { - style = NSBorderlessWindowMask; - } else { - if (window->flags & SDL_WINDOW_BORDERLESS) { - style = NSBorderlessWindowMask; - } else { - style = (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask); - } - if (window->flags & SDL_WINDOW_RESIZABLE) { - style |= NSResizableWindowMask; - } - } - return style; -} - -static SDL_bool -SetWindowStyle(SDL_Window * window, NSUInteger style) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - NSWindow *nswindow = data->nswindow; - - /* The view responder chain gets messed with during setStyleMask */ - if ([[nswindow contentView] nextResponder] == data->listener) { - [[nswindow contentView] setNextResponder:nil]; - } - - [nswindow setStyleMask:style]; - - /* The view responder chain gets messed with during setStyleMask */ - if ([[nswindow contentView] nextResponder] != data->listener) { - [[nswindow contentView] setNextResponder:data->listener]; - } - - return SDL_TRUE; -} - - -@implementation Cocoa_WindowListener - -- (void)listen:(SDL_WindowData *)data -{ - NSNotificationCenter *center; - NSWindow *window = data->nswindow; - NSView *view = [window contentView]; - - _data = data; - observingVisible = YES; - wasCtrlLeft = NO; - wasVisible = [window isVisible]; - isFullscreenSpace = NO; - inFullscreenTransition = NO; - pendingWindowOperation = PENDING_OPERATION_NONE; - isMoving = NO; - isDragAreaRunning = NO; - - center = [NSNotificationCenter defaultCenter]; - - if ([window delegate] != nil) { - [center addObserver:self selector:@selector(windowDidExpose:) name:NSWindowDidExposeNotification object:window]; - [center addObserver:self selector:@selector(windowDidMove:) name:NSWindowDidMoveNotification object:window]; - [center addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:window]; - [center addObserver:self selector:@selector(windowDidMiniaturize:) name:NSWindowDidMiniaturizeNotification object:window]; - [center addObserver:self selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification object:window]; - [center addObserver:self selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification object:window]; - [center addObserver:self selector:@selector(windowDidResignKey:) name:NSWindowDidResignKeyNotification object:window]; - [center addObserver:self selector:@selector(windowDidChangeBackingProperties:) name:NSWindowDidChangeBackingPropertiesNotification object:window]; - [center addObserver:self selector:@selector(windowWillEnterFullScreen:) name:NSWindowWillEnterFullScreenNotification object:window]; - [center addObserver:self selector:@selector(windowDidEnterFullScreen:) name:NSWindowDidEnterFullScreenNotification object:window]; - [center addObserver:self selector:@selector(windowWillExitFullScreen:) name:NSWindowWillExitFullScreenNotification object:window]; - [center addObserver:self selector:@selector(windowDidExitFullScreen:) name:NSWindowDidExitFullScreenNotification object:window]; - [center addObserver:self selector:@selector(windowDidFailToEnterFullScreen:) name:@"NSWindowDidFailToEnterFullScreenNotification" object:window]; - [center addObserver:self selector:@selector(windowDidFailToExitFullScreen:) name:@"NSWindowDidFailToExitFullScreenNotification" object:window]; - } else { - [window setDelegate:self]; - } - - /* Haven't found a delegate / notification that triggers when the window is - * ordered out (is not visible any more). You can be ordered out without - * minimizing, so DidMiniaturize doesn't work. (e.g. -[NSWindow orderOut:]) - */ - [window addObserver:self - forKeyPath:@"visible" - options:NSKeyValueObservingOptionNew - context:NULL]; - - [window setNextResponder:self]; - [window setAcceptsMouseMovedEvents:YES]; - - [view setNextResponder:self]; - - [view setAcceptsTouchEvents:YES]; -} - -- (void)observeValueForKeyPath:(NSString *)keyPath - ofObject:(id)object - change:(NSDictionary *)change - context:(void *)context -{ - if (!observingVisible) { - return; - } - - if (object == _data->nswindow && [keyPath isEqualToString:@"visible"]) { - int newVisibility = [[change objectForKey:@"new"] intValue]; - if (newVisibility) { - SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_SHOWN, 0, 0); - } else { - SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIDDEN, 0, 0); - } - } -} - --(void) pauseVisibleObservation -{ - observingVisible = NO; - wasVisible = [_data->nswindow isVisible]; -} - --(void) resumeVisibleObservation -{ - BOOL isVisible = [_data->nswindow isVisible]; - observingVisible = YES; - if (wasVisible != isVisible) { - if (isVisible) { - SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_SHOWN, 0, 0); - } else { - SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIDDEN, 0, 0); - } - - wasVisible = isVisible; - } -} - --(BOOL) setFullscreenSpace:(BOOL) state -{ - SDL_Window *window = _data->window; - NSWindow *nswindow = _data->nswindow; - SDL_VideoData *videodata = ((SDL_WindowData *) window->driverdata)->videodata; - - if (!videodata->allow_spaces) { - return NO; /* Spaces are forcibly disabled. */ - } else if (state && ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP)) { - return NO; /* we only allow you to make a Space on FULLSCREEN_DESKTOP windows. */ - } else if (!state && ((window->last_fullscreen_flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP)) { - return NO; /* we only handle leaving the Space on windows that were previously FULLSCREEN_DESKTOP. */ - } else if (state == isFullscreenSpace) { - return YES; /* already there. */ - } - - if (inFullscreenTransition) { - if (state) { - [self addPendingWindowOperation:PENDING_OPERATION_ENTER_FULLSCREEN]; - } else { - [self addPendingWindowOperation:PENDING_OPERATION_LEAVE_FULLSCREEN]; - } - return YES; - } - inFullscreenTransition = YES; - - /* you need to be FullScreenPrimary, or toggleFullScreen doesn't work. Unset it again in windowDidExitFullScreen. */ - [nswindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; - [nswindow performSelectorOnMainThread: @selector(toggleFullScreen:) withObject:nswindow waitUntilDone:NO]; - return YES; -} - --(BOOL) isInFullscreenSpace -{ - return isFullscreenSpace; -} - --(BOOL) isInFullscreenSpaceTransition -{ - return inFullscreenTransition; -} - --(void) addPendingWindowOperation:(PendingWindowOperation) operation -{ - pendingWindowOperation = operation; -} - -- (void)close -{ - NSNotificationCenter *center; - NSWindow *window = _data->nswindow; - NSView *view = [window contentView]; - - center = [NSNotificationCenter defaultCenter]; - - if ([window delegate] != self) { - [center removeObserver:self name:NSWindowDidExposeNotification object:window]; - [center removeObserver:self name:NSWindowDidMoveNotification object:window]; - [center removeObserver:self name:NSWindowDidResizeNotification object:window]; - [center removeObserver:self name:NSWindowDidMiniaturizeNotification object:window]; - [center removeObserver:self name:NSWindowDidDeminiaturizeNotification object:window]; - [center removeObserver:self name:NSWindowDidBecomeKeyNotification object:window]; - [center removeObserver:self name:NSWindowDidResignKeyNotification object:window]; - [center removeObserver:self name:NSWindowDidChangeBackingPropertiesNotification object:window]; - [center removeObserver:self name:NSWindowWillEnterFullScreenNotification object:window]; - [center removeObserver:self name:NSWindowDidEnterFullScreenNotification object:window]; - [center removeObserver:self name:NSWindowWillExitFullScreenNotification object:window]; - [center removeObserver:self name:NSWindowDidExitFullScreenNotification object:window]; - [center removeObserver:self name:@"NSWindowDidFailToEnterFullScreenNotification" object:window]; - [center removeObserver:self name:@"NSWindowDidFailToExitFullScreenNotification" object:window]; - } else { - [window setDelegate:nil]; - } - - [window removeObserver:self forKeyPath:@"visible"]; - - if ([window nextResponder] == self) { - [window setNextResponder:nil]; - } - if ([view nextResponder] == self) { - [view setNextResponder:nil]; - } -} - -- (BOOL)isMoving -{ - return isMoving; -} - --(void) setPendingMoveX:(int)x Y:(int)y -{ - pendingWindowWarpX = x; - pendingWindowWarpY = y; -} - -- (void)windowDidFinishMoving -{ - if ([self isMoving]) { - isMoving = NO; - - SDL_Mouse *mouse = SDL_GetMouse(); - if (pendingWindowWarpX != INT_MAX && pendingWindowWarpY != INT_MAX) { - mouse->WarpMouseGlobal(pendingWindowWarpX, pendingWindowWarpY); - pendingWindowWarpX = pendingWindowWarpY = INT_MAX; - } - if (mouse->relative_mode && !mouse->relative_mode_warp && mouse->focus == _data->window) { - mouse->SetRelativeMouseMode(SDL_TRUE); - } - } -} - -- (BOOL)windowShouldClose:(id)sender -{ - SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_CLOSE, 0, 0); - return NO; -} - -- (void)windowDidExpose:(NSNotification *)aNotification -{ - SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_EXPOSED, 0, 0); -} - -- (void)windowWillMove:(NSNotification *)aNotification -{ - if ([_data->nswindow isKindOfClass:[SDLWindow class]]) { - pendingWindowWarpX = pendingWindowWarpY = INT_MAX; - isMoving = YES; - } -} - -- (void)windowDidMove:(NSNotification *)aNotification -{ - int x, y; - SDL_Window *window = _data->window; - NSWindow *nswindow = _data->nswindow; - BOOL fullscreen = window->flags & FULLSCREEN_MASK; - NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]]; - ConvertNSRect([nswindow screen], fullscreen, &rect); - - if (s_moveHack) { - SDL_bool blockMove = ((SDL_GetTicks() - s_moveHack) < 500); - - s_moveHack = 0; - - if (blockMove) { - /* Cocoa is adjusting the window in response to a mode change */ - rect.origin.x = window->x; - rect.origin.y = window->y; - ConvertNSRect([nswindow screen], fullscreen, &rect); - [nswindow setFrameOrigin:rect.origin]; - return; - } - } - - x = (int)rect.origin.x; - y = (int)rect.origin.y; - - ScheduleContextUpdates(_data); - - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MOVED, x, y); -} - -- (void)windowDidResize:(NSNotification *)aNotification -{ - if (inFullscreenTransition) { - /* We'll take care of this at the end of the transition */ - return; - } - - SDL_Window *window = _data->window; - NSWindow *nswindow = _data->nswindow; - int x, y, w, h; - NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]]; - ConvertNSRect([nswindow screen], (window->flags & FULLSCREEN_MASK), &rect); - x = (int)rect.origin.x; - y = (int)rect.origin.y; - w = (int)rect.size.width; - h = (int)rect.size.height; - - if (SDL_IsShapedWindow(window)) { - Cocoa_ResizeWindowShape(window); - } - - ScheduleContextUpdates(_data); - - /* The window can move during a resize event, such as when maximizing - or resizing from a corner */ - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MOVED, x, y); - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, w, h); - - const BOOL zoomed = [nswindow isZoomed]; - if (!zoomed) { - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESTORED, 0, 0); - } else if (zoomed) { - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MAXIMIZED, 0, 0); - } -} - -- (void)windowDidMiniaturize:(NSNotification *)aNotification -{ - SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_MINIMIZED, 0, 0); -} - -- (void)windowDidDeminiaturize:(NSNotification *)aNotification -{ - SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_RESTORED, 0, 0); -} - -- (void)windowDidBecomeKey:(NSNotification *)aNotification -{ - SDL_Window *window = _data->window; - SDL_Mouse *mouse = SDL_GetMouse(); - - /* We're going to get keyboard events, since we're key. */ - /* This needs to be done before restoring the relative mouse mode. */ - SDL_SetKeyboardFocus(window); - - if (mouse->relative_mode && !mouse->relative_mode_warp && ![self isMoving]) { - mouse->SetRelativeMouseMode(SDL_TRUE); - } - - /* If we just gained focus we need the updated mouse position */ - if (!mouse->relative_mode) { - NSPoint point; - int x, y; - - point = [_data->nswindow mouseLocationOutsideOfEventStream]; - x = (int)point.x; - y = (int)(window->h - point.y); - - if (x >= 0 && x < window->w && y >= 0 && y < window->h) { - SDL_SendMouseMotion(window, 0, 0, x, y); - } - } - - /* Check to see if someone updated the clipboard */ - Cocoa_CheckClipboardUpdate(_data->videodata); - - if ((isFullscreenSpace) && ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP)) { - [NSMenu setMenuBarVisible:NO]; - } - - const unsigned int newflags = [NSEvent modifierFlags] & NSAlphaShiftKeyMask; - _data->videodata->modifierFlags = (_data->videodata->modifierFlags & ~NSAlphaShiftKeyMask) | newflags; - SDL_ToggleModState(KMOD_CAPS, newflags != 0); -} - -- (void)windowDidResignKey:(NSNotification *)aNotification -{ - SDL_Mouse *mouse = SDL_GetMouse(); - if (mouse->relative_mode && !mouse->relative_mode_warp) { - mouse->SetRelativeMouseMode(SDL_FALSE); - } - - /* Some other window will get mouse events, since we're not key. */ - if (SDL_GetMouseFocus() == _data->window) { - SDL_SetMouseFocus(NULL); - } - - /* Some other window will get keyboard events, since we're not key. */ - if (SDL_GetKeyboardFocus() == _data->window) { - SDL_SetKeyboardFocus(NULL); - } - - if (isFullscreenSpace) { - [NSMenu setMenuBarVisible:YES]; - } -} - -- (void)windowDidChangeBackingProperties:(NSNotification *)aNotification -{ - NSNumber *oldscale = [[aNotification userInfo] objectForKey:NSBackingPropertyOldScaleFactorKey]; - - if (inFullscreenTransition) { - return; - } - - if ([oldscale doubleValue] != [_data->nswindow backingScaleFactor]) { - /* Force a resize event when the backing scale factor changes. */ - _data->window->w = 0; - _data->window->h = 0; - [self windowDidResize:aNotification]; - } -} - -- (void)windowWillEnterFullScreen:(NSNotification *)aNotification -{ - SDL_Window *window = _data->window; - - SetWindowStyle(window, (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask)); - - isFullscreenSpace = YES; - inFullscreenTransition = YES; -} - -- (void)windowDidFailToEnterFullScreen:(NSNotification *)aNotification -{ - SDL_Window *window = _data->window; - - if (window->is_destroying) { - return; - } - - SetWindowStyle(window, GetWindowStyle(window)); - - isFullscreenSpace = NO; - inFullscreenTransition = NO; - - [self windowDidExitFullScreen:nil]; -} - -- (void)windowDidEnterFullScreen:(NSNotification *)aNotification -{ - SDL_Window *window = _data->window; - - inFullscreenTransition = NO; - - if (pendingWindowOperation == PENDING_OPERATION_LEAVE_FULLSCREEN) { - pendingWindowOperation = PENDING_OPERATION_NONE; - [self setFullscreenSpace:NO]; - } else { - if ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) { - [NSMenu setMenuBarVisible:NO]; - } - - pendingWindowOperation = PENDING_OPERATION_NONE; - /* Force the size change event in case it was delivered earlier - while the window was still animating into place. - */ - window->w = 0; - window->h = 0; - [self windowDidResize:aNotification]; - } -} - -- (void)windowWillExitFullScreen:(NSNotification *)aNotification -{ - SDL_Window *window = _data->window; - - /* As of OS X 10.11, the window seems to need to be resizable when exiting - a Space, in order for it to resize back to its windowed-mode size. - */ - SetWindowStyle(window, GetWindowStyle(window) | NSResizableWindowMask); - - isFullscreenSpace = NO; - inFullscreenTransition = YES; -} - -- (void)windowDidFailToExitFullScreen:(NSNotification *)aNotification -{ - SDL_Window *window = _data->window; - - if (window->is_destroying) { - return; - } - - SetWindowStyle(window, (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask)); - - isFullscreenSpace = YES; - inFullscreenTransition = NO; - - [self windowDidEnterFullScreen:nil]; -} - -- (void)windowDidExitFullScreen:(NSNotification *)aNotification -{ - SDL_Window *window = _data->window; - NSWindow *nswindow = _data->nswindow; - - inFullscreenTransition = NO; - - SetWindowStyle(window, GetWindowStyle(window)); - - [nswindow setLevel:kCGNormalWindowLevel]; - - if (pendingWindowOperation == PENDING_OPERATION_ENTER_FULLSCREEN) { - pendingWindowOperation = PENDING_OPERATION_NONE; - [self setFullscreenSpace:YES]; - } else if (pendingWindowOperation == PENDING_OPERATION_MINIMIZE) { - pendingWindowOperation = PENDING_OPERATION_NONE; - [nswindow miniaturize:nil]; - } else { - /* Adjust the fullscreen toggle button and readd menu now that we're here. */ - if (window->flags & SDL_WINDOW_RESIZABLE) { - /* resizable windows are Spaces-friendly: they get the "go fullscreen" toggle button on their titlebar. */ - [nswindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; - } else { - [nswindow setCollectionBehavior:NSWindowCollectionBehaviorManaged]; - } - [NSMenu setMenuBarVisible:YES]; - - pendingWindowOperation = PENDING_OPERATION_NONE; - /* Force the size change event in case it was delivered earlier - while the window was still animating into place. - */ - window->w = 0; - window->h = 0; - [self windowDidResize:aNotification]; - - /* FIXME: Why does the window get hidden? */ - if (window->flags & SDL_WINDOW_SHOWN) { - Cocoa_ShowWindow(SDL_GetVideoDevice(), window); - } - } -} - --(NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions -{ - if ((_data->window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) { - return NSApplicationPresentationFullScreen | NSApplicationPresentationHideDock | NSApplicationPresentationHideMenuBar; - } else { - return proposedOptions; - } -} - - -/* We'll respond to key events by doing nothing so we don't beep. - * We could handle key messages here, but we lose some in the NSApp dispatch, - * where they get converted to action messages, etc. - */ -- (void)flagsChanged:(NSEvent *)theEvent -{ - /*Cocoa_HandleKeyEvent(SDL_GetVideoDevice(), theEvent);*/ -} -- (void)keyDown:(NSEvent *)theEvent -{ - /*Cocoa_HandleKeyEvent(SDL_GetVideoDevice(), theEvent);*/ -} -- (void)keyUp:(NSEvent *)theEvent -{ - /*Cocoa_HandleKeyEvent(SDL_GetVideoDevice(), theEvent);*/ -} - -/* We'll respond to selectors by doing nothing so we don't beep. - * The escape key gets converted to a "cancel" selector, etc. - */ -- (void)doCommandBySelector:(SEL)aSelector -{ - /*NSLog(@"doCommandBySelector: %@\n", NSStringFromSelector(aSelector));*/ -} - -- (BOOL)processHitTest:(NSEvent *)theEvent -{ - SDL_assert(isDragAreaRunning == [_data->nswindow isMovableByWindowBackground]); - - if (_data->window->hit_test) { /* if no hit-test, skip this. */ - const NSPoint location = [theEvent locationInWindow]; - const SDL_Point point = { (int) location.x, _data->window->h - (((int) location.y)-1) }; - const SDL_HitTestResult rc = _data->window->hit_test(_data->window, &point, _data->window->hit_test_data); - if (rc == SDL_HITTEST_DRAGGABLE) { - if (!isDragAreaRunning) { - isDragAreaRunning = YES; - [_data->nswindow setMovableByWindowBackground:YES]; - } - return YES; /* dragging! */ - } - } - - if (isDragAreaRunning) { - isDragAreaRunning = NO; - [_data->nswindow setMovableByWindowBackground:NO]; - return YES; /* was dragging, drop event. */ - } - - return NO; /* not a special area, carry on. */ -} - -- (void)mouseDown:(NSEvent *)theEvent -{ - int button; - int clicks; - - /* Ignore events that aren't inside the client area (i.e. title bar.) */ - if ([theEvent window]) { - NSRect windowRect = [[[theEvent window] contentView] frame]; - if (!NSMouseInRect([theEvent locationInWindow], windowRect, NO)) { - return; - } - } - - if ([self processHitTest:theEvent]) { - SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); - return; /* dragging, drop event. */ - } - - switch ([theEvent buttonNumber]) { - case 0: - if (([theEvent modifierFlags] & NSControlKeyMask) && - GetHintCtrlClickEmulateRightClick()) { - wasCtrlLeft = YES; - button = SDL_BUTTON_RIGHT; - } else { - wasCtrlLeft = NO; - button = SDL_BUTTON_LEFT; - } - break; - case 1: - button = SDL_BUTTON_RIGHT; - break; - case 2: - button = SDL_BUTTON_MIDDLE; - break; - default: - button = (int) [theEvent buttonNumber] + 1; - break; - } - - clicks = (int) [theEvent clickCount]; - SDL_SendMouseButtonClicks(_data->window, 0, SDL_PRESSED, button, clicks); -} - -- (void)rightMouseDown:(NSEvent *)theEvent -{ - [self mouseDown:theEvent]; -} - -- (void)otherMouseDown:(NSEvent *)theEvent -{ - [self mouseDown:theEvent]; -} - -- (void)mouseUp:(NSEvent *)theEvent -{ - int button; - int clicks; - - if ([self processHitTest:theEvent]) { - SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); - return; /* stopped dragging, drop event. */ - } - - switch ([theEvent buttonNumber]) { - case 0: - if (wasCtrlLeft) { - button = SDL_BUTTON_RIGHT; - wasCtrlLeft = NO; - } else { - button = SDL_BUTTON_LEFT; - } - break; - case 1: - button = SDL_BUTTON_RIGHT; - break; - case 2: - button = SDL_BUTTON_MIDDLE; - break; - default: - button = (int) [theEvent buttonNumber] + 1; - break; - } - - clicks = (int) [theEvent clickCount]; - SDL_SendMouseButtonClicks(_data->window, 0, SDL_RELEASED, button, clicks); -} - -- (void)rightMouseUp:(NSEvent *)theEvent -{ - [self mouseUp:theEvent]; -} - -- (void)otherMouseUp:(NSEvent *)theEvent -{ - [self mouseUp:theEvent]; -} - -- (void)mouseMoved:(NSEvent *)theEvent -{ - SDL_Mouse *mouse = SDL_GetMouse(); - SDL_Window *window = _data->window; - NSPoint point; - int x, y; - - if ([self processHitTest:theEvent]) { - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); - return; /* dragging, drop event. */ - } - - if (mouse->relative_mode) { - return; - } - - point = [theEvent locationInWindow]; - x = (int)point.x; - y = (int)(window->h - point.y); - - if (window->flags & SDL_WINDOW_INPUT_GRABBED) { - if (x < 0 || x >= window->w || y < 0 || y >= window->h) { - if (x < 0) { - x = 0; - } else if (x >= window->w) { - x = window->w - 1; - } - if (y < 0) { - y = 0; - } else if (y >= window->h) { - y = window->h - 1; - } - -#if !SDL_MAC_NO_SANDBOX - CGPoint cgpoint; - - /* When SDL_MAC_NO_SANDBOX is set, this is handled by - * SDL_cocoamousetap.m. - */ - - cgpoint.x = window->x + x; - cgpoint.y = window->y + y; - - CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint); - CGAssociateMouseAndMouseCursorPosition(YES); - - Cocoa_HandleMouseWarp(cgpoint.x, cgpoint.y); -#endif - } - } - SDL_SendMouseMotion(window, 0, 0, x, y); -} - -- (void)mouseDragged:(NSEvent *)theEvent -{ - [self mouseMoved:theEvent]; -} - -- (void)rightMouseDragged:(NSEvent *)theEvent -{ - [self mouseMoved:theEvent]; -} - -- (void)otherMouseDragged:(NSEvent *)theEvent -{ - [self mouseMoved:theEvent]; -} - -- (void)scrollWheel:(NSEvent *)theEvent -{ - Cocoa_HandleMouseWheel(_data->window, theEvent); -} - -- (void)touchesBeganWithEvent:(NSEvent *) theEvent -{ - NSSet *touches = [theEvent touchesMatchingPhase:NSTouchPhaseAny inView:nil]; - int existingTouchCount = 0; - - for (NSTouch* touch in touches) { - if ([touch phase] != NSTouchPhaseBegan) { - existingTouchCount++; - } - } - if (existingTouchCount == 0) { - SDL_TouchID touchID = (SDL_TouchID)(intptr_t)[[touches anyObject] device]; - int numFingers = SDL_GetNumTouchFingers(touchID); - DLog("Reset Lost Fingers: %d", numFingers); - for (--numFingers; numFingers >= 0; --numFingers) { - SDL_Finger* finger = SDL_GetTouchFinger(touchID, numFingers); - SDL_SendTouch(touchID, finger->id, SDL_FALSE, 0, 0, 0); - } - } - - DLog("Began Fingers: %lu .. existing: %d", (unsigned long)[touches count], existingTouchCount); - [self handleTouches:NSTouchPhaseBegan withEvent:theEvent]; -} - -- (void)touchesMovedWithEvent:(NSEvent *) theEvent -{ - [self handleTouches:NSTouchPhaseMoved withEvent:theEvent]; -} - -- (void)touchesEndedWithEvent:(NSEvent *) theEvent -{ - [self handleTouches:NSTouchPhaseEnded withEvent:theEvent]; -} - -- (void)touchesCancelledWithEvent:(NSEvent *) theEvent -{ - [self handleTouches:NSTouchPhaseCancelled withEvent:theEvent]; -} - -- (void)handleTouches:(NSTouchPhase) phase withEvent:(NSEvent *) theEvent -{ - NSSet *touches = [theEvent touchesMatchingPhase:phase inView:nil]; - - for (NSTouch *touch in touches) { - const SDL_TouchID touchId = (SDL_TouchID)(intptr_t)[touch device]; - if (SDL_AddTouch(touchId, "") < 0) { - return; - } - - const SDL_FingerID fingerId = (SDL_FingerID)(intptr_t)[touch identity]; - float x = [touch normalizedPosition].x; - float y = [touch normalizedPosition].y; - /* Make the origin the upper left instead of the lower left */ - y = 1.0f - y; - - switch (phase) { - case NSTouchPhaseBegan: - SDL_SendTouch(touchId, fingerId, SDL_TRUE, x, y, 1.0f); - break; - case NSTouchPhaseEnded: - case NSTouchPhaseCancelled: - SDL_SendTouch(touchId, fingerId, SDL_FALSE, x, y, 1.0f); - break; - case NSTouchPhaseMoved: - SDL_SendTouchMotion(touchId, fingerId, x, y, 1.0f); - break; - default: - break; - } - } -} - -@end - -@interface SDLView : NSView { - SDL_Window *_sdlWindow; -} - -- (void)setSDLWindow:(SDL_Window*)window; - -/* The default implementation doesn't pass rightMouseDown to responder chain */ -- (void)rightMouseDown:(NSEvent *)theEvent; -- (BOOL)mouseDownCanMoveWindow; -- (void)drawRect:(NSRect)dirtyRect; -- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent; -@end - -@implementation SDLView -- (void)setSDLWindow:(SDL_Window*)window -{ - _sdlWindow = window; -} - -- (void)drawRect:(NSRect)dirtyRect -{ - SDL_SendWindowEvent(_sdlWindow, SDL_WINDOWEVENT_EXPOSED, 0, 0); -} - -- (void)rightMouseDown:(NSEvent *)theEvent -{ - [[self nextResponder] rightMouseDown:theEvent]; -} - -- (BOOL)mouseDownCanMoveWindow -{ - /* Always say YES, but this doesn't do anything until we call - -[NSWindow setMovableByWindowBackground:YES], which we ninja-toggle - during mouse events when we're using a drag area. */ - return YES; -} - -- (void)resetCursorRects -{ - [super resetCursorRects]; - SDL_Mouse *mouse = SDL_GetMouse(); - - if (mouse->cursor_shown && mouse->cur_cursor && !mouse->relative_mode) { - [self addCursorRect:[self bounds] - cursor:mouse->cur_cursor->driverdata]; - } else { - [self addCursorRect:[self bounds] - cursor:[NSCursor invisibleCursor]]; - } -} - -- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent -{ - if (SDL_GetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH)) { - return SDL_GetHintBoolean(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, SDL_FALSE); - } else { - return SDL_GetHintBoolean("SDL_MAC_MOUSE_FOCUS_CLICKTHROUGH", SDL_FALSE); - } -} -@end - -static int -SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created) -{ @autoreleasepool -{ - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - SDL_WindowData *data; - - /* Allocate the window data */ - window->driverdata = data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data)); - if (!data) { - return SDL_OutOfMemory(); - } - data->window = window; - data->nswindow = nswindow; - data->created = created; - data->videodata = videodata; - data->nscontexts = [[NSMutableArray alloc] init]; - - /* Create an event listener for the window */ - data->listener = [[Cocoa_WindowListener alloc] init]; - - /* Fill in the SDL window with the window data */ - { - NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]]; - ConvertNSRect([nswindow screen], (window->flags & FULLSCREEN_MASK), &rect); - window->x = (int)rect.origin.x; - window->y = (int)rect.origin.y; - window->w = (int)rect.size.width; - window->h = (int)rect.size.height; - } - - /* Set up the listener after we create the view */ - [data->listener listen:data]; - - if ([nswindow isVisible]) { - window->flags |= SDL_WINDOW_SHOWN; - } else { - window->flags &= ~SDL_WINDOW_SHOWN; - } - - { - unsigned long style = [nswindow styleMask]; - - if (style == NSBorderlessWindowMask) { - window->flags |= SDL_WINDOW_BORDERLESS; - } else { - window->flags &= ~SDL_WINDOW_BORDERLESS; - } - if (style & NSResizableWindowMask) { - window->flags |= SDL_WINDOW_RESIZABLE; - } else { - window->flags &= ~SDL_WINDOW_RESIZABLE; - } - } - - /* isZoomed always returns true if the window is not resizable */ - if ((window->flags & SDL_WINDOW_RESIZABLE) && [nswindow isZoomed]) { - window->flags |= SDL_WINDOW_MAXIMIZED; - } else { - window->flags &= ~SDL_WINDOW_MAXIMIZED; - } - - if ([nswindow isMiniaturized]) { - window->flags |= SDL_WINDOW_MINIMIZED; - } else { - window->flags &= ~SDL_WINDOW_MINIMIZED; - } - - if ([nswindow isKeyWindow]) { - window->flags |= SDL_WINDOW_INPUT_FOCUS; - SDL_SetKeyboardFocus(data->window); - } - - /* Prevents the window's "window device" from being destroyed when it is - * hidden. See http://www.mikeash.com/pyblog/nsopenglcontext-and-one-shot.html - */ - [nswindow setOneShot:NO]; - - /* All done! */ - window->driverdata = data; - return 0; -}} - -int -Cocoa_CreateWindow(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - NSWindow *nswindow; - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - NSRect rect; - SDL_Rect bounds; - NSUInteger style; - NSArray *screens = [NSScreen screens]; - - Cocoa_GetDisplayBounds(_this, display, &bounds); - rect.origin.x = window->x; - rect.origin.y = window->y; - rect.size.width = window->w; - rect.size.height = window->h; - ConvertNSRect([screens objectAtIndex:0], (window->flags & FULLSCREEN_MASK), &rect); - - style = GetWindowStyle(window); - - /* Figure out which screen to place this window */ - NSScreen *screen = nil; - for (NSScreen *candidate in screens) { - NSRect screenRect = [candidate frame]; - if (rect.origin.x >= screenRect.origin.x && - rect.origin.x < screenRect.origin.x + screenRect.size.width && - rect.origin.y >= screenRect.origin.y && - rect.origin.y < screenRect.origin.y + screenRect.size.height) { - screen = candidate; - rect.origin.x -= screenRect.origin.x; - rect.origin.y -= screenRect.origin.y; - } - } - - @try { - nswindow = [[SDLWindow alloc] initWithContentRect:rect styleMask:style backing:NSBackingStoreBuffered defer:NO screen:screen]; - } - @catch (NSException *e) { - return SDL_SetError("%s", [[e reason] UTF8String]); - } - [nswindow setBackgroundColor:[NSColor blackColor]]; - - if (videodata->allow_spaces) { - SDL_assert(floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6); - SDL_assert([nswindow respondsToSelector:@selector(toggleFullScreen:)]); - /* we put FULLSCREEN_DESKTOP windows in their own Space, without a toggle button or menubar, later */ - if (window->flags & SDL_WINDOW_RESIZABLE) { - /* resizable windows are Spaces-friendly: they get the "go fullscreen" toggle button on their titlebar. */ - [nswindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; - } - } - - /* Create a default view for this window */ - rect = [nswindow contentRectForFrameRect:[nswindow frame]]; - SDLView *contentView = [[SDLView alloc] initWithFrame:rect]; - [contentView setSDLWindow:window]; - - if (window->flags & SDL_WINDOW_ALLOW_HIGHDPI) { - if ([contentView respondsToSelector:@selector(setWantsBestResolutionOpenGLSurface:)]) { - [contentView setWantsBestResolutionOpenGLSurface:YES]; - } - } - - [nswindow setContentView:contentView]; - [contentView release]; - - /* Allow files and folders to be dragged onto the window by users */ - [nswindow registerForDraggedTypes:[NSArray arrayWithObject:(NSString *)kUTTypeFileURL]]; - - if (SetupWindowData(_this, window, nswindow, SDL_TRUE) < 0) { - [nswindow release]; - return -1; - } - return 0; -}} - -int -Cocoa_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) -{ @autoreleasepool -{ - NSWindow *nswindow = (NSWindow *) data; - NSString *title; - - /* Query the title from the existing window */ - title = [nswindow title]; - if (title) { - window->title = SDL_strdup([title UTF8String]); - } - - return SetupWindowData(_this, window, nswindow, SDL_FALSE); -}} - -void -Cocoa_SetWindowTitle(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - const char *title = window->title ? window->title : ""; - NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow; - NSString *string = [[NSString alloc] initWithUTF8String:title]; - [nswindow setTitle:string]; - [string release]; -}} - -void -Cocoa_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) -{ @autoreleasepool -{ - NSImage *nsimage = Cocoa_CreateImage(icon); - - if (nsimage) { - [NSApp setApplicationIconImage:nsimage]; - } -}} - -void -Cocoa_SetWindowPosition(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_WindowData *windata = (SDL_WindowData *) window->driverdata; - NSWindow *nswindow = windata->nswindow; - NSRect rect; - Uint32 moveHack; - - rect.origin.x = window->x; - rect.origin.y = window->y; - rect.size.width = window->w; - rect.size.height = window->h; - ConvertNSRect([nswindow screen], (window->flags & FULLSCREEN_MASK), &rect); - - moveHack = s_moveHack; - s_moveHack = 0; - [nswindow setFrameOrigin:rect.origin]; - s_moveHack = moveHack; - - ScheduleContextUpdates(windata); -}} - -void -Cocoa_SetWindowSize(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_WindowData *windata = (SDL_WindowData *) window->driverdata; - NSWindow *nswindow = windata->nswindow; - NSRect rect; - Uint32 moveHack; - - /* Cocoa will resize the window from the bottom-left rather than the - * top-left when -[nswindow setContentSize:] is used, so we must set the - * entire frame based on the new size, in order to preserve the position. - */ - rect.origin.x = window->x; - rect.origin.y = window->y; - rect.size.width = window->w; - rect.size.height = window->h; - ConvertNSRect([nswindow screen], (window->flags & FULLSCREEN_MASK), &rect); - - moveHack = s_moveHack; - s_moveHack = 0; - [nswindow setFrame:[nswindow frameRectForContentRect:rect] display:YES]; - s_moveHack = moveHack; - - ScheduleContextUpdates(windata); -}} - -void -Cocoa_SetWindowMinimumSize(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_WindowData *windata = (SDL_WindowData *) window->driverdata; - - NSSize minSize; - minSize.width = window->min_w; - minSize.height = window->min_h; - - [windata->nswindow setContentMinSize:minSize]; -}} - -void -Cocoa_SetWindowMaximumSize(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_WindowData *windata = (SDL_WindowData *) window->driverdata; - - NSSize maxSize; - maxSize.width = window->max_w; - maxSize.height = window->max_h; - - [windata->nswindow setContentMaxSize:maxSize]; -}} - -void -Cocoa_ShowWindow(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_WindowData *windowData = ((SDL_WindowData *) window->driverdata); - NSWindow *nswindow = windowData->nswindow; - - if (![nswindow isMiniaturized]) { - [windowData->listener pauseVisibleObservation]; - [nswindow makeKeyAndOrderFront:nil]; - [windowData->listener resumeVisibleObservation]; - } -}} - -void -Cocoa_HideWindow(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow; - - [nswindow orderOut:nil]; -}} - -void -Cocoa_RaiseWindow(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_WindowData *windowData = ((SDL_WindowData *) window->driverdata); - NSWindow *nswindow = windowData->nswindow; - - /* makeKeyAndOrderFront: has the side-effect of deminiaturizing and showing - a minimized or hidden window, so check for that before showing it. - */ - [windowData->listener pauseVisibleObservation]; - if (![nswindow isMiniaturized] && [nswindow isVisible]) { - [NSApp activateIgnoringOtherApps:YES]; - [nswindow makeKeyAndOrderFront:nil]; - } - [windowData->listener resumeVisibleObservation]; -}} - -void -Cocoa_MaximizeWindow(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_WindowData *windata = (SDL_WindowData *) window->driverdata; - NSWindow *nswindow = windata->nswindow; - - [nswindow zoom:nil]; - - ScheduleContextUpdates(windata); -}} - -void -Cocoa_MinimizeWindow(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - NSWindow *nswindow = data->nswindow; - - if ([data->listener isInFullscreenSpaceTransition]) { - [data->listener addPendingWindowOperation:PENDING_OPERATION_MINIMIZE]; - } else { - [nswindow miniaturize:nil]; - } -}} - -void -Cocoa_RestoreWindow(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow; - - if ([nswindow isMiniaturized]) { - [nswindow deminiaturize:nil]; - } else if ((window->flags & SDL_WINDOW_RESIZABLE) && [nswindow isZoomed]) { - [nswindow zoom:nil]; - } -}} - -void -Cocoa_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) -{ @autoreleasepool -{ - if (SetWindowStyle(window, GetWindowStyle(window))) { - if (bordered) { - Cocoa_SetWindowTitle(_this, window); /* this got blanked out. */ - } - } -}} - -void -Cocoa_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable) -{ @autoreleasepool -{ - /* Don't set this if we're in a space! - * The window will get permanently stuck if resizable is false. - * -flibit - */ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Cocoa_WindowListener *listener = data->listener; - if (![listener isInFullscreenSpace]) { - SetWindowStyle(window, GetWindowStyle(window)); - } -}} - -void -Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen) -{ @autoreleasepool -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - NSWindow *nswindow = data->nswindow; - NSRect rect; - - /* The view responder chain gets messed with during setStyleMask */ - if ([[nswindow contentView] nextResponder] == data->listener) { - [[nswindow contentView] setNextResponder:nil]; - } - - if (fullscreen) { - SDL_Rect bounds; - - Cocoa_GetDisplayBounds(_this, display, &bounds); - rect.origin.x = bounds.x; - rect.origin.y = bounds.y; - rect.size.width = bounds.w; - rect.size.height = bounds.h; - ConvertNSRect([nswindow screen], fullscreen, &rect); - - /* Hack to fix origin on Mac OS X 10.4 */ - NSRect screenRect = [[nswindow screen] frame]; - if (screenRect.size.height >= 1.0f) { - rect.origin.y += (screenRect.size.height - rect.size.height); - } - - [nswindow setStyleMask:NSBorderlessWindowMask]; - } else { - rect.origin.x = window->windowed.x; - rect.origin.y = window->windowed.y; - rect.size.width = window->windowed.w; - rect.size.height = window->windowed.h; - ConvertNSRect([nswindow screen], fullscreen, &rect); - - [nswindow setStyleMask:GetWindowStyle(window)]; - - /* Hack to restore window decorations on Mac OS X 10.10 */ - NSRect frameRect = [nswindow frame]; - [nswindow setFrame:NSMakeRect(frameRect.origin.x, frameRect.origin.y, frameRect.size.width + 1, frameRect.size.height) display:NO]; - [nswindow setFrame:frameRect display:NO]; - } - - /* The view responder chain gets messed with during setStyleMask */ - if ([[nswindow contentView] nextResponder] != data->listener) { - [[nswindow contentView] setNextResponder:data->listener]; - } - - s_moveHack = 0; - [nswindow setContentSize:rect.size]; - [nswindow setFrameOrigin:rect.origin]; - s_moveHack = SDL_GetTicks(); - - /* When the window style changes the title is cleared */ - if (!fullscreen) { - Cocoa_SetWindowTitle(_this, window); - } - - if (SDL_ShouldAllowTopmost() && fullscreen) { - /* OpenGL is rendering to the window, so make it visible! */ - [nswindow setLevel:CGShieldingWindowLevel()]; - } else { - [nswindow setLevel:kCGNormalWindowLevel]; - } - - if ([nswindow isVisible] || fullscreen) { - [data->listener pauseVisibleObservation]; - [nswindow makeKeyAndOrderFront:nil]; - [data->listener resumeVisibleObservation]; - } - - ScheduleContextUpdates(data); -}} - -int -Cocoa_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp) -{ - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - CGDirectDisplayID display_id = ((SDL_DisplayData *)display->driverdata)->display; - const uint32_t tableSize = 256; - CGGammaValue redTable[tableSize]; - CGGammaValue greenTable[tableSize]; - CGGammaValue blueTable[tableSize]; - uint32_t i; - float inv65535 = 1.0f / 65535.0f; - - /* Extract gamma values into separate tables, convert to floats between 0.0 and 1.0 */ - for (i = 0; i < 256; i++) { - redTable[i] = ramp[0*256+i] * inv65535; - greenTable[i] = ramp[1*256+i] * inv65535; - blueTable[i] = ramp[2*256+i] * inv65535; - } - - if (CGSetDisplayTransferByTable(display_id, tableSize, - redTable, greenTable, blueTable) != CGDisplayNoErr) { - return SDL_SetError("CGSetDisplayTransferByTable()"); - } - return 0; -} - -int -Cocoa_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp) -{ - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - CGDirectDisplayID display_id = ((SDL_DisplayData *)display->driverdata)->display; - const uint32_t tableSize = 256; - CGGammaValue redTable[tableSize]; - CGGammaValue greenTable[tableSize]; - CGGammaValue blueTable[tableSize]; - uint32_t i, tableCopied; - - if (CGGetDisplayTransferByTable(display_id, tableSize, - redTable, greenTable, blueTable, &tableCopied) != CGDisplayNoErr) { - return SDL_SetError("CGGetDisplayTransferByTable()"); - } - - for (i = 0; i < tableCopied; i++) { - ramp[0*256+i] = (Uint16)(redTable[i] * 65535.0f); - ramp[1*256+i] = (Uint16)(greenTable[i] * 65535.0f); - ramp[2*256+i] = (Uint16)(blueTable[i] * 65535.0f); - } - return 0; -} - -void -Cocoa_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) -{ - /* Move the cursor to the nearest point in the window */ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - if (grabbed && data && ![data->listener isMoving]) { - int x, y; - CGPoint cgpoint; - - SDL_GetMouseState(&x, &y); - cgpoint.x = window->x + x; - cgpoint.y = window->y + y; - - Cocoa_HandleMouseWarp(cgpoint.x, cgpoint.y); - - DLog("Returning cursor to (%g, %g)", cgpoint.x, cgpoint.y); - CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint); - } - - if ( data && (window->flags & SDL_WINDOW_FULLSCREEN) ) { - if (SDL_ShouldAllowTopmost() && (window->flags & SDL_WINDOW_INPUT_FOCUS) - && ![data->listener isInFullscreenSpace]) { - /* OpenGL is rendering to the window, so make it visible! */ - /* Doing this in 10.11 while in a Space breaks things (bug #3152) */ - [data->nswindow setLevel:CGShieldingWindowLevel()]; - } else { - [data->nswindow setLevel:kCGNormalWindowLevel]; - } - } -} - -void -Cocoa_DestroyWindow(_THIS, SDL_Window * window) -{ @autoreleasepool -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - - if (data) { - if ([data->listener isInFullscreenSpace]) { - [NSMenu setMenuBarVisible:YES]; - } - [data->listener close]; - [data->listener release]; - if (data->created) { - [data->nswindow close]; - } - - NSArray *contexts = [[data->nscontexts copy] autorelease]; - for (SDLOpenGLContext *context in contexts) { - /* Calling setWindow:NULL causes the context to remove itself from the context list. */ - [context setWindow:NULL]; - } - [data->nscontexts release]; - - SDL_free(data); - } - window->driverdata = NULL; -}} - -SDL_bool -Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) -{ - NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow; - - if (info->version.major <= SDL_MAJOR_VERSION) { - info->subsystem = SDL_SYSWM_COCOA; - info->info.cocoa.window = nswindow; - return SDL_TRUE; - } else { - SDL_SetError("Application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } -} - -SDL_bool -Cocoa_IsWindowInFullscreenSpace(SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - - if ([data->listener isInFullscreenSpace]) { - return SDL_TRUE; - } else { - return SDL_FALSE; - } -} - -SDL_bool -Cocoa_SetWindowFullscreenSpace(SDL_Window * window, SDL_bool state) -{ @autoreleasepool -{ - SDL_bool succeeded = SDL_FALSE; - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - - if ([data->listener setFullscreenSpace:(state ? YES : NO)]) { - const int maxattempts = 3; - int attempt = 0; - while (++attempt <= maxattempts) { - /* Wait for the transition to complete, so application changes - take effect properly (e.g. setting the window size, etc.) - */ - const int limit = 10000; - int count = 0; - while ([data->listener isInFullscreenSpaceTransition]) { - if ( ++count == limit ) { - /* Uh oh, transition isn't completing. Should we assert? */ - break; - } - SDL_Delay(1); - SDL_PumpEvents(); - } - if ([data->listener isInFullscreenSpace] == (state ? YES : NO)) - break; - /* Try again, the last attempt was interrupted by user gestures */ - if (![data->listener setFullscreenSpace:(state ? YES : NO)]) - break; /* ??? */ - } - /* Return TRUE to prevent non-space fullscreen logic from running */ - succeeded = SDL_TRUE; - } - - return succeeded; -}} - -int -Cocoa_SetWindowHitTest(SDL_Window * window, SDL_bool enabled) -{ - return 0; /* just succeed, the real work is done elsewhere. */ -} - -int -Cocoa_SetWindowOpacity(_THIS, SDL_Window * window, float opacity) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - [data->nswindow setAlphaValue:opacity]; - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_COCOA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_WM.c b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_WM.c deleted file mode 100644 index 4b979f36c80..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_WM.c +++ /dev/null @@ -1,413 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DIRECTFB - -#include "SDL_DirectFB_video.h" -#include "SDL_DirectFB_window.h" - -#include "../../events/SDL_windowevents_c.h" - -#define COLOR_EXPAND(col) col.r, col.g, col.b, col.a - -static DFB_Theme theme_std = { - 4, 4, 8, 8, - {255, 200, 200, 200}, - 24, - {255, 0, 0, 255}, - 16, - {255, 255, 255, 255}, - "/usr/share/fonts/truetype/freefont/FreeSans.ttf", - {255, 255, 0, 0}, - {255, 255, 255, 0}, -}; - -static DFB_Theme theme_none = { - 0, 0, 0, 0, - {0, 0, 0, 0}, - 0, - {0, 0, 0, 0}, - 0, - {0, 0, 0, 0}, - NULL -}; - -static void -DrawTriangle(IDirectFBSurface * s, int down, int x, int y, int w) -{ - int x1, x2, x3; - int y1, y2, y3; - - if (down) { - x1 = x + w / 2; - x2 = x; - x3 = x + w; - y1 = y + w; - y2 = y; - y3 = y; - } else { - x1 = x + w / 2; - x2 = x; - x3 = x + w; - y1 = y; - y2 = y + w; - y3 = y + w; - } - s->FillTriangle(s, x1, y1, x2, y2, x3, y3); -} - -static void -LoadFont(_THIS, SDL_Window * window) -{ - SDL_DFB_DEVICEDATA(_this); - SDL_DFB_WINDOWDATA(window); - - if (windata->font != NULL) { - SDL_DFB_RELEASE(windata->font); - windata->font = NULL; - SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, windata->font)); - } - - if (windata->theme.font != NULL) - { - DFBFontDescription fdesc; - - SDL_zero(fdesc); - fdesc.flags = DFDESC_HEIGHT; - fdesc.height = windata->theme.font_size; - SDL_DFB_CHECK(devdata-> - dfb->CreateFont(devdata->dfb, windata->theme.font, - &fdesc, &windata->font)); - SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, windata->font)); - } -} - -static void -DrawCraption(_THIS, IDirectFBSurface * s, int x, int y, char *text) -{ - DFBSurfaceTextFlags flags; - - flags = DSTF_CENTER | DSTF_TOP; - - s->DrawString(s, text, -1, x, y, flags); -} - -void -DirectFB_WM_RedrawLayout(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - IDirectFBSurface *s = windata->window_surface; - DFB_Theme *t = &windata->theme; - int i; - int d = (t->caption_size - t->font_size) / 2; - int x, y, w; - - - if (!windata->is_managed || (window->flags & SDL_WINDOW_FULLSCREEN)) - return; - - SDL_DFB_CHECK(s->SetSrcBlendFunction(s, DSBF_ONE)); - SDL_DFB_CHECK(s->SetDstBlendFunction(s, DSBF_ZERO)); - SDL_DFB_CHECK(s->SetDrawingFlags(s, DSDRAW_NOFX)); - SDL_DFB_CHECK(s->SetBlittingFlags(s, DSBLIT_NOFX)); - - LoadFont(_this, window); - /* s->SetDrawingFlags(s, DSDRAW_BLEND); */ - s->SetColor(s, COLOR_EXPAND(t->frame_color)); - /* top */ - for (i = 0; i < t->top_size; i++) - s->DrawLine(s, 0, i, windata->size.w, i); - /* bottom */ - for (i = windata->size.h - t->bottom_size; i < windata->size.h; i++) - s->DrawLine(s, 0, i, windata->size.w, i); - /* left */ - for (i = 0; i < t->left_size; i++) - s->DrawLine(s, i, 0, i, windata->size.h); - /* right */ - for (i = windata->size.w - t->right_size; i < windata->size.w; i++) - s->DrawLine(s, i, 0, i, windata->size.h); - /* Caption */ - s->SetColor(s, COLOR_EXPAND(t->caption_color)); - s->FillRectangle(s, t->left_size, t->top_size, windata->client.w, - t->caption_size); - /* Close Button */ - w = t->caption_size; - x = windata->size.w - t->right_size - w + d; - y = t->top_size + d; - s->SetColor(s, COLOR_EXPAND(t->close_color)); - DrawTriangle(s, 1, x, y, w - 2 * d); - /* Max Button */ - s->SetColor(s, COLOR_EXPAND(t->max_color)); - DrawTriangle(s, window->flags & SDL_WINDOW_MAXIMIZED ? 1 : 0, x - w, - y, w - 2 * d); - - /* Caption */ - if (*window->title) { - s->SetColor(s, COLOR_EXPAND(t->font_color)); - DrawCraption(_this, s, (x - w) / 2, t->top_size + d, window->title); - } - /* Icon */ - if (windata->icon) { - DFBRectangle dr; - - dr.x = t->left_size + d; - dr.y = t->top_size + d; - dr.w = w - 2 * d; - dr.h = w - 2 * d; - s->SetBlittingFlags(s, DSBLIT_BLEND_ALPHACHANNEL); - - s->StretchBlit(s, windata->icon, NULL, &dr); - } - windata->wm_needs_redraw = 0; -} - -DFBResult -DirectFB_WM_GetClientSize(_THIS, SDL_Window * window, int *cw, int *ch) -{ - SDL_DFB_WINDOWDATA(window); - IDirectFBWindow *dfbwin = windata->dfbwin; - - SDL_DFB_CHECK(dfbwin->GetSize(dfbwin, cw, ch)); - dfbwin->GetSize(dfbwin, cw, ch); - *cw -= windata->theme.left_size + windata->theme.right_size; - *ch -= - windata->theme.top_size + windata->theme.caption_size + - windata->theme.bottom_size; - return DFB_OK; -} - -void -DirectFB_WM_AdjustWindowLayout(SDL_Window * window, int flags, int w, int h) -{ - SDL_DFB_WINDOWDATA(window); - - if (!windata->is_managed) - windata->theme = theme_none; - else if (flags & SDL_WINDOW_BORDERLESS) - /* desc.caps |= DWCAPS_NODECORATION;) */ - windata->theme = theme_none; - else if (flags & SDL_WINDOW_FULLSCREEN) { - windata->theme = theme_none; - } else if (flags & SDL_WINDOW_MAXIMIZED) { - windata->theme = theme_std; - windata->theme.left_size = 0; - windata->theme.right_size = 0; - windata->theme.top_size = 0; - windata->theme.bottom_size = 0; - } else { - windata->theme = theme_std; - } - - windata->client.x = windata->theme.left_size; - windata->client.y = windata->theme.top_size + windata->theme.caption_size; - windata->client.w = w; - windata->client.h = h; - windata->size.w = - w + windata->theme.left_size + windata->theme.right_size; - windata->size.h = - h + windata->theme.top_size + - windata->theme.caption_size + windata->theme.bottom_size; -} - - -enum -{ - WM_POS_NONE = 0x00, - WM_POS_CAPTION = 0x01, - WM_POS_CLOSE = 0x02, - WM_POS_MAX = 0x04, - WM_POS_LEFT = 0x08, - WM_POS_RIGHT = 0x10, - WM_POS_TOP = 0x20, - WM_POS_BOTTOM = 0x40, -}; - -static int -WMIsClient(DFB_WindowData * p, int x, int y) -{ - x -= p->client.x; - y -= p->client.y; - if (x < 0 || y < 0) - return 0; - if (x >= p->client.w || y >= p->client.h) - return 0; - return 1; -} - -static int -WMPos(DFB_WindowData * p, int x, int y) -{ - int pos = WM_POS_NONE; - - if (!WMIsClient(p, x, y)) { - if (y < p->theme.top_size) { - pos |= WM_POS_TOP; - } else if (y < p->client.y) { - if (x < - p->size.w - p->theme.right_size - 2 * p->theme.caption_size) { - pos |= WM_POS_CAPTION; - } else if (x < - p->size.w - p->theme.right_size - - p->theme.caption_size) { - pos |= WM_POS_MAX; - } else { - pos |= WM_POS_CLOSE; - } - } else if (y >= p->size.h - p->theme.bottom_size) { - pos |= WM_POS_BOTTOM; - } - if (x < p->theme.left_size) { - pos |= WM_POS_LEFT; - } else if (x >= p->size.w - p->theme.right_size) { - pos |= WM_POS_RIGHT; - } - } - return pos; -} - -int -DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window, DFBWindowEvent * evt) -{ - SDL_DFB_DEVICEDATA(_this); - SDL_DFB_WINDOWDATA(window); - DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) : NULL); - IDirectFBWindow *dfbwin = windata->dfbwin; - DFBWindowOptions wopts; - - if (!windata->is_managed) - return 0; - - SDL_DFB_CHECK(dfbwin->GetOptions(dfbwin, &wopts)); - - switch (evt->type) { - case DWET_BUTTONDOWN: - if (evt->buttons & DIBM_LEFT) { - int pos = WMPos(windata, evt->x, evt->y); - switch (pos) { - case WM_POS_NONE: - return 0; - case WM_POS_CLOSE: - windata->wm_grab = WM_POS_NONE; - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_CLOSE, 0, - 0); - return 1; - case WM_POS_MAX: - windata->wm_grab = WM_POS_NONE; - if (window->flags & SDL_WINDOW_MAXIMIZED) { - SDL_RestoreWindow(window); - } else { - SDL_MaximizeWindow(window); - } - return 1; - case WM_POS_CAPTION: - if (!(wopts & DWOP_KEEP_STACKING)) { - DirectFB_RaiseWindow(_this, window); - } - if (window->flags & SDL_WINDOW_MAXIMIZED) - return 1; - /* fall through */ - default: - windata->wm_grab = pos; - if (gwindata != NULL) - SDL_DFB_CHECK(gwindata->dfbwin->UngrabPointer(gwindata->dfbwin)); - SDL_DFB_CHECK(dfbwin->GrabPointer(dfbwin)); - windata->wm_lastx = evt->cx; - windata->wm_lasty = evt->cy; - } - } - return 1; - case DWET_BUTTONUP: - if (!windata->wm_grab) - return 0; - if (!(evt->buttons & DIBM_LEFT)) { - if (windata->wm_grab & (WM_POS_RIGHT | WM_POS_BOTTOM)) { - int dx = evt->cx - windata->wm_lastx; - int dy = evt->cy - windata->wm_lasty; - - if (!(wopts & DWOP_KEEP_SIZE)) { - int cw, ch; - if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_BOTTOM) - dx = 0; - else if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_RIGHT) - dy = 0; - SDL_DFB_CHECK(dfbwin->GetSize(dfbwin, &cw, &ch)); - - /* necessary to trigger an event - ugly */ - SDL_DFB_CHECK(dfbwin->DisableEvents(dfbwin, DWET_ALL)); - SDL_DFB_CHECK(dfbwin->Resize(dfbwin, cw + dx + 1, ch + dy)); - SDL_DFB_CHECK(dfbwin->EnableEvents(dfbwin, DWET_ALL)); - - SDL_DFB_CHECK(dfbwin->Resize(dfbwin, cw + dx, ch + dy)); - } - } - SDL_DFB_CHECK(dfbwin->UngrabPointer(dfbwin)); - if (gwindata != NULL) - SDL_DFB_CHECK(gwindata->dfbwin->GrabPointer(gwindata->dfbwin)); - windata->wm_grab = WM_POS_NONE; - return 1; - } - break; - case DWET_MOTION: - if (!windata->wm_grab) - return 0; - if (evt->buttons & DIBM_LEFT) { - int dx = evt->cx - windata->wm_lastx; - int dy = evt->cy - windata->wm_lasty; - - if (windata->wm_grab & WM_POS_CAPTION) { - if (!(wopts & DWOP_KEEP_POSITION)) - SDL_DFB_CHECK(dfbwin->Move(dfbwin, dx, dy)); - } - if (windata->wm_grab & (WM_POS_RIGHT | WM_POS_BOTTOM)) { - if (!(wopts & DWOP_KEEP_SIZE)) { - int cw, ch; - - /* Make sure all events are disabled for this operation ! */ - SDL_DFB_CHECK(dfbwin->DisableEvents(dfbwin, DWET_ALL)); - - if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_BOTTOM) - dx = 0; - else if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_RIGHT) - dy = 0; - - SDL_DFB_CHECK(dfbwin->GetSize(dfbwin, &cw, &ch)); - SDL_DFB_CHECK(dfbwin->Resize(dfbwin, cw + dx, ch + dy)); - - SDL_DFB_CHECK(dfbwin->EnableEvents(dfbwin, DWET_ALL)); - } - } - windata->wm_lastx = evt->cx; - windata->wm_lasty = evt->cy; - return 1; - } - break; - case DWET_KEYDOWN: - break; - case DWET_KEYUP: - break; - default: - ; - } - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_DIRECTFB */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_WM.h b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_WM.h deleted file mode 100644 index f5f9a46fdae..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_WM.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_directfb_wm_h -#define _SDL_directfb_wm_h - -#include "SDL_DirectFB_video.h" - -typedef struct _DFB_Theme DFB_Theme; -struct _DFB_Theme -{ - int left_size; - int right_size; - int top_size; - int bottom_size; - DFBColor frame_color; - int caption_size; - DFBColor caption_color; - int font_size; - DFBColor font_color; - char *font; - DFBColor close_color; - DFBColor max_color; -}; - -extern void DirectFB_WM_AdjustWindowLayout(SDL_Window * window, int flags, int w, int h); -extern void DirectFB_WM_RedrawLayout(_THIS, SDL_Window * window); - -extern int DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window, - DFBWindowEvent * evt); - -extern DFBResult DirectFB_WM_GetClientSize(_THIS, SDL_Window * window, - int *cw, int *ch); - - -#endif /* _SDL_directfb_wm_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_dyn.c b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_dyn.c deleted file mode 100644 index 52a4b536701..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_dyn.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DIRECTFB - -#include "SDL_DirectFB_video.h" -#include "SDL_DirectFB_dyn.h" - -#ifdef SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC -#include "SDL_name.h" -#include "SDL_loadso.h" - -#define DFB_SYM(ret, name, args, al, func) ret (*name) args; -static struct _SDL_DirectFB_Symbols -{ - DFB_SYMS - const unsigned int *directfb_major_version; - const unsigned int *directfb_minor_version; - const unsigned int *directfb_micro_version; -} SDL_DirectFB_Symbols; -#undef DFB_SYM - -#define DFB_SYM(ret, name, args, al, func) ret name args { func SDL_DirectFB_Symbols.name al ; } -DFB_SYMS -#undef DFB_SYM - -static void *handle = NULL; - -int -SDL_DirectFB_LoadLibrary(void) -{ - int retval = 0; - - if (handle == NULL) { - handle = SDL_LoadObject(SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC); - if (handle != NULL) { - retval = 1; -#define DFB_SYM(ret, name, args, al, func) if (!(SDL_DirectFB_Symbols.name = SDL_LoadFunction(handle, # name))) retval = 0; - DFB_SYMS -#undef DFB_SYM - if (! - (SDL_DirectFB_Symbols.directfb_major_version = - SDL_LoadFunction(handle, "directfb_major_version"))) - retval = 0; - if (! - (SDL_DirectFB_Symbols.directfb_minor_version = - SDL_LoadFunction(handle, "directfb_minor_version"))) - retval = 0; - if (! - (SDL_DirectFB_Symbols.directfb_micro_version = - SDL_LoadFunction(handle, "directfb_micro_version"))) - retval = 0; - } - } - if (retval) { - const char *stemp = DirectFBCheckVersion(DIRECTFB_MAJOR_VERSION, - DIRECTFB_MINOR_VERSION, - DIRECTFB_MICRO_VERSION); - /* Version Check */ - if (stemp != NULL) { - fprintf(stderr, - "DirectFB Lib: Version mismatch. Compiled: %d.%d.%d Library %d.%d.%d\n", - DIRECTFB_MAJOR_VERSION, DIRECTFB_MINOR_VERSION, - DIRECTFB_MICRO_VERSION, - *SDL_DirectFB_Symbols.directfb_major_version, - *SDL_DirectFB_Symbols.directfb_minor_version, - *SDL_DirectFB_Symbols.directfb_micro_version); - retval = 0; - } - } - if (!retval) - SDL_DirectFB_UnLoadLibrary(); - return retval; -} - -void -SDL_DirectFB_UnLoadLibrary(void) -{ - if (handle != NULL) { - SDL_UnloadObject(handle); - handle = NULL; - } -} - -#else -int -SDL_DirectFB_LoadLibrary(void) -{ - return 1; -} - -void -SDL_DirectFB_UnLoadLibrary(void) -{ -} -#endif - -#endif /* SDL_VIDEO_DRIVER_DIRECTFB */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_dyn.h b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_dyn.h deleted file mode 100644 index bd99a3faf39..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_dyn.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_DirectFB_dyn_h -#define _SDL_DirectFB_dyn_h - -#define DFB_SYMS \ - DFB_SYM(DFBResult, DirectFBError, (const char *msg, DFBResult result), (msg, result), return) \ - DFB_SYM(DFBResult, DirectFBErrorFatal, (const char *msg, DFBResult result), (msg, result), return) \ - DFB_SYM(const char *, DirectFBErrorString, (DFBResult result), (result), return) \ - DFB_SYM(const char *, DirectFBUsageString, ( void ), (), return) \ - DFB_SYM(DFBResult, DirectFBInit, (int *argc, char *(*argv[]) ), (argc, argv), return) \ - DFB_SYM(DFBResult, DirectFBSetOption, (const char *name, const char *value), (name, value), return) \ - DFB_SYM(DFBResult, DirectFBCreate, (IDirectFB **interface), (interface), return) \ - DFB_SYM(const char *, DirectFBCheckVersion, (unsigned int required_major, unsigned int required_minor, unsigned int required_micro), \ - (required_major, required_minor, required_micro), return) - -int SDL_DirectFB_LoadLibrary(void); -void SDL_DirectFB_UnLoadLibrary(void); - -#endif diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_events.c b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_events.c deleted file mode 100644 index 0bf9fdba581..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_events.c +++ /dev/null @@ -1,751 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DIRECTFB - -/* Handle the event stream, converting DirectFB input events into SDL events */ - -#include "SDL_DirectFB_video.h" -#include "SDL_DirectFB_window.h" -#include "SDL_DirectFB_modes.h" - -#include "SDL_syswm.h" - -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_keyboard_c.h" -#include "../../events/SDL_windowevents_c.h" -#include "../../events/SDL_events_c.h" -#include "../../events/scancodes_linux.h" -#include "../../events/scancodes_xfree86.h" - -#include "SDL_DirectFB_events.h" - -#if USE_MULTI_API -#define SDL_SendMouseMotion_ex(w, id, relative, x, y, p) SDL_SendMouseMotion(w, id, relative, x, y, p) -#define SDL_SendMouseButton_ex(w, id, state, button) SDL_SendMouseButton(w, id, state, button) -#define SDL_SendKeyboardKey_ex(id, state, scancode) SDL_SendKeyboardKey(id, state, scancode) -#define SDL_SendKeyboardText_ex(id, text) SDL_SendKeyboardText(id, text) -#else -#define SDL_SendMouseMotion_ex(w, id, relative, x, y, p) SDL_SendMouseMotion(w, id, relative, x, y) -#define SDL_SendMouseButton_ex(w, id, state, button) SDL_SendMouseButton(w, id, state, button) -#define SDL_SendKeyboardKey_ex(id, state, scancode) SDL_SendKeyboardKey(state, scancode) -#define SDL_SendKeyboardText_ex(id, text) SDL_SendKeyboardText(text) -#endif - -typedef struct _cb_data cb_data; -struct _cb_data -{ - DFB_DeviceData *devdata; - int sys_ids; - int sys_kbd; -}; - -/* The translation tables from a DirectFB keycode to a SDL keysym */ -static SDL_Scancode oskeymap[256]; - - -static SDL_Keysym *DirectFB_TranslateKey(_THIS, DFBWindowEvent * evt, - SDL_Keysym * keysym, Uint32 *unicode); -static SDL_Keysym *DirectFB_TranslateKeyInputEvent(_THIS, DFBInputEvent * evt, - SDL_Keysym * keysym, Uint32 *unicode); - -static void DirectFB_InitOSKeymap(_THIS, SDL_Scancode * keypmap, int numkeys); -static int DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button); - -static void UnicodeToUtf8( Uint16 w , char *utf8buf) -{ - unsigned char *utf8s = (unsigned char *) utf8buf; - - if ( w < 0x0080 ) { - utf8s[0] = ( unsigned char ) w; - utf8s[1] = 0; - } - else if ( w < 0x0800 ) { - utf8s[0] = 0xc0 | (( w ) >> 6 ); - utf8s[1] = 0x80 | (( w ) & 0x3f ); - utf8s[2] = 0; - } - else { - utf8s[0] = 0xe0 | (( w ) >> 12 ); - utf8s[1] = 0x80 | (( ( w ) >> 6 ) & 0x3f ); - utf8s[2] = 0x80 | (( w ) & 0x3f ); - utf8s[3] = 0; - } -} - -static void -FocusAllMice(_THIS, SDL_Window *window) -{ -#if USE_MULTI_API - SDL_DFB_DEVICEDATA(_this); - int index; - - for (index = 0; index < devdata->num_mice; index++) - SDL_SetMouseFocus(devdata->mouse_id[index], id); -#else - SDL_SetMouseFocus(window); -#endif -} - - -static void -FocusAllKeyboards(_THIS, SDL_Window *window) -{ -#if USE_MULTI_API - SDL_DFB_DEVICEDATA(_this); - int index; - - for (index = 0; index < devdata->num_keyboard; index++) - SDL_SetKeyboardFocus(index, id); -#else - SDL_SetKeyboardFocus(window); -#endif -} - -static void -MotionAllMice(_THIS, int x, int y) -{ -#if USE_MULTI_API - SDL_DFB_DEVICEDATA(_this); - int index; - - for (index = 0; index < devdata->num_mice; index++) { - SDL_Mouse *mouse = SDL_GetMouse(index); - mouse->x = mouse->last_x = x; - mouse->y = mouse->last_y = y; - /* SDL_SendMouseMotion(devdata->mouse_id[index], 0, x, y, 0); */ - } -#endif -} - -static int -KbdIndex(_THIS, int id) -{ - SDL_DFB_DEVICEDATA(_this); - int index; - - for (index = 0; index < devdata->num_keyboard; index++) { - if (devdata->keyboard[index].id == id) - return index; - } - return -1; -} - -static int -ClientXY(DFB_WindowData * p, int *x, int *y) -{ - int cx, cy; - - cx = *x; - cy = *y; - - cx -= p->client.x; - cy -= p->client.y; - - if (cx < 0 || cy < 0) - return 0; - if (cx >= p->client.w || cy >= p->client.h) - return 0; - *x = cx; - *y = cy; - return 1; -} - -static void -ProcessWindowEvent(_THIS, SDL_Window *sdlwin, DFBWindowEvent * evt) -{ - SDL_DFB_DEVICEDATA(_this); - SDL_DFB_WINDOWDATA(sdlwin); - SDL_Keysym keysym; - Uint32 unicode; - char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; - - if (evt->clazz == DFEC_WINDOW) { - switch (evt->type) { - case DWET_BUTTONDOWN: - if (ClientXY(windata, &evt->x, &evt->y)) { - if (!devdata->use_linux_input) { - SDL_SendMouseMotion_ex(sdlwin, devdata->mouse_id[0], 0, evt->x, - evt->y, 0); - SDL_SendMouseButton_ex(sdlwin, devdata->mouse_id[0], - SDL_PRESSED, - DirectFB_TranslateButton - (evt->button)); - } else { - MotionAllMice(_this, evt->x, evt->y); - } - } - break; - case DWET_BUTTONUP: - if (ClientXY(windata, &evt->x, &evt->y)) { - if (!devdata->use_linux_input) { - SDL_SendMouseMotion_ex(sdlwin, devdata->mouse_id[0], 0, evt->x, - evt->y, 0); - SDL_SendMouseButton_ex(sdlwin, devdata->mouse_id[0], - SDL_RELEASED, - DirectFB_TranslateButton - (evt->button)); - } else { - MotionAllMice(_this, evt->x, evt->y); - } - } - break; - case DWET_MOTION: - if (ClientXY(windata, &evt->x, &evt->y)) { - if (!devdata->use_linux_input) { - if (!(sdlwin->flags & SDL_WINDOW_INPUT_GRABBED)) - SDL_SendMouseMotion_ex(sdlwin, devdata->mouse_id[0], 0, - evt->x, evt->y, 0); - } else { - /* relative movements are not exact! - * This code should limit the number of events sent. - * However it kills MAME axis recognition ... */ - static int cnt = 0; - if (1 && ++cnt > 20) { - MotionAllMice(_this, evt->x, evt->y); - cnt = 0; - } - } - if (!(sdlwin->flags & SDL_WINDOW_MOUSE_FOCUS)) - SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_ENTER, 0, - 0); - } - break; - case DWET_KEYDOWN: - if (!devdata->use_linux_input) { - DirectFB_TranslateKey(_this, evt, &keysym, &unicode); - /* printf("Scancode %d %d %d\n", keysym.scancode, evt->key_code, evt->key_id); */ - SDL_SendKeyboardKey_ex(0, SDL_PRESSED, keysym.scancode); - if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) { - SDL_zero(text); - UnicodeToUtf8(unicode, text); - if (*text) { - SDL_SendKeyboardText_ex(0, text); - } - } - } - break; - case DWET_KEYUP: - if (!devdata->use_linux_input) { - DirectFB_TranslateKey(_this, evt, &keysym, &unicode); - SDL_SendKeyboardKey_ex(0, SDL_RELEASED, keysym.scancode); - } - break; - case DWET_POSITION: - if (ClientXY(windata, &evt->x, &evt->y)) { - SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_MOVED, - evt->x, evt->y); - } - break; - case DWET_POSITION_SIZE: - if (ClientXY(windata, &evt->x, &evt->y)) { - SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_MOVED, - evt->x, evt->y); - } - /* fall throught */ - case DWET_SIZE: - /* FIXME: what about < 0 */ - evt->w -= (windata->theme.right_size + windata->theme.left_size); - evt->h -= - (windata->theme.top_size + windata->theme.bottom_size + - windata->theme.caption_size); - SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_RESIZED, - evt->w, evt->h); - break; - case DWET_CLOSE: - SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_CLOSE, 0, 0); - break; - case DWET_GOTFOCUS: - DirectFB_SetContext(_this, sdlwin); - FocusAllKeyboards(_this, sdlwin); - SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_FOCUS_GAINED, - 0, 0); - break; - case DWET_LOSTFOCUS: - SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0); - FocusAllKeyboards(_this, 0); - break; - case DWET_ENTER: - /* SDL_DirectFB_ReshowCursor(_this, 0); */ - FocusAllMice(_this, sdlwin); - /* FIXME: when do we really enter ? */ - if (ClientXY(windata, &evt->x, &evt->y)) - MotionAllMice(_this, evt->x, evt->y); - SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_ENTER, 0, 0); - break; - case DWET_LEAVE: - SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_LEAVE, 0, 0); - FocusAllMice(_this, 0); - /* SDL_DirectFB_ReshowCursor(_this, 1); */ - break; - default: - ; - } - } else - printf("Event Clazz %d\n", evt->clazz); -} - -static void -ProcessInputEvent(_THIS, DFBInputEvent * ievt) -{ - SDL_DFB_DEVICEDATA(_this); - SDL_Keysym keysym; - int kbd_idx; - Uint32 unicode; - char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; - - if (!devdata->use_linux_input) { - if (ievt->type == DIET_AXISMOTION) { - if ((devdata->grabbed_window != NULL) && (ievt->flags & DIEF_AXISREL)) { - if (ievt->axis == DIAI_X) - SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1, - ievt->axisrel, 0, 0); - else if (ievt->axis == DIAI_Y) - SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1, 0, - ievt->axisrel, 0); - } - } - } else { - static int last_x, last_y; - - switch (ievt->type) { - case DIET_AXISMOTION: - if (ievt->flags & DIEF_AXISABS) { - if (ievt->axis == DIAI_X) - last_x = ievt->axisabs; - else if (ievt->axis == DIAI_Y) - last_y = ievt->axisabs; - if (!(ievt->flags & DIEF_FOLLOW)) { -#if USE_MULTI_API - SDL_Mouse *mouse = SDL_GetMouse(ievt->device_id); - SDL_Window *window = SDL_GetWindowFromID(mouse->focus); -#else - SDL_Window *window = devdata->grabbed_window; -#endif - if (window) { - DFB_WindowData *windata = - (DFB_WindowData *) window->driverdata; - int x, y; - - windata->dfbwin->GetPosition(windata->dfbwin, &x, &y); - SDL_SendMouseMotion_ex(window, ievt->device_id, 0, - last_x - (x + - windata->client.x), - last_y - (y + - windata->client.y), 0); - } else { - SDL_SendMouseMotion_ex(window, ievt->device_id, 0, last_x, - last_y, 0); - } - } - } else if (ievt->flags & DIEF_AXISREL) { - if (ievt->axis == DIAI_X) - SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1, - ievt->axisrel, 0, 0); - else if (ievt->axis == DIAI_Y) - SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1, 0, - ievt->axisrel, 0); - } - break; - case DIET_KEYPRESS: - kbd_idx = KbdIndex(_this, ievt->device_id); - DirectFB_TranslateKeyInputEvent(_this, ievt, &keysym, &unicode); - /* printf("Scancode %d %d %d\n", keysym.scancode, evt->key_code, evt->key_id); */ - SDL_SendKeyboardKey_ex(kbd_idx, SDL_PRESSED, keysym.scancode); - if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) { - SDL_zero(text); - UnicodeToUtf8(unicode, text); - if (*text) { - SDL_SendKeyboardText_ex(kbd_idx, text); - } - } - break; - case DIET_KEYRELEASE: - kbd_idx = KbdIndex(_this, ievt->device_id); - DirectFB_TranslateKeyInputEvent(_this, ievt, &keysym, &unicode); - SDL_SendKeyboardKey_ex(kbd_idx, SDL_RELEASED, keysym.scancode); - break; - case DIET_BUTTONPRESS: - if (ievt->buttons & DIBM_LEFT) - SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 1); - if (ievt->buttons & DIBM_MIDDLE) - SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 2); - if (ievt->buttons & DIBM_RIGHT) - SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 3); - break; - case DIET_BUTTONRELEASE: - if (!(ievt->buttons & DIBM_LEFT)) - SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 1); - if (!(ievt->buttons & DIBM_MIDDLE)) - SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 2); - if (!(ievt->buttons & DIBM_RIGHT)) - SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 3); - break; - default: - break; /* please gcc */ - } - } -} - -void -DirectFB_PumpEventsWindow(_THIS) -{ - SDL_DFB_DEVICEDATA(_this); - DFBInputEvent ievt; - SDL_Window *w; - - for (w = devdata->firstwin; w != NULL; w = w->next) { - SDL_DFB_WINDOWDATA(w); - DFBWindowEvent evt; - - while (windata->eventbuffer->GetEvent(windata->eventbuffer, - DFB_EVENT(&evt)) == DFB_OK) { - if (!DirectFB_WM_ProcessEvent(_this, w, &evt)) { - /* Send a SDL_SYSWMEVENT if the application wants them */ - if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) { - SDL_SysWMmsg wmmsg; - SDL_VERSION(&wmmsg.version); - wmmsg.subsystem = SDL_SYSWM_DIRECTFB; - wmmsg.msg.dfb.event.window = evt; - SDL_SendSysWMEvent(&wmmsg); - } - ProcessWindowEvent(_this, w, &evt); - } - } - } - - /* Now get relative events in case we need them */ - while (devdata->events->GetEvent(devdata->events, - DFB_EVENT(&ievt)) == DFB_OK) { - - if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) { - SDL_SysWMmsg wmmsg; - SDL_VERSION(&wmmsg.version); - wmmsg.subsystem = SDL_SYSWM_DIRECTFB; - wmmsg.msg.dfb.event.input = ievt; - SDL_SendSysWMEvent(&wmmsg); - } - ProcessInputEvent(_this, &ievt); - } -} - -void -DirectFB_InitOSKeymap(_THIS, SDL_Scancode * keymap, int numkeys) -{ - int i; - - /* Initialize the DirectFB key translation table */ - for (i = 0; i < numkeys; ++i) - keymap[i] = SDL_SCANCODE_UNKNOWN; - - keymap[DIKI_A - DIKI_UNKNOWN] = SDL_SCANCODE_A; - keymap[DIKI_B - DIKI_UNKNOWN] = SDL_SCANCODE_B; - keymap[DIKI_C - DIKI_UNKNOWN] = SDL_SCANCODE_C; - keymap[DIKI_D - DIKI_UNKNOWN] = SDL_SCANCODE_D; - keymap[DIKI_E - DIKI_UNKNOWN] = SDL_SCANCODE_E; - keymap[DIKI_F - DIKI_UNKNOWN] = SDL_SCANCODE_F; - keymap[DIKI_G - DIKI_UNKNOWN] = SDL_SCANCODE_G; - keymap[DIKI_H - DIKI_UNKNOWN] = SDL_SCANCODE_H; - keymap[DIKI_I - DIKI_UNKNOWN] = SDL_SCANCODE_I; - keymap[DIKI_J - DIKI_UNKNOWN] = SDL_SCANCODE_J; - keymap[DIKI_K - DIKI_UNKNOWN] = SDL_SCANCODE_K; - keymap[DIKI_L - DIKI_UNKNOWN] = SDL_SCANCODE_L; - keymap[DIKI_M - DIKI_UNKNOWN] = SDL_SCANCODE_M; - keymap[DIKI_N - DIKI_UNKNOWN] = SDL_SCANCODE_N; - keymap[DIKI_O - DIKI_UNKNOWN] = SDL_SCANCODE_O; - keymap[DIKI_P - DIKI_UNKNOWN] = SDL_SCANCODE_P; - keymap[DIKI_Q - DIKI_UNKNOWN] = SDL_SCANCODE_Q; - keymap[DIKI_R - DIKI_UNKNOWN] = SDL_SCANCODE_R; - keymap[DIKI_S - DIKI_UNKNOWN] = SDL_SCANCODE_S; - keymap[DIKI_T - DIKI_UNKNOWN] = SDL_SCANCODE_T; - keymap[DIKI_U - DIKI_UNKNOWN] = SDL_SCANCODE_U; - keymap[DIKI_V - DIKI_UNKNOWN] = SDL_SCANCODE_V; - keymap[DIKI_W - DIKI_UNKNOWN] = SDL_SCANCODE_W; - keymap[DIKI_X - DIKI_UNKNOWN] = SDL_SCANCODE_X; - keymap[DIKI_Y - DIKI_UNKNOWN] = SDL_SCANCODE_Y; - keymap[DIKI_Z - DIKI_UNKNOWN] = SDL_SCANCODE_Z; - - keymap[DIKI_0 - DIKI_UNKNOWN] = SDL_SCANCODE_0; - keymap[DIKI_1 - DIKI_UNKNOWN] = SDL_SCANCODE_1; - keymap[DIKI_2 - DIKI_UNKNOWN] = SDL_SCANCODE_2; - keymap[DIKI_3 - DIKI_UNKNOWN] = SDL_SCANCODE_3; - keymap[DIKI_4 - DIKI_UNKNOWN] = SDL_SCANCODE_4; - keymap[DIKI_5 - DIKI_UNKNOWN] = SDL_SCANCODE_5; - keymap[DIKI_6 - DIKI_UNKNOWN] = SDL_SCANCODE_6; - keymap[DIKI_7 - DIKI_UNKNOWN] = SDL_SCANCODE_7; - keymap[DIKI_8 - DIKI_UNKNOWN] = SDL_SCANCODE_8; - keymap[DIKI_9 - DIKI_UNKNOWN] = SDL_SCANCODE_9; - - keymap[DIKI_F1 - DIKI_UNKNOWN] = SDL_SCANCODE_F1; - keymap[DIKI_F2 - DIKI_UNKNOWN] = SDL_SCANCODE_F2; - keymap[DIKI_F3 - DIKI_UNKNOWN] = SDL_SCANCODE_F3; - keymap[DIKI_F4 - DIKI_UNKNOWN] = SDL_SCANCODE_F4; - keymap[DIKI_F5 - DIKI_UNKNOWN] = SDL_SCANCODE_F5; - keymap[DIKI_F6 - DIKI_UNKNOWN] = SDL_SCANCODE_F6; - keymap[DIKI_F7 - DIKI_UNKNOWN] = SDL_SCANCODE_F7; - keymap[DIKI_F8 - DIKI_UNKNOWN] = SDL_SCANCODE_F8; - keymap[DIKI_F9 - DIKI_UNKNOWN] = SDL_SCANCODE_F9; - keymap[DIKI_F10 - DIKI_UNKNOWN] = SDL_SCANCODE_F10; - keymap[DIKI_F11 - DIKI_UNKNOWN] = SDL_SCANCODE_F11; - keymap[DIKI_F12 - DIKI_UNKNOWN] = SDL_SCANCODE_F12; - - keymap[DIKI_ESCAPE - DIKI_UNKNOWN] = SDL_SCANCODE_ESCAPE; - keymap[DIKI_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_LEFT; - keymap[DIKI_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_RIGHT; - keymap[DIKI_UP - DIKI_UNKNOWN] = SDL_SCANCODE_UP; - keymap[DIKI_DOWN - DIKI_UNKNOWN] = SDL_SCANCODE_DOWN; - keymap[DIKI_CONTROL_L - DIKI_UNKNOWN] = SDL_SCANCODE_LCTRL; - keymap[DIKI_CONTROL_R - DIKI_UNKNOWN] = SDL_SCANCODE_RCTRL; - keymap[DIKI_SHIFT_L - DIKI_UNKNOWN] = SDL_SCANCODE_LSHIFT; - keymap[DIKI_SHIFT_R - DIKI_UNKNOWN] = SDL_SCANCODE_RSHIFT; - keymap[DIKI_ALT_L - DIKI_UNKNOWN] = SDL_SCANCODE_LALT; - keymap[DIKI_ALT_R - DIKI_UNKNOWN] = SDL_SCANCODE_RALT; - keymap[DIKI_META_L - DIKI_UNKNOWN] = SDL_SCANCODE_LGUI; - keymap[DIKI_META_R - DIKI_UNKNOWN] = SDL_SCANCODE_RGUI; - keymap[DIKI_SUPER_L - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION; - keymap[DIKI_SUPER_R - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION; - /* FIXME:Do we read hyper keys ? - * keymap[DIKI_HYPER_L - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION; - * keymap[DIKI_HYPER_R - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION; - */ - keymap[DIKI_TAB - DIKI_UNKNOWN] = SDL_SCANCODE_TAB; - keymap[DIKI_ENTER - DIKI_UNKNOWN] = SDL_SCANCODE_RETURN; - keymap[DIKI_SPACE - DIKI_UNKNOWN] = SDL_SCANCODE_SPACE; - keymap[DIKI_BACKSPACE - DIKI_UNKNOWN] = SDL_SCANCODE_BACKSPACE; - keymap[DIKI_INSERT - DIKI_UNKNOWN] = SDL_SCANCODE_INSERT; - keymap[DIKI_DELETE - DIKI_UNKNOWN] = SDL_SCANCODE_DELETE; - keymap[DIKI_HOME - DIKI_UNKNOWN] = SDL_SCANCODE_HOME; - keymap[DIKI_END - DIKI_UNKNOWN] = SDL_SCANCODE_END; - keymap[DIKI_PAGE_UP - DIKI_UNKNOWN] = SDL_SCANCODE_PAGEUP; - keymap[DIKI_PAGE_DOWN - DIKI_UNKNOWN] = SDL_SCANCODE_PAGEDOWN; - keymap[DIKI_CAPS_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_CAPSLOCK; - keymap[DIKI_NUM_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_NUMLOCKCLEAR; - keymap[DIKI_SCROLL_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_SCROLLLOCK; - keymap[DIKI_PRINT - DIKI_UNKNOWN] = SDL_SCANCODE_PRINTSCREEN; - keymap[DIKI_PAUSE - DIKI_UNKNOWN] = SDL_SCANCODE_PAUSE; - - keymap[DIKI_KP_EQUAL - DIKI_UNKNOWN] = SDL_SCANCODE_KP_EQUALS; - keymap[DIKI_KP_DECIMAL - DIKI_UNKNOWN] = SDL_SCANCODE_KP_PERIOD; - keymap[DIKI_KP_0 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_0; - keymap[DIKI_KP_1 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_1; - keymap[DIKI_KP_2 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_2; - keymap[DIKI_KP_3 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_3; - keymap[DIKI_KP_4 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_4; - keymap[DIKI_KP_5 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_5; - keymap[DIKI_KP_6 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_6; - keymap[DIKI_KP_7 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_7; - keymap[DIKI_KP_8 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_8; - keymap[DIKI_KP_9 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_9; - keymap[DIKI_KP_DIV - DIKI_UNKNOWN] = SDL_SCANCODE_KP_DIVIDE; - keymap[DIKI_KP_MULT - DIKI_UNKNOWN] = SDL_SCANCODE_KP_MULTIPLY; - keymap[DIKI_KP_MINUS - DIKI_UNKNOWN] = SDL_SCANCODE_KP_MINUS; - keymap[DIKI_KP_PLUS - DIKI_UNKNOWN] = SDL_SCANCODE_KP_PLUS; - keymap[DIKI_KP_ENTER - DIKI_UNKNOWN] = SDL_SCANCODE_KP_ENTER; - - keymap[DIKI_QUOTE_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_GRAVE; /* TLDE */ - keymap[DIKI_MINUS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_MINUS; /* AE11 */ - keymap[DIKI_EQUALS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_EQUALS; /* AE12 */ - keymap[DIKI_BRACKET_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_RIGHTBRACKET; /* AD11 */ - keymap[DIKI_BRACKET_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_LEFTBRACKET; /* AD12 */ - keymap[DIKI_BACKSLASH - DIKI_UNKNOWN] = SDL_SCANCODE_BACKSLASH; /* BKSL */ - keymap[DIKI_SEMICOLON - DIKI_UNKNOWN] = SDL_SCANCODE_SEMICOLON; /* AC10 */ - keymap[DIKI_QUOTE_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_APOSTROPHE; /* AC11 */ - keymap[DIKI_COMMA - DIKI_UNKNOWN] = SDL_SCANCODE_COMMA; /* AB08 */ - keymap[DIKI_PERIOD - DIKI_UNKNOWN] = SDL_SCANCODE_PERIOD; /* AB09 */ - keymap[DIKI_SLASH - DIKI_UNKNOWN] = SDL_SCANCODE_SLASH; /* AB10 */ - keymap[DIKI_LESS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_NONUSBACKSLASH; /* 103rd */ - -} - -static SDL_Keysym * -DirectFB_TranslateKey(_THIS, DFBWindowEvent * evt, SDL_Keysym * keysym, Uint32 *unicode) -{ - SDL_DFB_DEVICEDATA(_this); - int kbd_idx = 0; /* Window events lag the device source KbdIndex(_this, evt->device_id); */ - DFB_KeyboardData *kbd = &devdata->keyboard[kbd_idx]; - - keysym->scancode = SDL_SCANCODE_UNKNOWN; - - if (kbd->map && evt->key_code >= kbd->map_adjust && - evt->key_code < kbd->map_size + kbd->map_adjust) - keysym->scancode = kbd->map[evt->key_code - kbd->map_adjust]; - - if (keysym->scancode == SDL_SCANCODE_UNKNOWN || - devdata->keyboard[kbd_idx].is_generic) { - if (evt->key_id - DIKI_UNKNOWN < SDL_arraysize(oskeymap)) - keysym->scancode = oskeymap[evt->key_id - DIKI_UNKNOWN]; - else - keysym->scancode = SDL_SCANCODE_UNKNOWN; - } - - *unicode = - (DFB_KEY_TYPE(evt->key_symbol) == DIKT_UNICODE) ? evt->key_symbol : 0; - if (*unicode == 0 && - (evt->key_symbol > 0 && evt->key_symbol < 255)) - *unicode = evt->key_symbol; - - return keysym; -} - -static SDL_Keysym * -DirectFB_TranslateKeyInputEvent(_THIS, DFBInputEvent * evt, - SDL_Keysym * keysym, Uint32 *unicode) -{ - SDL_DFB_DEVICEDATA(_this); - int kbd_idx = KbdIndex(_this, evt->device_id); - DFB_KeyboardData *kbd = &devdata->keyboard[kbd_idx]; - - keysym->scancode = SDL_SCANCODE_UNKNOWN; - - if (kbd->map && evt->key_code >= kbd->map_adjust && - evt->key_code < kbd->map_size + kbd->map_adjust) - keysym->scancode = kbd->map[evt->key_code - kbd->map_adjust]; - - if (keysym->scancode == SDL_SCANCODE_UNKNOWN || devdata->keyboard[kbd_idx].is_generic) { - if (evt->key_id - DIKI_UNKNOWN < SDL_arraysize(oskeymap)) - keysym->scancode = oskeymap[evt->key_id - DIKI_UNKNOWN]; - else - keysym->scancode = SDL_SCANCODE_UNKNOWN; - } - - *unicode = - (DFB_KEY_TYPE(evt->key_symbol) == DIKT_UNICODE) ? evt->key_symbol : 0; - if (*unicode == 0 && - (evt->key_symbol > 0 && evt->key_symbol < 255)) - *unicode = evt->key_symbol; - - return keysym; -} - -static int -DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button) -{ - switch (button) { - case DIBI_LEFT: - return 1; - case DIBI_MIDDLE: - return 2; - case DIBI_RIGHT: - return 3; - default: - return 0; - } -} - -static DFBEnumerationResult -EnumKeyboards(DFBInputDeviceID device_id, - DFBInputDeviceDescription desc, void *callbackdata) -{ - cb_data *cb = callbackdata; - DFB_DeviceData *devdata = cb->devdata; -#if USE_MULTI_API - SDL_Keyboard keyboard; -#endif - SDL_Keycode keymap[SDL_NUM_SCANCODES]; - - if (!cb->sys_kbd) { - if (cb->sys_ids) { - if (device_id >= 0x10) - return DFENUM_OK; - } else { - if (device_id < 0x10) - return DFENUM_OK; - } - } else { - if (device_id != DIDID_KEYBOARD) - return DFENUM_OK; - } - - if ((desc.caps & DIDTF_KEYBOARD)) { -#if USE_MULTI_API - SDL_zero(keyboard); - SDL_AddKeyboard(&keyboard, devdata->num_keyboard); -#endif - devdata->keyboard[devdata->num_keyboard].id = device_id; - devdata->keyboard[devdata->num_keyboard].is_generic = 0; - if (!strncmp("X11", desc.name, 3)) - { - devdata->keyboard[devdata->num_keyboard].map = xfree86_scancode_table2; - devdata->keyboard[devdata->num_keyboard].map_size = SDL_arraysize(xfree86_scancode_table2); - devdata->keyboard[devdata->num_keyboard].map_adjust = 8; - } else { - devdata->keyboard[devdata->num_keyboard].map = linux_scancode_table; - devdata->keyboard[devdata->num_keyboard].map_size = SDL_arraysize(linux_scancode_table); - devdata->keyboard[devdata->num_keyboard].map_adjust = 0; - } - - SDL_DFB_LOG("Keyboard %d - %s\n", device_id, desc.name); - - SDL_GetDefaultKeymap(keymap); -#if USE_MULTI_API - SDL_SetKeymap(devdata->num_keyboard, 0, keymap, SDL_NUM_SCANCODES); -#else - SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); -#endif - devdata->num_keyboard++; - - if (cb->sys_kbd) - return DFENUM_CANCEL; - } - return DFENUM_OK; -} - -void -DirectFB_InitKeyboard(_THIS) -{ - SDL_DFB_DEVICEDATA(_this); - cb_data cb; - - DirectFB_InitOSKeymap(_this, &oskeymap[0], SDL_arraysize(oskeymap)); - - devdata->num_keyboard = 0; - cb.devdata = devdata; - - if (devdata->use_linux_input) { - cb.sys_kbd = 0; - cb.sys_ids = 0; - SDL_DFB_CHECK(devdata->dfb-> - EnumInputDevices(devdata->dfb, EnumKeyboards, &cb)); - if (devdata->num_keyboard == 0) { - cb.sys_ids = 1; - SDL_DFB_CHECK(devdata->dfb->EnumInputDevices(devdata->dfb, - EnumKeyboards, - &cb)); - } - } else { - cb.sys_kbd = 1; - SDL_DFB_CHECK(devdata->dfb->EnumInputDevices(devdata->dfb, - EnumKeyboards, - &cb)); - } -} - -void -DirectFB_QuitKeyboard(_THIS) -{ - /* SDL_DFB_DEVICEDATA(_this); */ - - SDL_KeyboardQuit(); - -} - -#endif /* SDL_VIDEO_DRIVER_DIRECTFB */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_events.h b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_events.h deleted file mode 100644 index 2931ad2a1c4..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_events.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_DirectFB_events_h -#define _SDL_DirectFB_events_h - -#include "../SDL_sysvideo.h" - -/* Functions to be exported */ -extern void DirectFB_InitKeyboard(_THIS); -extern void DirectFB_QuitKeyboard(_THIS); -extern void DirectFB_PumpEventsWindow(_THIS); - -#endif diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_modes.c b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_modes.c deleted file mode 100644 index 9d0abf56011..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_modes.c +++ /dev/null @@ -1,414 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DIRECTFB - -#include "SDL_DirectFB_video.h" -#include "SDL_DirectFB_modes.h" - -#define DFB_MAX_MODES 200 - -struct screen_callback_t -{ - int numscreens; - DFBScreenID screenid[DFB_MAX_SCREENS]; - DFBDisplayLayerID gralayer[DFB_MAX_SCREENS]; - DFBDisplayLayerID vidlayer[DFB_MAX_SCREENS]; - int aux; /* auxiliary integer for callbacks */ -}; - -struct modes_callback_t -{ - int nummodes; - SDL_DisplayMode *modelist; -}; - -static DFBEnumerationResult -EnumModesCallback(int width, int height, int bpp, void *data) -{ - struct modes_callback_t *modedata = (struct modes_callback_t *) data; - SDL_DisplayMode mode; - - mode.w = width; - mode.h = height; - mode.refresh_rate = 0; - mode.driverdata = NULL; - mode.format = SDL_PIXELFORMAT_UNKNOWN; - - if (modedata->nummodes < DFB_MAX_MODES) { - modedata->modelist[modedata->nummodes++] = mode; - } - - return DFENUM_OK; -} - -static DFBEnumerationResult -EnumScreensCallback(DFBScreenID screen_id, DFBScreenDescription desc, - void *callbackdata) -{ - struct screen_callback_t *devdata = (struct screen_callback_t *) callbackdata; - - devdata->screenid[devdata->numscreens++] = screen_id; - return DFENUM_OK; -} - -static DFBEnumerationResult -EnumLayersCallback(DFBDisplayLayerID layer_id, DFBDisplayLayerDescription desc, - void *callbackdata) -{ - struct screen_callback_t *devdata = (struct screen_callback_t *) callbackdata; - - if (desc.caps & DLCAPS_SURFACE) { - if ((desc.type & DLTF_GRAPHICS) && (desc.type & DLTF_VIDEO)) { - if (devdata->vidlayer[devdata->aux] == -1) - devdata->vidlayer[devdata->aux] = layer_id; - } else if (desc.type & DLTF_GRAPHICS) { - if (devdata->gralayer[devdata->aux] == -1) - devdata->gralayer[devdata->aux] = layer_id; - } - } - return DFENUM_OK; -} - -static void -CheckSetDisplayMode(_THIS, SDL_VideoDisplay * display, DFB_DisplayData * data, SDL_DisplayMode * mode) -{ - SDL_DFB_DEVICEDATA(_this); - DFBDisplayLayerConfig config; - DFBDisplayLayerConfigFlags failed; - - SDL_DFB_CHECKERR(data->layer->SetCooperativeLevel(data->layer, - DLSCL_ADMINISTRATIVE)); - config.width = mode->w; - config.height = mode->h; - config.pixelformat = DirectFB_SDLToDFBPixelFormat(mode->format); - config.flags = DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT; - if (devdata->use_yuv_underlays) { - config.flags |= DLCONF_OPTIONS; - config.options = DLOP_ALPHACHANNEL; - } - failed = 0; - data->layer->TestConfiguration(data->layer, &config, &failed); - SDL_DFB_CHECKERR(data->layer->SetCooperativeLevel(data->layer, - DLSCL_SHARED)); - if (failed == 0) - { - SDL_AddDisplayMode(display, mode); - SDL_DFB_LOG("Mode %d x %d Added\n", mode->w, mode->h); - } - else - SDL_DFB_ERR("Mode %d x %d not available: %x\n", mode->w, - mode->h, failed); - - return; - error: - return; -} - - -void -DirectFB_SetContext(_THIS, SDL_Window *window) -{ -#if (DFB_VERSION_ATLEAST(1,0,0)) - /* FIXME: does not work on 1.0/1.2 with radeon driver - * the approach did work with the matrox driver - * This has simply no effect. - */ - - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; - - /* FIXME: should we handle the error */ - if (dispdata->vidIDinuse) - SDL_DFB_CHECK(dispdata->vidlayer->SwitchContext(dispdata->vidlayer, - DFB_TRUE)); -#endif -} - -void -DirectFB_InitModes(_THIS) -{ - SDL_DFB_DEVICEDATA(_this); - IDirectFBDisplayLayer *layer = NULL; - SDL_VideoDisplay display; - DFB_DisplayData *dispdata = NULL; - SDL_DisplayMode mode; - DFBGraphicsDeviceDescription caps; - DFBDisplayLayerConfig dlc; - struct screen_callback_t *screencbdata; - - int tcw[DFB_MAX_SCREENS]; - int tch[DFB_MAX_SCREENS]; - int i; - DFBResult ret; - - SDL_DFB_ALLOC_CLEAR(screencbdata, sizeof(*screencbdata)); - - screencbdata->numscreens = 0; - - for (i = 0; i < DFB_MAX_SCREENS; i++) { - screencbdata->gralayer[i] = -1; - screencbdata->vidlayer[i] = -1; - } - - SDL_DFB_CHECKERR(devdata->dfb->EnumScreens(devdata->dfb, &EnumScreensCallback, - screencbdata)); - - for (i = 0; i < screencbdata->numscreens; i++) { - IDirectFBScreen *screen; - - SDL_DFB_CHECKERR(devdata->dfb->GetScreen(devdata->dfb, - screencbdata->screenid - [i], &screen)); - - screencbdata->aux = i; - SDL_DFB_CHECKERR(screen->EnumDisplayLayers(screen, &EnumLayersCallback, - screencbdata)); - screen->GetSize(screen, &tcw[i], &tch[i]); - - screen->Release(screen); - } - - /* Query card capabilities */ - - devdata->dfb->GetDeviceDescription(devdata->dfb, &caps); - - for (i = 0; i < screencbdata->numscreens; i++) { - SDL_DFB_CHECKERR(devdata->dfb->GetDisplayLayer(devdata->dfb, - screencbdata->gralayer - [i], &layer)); - - SDL_DFB_CHECKERR(layer->SetCooperativeLevel(layer, - DLSCL_ADMINISTRATIVE)); - layer->EnableCursor(layer, 1); - SDL_DFB_CHECKERR(layer->SetCursorOpacity(layer, 0xC0)); - - if (devdata->use_yuv_underlays) { - dlc.flags = DLCONF_PIXELFORMAT | DLCONF_OPTIONS; - dlc.pixelformat = DSPF_ARGB; - dlc.options = DLOP_ALPHACHANNEL; - - ret = layer->SetConfiguration(layer, &dlc); - if (ret != DFB_OK) { - /* try AiRGB if the previous failed */ - dlc.pixelformat = DSPF_AiRGB; - SDL_DFB_CHECKERR(layer->SetConfiguration(layer, &dlc)); - } - } - - /* Query layer configuration to determine the current mode and pixelformat */ - dlc.flags = DLCONF_ALL; - SDL_DFB_CHECKERR(layer->GetConfiguration(layer, &dlc)); - - mode.format = DirectFB_DFBToSDLPixelFormat(dlc.pixelformat); - - if (mode.format == SDL_PIXELFORMAT_UNKNOWN) { - SDL_DFB_ERR("Unknown dfb pixelformat %x !\n", dlc.pixelformat); - goto error; - } - - mode.w = dlc.width; - mode.h = dlc.height; - mode.refresh_rate = 0; - mode.driverdata = NULL; - - SDL_DFB_ALLOC_CLEAR(dispdata, sizeof(*dispdata)); - - dispdata->layer = layer; - dispdata->pixelformat = dlc.pixelformat; - dispdata->cw = tcw[i]; - dispdata->ch = tch[i]; - - /* YUV - Video layer */ - - dispdata->vidID = screencbdata->vidlayer[i]; - dispdata->vidIDinuse = 0; - - SDL_zero(display); - - display.desktop_mode = mode; - display.current_mode = mode; - display.driverdata = dispdata; - -#if (DFB_VERSION_ATLEAST(1,2,0)) - dlc.flags = - DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT | - DLCONF_OPTIONS; - ret = layer->SetConfiguration(layer, &dlc); -#endif - - SDL_DFB_CHECKERR(layer->SetCooperativeLevel(layer, DLSCL_SHARED)); - - SDL_AddVideoDisplay(&display); - } - SDL_DFB_FREE(screencbdata); - return; - error: - /* FIXME: Cleanup not complete, Free existing displays */ - SDL_DFB_FREE(dispdata); - SDL_DFB_RELEASE(layer); - return; -} - -void -DirectFB_GetDisplayModes(_THIS, SDL_VideoDisplay * display) -{ - SDL_DFB_DEVICEDATA(_this); - DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; - SDL_DisplayMode mode; - struct modes_callback_t data; - int i; - - data.nummodes = 0; - /* Enumerate the available fullscreen modes */ - SDL_DFB_CALLOC(data.modelist, DFB_MAX_MODES, sizeof(SDL_DisplayMode)); - SDL_DFB_CHECKERR(devdata->dfb->EnumVideoModes(devdata->dfb, - EnumModesCallback, &data)); - - for (i = 0; i < data.nummodes; ++i) { - mode = data.modelist[i]; - - mode.format = SDL_PIXELFORMAT_ARGB8888; - CheckSetDisplayMode(_this, display, dispdata, &mode); - mode.format = SDL_PIXELFORMAT_RGB888; - CheckSetDisplayMode(_this, display, dispdata, &mode); - mode.format = SDL_PIXELFORMAT_RGB24; - CheckSetDisplayMode(_this, display, dispdata, &mode); - mode.format = SDL_PIXELFORMAT_RGB565; - CheckSetDisplayMode(_this, display, dispdata, &mode); - mode.format = SDL_PIXELFORMAT_INDEX8; - CheckSetDisplayMode(_this, display, dispdata, &mode); - } - - SDL_DFB_FREE(data.modelist); -error: - return; -} - -int -DirectFB_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - /* - * FIXME: video mode switch is currently broken for 1.2.0 - * - */ - - SDL_DFB_DEVICEDATA(_this); - DFB_DisplayData *data = (DFB_DisplayData *) display->driverdata; - DFBDisplayLayerConfig config, rconfig; - DFBDisplayLayerConfigFlags fail = 0; - - SDL_DFB_CHECKERR(data->layer->SetCooperativeLevel(data->layer, - DLSCL_ADMINISTRATIVE)); - - SDL_DFB_CHECKERR(data->layer->GetConfiguration(data->layer, &config)); - config.flags = DLCONF_WIDTH | DLCONF_HEIGHT; - if (mode->format != SDL_PIXELFORMAT_UNKNOWN) { - config.flags |= DLCONF_PIXELFORMAT; - config.pixelformat = DirectFB_SDLToDFBPixelFormat(mode->format); - data->pixelformat = config.pixelformat; - } - config.width = mode->w; - config.height = mode->h; - - if (devdata->use_yuv_underlays) { - config.flags |= DLCONF_OPTIONS; - config.options = DLOP_ALPHACHANNEL; - } - - data->layer->TestConfiguration(data->layer, &config, &fail); - - if (fail & - (DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT | - DLCONF_OPTIONS)) { - SDL_DFB_ERR("Error setting mode %dx%d-%x\n", mode->w, mode->h, - mode->format); - return -1; - } - - config.flags &= ~fail; - SDL_DFB_CHECKERR(data->layer->SetConfiguration(data->layer, &config)); -#if (DFB_VERSION_ATLEAST(1,2,0)) - /* Need to call this twice ! */ - SDL_DFB_CHECKERR(data->layer->SetConfiguration(data->layer, &config)); -#endif - - /* Double check */ - SDL_DFB_CHECKERR(data->layer->GetConfiguration(data->layer, &rconfig)); - SDL_DFB_CHECKERR(data-> - layer->SetCooperativeLevel(data->layer, DLSCL_SHARED)); - - if ((config.width != rconfig.width) || (config.height != rconfig.height) - || ((mode->format != SDL_PIXELFORMAT_UNKNOWN) - && (config.pixelformat != rconfig.pixelformat))) { - SDL_DFB_ERR("Error setting mode %dx%d-%x\n", mode->w, mode->h, - mode->format); - return -1; - } - - data->pixelformat = rconfig.pixelformat; - data->cw = config.width; - data->ch = config.height; - display->current_mode = *mode; - - return 0; - error: - return -1; -} - -void -DirectFB_QuitModes(_THIS) -{ - SDL_DisplayMode tmode; - int i; - - for (i = 0; i < _this->num_displays; ++i) { - SDL_VideoDisplay *display = &_this->displays[i]; - DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; - - SDL_GetDesktopDisplayMode(i, &tmode); - tmode.format = SDL_PIXELFORMAT_UNKNOWN; - DirectFB_SetDisplayMode(_this, display, &tmode); - - SDL_GetDesktopDisplayMode(i, &tmode); - DirectFB_SetDisplayMode(_this, display, &tmode); - - if (dispdata->layer) { - SDL_DFB_CHECK(dispdata-> - layer->SetCooperativeLevel(dispdata->layer, - DLSCL_ADMINISTRATIVE)); - SDL_DFB_CHECK(dispdata-> - layer->SetCursorOpacity(dispdata->layer, 0x00)); - SDL_DFB_CHECK(dispdata-> - layer->SetCooperativeLevel(dispdata->layer, - DLSCL_SHARED)); - } - - SDL_DFB_RELEASE(dispdata->layer); - SDL_DFB_RELEASE(dispdata->vidlayer); - - } -} - -#endif /* SDL_VIDEO_DRIVER_DIRECTFB */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_modes.h b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_modes.h deleted file mode 100644 index 9911eff568c..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_modes.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_directfb_modes_h -#define _SDL_directfb_modes_h - -#include <directfb.h> - -#include "../SDL_sysvideo.h" - -#define SDL_DFB_DISPLAYDATA(win) DFB_DisplayData *dispdata = ((win) ? (DFB_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata : NULL) - -typedef struct _DFB_DisplayData DFB_DisplayData; -struct _DFB_DisplayData -{ - IDirectFBDisplayLayer *layer; - DFBSurfacePixelFormat pixelformat; - /* FIXME: support for multiple video layer. - * However, I do not know any card supporting - * more than one - */ - DFBDisplayLayerID vidID; - IDirectFBDisplayLayer *vidlayer; - - int vidIDinuse; - - int cw; - int ch; -}; - - -extern void DirectFB_InitModes(_THIS); -extern void DirectFB_GetDisplayModes(_THIS, SDL_VideoDisplay * display); -extern int DirectFB_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -extern void DirectFB_QuitModes(_THIS); - -extern void DirectFB_SetContext(_THIS, SDL_Window *window); - -#endif /* _SDL_directfb_modes_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_mouse.c b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_mouse.c deleted file mode 100644 index 0657d2f06ac..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_mouse.c +++ /dev/null @@ -1,394 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DIRECTFB - -#include "SDL_assert.h" - -#include "SDL_DirectFB_video.h" -#include "SDL_DirectFB_mouse.h" -#include "SDL_DirectFB_modes.h" -#include "SDL_DirectFB_window.h" - -#include "../SDL_sysvideo.h" -#include "../../events/SDL_mouse_c.h" - -static SDL_Cursor *DirectFB_CreateDefaultCursor(void); -static SDL_Cursor *DirectFB_CreateCursor(SDL_Surface * surface, - int hot_x, int hot_y); -static int DirectFB_ShowCursor(SDL_Cursor * cursor); -static void DirectFB_MoveCursor(SDL_Cursor * cursor); -static void DirectFB_FreeCursor(SDL_Cursor * cursor); -static void DirectFB_WarpMouse(SDL_Window * window, int x, int y); -static void DirectFB_FreeMouse(SDL_Mouse * mouse); - -static const char *arrow[] = { - /* pixels */ - "X ", - "XX ", - "X.X ", - "X..X ", - "X...X ", - "X....X ", - "X.....X ", - "X......X ", - "X.......X ", - "X........X ", - "X.....XXXXX ", - "X..X..X ", - "X.X X..X ", - "XX X..X ", - "X X..X ", - " X..X ", - " X..X ", - " X..X ", - " XX ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", -}; - -static SDL_Cursor * -DirectFB_CreateDefaultCursor(void) -{ - SDL_VideoDevice *dev = SDL_GetVideoDevice(); - - SDL_DFB_DEVICEDATA(dev); - DFB_CursorData *curdata; - DFBResult ret; - DFBSurfaceDescription dsc; - SDL_Cursor *cursor; - Uint32 *dest; - Uint32 *p; - int pitch, i, j; - - SDL_DFB_ALLOC_CLEAR( cursor, sizeof(*cursor)); - SDL_DFB_ALLOC_CLEAR(curdata, sizeof(*curdata)); - - dsc.flags = - DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS; - dsc.caps = DSCAPS_VIDEOONLY; - dsc.width = 32; - dsc.height = 32; - dsc.pixelformat = DSPF_ARGB; - - SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc, - &curdata->surf)); - curdata->hotx = 0; - curdata->hoty = 0; - cursor->driverdata = curdata; - - SDL_DFB_CHECKERR(curdata->surf->Lock(curdata->surf, DSLF_WRITE, - (void *) &dest, &pitch)); - - /* Relies on the fact that this is only called with ARGB surface. */ - for (i = 0; i < 32; i++) - { - for (j = 0; j < 32; j++) - { - switch (arrow[i][j]) - { - case ' ': dest[j] = 0x00000000; break; - case '.': dest[j] = 0xffffffff; break; - case 'X': dest[j] = 0xff000000; break; - } - } - dest += (pitch >> 2); - } - - curdata->surf->Unlock(curdata->surf); - return cursor; - error: - return NULL; -} - -/* Create a cursor from a surface */ -static SDL_Cursor * -DirectFB_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y) -{ - SDL_VideoDevice *dev = SDL_GetVideoDevice(); - - SDL_DFB_DEVICEDATA(dev); - DFB_CursorData *curdata; - DFBResult ret; - DFBSurfaceDescription dsc; - SDL_Cursor *cursor; - Uint32 *dest; - Uint32 *p; - int pitch, i; - - SDL_assert(surface->format->format == SDL_PIXELFORMAT_ARGB8888); - SDL_assert(surface->pitch == surface->w * 4); - - SDL_DFB_ALLOC_CLEAR( cursor, sizeof(*cursor)); - SDL_DFB_ALLOC_CLEAR(curdata, sizeof(*curdata)); - - dsc.flags = - DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS; - dsc.caps = DSCAPS_VIDEOONLY; - dsc.width = surface->w; - dsc.height = surface->h; - dsc.pixelformat = DSPF_ARGB; - - SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc, - &curdata->surf)); - curdata->hotx = hot_x; - curdata->hoty = hot_y; - cursor->driverdata = curdata; - - SDL_DFB_CHECKERR(curdata->surf->Lock(curdata->surf, DSLF_WRITE, - (void *) &dest, &pitch)); - - p = surface->pixels; - for (i = 0; i < surface->h; i++) - memcpy((char *) dest + i * pitch, - (char *) p + i * surface->pitch, 4 * surface->w); - - curdata->surf->Unlock(curdata->surf); - return cursor; - error: - return NULL; -} - -/* Show the specified cursor, or hide if cursor is NULL */ -static int -DirectFB_ShowCursor(SDL_Cursor * cursor) -{ - SDL_DFB_CURSORDATA(cursor); - DFBResult ret; - SDL_Window *window; - - window = SDL_GetFocusWindow(); - if (!window) - return -1; - else { - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - - if (display) { - DFB_DisplayData *dispdata = - (DFB_DisplayData *) display->driverdata; - DFB_WindowData *windata = (DFB_WindowData *) window->driverdata; - - if (cursor) - SDL_DFB_CHECKERR(windata->dfbwin-> - SetCursorShape(windata->dfbwin, - curdata->surf, curdata->hotx, - curdata->hoty)); - - SDL_DFB_CHECKERR(dispdata->layer-> - SetCooperativeLevel(dispdata->layer, - DLSCL_ADMINISTRATIVE)); - SDL_DFB_CHECKERR(dispdata->layer-> - SetCursorOpacity(dispdata->layer, - cursor ? 0xC0 : 0x00)); - SDL_DFB_CHECKERR(dispdata->layer-> - SetCooperativeLevel(dispdata->layer, - DLSCL_SHARED)); - } - } - - return 0; - error: - return -1; -} - -/* Free a window manager cursor */ -static void -DirectFB_FreeCursor(SDL_Cursor * cursor) -{ - SDL_DFB_CURSORDATA(cursor); - - SDL_DFB_RELEASE(curdata->surf); - SDL_DFB_FREE(cursor->driverdata); - SDL_DFB_FREE(cursor); -} - -/* Warp the mouse to (x,y) */ -static void -DirectFB_WarpMouse(SDL_Window * window, int x, int y) -{ - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; - DFB_WindowData *windata = (DFB_WindowData *) window->driverdata; - DFBResult ret; - int cx, cy; - - SDL_DFB_CHECKERR(windata->dfbwin->GetPosition(windata->dfbwin, &cx, &cy)); - SDL_DFB_CHECKERR(dispdata->layer->WarpCursor(dispdata->layer, - cx + x + windata->client.x, - cy + y + windata->client.y)); - - error: - return; -} - -#if USE_MULTI_API - -static void DirectFB_WarpMouse(SDL_Mouse * mouse, SDL_Window * window, - int x, int y); - -static int id_mask; - -static DFBEnumerationResult -EnumMice(DFBInputDeviceID device_id, DFBInputDeviceDescription desc, - void *callbackdata) -{ - DFB_DeviceData *devdata = callbackdata; - - if ((desc.type & DIDTF_MOUSE) && (device_id & id_mask)) { - SDL_Mouse mouse; - - SDL_zero(mouse); - mouse.id = device_id; - mouse.CreateCursor = DirectFB_CreateCursor; - mouse.ShowCursor = DirectFB_ShowCursor; - mouse.MoveCursor = DirectFB_MoveCursor; - mouse.FreeCursor = DirectFB_FreeCursor; - mouse.WarpMouse = DirectFB_WarpMouse; - mouse.FreeMouse = DirectFB_FreeMouse; - mouse.cursor_shown = 1; - - SDL_AddMouse(&mouse, desc.name, 0, 0, 1); - devdata->mouse_id[devdata->num_mice++] = device_id; - } - return DFENUM_OK; -} - -void -DirectFB_InitMouse(_THIS) -{ - SDL_DFB_DEVICEDATA(_this); - - devdata->num_mice = 0; - if (devdata->use_linux_input) { - /* try non-core devices first */ - id_mask = 0xF0; - devdata->dfb->EnumInputDevices(devdata->dfb, EnumMice, devdata); - if (devdata->num_mice == 0) { - /* try core devices */ - id_mask = 0x0F; - devdata->dfb->EnumInputDevices(devdata->dfb, EnumMice, devdata); - } - } - if (devdata->num_mice == 0) { - SDL_Mouse mouse; - - SDL_zero(mouse); - mouse.CreateCursor = DirectFB_CreateCursor; - mouse.ShowCursor = DirectFB_ShowCursor; - mouse.MoveCursor = DirectFB_MoveCursor; - mouse.FreeCursor = DirectFB_FreeCursor; - mouse.WarpMouse = DirectFB_WarpMouse; - mouse.FreeMouse = DirectFB_FreeMouse; - mouse.cursor_shown = 1; - - SDL_AddMouse(&mouse, "Mouse", 0, 0, 1); - devdata->num_mice = 1; - } -} - -void -DirectFB_QuitMouse(_THIS) -{ - SDL_DFB_DEVICEDATA(_this); - - if (devdata->use_linux_input) { - SDL_MouseQuit(); - } else { - SDL_DelMouse(0); - } -} - - -/* This is called when a mouse motion event occurs */ -static void -DirectFB_MoveCursor(SDL_Cursor * cursor) -{ - -} - -/* Warp the mouse to (x,y) */ -static void -DirectFB_WarpMouse(SDL_Mouse * mouse, SDL_Window * window, int x, int y) -{ - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; - DFB_WindowData *windata = (DFB_WindowData *) window->driverdata; - DFBResult ret; - int cx, cy; - - SDL_DFB_CHECKERR(windata->dfbwin->GetPosition(windata->dfbwin, &cx, &cy)); - SDL_DFB_CHECKERR(dispdata->layer->WarpCursor(dispdata->layer, - cx + x + windata->client.x, - cy + y + windata->client.y)); - - error: - return; -} - -/* Free the mouse when it's time */ -static void -DirectFB_FreeMouse(SDL_Mouse * mouse) -{ - /* nothing yet */ -} - -#else /* USE_MULTI_API */ - -void -DirectFB_InitMouse(_THIS) -{ - SDL_DFB_DEVICEDATA(_this); - - SDL_Mouse *mouse = SDL_GetMouse(); - - mouse->CreateCursor = DirectFB_CreateCursor; - mouse->ShowCursor = DirectFB_ShowCursor; - mouse->WarpMouse = DirectFB_WarpMouse; - mouse->FreeCursor = DirectFB_FreeCursor; - - SDL_SetDefaultCursor(DirectFB_CreateDefaultCursor()); - - devdata->num_mice = 1; -} - -void -DirectFB_QuitMouse(_THIS) -{ -} - - -#endif - -#endif /* SDL_VIDEO_DRIVER_DIRECTFB */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_mouse.h b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_mouse.h deleted file mode 100644 index 4e2f27a92e6..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_mouse.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_DirectFB_mouse_h -#define _SDL_DirectFB_mouse_h - -#include <directfb.h> - -#include "../SDL_sysvideo.h" - -typedef struct _DFB_CursorData DFB_CursorData; -struct _DFB_CursorData -{ - IDirectFBSurface *surf; - int hotx; - int hoty; -}; - -#define SDL_DFB_CURSORDATA(curs) DFB_CursorData *curdata = (DFB_CursorData *) ((curs) ? (curs)->driverdata : NULL) - -extern void DirectFB_InitMouse(_THIS); -extern void DirectFB_QuitMouse(_THIS); - -#endif /* _SDL_DirectFB_mouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_opengl.c b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_opengl.c deleted file mode 100644 index 065854a08fb..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_opengl.c +++ /dev/null @@ -1,345 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DIRECTFB - -#include "SDL_DirectFB_video.h" - -#if SDL_DIRECTFB_OPENGL - -#include "SDL_DirectFB_opengl.h" -#include "SDL_DirectFB_window.h" - -#include <directfbgl.h> -#include "SDL_loadso.h" -#endif - -#if SDL_DIRECTFB_OPENGL - -struct SDL_GLDriverData -{ - int gl_active; /* to stop switching drivers while we have a valid context */ - int initialized; - DirectFB_GLContext *firstgl; /* linked list */ - - /* OpenGL */ - void (*glFinish) (void); - void (*glFlush) (void); -}; - -#define OPENGL_REQUIRS_DLOPEN -#if defined(OPENGL_REQUIRS_DLOPEN) && defined(SDL_LOADSO_DLOPEN) -#include <dlfcn.h> -#define GL_LoadObject(X) dlopen(X, (RTLD_NOW|RTLD_GLOBAL)) -#define GL_LoadFunction dlsym -#define GL_UnloadObject dlclose -#else -#define GL_LoadObject SDL_LoadObject -#define GL_LoadFunction SDL_LoadFunction -#define GL_UnloadObject SDL_UnloadObject -#endif - -static void DirectFB_GL_UnloadLibrary(_THIS); - -int -DirectFB_GL_Initialize(_THIS) -{ - if (_this->gl_data) { - return 0; - } - - _this->gl_data = - (struct SDL_GLDriverData *) SDL_calloc(1, - sizeof(struct - SDL_GLDriverData)); - if (!_this->gl_data) { - return SDL_OutOfMemory(); - } - _this->gl_data->initialized = 0; - - ++_this->gl_data->initialized; - _this->gl_data->firstgl = NULL; - - if (DirectFB_GL_LoadLibrary(_this, NULL) < 0) { - return -1; - } - - /* Initialize extensions */ - /* FIXME needed? - * X11_GL_InitExtensions(_this); - */ - - return 0; -} - -void -DirectFB_GL_Shutdown(_THIS) -{ - if (!_this->gl_data || (--_this->gl_data->initialized > 0)) { - return; - } - - DirectFB_GL_UnloadLibrary(_this); - - SDL_free(_this->gl_data); - _this->gl_data = NULL; -} - -int -DirectFB_GL_LoadLibrary(_THIS, const char *path) -{ - void *handle = NULL; - - SDL_DFB_DEBUG("Loadlibrary : %s\n", path); - - if (_this->gl_data->gl_active) { - return SDL_SetError("OpenGL context already created"); - } - - - if (path == NULL) { - path = SDL_getenv("SDL_VIDEO_GL_DRIVER"); - if (path == NULL) { - path = "libGL.so"; - } - } - - handle = GL_LoadObject(path); - if (handle == NULL) { - SDL_DFB_ERR("Library not found: %s\n", path); - /* SDL_LoadObject() will call SDL_SetError() for us. */ - return -1; - } - - SDL_DFB_DEBUG("Loaded library: %s\n", path); - - _this->gl_config.dll_handle = handle; - _this->gl_config.driver_loaded = 1; - if (path) { - SDL_strlcpy(_this->gl_config.driver_path, path, - SDL_arraysize(_this->gl_config.driver_path)); - } else { - *_this->gl_config.driver_path = '\0'; - } - - _this->gl_data->glFinish = DirectFB_GL_GetProcAddress(_this, "glFinish"); - _this->gl_data->glFlush = DirectFB_GL_GetProcAddress(_this, "glFlush"); - - return 0; -} - -static void -DirectFB_GL_UnloadLibrary(_THIS) -{ - #if 0 - int ret; - - if (_this->gl_config.driver_loaded) { - - ret = GL_UnloadObject(_this->gl_config.dll_handle); - if (ret) - SDL_DFB_ERR("Error #%d trying to unload library.\n", ret); - _this->gl_config.dll_handle = NULL; - _this->gl_config.driver_loaded = 0; - } -#endif - /* Free OpenGL memory */ - SDL_free(_this->gl_data); - _this->gl_data = NULL; -} - -void * -DirectFB_GL_GetProcAddress(_THIS, const char *proc) -{ - void *handle; - - handle = _this->gl_config.dll_handle; - return GL_LoadFunction(handle, proc); -} - -SDL_GLContext -DirectFB_GL_CreateContext(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - DirectFB_GLContext *context; - - SDL_DFB_ALLOC_CLEAR(context, sizeof(DirectFB_GLContext)); - - SDL_DFB_CHECKERR(windata->surface->GetGL(windata->surface, - &context->context)); - - if (!context->context) - return NULL; - - context->is_locked = 0; - context->sdl_window = window; - - context->next = _this->gl_data->firstgl; - _this->gl_data->firstgl = context; - - SDL_DFB_CHECK(context->context->Unlock(context->context)); - - if (DirectFB_GL_MakeCurrent(_this, window, context) < 0) { - DirectFB_GL_DeleteContext(_this, context); - return NULL; - } - - return context; - - error: - return NULL; -} - -int -DirectFB_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) -{ - DirectFB_GLContext *ctx = (DirectFB_GLContext *) context; - DirectFB_GLContext *p; - - for (p = _this->gl_data->firstgl; p; p = p->next) - { - if (p->is_locked) { - SDL_DFB_CHECKERR(p->context->Unlock(p->context)); - p->is_locked = 0; - } - - } - - if (ctx != NULL) { - SDL_DFB_CHECKERR(ctx->context->Lock(ctx->context)); - ctx->is_locked = 1; - } - - return 0; - error: - return -1; -} - -int -DirectFB_GL_SetSwapInterval(_THIS, int interval) -{ - return SDL_Unsupported(); -} - -int -DirectFB_GL_GetSwapInterval(_THIS) -{ - return 0; -} - -void -DirectFB_GL_SwapWindow(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - DFBRegion region; - DirectFB_GLContext *p; - - region.x1 = 0; - region.y1 = 0; - region.x2 = window->w; - region.y2 = window->h; - -#if 0 - if (devdata->glFinish) - devdata->glFinish(); - else if (devdata->glFlush) - devdata->glFlush(); -#endif - - for (p = _this->gl_data->firstgl; p != NULL; p = p->next) - if (p->sdl_window == window && p->is_locked) - { - SDL_DFB_CHECKERR(p->context->Unlock(p->context)); - p->is_locked = 0; - } - - SDL_DFB_CHECKERR(windata->window_surface->Flip(windata->window_surface,NULL, DSFLIP_PIPELINE |DSFLIP_BLIT | DSFLIP_ONSYNC )); - return; - error: - return; -} - -void -DirectFB_GL_DeleteContext(_THIS, SDL_GLContext context) -{ - DirectFB_GLContext *ctx = (DirectFB_GLContext *) context; - DirectFB_GLContext *p; - - if (ctx->is_locked) - SDL_DFB_CHECK(ctx->context->Unlock(ctx->context)); - SDL_DFB_RELEASE(ctx->context); - - for (p = _this->gl_data->firstgl; p && p->next != ctx; p = p->next) - ; - if (p) - p->next = ctx->next; - else - _this->gl_data->firstgl = ctx->next; - - SDL_DFB_FREE(ctx); -} - -void -DirectFB_GL_FreeWindowContexts(_THIS, SDL_Window * window) -{ - DirectFB_GLContext *p; - - for (p = _this->gl_data->firstgl; p != NULL; p = p->next) - if (p->sdl_window == window) - { - if (p->is_locked) - SDL_DFB_CHECK(p->context->Unlock(p->context)); - SDL_DFB_RELEASE(p->context); - } -} - -void -DirectFB_GL_ReAllocWindowContexts(_THIS, SDL_Window * window) -{ - DirectFB_GLContext *p; - - for (p = _this->gl_data->firstgl; p != NULL; p = p->next) - if (p->sdl_window == window) - { - SDL_DFB_WINDOWDATA(window); - SDL_DFB_CHECK(windata->surface->GetGL(windata->surface, - &p->context)); - if (p->is_locked) - SDL_DFB_CHECK(p->context->Lock(p->context)); - } -} - -void -DirectFB_GL_DestroyWindowContexts(_THIS, SDL_Window * window) -{ - DirectFB_GLContext *p; - - for (p = _this->gl_data->firstgl; p != NULL; p = p->next) - if (p->sdl_window == window) - DirectFB_GL_DeleteContext(_this, p); -} - -#endif - -#endif /* SDL_VIDEO_DRIVER_DIRECTFB */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_opengl.h b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_opengl.h deleted file mode 100644 index 6391ee4f3d7..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_opengl.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef _SDL_directfb_opengl_h -#define _SDL_directfb_opengl_h - -#include "SDL_DirectFB_video.h" - -#if SDL_DIRECTFB_OPENGL - -#include "SDL_opengl.h" - -typedef struct _DirectFB_GLContext DirectFB_GLContext; -struct _DirectFB_GLContext -{ - IDirectFBGL *context; - DirectFB_GLContext *next; - - SDL_Window *sdl_window; - int is_locked; -}; - -/* OpenGL functions */ -extern int DirectFB_GL_Initialize(_THIS); -extern void DirectFB_GL_Shutdown(_THIS); - -extern int DirectFB_GL_LoadLibrary(_THIS, const char *path); -extern void *DirectFB_GL_GetProcAddress(_THIS, const char *proc); -extern SDL_GLContext DirectFB_GL_CreateContext(_THIS, SDL_Window * window); -extern int DirectFB_GL_MakeCurrent(_THIS, SDL_Window * window, - SDL_GLContext context); -extern int DirectFB_GL_SetSwapInterval(_THIS, int interval); -extern int DirectFB_GL_GetSwapInterval(_THIS); -extern void DirectFB_GL_SwapWindow(_THIS, SDL_Window * window); -extern void DirectFB_GL_DeleteContext(_THIS, SDL_GLContext context); - -extern void DirectFB_GL_FreeWindowContexts(_THIS, SDL_Window * window); -extern void DirectFB_GL_ReAllocWindowContexts(_THIS, SDL_Window * window); -extern void DirectFB_GL_DestroyWindowContexts(_THIS, SDL_Window * window); - -#endif /* SDL_DIRECTFB_OPENGL */ - -#endif /* _SDL_directfb_opengl_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_render.c b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_render.c deleted file mode 100644 index 4a1bf46b8e0..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_render.c +++ /dev/null @@ -1,1328 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DIRECTFB -#include "SDL_DirectFB_window.h" -#include "SDL_DirectFB_modes.h" - -#include "SDL_syswm.h" -#include "SDL_DirectFB_shape.h" - -#include "../SDL_sysvideo.h" -#include "../../render/SDL_sysrender.h" - -#ifndef DFB_VERSION_ATLEAST - -#define DFB_VERSIONNUM(X, Y, Z) \ - ((X)*1000 + (Y)*100 + (Z)) - -#define DFB_COMPILEDVERSION \ - DFB_VERSIONNUM(DIRECTFB_MAJOR_VERSION, DIRECTFB_MINOR_VERSION, DIRECTFB_MICRO_VERSION) - -#define DFB_VERSION_ATLEAST(X, Y, Z) \ - (DFB_COMPILEDVERSION >= DFB_VERSIONNUM(X, Y, Z)) - -#define SDL_DFB_CHECK(x) x - -#endif - -/* the following is not yet tested ... */ -#define USE_DISPLAY_PALETTE (0) - - -#define SDL_DFB_RENDERERDATA(rend) DirectFB_RenderData *renddata = ((rend) ? (DirectFB_RenderData *) (rend)->driverdata : NULL) - - -/* DirectFB renderer implementation */ - -static SDL_Renderer *DirectFB_CreateRenderer(SDL_Window * window, - Uint32 flags); -static void DirectFB_ActivateRenderer(SDL_Renderer * renderer); -static int DirectFB_CreateTexture(SDL_Renderer * renderer, - SDL_Texture * texture); -static int DirectFB_QueryTexturePixels(SDL_Renderer * renderer, - SDL_Texture * texture, - void **pixels, int *pitch); -static int DirectFB_SetTexturePalette(SDL_Renderer * renderer, - SDL_Texture * texture, - const SDL_Color * colors, - int firstcolor, int ncolors); -static int DirectFB_GetTexturePalette(SDL_Renderer * renderer, - SDL_Texture * texture, - SDL_Color * colors, - int firstcolor, int ncolors); -static int DirectFB_SetTextureAlphaMod(SDL_Renderer * renderer, - SDL_Texture * texture); -static int DirectFB_SetTextureColorMod(SDL_Renderer * renderer, - SDL_Texture * texture); -static int DirectFB_SetTextureBlendMode(SDL_Renderer * renderer, - SDL_Texture * texture); -static int DirectFB_SetTextureScaleMode(SDL_Renderer * renderer, - SDL_Texture * texture); -static int DirectFB_UpdateTexture(SDL_Renderer * renderer, - SDL_Texture * texture, - const SDL_Rect * rect, - const void *pixels, int pitch); -static int DirectFB_LockTexture(SDL_Renderer * renderer, - SDL_Texture * texture, - const SDL_Rect * rect, - void **pixels, int *pitch); -static void DirectFB_UnlockTexture(SDL_Renderer * renderer, - SDL_Texture * texture); -static void DirectFB_DirtyTexture(SDL_Renderer * renderer, - SDL_Texture * texture, int numrects, - const SDL_Rect * rects); -static int DirectFB_SetDrawBlendMode(SDL_Renderer * renderer); -static int DirectFB_RenderDrawPoints(SDL_Renderer * renderer, - const SDL_FPoint * points, int count); -static int DirectFB_RenderDrawLines(SDL_Renderer * renderer, - const SDL_FPoint * points, int count); -static int DirectFB_RenderDrawRects(SDL_Renderer * renderer, - const SDL_Rect ** rects, int count); -static int DirectFB_RenderFillRects(SDL_Renderer * renderer, - const SDL_FRect * rects, int count); -static int DirectFB_RenderCopy(SDL_Renderer * renderer, - SDL_Texture * texture, - const SDL_Rect * srcrect, - const SDL_FRect * dstrect); -static void DirectFB_RenderPresent(SDL_Renderer * renderer); -static void DirectFB_DestroyTexture(SDL_Renderer * renderer, - SDL_Texture * texture); -static void DirectFB_DestroyRenderer(SDL_Renderer * renderer); -static int DirectFB_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, - Uint32 format, void * pixels, int pitch); -static int DirectFB_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect, - Uint32 format, const void * pixels, int pitch); -static int DirectFB_UpdateViewport(SDL_Renderer * renderer); -static int DirectFB_UpdateClipRect(SDL_Renderer * renderer); -static int DirectFB_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture); - -static int PrepareDraw(SDL_Renderer * renderer); - - -#define SDL_DFB_WINDOWSURFACE(win) IDirectFBSurface *destsurf = ((DFB_WindowData *) ((win)->driverdata))->surface; - -SDL_RenderDriver DirectFB_RenderDriver = { - DirectFB_CreateRenderer, - { - "directfb", - (SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED), - /* (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | - SDL_TEXTUREMODULATE_ALPHA), - (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | SDL_BLENDMODE_BLEND | - SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD), - (SDL_SCALEMODE_NONE | SDL_SCALEMODE_FAST | - SDL_SCALEMODE_SLOW | SDL_SCALEMODE_BEST), */ - 0, - { - /* formats filled in later */ - }, - 0, - 0} -}; - -typedef struct -{ - SDL_Window *window; - DFBSurfaceFlipFlags flipflags; - int size_changed; - int lastBlendMode; - DFBSurfaceBlittingFlags blitFlags; - DFBSurfaceDrawingFlags drawFlags; - IDirectFBSurface* target; -} DirectFB_RenderData; - -typedef struct -{ - IDirectFBSurface *surface; - Uint32 format; - void *pixels; - int pitch; - IDirectFBPalette *palette; - int isDirty; - - SDL_VideoDisplay *display; /* only for yuv textures */ - -#if (DFB_VERSION_ATLEAST(1,2,0)) - DFBSurfaceRenderOptions render_options; -#endif -} DirectFB_TextureData; - -static SDL_INLINE void -SDLtoDFBRect(const SDL_Rect * sr, DFBRectangle * dr) -{ - dr->x = sr->x; - dr->y = sr->y; - dr->h = sr->h; - dr->w = sr->w; -} -static SDL_INLINE void -SDLtoDFBRect_Float(const SDL_FRect * sr, DFBRectangle * dr) -{ - dr->x = sr->x; - dr->y = sr->y; - dr->h = sr->h; - dr->w = sr->w; -} - - -static int -TextureHasAlpha(DirectFB_TextureData * data) -{ - /* Drawing primitive ? */ - if (!data) - return 0; - - return (DFB_PIXELFORMAT_HAS_ALPHA(DirectFB_SDLToDFBPixelFormat(data->format)) ? 1 : 0); -#if 0 - switch (data->format) { - case SDL_PIXELFORMAT_INDEX4LSB: - case SDL_PIXELFORMAT_INDEX4MSB: - case SDL_PIXELFORMAT_ARGB4444: - case SDL_PIXELFORMAT_ARGB1555: - case SDL_PIXELFORMAT_ARGB8888: - case SDL_PIXELFORMAT_RGBA8888: - case SDL_PIXELFORMAT_ABGR8888: - case SDL_PIXELFORMAT_BGRA8888: - case SDL_PIXELFORMAT_ARGB2101010: - return 1; - default: - return 0; - } -#endif -} - -static SDL_INLINE IDirectFBSurface *get_dfb_surface(SDL_Window *window) -{ - SDL_SysWMinfo wm_info; - SDL_memset(&wm_info, 0, sizeof(SDL_SysWMinfo)); - - SDL_VERSION(&wm_info.version); - SDL_GetWindowWMInfo(window, &wm_info); - - return wm_info.info.dfb.surface; -} - -static SDL_INLINE IDirectFBWindow *get_dfb_window(SDL_Window *window) -{ - SDL_SysWMinfo wm_info; - SDL_memset(&wm_info, 0, sizeof(SDL_SysWMinfo)); - - SDL_VERSION(&wm_info.version); - SDL_GetWindowWMInfo(window, &wm_info); - - return wm_info.info.dfb.window; -} - -static void -SetBlendMode(DirectFB_RenderData * data, int blendMode, - DirectFB_TextureData * source) -{ - IDirectFBSurface *destsurf = data->target; - - /* FIXME: check for format change */ - if (1 || data->lastBlendMode != blendMode) { - switch (blendMode) { - case SDL_BLENDMODE_NONE: - /**< No blending */ - data->blitFlags = DSBLIT_NOFX; - data->drawFlags = DSDRAW_NOFX; - SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE)); - SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_ZERO)); - break; -#if 0 - case SDL_BLENDMODE_MASK: - data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; - data->drawFlags = DSDRAW_BLEND; - SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA)); - SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA)); - break; -#endif - case SDL_BLENDMODE_BLEND: - data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; - data->drawFlags = DSDRAW_BLEND; - SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA)); - SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA)); - break; - case SDL_BLENDMODE_ADD: - data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; - data->drawFlags = DSDRAW_BLEND; - /* FIXME: SRCALPHA kills performance on radeon ... - * It will be cheaper to copy the surface to a temporary surface and premultiply - */ - if (source && TextureHasAlpha(source)) - SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA)); - else - SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE)); - SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_ONE)); - break; - case SDL_BLENDMODE_MOD: - data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; - data->drawFlags = DSDRAW_BLEND; - SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_ZERO)); - SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_SRCCOLOR)); - - break; - } - data->lastBlendMode = blendMode; - } -} - -static int -DisplayPaletteChanged(void *userdata, SDL_Palette * palette) -{ -#if USE_DISPLAY_PALETTE - DirectFB_RenderData *data = (DirectFB_RenderData *) userdata; - SDL_DFB_WINDOWSURFACE(data->window); - IDirectFBPalette *surfpal; - - int i; - int ncolors; - DFBColor entries[256]; - - SDL_DFB_CHECKERR(destsurf->GetPalette(destsurf, &surfpal)); - - /* FIXME: number of colors */ - ncolors = (palette->ncolors < 256 ? palette->ncolors : 256); - - for (i = 0; i < ncolors; ++i) { - entries[i].r = palette->colors[i].r; - entries[i].g = palette->colors[i].g; - entries[i].b = palette->colors[i].b; - entries[i].a = palette->colors[i].a; - } - SDL_DFB_CHECKERR(surfpal->SetEntries(surfpal, entries, ncolors, 0)); - return 0; - error: -#else - SDL_Unsupported(); -#endif - return -1; -} - -static void -DirectFB_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) -{ - SDL_DFB_RENDERERDATA(renderer); - - if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) { - /* Rebind the context to the window area and update matrices */ - /* SDL_CurrentContext = NULL; */ - /* data->updateSize = SDL_TRUE; */ - renddata->size_changed = SDL_TRUE; - } -} - -int -DirectFB_RenderClear(SDL_Renderer * renderer) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - IDirectFBSurface *destsurf = data->target; - - DirectFB_ActivateRenderer(renderer); - - PrepareDraw(renderer); - - destsurf->Clear(destsurf, renderer->r, renderer->g, renderer->b, renderer->a); - - - return 0; -} - -SDL_Renderer * -DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags) -{ - IDirectFBSurface *winsurf = get_dfb_surface(window); - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - SDL_Renderer *renderer = NULL; - DirectFB_RenderData *data = NULL; - DFBSurfaceCapabilities scaps; - - SDL_DFB_ALLOC_CLEAR(renderer, sizeof(*renderer)); - SDL_DFB_ALLOC_CLEAR(data, sizeof(*data)); - - renderer->WindowEvent = DirectFB_WindowEvent; - renderer->CreateTexture = DirectFB_CreateTexture; - renderer->SetTextureAlphaMod = DirectFB_SetTextureAlphaMod; - renderer->SetTextureColorMod = DirectFB_SetTextureColorMod; - renderer->SetTextureBlendMode = DirectFB_SetTextureBlendMode; - renderer->UpdateTexture = DirectFB_UpdateTexture; - renderer->LockTexture = DirectFB_LockTexture; - renderer->RenderClear = DirectFB_RenderClear; - renderer->UnlockTexture = DirectFB_UnlockTexture; - renderer->RenderDrawPoints = DirectFB_RenderDrawPoints; - renderer->RenderDrawLines = DirectFB_RenderDrawLines; - /* SetDrawColor - no needed */ - renderer->RenderFillRects = DirectFB_RenderFillRects; - - renderer->RenderCopy = DirectFB_RenderCopy; - renderer->RenderPresent = DirectFB_RenderPresent; - - /* FIXME: Yet to be tested */ - renderer->RenderReadPixels = DirectFB_RenderReadPixels; - /* renderer->RenderWritePixels = DirectFB_RenderWritePixels; */ - - renderer->DestroyTexture = DirectFB_DestroyTexture; - renderer->DestroyRenderer = DirectFB_DestroyRenderer; - renderer->UpdateViewport = DirectFB_UpdateViewport; - renderer->UpdateClipRect = DirectFB_UpdateClipRect; - renderer->SetRenderTarget = DirectFB_SetRenderTarget; - -#if 0 - renderer->QueryTexturePixels = DirectFB_QueryTexturePixels; - renderer->SetTexturePalette = DirectFB_SetTexturePalette; - renderer->GetTexturePalette = DirectFB_GetTexturePalette; - renderer->SetTextureScaleMode = DirectFB_SetTextureScaleMode; - renderer->DirtyTexture = DirectFB_DirtyTexture; - renderer->SetDrawBlendMode = DirectFB_SetDrawBlendMode; - renderer->RenderDrawRects = DirectFB_RenderDrawRects; -#endif - - renderer->info = DirectFB_RenderDriver.info; - renderer->window = window; /* SDL window */ - renderer->driverdata = data; - - renderer->info.flags = - SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE; - - data->window = window; - data->target = winsurf; - - data->flipflags = DSFLIP_PIPELINE | DSFLIP_BLIT; - - if (flags & SDL_RENDERER_PRESENTVSYNC) { - data->flipflags |= DSFLIP_WAITFORSYNC | DSFLIP_ONSYNC; - renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC; - } else - data->flipflags |= DSFLIP_ONSYNC; - - SDL_DFB_CHECKERR(winsurf->GetCapabilities(winsurf, &scaps)); - -#if 0 - if (scaps & DSCAPS_DOUBLE) - renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2; - else if (scaps & DSCAPS_TRIPLE) - renderer->info.flags |= SDL_RENDERER_PRESENTFLIP3; - else - renderer->info.flags |= SDL_RENDERER_SINGLEBUFFER; -#endif - - DirectFB_SetSupportedPixelFormats(&renderer->info); - -#if 0 - /* Set up a palette watch on the display palette */ - if (display-> palette) { - SDL_AddPaletteWatch(display->palette, DisplayPaletteChanged, data); - } -#endif - - return renderer; - - error: - SDL_DFB_FREE(renderer); - SDL_DFB_FREE(data); - return NULL; -} - -static void -DirectFB_ActivateRenderer(SDL_Renderer * renderer) -{ - SDL_DFB_RENDERERDATA(renderer); - SDL_Window *window = renderer->window; - SDL_DFB_WINDOWDATA(window); - - if (renddata->size_changed /* || windata->wm_needs_redraw */) { - renddata->size_changed = SDL_FALSE; - } -} - - -static int -DirectFB_AcquireVidLayer(SDL_Renderer * renderer, SDL_Texture * texture) -{ - SDL_Window *window = renderer->window; - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - SDL_DFB_DEVICEDATA(display->device); - DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; - DirectFB_TextureData *data = texture->driverdata; - DFBDisplayLayerConfig layconf; - DFBResult ret; - - if (devdata->use_yuv_direct && (dispdata->vidID >= 0) - && (!dispdata->vidIDinuse) - && SDL_ISPIXELFORMAT_FOURCC(data->format)) { - layconf.flags = - DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT | - DLCONF_SURFACE_CAPS; - layconf.width = texture->w; - layconf.height = texture->h; - layconf.pixelformat = DirectFB_SDLToDFBPixelFormat(data->format); - layconf.surface_caps = DSCAPS_VIDEOONLY | DSCAPS_DOUBLE; - - SDL_DFB_CHECKERR(devdata->dfb->GetDisplayLayer(devdata->dfb, - dispdata->vidID, - &dispdata->vidlayer)); - SDL_DFB_CHECKERR(dispdata-> - vidlayer->SetCooperativeLevel(dispdata->vidlayer, - DLSCL_EXCLUSIVE)); - - if (devdata->use_yuv_underlays) { - ret = dispdata->vidlayer->SetLevel(dispdata->vidlayer, -1); - if (ret != DFB_OK) - SDL_DFB_DEBUG("Underlay Setlevel not supported\n"); - } - SDL_DFB_CHECKERR(dispdata-> - vidlayer->SetConfiguration(dispdata->vidlayer, - &layconf)); - SDL_DFB_CHECKERR(dispdata-> - vidlayer->GetSurface(dispdata->vidlayer, - &data->surface)); - dispdata->vidIDinuse = 1; - data->display = display; - return 0; - } - return 1; - error: - if (dispdata->vidlayer) { - SDL_DFB_RELEASE(data->surface); - SDL_DFB_CHECKERR(dispdata-> - vidlayer->SetCooperativeLevel(dispdata->vidlayer, - DLSCL_ADMINISTRATIVE)); - SDL_DFB_RELEASE(dispdata->vidlayer); - } - return 1; -} - -static int -DirectFB_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) -{ - SDL_Window *window = renderer->window; - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - SDL_DFB_DEVICEDATA(display->device); - DirectFB_TextureData *data; - DFBSurfaceDescription dsc; - DFBSurfacePixelFormat pixelformat; - - DirectFB_ActivateRenderer(renderer); - - SDL_DFB_ALLOC_CLEAR(data, sizeof(*data)); - texture->driverdata = data; - - /* find the right pixelformat */ - pixelformat = DirectFB_SDLToDFBPixelFormat(texture->format); - if (pixelformat == DSPF_UNKNOWN) { - SDL_SetError("Unknown pixel format %d\n", data->format); - goto error; - } - - data->format = texture->format; - data->pitch = texture->w * DFB_BYTES_PER_PIXEL(pixelformat); - - if (DirectFB_AcquireVidLayer(renderer, texture) != 0) { - /* fill surface description */ - dsc.flags = - DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS; - dsc.width = texture->w; - dsc.height = texture->h; - if(texture->format == SDL_PIXELFORMAT_YV12 || - texture->format == SDL_PIXELFORMAT_IYUV) { - /* dfb has problems with odd sizes -make them even internally */ - dsc.width += (dsc.width % 2); - dsc.height += (dsc.height % 2); - } - /* <1.2 Never use DSCAPS_VIDEOONLY here. It kills performance - * No DSCAPS_SYSTEMONLY either - let dfb decide - * 1.2: DSCAPS_SYSTEMONLY boosts performance by factor ~8 - * Depends on other settings as well. Let dfb decide. - */ - dsc.caps = DSCAPS_PREMULTIPLIED; -#if 0 - if (texture->access == SDL_TEXTUREACCESS_STREAMING) - dsc.caps |= DSCAPS_SYSTEMONLY; - else - dsc.caps |= DSCAPS_VIDEOONLY; -#endif - - dsc.pixelformat = pixelformat; - data->pixels = NULL; - - /* Create the surface */ - SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc, - &data->surface)); - if (SDL_ISPIXELFORMAT_INDEXED(data->format) - && !SDL_ISPIXELFORMAT_FOURCC(data->format)) { -#if 1 - SDL_DFB_CHECKERR(data->surface->GetPalette(data->surface, &data->palette)); -#else - /* DFB has issues with blitting LUT8 surfaces. - * Creating a new palette does not help. - */ - DFBPaletteDescription pal_desc; - pal_desc.flags = DPDESC_SIZE; /* | DPDESC_ENTRIES */ - pal_desc.size = 256; - SDL_DFB_CHECKERR(devdata->dfb->CreatePalette(devdata->dfb, &pal_desc,&data->palette)); - SDL_DFB_CHECKERR(data->surface->SetPalette(data->surface, data->palette)); -#endif - } - - } -#if (DFB_VERSION_ATLEAST(1,2,0)) - data->render_options = DSRO_NONE; -#endif - if (texture->access == SDL_TEXTUREACCESS_STREAMING) { - /* 3 plane YUVs return 1 bpp, but we need more space for other planes */ - if(texture->format == SDL_PIXELFORMAT_YV12 || - texture->format == SDL_PIXELFORMAT_IYUV) { - SDL_DFB_ALLOC_CLEAR(data->pixels, (texture->h * data->pitch + ((texture->h + texture->h % 2) * (data->pitch + data->pitch % 2) * 2) / 4)); - } else { - SDL_DFB_ALLOC_CLEAR(data->pixels, texture->h * data->pitch); - } - } - - return 0; - - error: - SDL_DFB_RELEASE(data->palette); - SDL_DFB_RELEASE(data->surface); - SDL_DFB_FREE(texture->driverdata); - return -1; -} - -static int -DirectFB_QueryTexturePixels(SDL_Renderer * renderer, - SDL_Texture * texture, void **pixels, int *pitch) -{ - DirectFB_TextureData *texturedata = - (DirectFB_TextureData *) texture->driverdata; - - if (texturedata->display) { - return -1; - } else { - *pixels = texturedata->pixels; - *pitch = texturedata->pitch; - } - return 0; -} - -static int -DirectFB_SetTexturePalette(SDL_Renderer * renderer, - SDL_Texture * texture, - const SDL_Color * colors, int firstcolor, - int ncolors) -{ - DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata; - if (SDL_ISPIXELFORMAT_INDEXED(data->format) - && !SDL_ISPIXELFORMAT_FOURCC(data->format)) { - DFBColor entries[256]; - int i; - - if (ncolors > 256) - ncolors = 256; - - for (i = 0; i < ncolors; ++i) { - entries[i].r = colors[i].r; - entries[i].g = colors[i].g; - entries[i].b = colors[i].b; - entries[i].a = 0xff; - } - SDL_DFB_CHECKERR(data-> - palette->SetEntries(data->palette, entries, ncolors, firstcolor)); - return 0; - } else { - return SDL_SetError("YUV textures don't have a palette"); - } - error: - return -1; -} - -static int -DirectFB_GetTexturePalette(SDL_Renderer * renderer, - SDL_Texture * texture, SDL_Color * colors, - int firstcolor, int ncolors) -{ - DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata; - - if (SDL_ISPIXELFORMAT_INDEXED(data->format) - && !SDL_ISPIXELFORMAT_FOURCC(data->format)) { - DFBColor entries[256]; - int i; - - SDL_DFB_CHECKERR(data-> - palette->GetEntries(data->palette, entries, ncolors, - firstcolor)); - - for (i = 0; i < ncolors; ++i) { - colors[i].r = entries[i].r; - colors[i].g = entries[i].g; - colors[i].b = entries[i].b; - colors[i].a = SDL_ALPHA_OPAQUE; - } - return 0; - } else { - return SDL_SetError("YUV textures don't have a palette"); - } - error: - return -1; -} - -static int -DirectFB_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture) -{ - return 0; -} - -static int -DirectFB_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture) -{ - return 0; -} - -static int -DirectFB_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) -{ - switch (texture->blendMode) { - case SDL_BLENDMODE_NONE: - /* case SDL_BLENDMODE_MASK: */ - case SDL_BLENDMODE_BLEND: - case SDL_BLENDMODE_ADD: - case SDL_BLENDMODE_MOD: - return 0; - default: - texture->blendMode = SDL_BLENDMODE_NONE; - return SDL_Unsupported(); - } -} - -static int -DirectFB_SetDrawBlendMode(SDL_Renderer * renderer) -{ - switch (renderer->blendMode) { - case SDL_BLENDMODE_NONE: - /* case SDL_BLENDMODE_MASK: */ - case SDL_BLENDMODE_BLEND: - case SDL_BLENDMODE_ADD: - case SDL_BLENDMODE_MOD: - return 0; - default: - renderer->blendMode = SDL_BLENDMODE_NONE; - return SDL_Unsupported(); - } -} - -#if 0 -static int -DirectFB_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture) -{ -#if (DFB_VERSION_ATLEAST(1,2,0)) - - DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata; - - switch (texture->scaleMode) { - case SDL_SCALEMODE_NONE: - case SDL_SCALEMODE_FAST: - data->render_options = DSRO_NONE; - break; - case SDL_SCALEMODE_SLOW: - data->render_options = DSRO_SMOOTH_UPSCALE | DSRO_SMOOTH_DOWNSCALE; - break; - case SDL_SCALEMODE_BEST: - data->render_options = - DSRO_SMOOTH_UPSCALE | DSRO_SMOOTH_DOWNSCALE | DSRO_ANTIALIAS; - break; - default: - data->render_options = DSRO_NONE; - texture->scaleMode = SDL_SCALEMODE_NONE; - return SDL_Unsupported(); - } -#endif - return 0; -} -#endif - -static int -DirectFB_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, - const SDL_Rect * rect, const void *pixels, int pitch) -{ - DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata; - Uint8 *dpixels; - int dpitch; - Uint8 *src, *dst; - int row; - size_t length; - int bpp = DFB_BYTES_PER_PIXEL(DirectFB_SDLToDFBPixelFormat(texture->format)); - /* FIXME: SDL_BYTESPERPIXEL(texture->format) broken for yuv yv12 3 planes */ - - DirectFB_ActivateRenderer(renderer); - - if ((texture->format == SDL_PIXELFORMAT_YV12) || - (texture->format == SDL_PIXELFORMAT_IYUV)) { - bpp = 1; - } - - SDL_DFB_CHECKERR(data->surface->Lock(data->surface, - DSLF_WRITE | DSLF_READ, - ((void **) &dpixels), &dpitch)); - src = (Uint8 *) pixels; - dst = (Uint8 *) dpixels + rect->y * dpitch + rect->x * bpp; - length = rect->w * bpp; - for (row = 0; row < rect->h; ++row) { - SDL_memcpy(dst, src, length); - src += pitch; - dst += dpitch; - } - /* copy other planes for 3 plane formats */ - if ((texture->format == SDL_PIXELFORMAT_YV12) || - (texture->format == SDL_PIXELFORMAT_IYUV)) { - src = (Uint8 *) pixels + texture->h * pitch; - dst = (Uint8 *) dpixels + texture->h * dpitch + rect->y * dpitch / 4 + rect->x * bpp / 2; - for (row = 0; row < rect->h / 2 + (rect->h & 1); ++row) { - SDL_memcpy(dst, src, length / 2); - src += pitch / 2; - dst += dpitch / 2; - } - src = (Uint8 *) pixels + texture->h * pitch + texture->h * pitch / 4; - dst = (Uint8 *) dpixels + texture->h * dpitch + texture->h * dpitch / 4 + rect->y * dpitch / 4 + rect->x * bpp / 2; - for (row = 0; row < rect->h / 2 + (rect->h & 1); ++row) { - SDL_memcpy(dst, src, length / 2); - src += pitch / 2; - dst += dpitch / 2; - } - } - SDL_DFB_CHECKERR(data->surface->Unlock(data->surface)); - data->isDirty = 0; - return 0; - error: - return 1; - -} - -static int -DirectFB_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, - const SDL_Rect * rect, void **pixels, int *pitch) -{ - DirectFB_TextureData *texturedata = - (DirectFB_TextureData *) texture->driverdata; - - DirectFB_ActivateRenderer(renderer); - -#if 0 - if (markDirty) { - SDL_AddDirtyRect(&texturedata->dirty, rect); - } -#endif - - if (texturedata->display) { - void *fdata; - int fpitch; - - SDL_DFB_CHECKERR(texturedata->surface->Lock(texturedata->surface, - DSLF_WRITE | DSLF_READ, - &fdata, &fpitch)); - *pitch = fpitch; - *pixels = fdata; - } else { - *pixels = - (void *) ((Uint8 *) texturedata->pixels + - rect->y * texturedata->pitch + - rect->x * DFB_BYTES_PER_PIXEL(DirectFB_SDLToDFBPixelFormat(texture->format))); - *pitch = texturedata->pitch; - texturedata->isDirty = 1; - } - return 0; - - error: - return -1; -} - -static void -DirectFB_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture) -{ - DirectFB_TextureData *texturedata = - (DirectFB_TextureData *) texture->driverdata; - - DirectFB_ActivateRenderer(renderer); - - if (texturedata->display) { - SDL_DFB_CHECK(texturedata->surface->Unlock(texturedata->surface)); - texturedata->pixels = NULL; - } -} - -#if 0 -static void -DirectFB_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, - int numrects, const SDL_Rect * rects) -{ - DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata; - int i; - - for (i = 0; i < numrects; ++i) { - SDL_AddDirtyRect(&data->dirty, &rects[i]); - } -} -#endif - -static int DirectFB_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - DirectFB_TextureData *tex_data = NULL; - - DirectFB_ActivateRenderer(renderer); - if (texture) { - tex_data = (DirectFB_TextureData *) texture->driverdata; - data->target = tex_data->surface; - } else { - data->target = get_dfb_surface(data->window); - } - data->lastBlendMode = 0; - return 0; -} - - -static int -PrepareDraw(SDL_Renderer * renderer) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - IDirectFBSurface *destsurf = data->target; - - Uint8 r, g, b, a; - - r = renderer->r; - g = renderer->g; - b = renderer->b; - a = renderer->a; - - SetBlendMode(data, renderer->blendMode, NULL); - SDL_DFB_CHECKERR(destsurf->SetDrawingFlags(destsurf, data->drawFlags)); - - switch (renderer->blendMode) { - case SDL_BLENDMODE_NONE: - /* case SDL_BLENDMODE_MASK: */ - case SDL_BLENDMODE_BLEND: - break; - case SDL_BLENDMODE_ADD: - case SDL_BLENDMODE_MOD: - r = ((int) r * (int) a) / 255; - g = ((int) g * (int) a) / 255; - b = ((int) b * (int) a) / 255; - a = 255; - break; - } - - SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, r, g, b, a)); - return 0; - error: - return -1; -} - -static int DirectFB_RenderDrawPoints(SDL_Renderer * renderer, - const SDL_FPoint * points, int count) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - IDirectFBSurface *destsurf = data->target; - DFBRegion clip_region; - int i; - - DirectFB_ActivateRenderer(renderer); - - PrepareDraw(renderer); - destsurf->GetClip(destsurf, &clip_region); - for (i=0; i < count; i++) { - int x = points[i].x + clip_region.x1; - int y = points[i].y + clip_region.y1; - SDL_DFB_CHECKERR(destsurf->DrawLine(destsurf, x, y, x, y)); - } - return 0; - error: - return -1; -} - -static int DirectFB_RenderDrawLines(SDL_Renderer * renderer, - const SDL_FPoint * points, int count) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - IDirectFBSurface *destsurf = data->target; - DFBRegion clip_region; - int i; - - DirectFB_ActivateRenderer(renderer); - - PrepareDraw(renderer); - /* Use antialiasing when available */ -#if (DFB_VERSION_ATLEAST(1,2,0)) - SDL_DFB_CHECKERR(destsurf->SetRenderOptions(destsurf, DSRO_ANTIALIAS)); -#endif - - destsurf->GetClip(destsurf, &clip_region); - for (i=0; i < count - 1; i++) { - int x1 = points[i].x + clip_region.x1; - int y1 = points[i].y + clip_region.y1; - int x2 = points[i + 1].x + clip_region.x1; - int y2 = points[i + 1].y + clip_region.y1; - SDL_DFB_CHECKERR(destsurf->DrawLine(destsurf, x1, y1, x2, y2)); - } - - return 0; - error: - return -1; -} - -static int -DirectFB_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - IDirectFBSurface *destsurf = data->target; - DFBRegion clip_region; - int i; - - DirectFB_ActivateRenderer(renderer); - - PrepareDraw(renderer); - - destsurf->GetClip(destsurf, &clip_region); - for (i=0; i<count; i++) { - SDL_Rect dst = {rects[i]->x, rects[i]->y, rects[i]->w, rects[i]->h}; - dst.x += clip_region.x1; - dst.y += clip_region.y1; - SDL_DFB_CHECKERR(destsurf->DrawRectangle(destsurf, dst.x, dst.y, - dst.w, dst.h)); - } - - return 0; - error: - return -1; -} - -static int -DirectFB_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects, int count) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - IDirectFBSurface *destsurf = data->target; - DFBRegion clip_region; - int i; - - DirectFB_ActivateRenderer(renderer); - - PrepareDraw(renderer); - - destsurf->GetClip(destsurf, &clip_region); - for (i=0; i<count; i++) { - SDL_Rect dst = {rects[i].x, rects[i].y, rects[i].w, rects[i].h}; - dst.x += clip_region.x1; - dst.y += clip_region.y1; - SDL_DFB_CHECKERR(destsurf->FillRectangle(destsurf, dst.x, dst.y, - dst.w, dst.h)); - } - - return 0; - error: - return -1; -} - -static int -DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, - const SDL_Rect * srcrect, const SDL_FRect * dstrect) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - IDirectFBSurface *destsurf = data->target; - DirectFB_TextureData *texturedata = - (DirectFB_TextureData *) texture->driverdata; - Uint8 alpha, r, g, b; - DFBRegion clip_region; - DFBRectangle sr, dr; - - DirectFB_ActivateRenderer(renderer); - - SDLtoDFBRect(srcrect, &sr); - SDLtoDFBRect_Float(dstrect, &dr); - - destsurf->GetClip(destsurf, &clip_region); - dr.x += clip_region.x1; - dr.y += clip_region.y1; - - if (texturedata->display) { - int px, py; - SDL_Window *window = renderer->window; - IDirectFBWindow *dfbwin = get_dfb_window(window); - SDL_DFB_WINDOWDATA(window); - SDL_VideoDisplay *display = texturedata->display; - DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; - - SDL_DFB_CHECKERR(dispdata-> - vidlayer->SetSourceRectangle(dispdata->vidlayer, - sr.x, sr.y, sr.w, sr.h)); - dfbwin->GetPosition(dfbwin, &px, &py); - px += windata->client.x; - py += windata->client.y; - SDL_DFB_CHECKERR(dispdata-> - vidlayer->SetScreenRectangle(dispdata->vidlayer, - px + dr.x, - py + dr.y, - dr.w, - dr.h)); - } else { - DFBSurfaceBlittingFlags flags = 0; - -#if 0 - if (texturedata->dirty.list) { - SDL_DirtyRect *dirty; - void *pixels; - int bpp = DFB_BYTES_PER_PIXEL(DirectFB_SDLToDFBPixelFormat(texture->format)); - int pitch = texturedata->pitch; - - for (dirty = texturedata->dirty.list; dirty; dirty = dirty->next) { - SDL_Rect *rect = &dirty->rect; - pixels = - (void *) ((Uint8 *) texturedata->pixels + - rect->y * pitch + rect->x * bpp); - DirectFB_UpdateTexture(renderer, texture, rect, - pixels, - texturedata->pitch); - } - SDL_ClearDirtyRects(&texturedata->dirty); - } -#endif - if (texturedata->isDirty) - { - SDL_Rect rect; - - rect.x = 0; - rect.y = 0; - rect.w = texture->w; - rect.h = texture->h; - - DirectFB_UpdateTexture(renderer, texture, &rect, texturedata->pixels, texturedata->pitch); - } - - alpha = r = g = b = 0xff; - if (texture->modMode & SDL_TEXTUREMODULATE_ALPHA){ - alpha = texture->a; - flags |= DSBLIT_BLEND_COLORALPHA; - } - - if (texture->modMode & SDL_TEXTUREMODULATE_COLOR) { - r = texture->r; - g = texture->g; - b = texture->b; - flags |= DSBLIT_COLORIZE; - } - SDL_DFB_CHECKERR(destsurf-> - SetColor(destsurf, r, g, b, alpha)); - - /* ???? flags |= DSBLIT_SRC_PREMULTCOLOR; */ - - SetBlendMode(data, texture->blendMode, texturedata); - - SDL_DFB_CHECKERR(destsurf->SetBlittingFlags(destsurf, - data->blitFlags | flags)); - -#if (DFB_VERSION_ATLEAST(1,2,0)) - SDL_DFB_CHECKERR(destsurf->SetRenderOptions(destsurf, - texturedata-> - render_options)); -#endif - - if (srcrect->w == dstrect->w && srcrect->h == dstrect->h) { - SDL_DFB_CHECKERR(destsurf->Blit(destsurf, - texturedata->surface, - &sr, dr.x, dr.y)); - } else { - SDL_DFB_CHECKERR(destsurf->StretchBlit(destsurf, - texturedata->surface, - &sr, &dr)); - } - } - return 0; - error: - return -1; -} - -static void -DirectFB_RenderPresent(SDL_Renderer * renderer) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - SDL_Window *window = renderer->window; - SDL_DFB_WINDOWDATA(window); - SDL_ShapeData *shape_data = (window->shaper ? window->shaper->driverdata : NULL); - - DirectFB_ActivateRenderer(renderer); - - if (shape_data && shape_data->surface) { - /* saturate the window surface alpha channel */ - SDL_DFB_CHECK(windata->window_surface->SetSrcBlendFunction(windata->window_surface, DSBF_ONE)); - SDL_DFB_CHECK(windata->window_surface->SetDstBlendFunction(windata->window_surface, DSBF_ONE)); - SDL_DFB_CHECK(windata->window_surface->SetDrawingFlags(windata->window_surface, DSDRAW_BLEND)); - SDL_DFB_CHECK(windata->window_surface->SetColor(windata->window_surface, 0, 0, 0, 0xff)); - SDL_DFB_CHECK(windata->window_surface->FillRectangle(windata->window_surface, 0,0, windata->size.w, windata->size.h)); - - /* blit the mask */ - SDL_DFB_CHECK(windata->surface->SetSrcBlendFunction(windata->surface, DSBF_DESTCOLOR)); - SDL_DFB_CHECK(windata->surface->SetDstBlendFunction(windata->surface, DSBF_ZERO)); - SDL_DFB_CHECK(windata->surface->SetBlittingFlags(windata->surface, DSBLIT_BLEND_ALPHACHANNEL)); -#if (DFB_VERSION_ATLEAST(1,2,0)) - SDL_DFB_CHECK(windata->surface->SetRenderOptions(windata->surface, DSRO_NONE)); -#endif - SDL_DFB_CHECK(windata->surface->Blit(windata->surface, shape_data->surface, NULL, 0, 0)); - } - - /* Send the data to the display */ - SDL_DFB_CHECK(windata->window_surface->Flip(windata->window_surface, NULL, - data->flipflags)); -} - -static void -DirectFB_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture) -{ - DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata; - - DirectFB_ActivateRenderer(renderer); - - if (!data) { - return; - } - SDL_DFB_RELEASE(data->palette); - SDL_DFB_RELEASE(data->surface); - if (data->display) { - DFB_DisplayData *dispdata = - (DFB_DisplayData *) data->display->driverdata; - dispdata->vidIDinuse = 0; - /* FIXME: Shouldn't we reset the cooperative level */ - SDL_DFB_CHECK(dispdata->vidlayer->SetCooperativeLevel(dispdata->vidlayer, - DLSCL_ADMINISTRATIVE)); - SDL_DFB_RELEASE(dispdata->vidlayer); - } - SDL_DFB_FREE(data->pixels); - SDL_free(data); - texture->driverdata = NULL; -} - -static void -DirectFB_DestroyRenderer(SDL_Renderer * renderer) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(data->window); -#if 0 - if (display->palette) { - SDL_DelPaletteWatch(display->palette, DisplayPaletteChanged, data); - } -#endif - - SDL_free(data); - SDL_free(renderer); -} - -static int -DirectFB_UpdateViewport(SDL_Renderer * renderer) -{ - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - IDirectFBSurface *winsurf = data->target; - DFBRegion dreg; - - dreg.x1 = renderer->viewport.x; - dreg.y1 = renderer->viewport.y; - dreg.x2 = dreg.x1 + renderer->viewport.w - 1; - dreg.y2 = dreg.y1 + renderer->viewport.h - 1; - - winsurf->SetClip(winsurf, &dreg); - return 0; -} - -static int -DirectFB_UpdateClipRect(SDL_Renderer * renderer) -{ - const SDL_Rect *rect = &renderer->clip_rect; - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - IDirectFBSurface *destsurf = get_dfb_surface(data->window); - DFBRegion region; - - if (!SDL_RectEmpty(rect)) { - region.x1 = rect->x; - region.x2 = rect->x + rect->w; - region.y1 = rect->y; - region.y2 = rect->y + rect->h; - SDL_DFB_CHECKERR(destsurf->SetClip(destsurf, ®ion)); - } else { - SDL_DFB_CHECKERR(destsurf->SetClip(destsurf, NULL)); - } - return 0; - error: - return -1; -} - -static int -DirectFB_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, - Uint32 format, void * pixels, int pitch) -{ - Uint32 sdl_format; - void * laypixels; - int laypitch; - DFBSurfacePixelFormat dfb_format; - DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; - IDirectFBSurface *winsurf = data->target; - - DirectFB_ActivateRenderer(renderer); - - winsurf->GetPixelFormat(winsurf, &dfb_format); - sdl_format = DirectFB_DFBToSDLPixelFormat(dfb_format); - winsurf->Lock(winsurf, DSLF_READ, (void **) &laypixels, &laypitch); - - laypixels += (rect->y * laypitch + rect->x * SDL_BYTESPERPIXEL(sdl_format) ); - SDL_ConvertPixels(rect->w, rect->h, - sdl_format, laypixels, laypitch, - format, pixels, pitch); - - winsurf->Unlock(winsurf); - - return 0; -} - -#if 0 -static int -DirectFB_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect, - Uint32 format, const void * pixels, int pitch) -{ - SDL_Window *window = renderer->window; - SDL_DFB_WINDOWDATA(window); - Uint32 sdl_format; - void * laypixels; - int laypitch; - DFBSurfacePixelFormat dfb_format; - - SDL_DFB_CHECK(windata->surface->GetPixelFormat(windata->surface, &dfb_format)); - sdl_format = DirectFB_DFBToSDLPixelFormat(dfb_format); - - SDL_DFB_CHECK(windata->surface->Lock(windata->surface, DSLF_WRITE, (void **) &laypixels, &laypitch)); - - laypixels += (rect->y * laypitch + rect->x * SDL_BYTESPERPIXEL(sdl_format) ); - SDL_ConvertPixels(rect->w, rect->h, - format, pixels, pitch, - sdl_format, laypixels, laypitch); - - SDL_DFB_CHECK(windata->surface->Unlock(windata->surface)); - - return 0; -} -#endif - -#endif /* SDL_VIDEO_DRIVER_DIRECTFB */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_render.h b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_render.h deleted file mode 100644 index be016b0844b..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_render.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - - -/* SDL surface based renderer implementation */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_shape.c b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_shape.c deleted file mode 100644 index 3239e30214e..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_shape.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DIRECTFB - -#include "SDL_assert.h" -#include "SDL_DirectFB_video.h" -#include "SDL_DirectFB_shape.h" -#include "SDL_DirectFB_window.h" - -#include "../SDL_shape_internals.h" - -SDL_Window* -DirectFB_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags) { - return SDL_CreateWindow(title,x,y,w,h,flags /* | SDL_DFB_WINDOW_SHAPED */); -} - -SDL_WindowShaper* -DirectFB_CreateShaper(SDL_Window* window) { - SDL_WindowShaper* result = NULL; - - result = malloc(sizeof(SDL_WindowShaper)); - result->window = window; - result->mode.mode = ShapeModeDefault; - result->mode.parameters.binarizationCutoff = 1; - result->userx = result->usery = 0; - SDL_ShapeData* data = SDL_malloc(sizeof(SDL_ShapeData)); - result->driverdata = data; - data->surface = NULL; - window->shaper = result; - int resized_properly = DirectFB_ResizeWindowShape(window); - SDL_assert(resized_properly == 0); - - return result; -} - -int -DirectFB_ResizeWindowShape(SDL_Window* window) { - SDL_ShapeData* data = window->shaper->driverdata; - SDL_assert(data != NULL); - - if (window->x != -1000) - { - window->shaper->userx = window->x; - window->shaper->usery = window->y; - } - SDL_SetWindowPosition(window,-1000,-1000); - - return 0; -} - -int -DirectFB_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode) { - - if(shaper == NULL || shape == NULL || shaper->driverdata == NULL) - return -1; - if(shape->format->Amask == 0 && SDL_SHAPEMODEALPHA(shape_mode->mode)) - return -2; - if(shape->w != shaper->window->w || shape->h != shaper->window->h) - return -3; - - { - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(shaper->window); - SDL_DFB_DEVICEDATA(display->device); - Uint32 *pixels; - Sint32 pitch; - Uint32 h,w; - Uint8 *src, *bitmap; - DFBSurfaceDescription dsc; - - SDL_ShapeData *data = shaper->driverdata; - - SDL_DFB_RELEASE(data->surface); - - dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS; - dsc.width = shape->w; - dsc.height = shape->h; - dsc.caps = DSCAPS_PREMULTIPLIED; - dsc.pixelformat = DSPF_ARGB; - - SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc, &data->surface)); - - /* Assume that shaper->alphacutoff already has a value, because SDL_SetWindowShape() should have given it one. */ - SDL_DFB_ALLOC_CLEAR(bitmap, shape->w * shape->h); - SDL_CalculateShapeBitmap(shaper->mode,shape,bitmap,1); - - src = bitmap; - - SDL_DFB_CHECK(data->surface->Lock(data->surface, DSLF_WRITE | DSLF_READ, (void **) &pixels, &pitch)); - - h = shaper->window->h; - while (h--) { - for (w = 0; w < shaper->window->w; w++) { - if (*src) - pixels[w] = 0xFFFFFFFF; - else - pixels[w] = 0; - src++; - - } - pixels += (pitch >> 2); - } - SDL_DFB_CHECK(data->surface->Unlock(data->surface)); - SDL_DFB_FREE(bitmap); - - /* FIXME: Need to call this here - Big ?? */ - DirectFB_WM_RedrawLayout(SDL_GetDisplayForWindow(shaper->window)->device, shaper->window); - } - - return 0; -error: - return -1; -} - -#endif /* SDL_VIDEO_DRIVER_DIRECTFB */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_shape.h b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_shape.h deleted file mode 100644 index 46be39fbf7d..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_shape.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_DirectFB_shape_h -#define _SDL_DirectFB_shape_h - -#include <directfb.h> - -#include "../SDL_sysvideo.h" -#include "SDL_shape.h" - -typedef struct { - IDirectFBSurface *surface; -} SDL_ShapeData; - -extern SDL_Window* DirectFB_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags); -extern SDL_WindowShaper* DirectFB_CreateShaper(SDL_Window* window); -extern int DirectFB_ResizeWindowShape(SDL_Window* window); -extern int DirectFB_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shapeMode); - -#endif /* _SDL_DirectFB_shape_h */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_video.c b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_video.c deleted file mode 100644 index d339dd78e24..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_video.c +++ /dev/null @@ -1,425 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DIRECTFB - -#include "SDL_DirectFB_video.h" - -#include "SDL_DirectFB_events.h" -/* - * #include "SDL_DirectFB_keyboard.h" - */ -#include "SDL_DirectFB_modes.h" -#include "SDL_DirectFB_mouse.h" -#include "SDL_DirectFB_opengl.h" -#include "SDL_DirectFB_window.h" -#include "SDL_DirectFB_WM.h" - - -/* DirectFB video driver implementation. -*/ - -#include <fcntl.h> -#include <unistd.h> -#include <sys/mman.h> - -#include <directfb.h> -#include <directfb_version.h> -#include <directfb_strings.h> - -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../../events/SDL_events_c.h" -#include "SDL_DirectFB_video.h" -#include "SDL_DirectFB_events.h" -#include "SDL_DirectFB_render.h" -#include "SDL_DirectFB_mouse.h" -#include "SDL_DirectFB_shape.h" - - -#include "SDL_DirectFB_dyn.h" - -/* Initialization/Query functions */ -static int DirectFB_VideoInit(_THIS); -static void DirectFB_VideoQuit(_THIS); - -static int DirectFB_Available(void); -static SDL_VideoDevice *DirectFB_CreateDevice(int devindex); - -VideoBootStrap DirectFB_bootstrap = { - "directfb", "DirectFB", - DirectFB_Available, DirectFB_CreateDevice -}; - -static const DirectFBSurfaceDrawingFlagsNames(drawing_flags); -static const DirectFBSurfaceBlittingFlagsNames(blitting_flags); -static const DirectFBAccelerationMaskNames(acceleration_mask); - -/* DirectFB driver bootstrap functions */ - -static int -DirectFB_Available(void) -{ - if (!SDL_DirectFB_LoadLibrary()) - return 0; - SDL_DirectFB_UnLoadLibrary(); - return 1; -} - -static void -DirectFB_DeleteDevice(SDL_VideoDevice * device) -{ - SDL_DirectFB_UnLoadLibrary(); - SDL_DFB_FREE(device->driverdata); - SDL_DFB_FREE(device); -} - -static SDL_VideoDevice * -DirectFB_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - - if (!SDL_DirectFB_LoadLibrary()) { - return NULL; - } - - /* Initialize all variables that we clean on shutdown */ - SDL_DFB_ALLOC_CLEAR(device, sizeof(SDL_VideoDevice)); - - /* Set the function pointers */ - - /* Set the function pointers */ - device->VideoInit = DirectFB_VideoInit; - device->VideoQuit = DirectFB_VideoQuit; - device->GetDisplayModes = DirectFB_GetDisplayModes; - device->SetDisplayMode = DirectFB_SetDisplayMode; - device->PumpEvents = DirectFB_PumpEventsWindow; - device->CreateWindow = DirectFB_CreateWindow; - device->CreateWindowFrom = DirectFB_CreateWindowFrom; - device->SetWindowTitle = DirectFB_SetWindowTitle; - device->SetWindowIcon = DirectFB_SetWindowIcon; - device->SetWindowPosition = DirectFB_SetWindowPosition; - device->SetWindowSize = DirectFB_SetWindowSize; - device->SetWindowOpacity = DirectFB_SetWindowOpacity; - device->ShowWindow = DirectFB_ShowWindow; - device->HideWindow = DirectFB_HideWindow; - device->RaiseWindow = DirectFB_RaiseWindow; - device->MaximizeWindow = DirectFB_MaximizeWindow; - device->MinimizeWindow = DirectFB_MinimizeWindow; - device->RestoreWindow = DirectFB_RestoreWindow; - device->SetWindowGrab = DirectFB_SetWindowGrab; - device->DestroyWindow = DirectFB_DestroyWindow; - device->GetWindowWMInfo = DirectFB_GetWindowWMInfo; - - /* !!! FIXME: implement SetWindowBordered */ - -#if SDL_DIRECTFB_OPENGL - device->GL_LoadLibrary = DirectFB_GL_LoadLibrary; - device->GL_GetProcAddress = DirectFB_GL_GetProcAddress; - device->GL_MakeCurrent = DirectFB_GL_MakeCurrent; - - device->GL_CreateContext = DirectFB_GL_CreateContext; - device->GL_SetSwapInterval = DirectFB_GL_SetSwapInterval; - device->GL_GetSwapInterval = DirectFB_GL_GetSwapInterval; - device->GL_SwapWindow = DirectFB_GL_SwapWindow; - device->GL_DeleteContext = DirectFB_GL_DeleteContext; - -#endif - - /* Shaped window support */ - device->shape_driver.CreateShaper = DirectFB_CreateShaper; - device->shape_driver.SetWindowShape = DirectFB_SetWindowShape; - device->shape_driver.ResizeWindowShape = DirectFB_ResizeWindowShape; - - device->free = DirectFB_DeleteDevice; - - return device; - error: - if (device) - SDL_free(device); - return (0); -} - -static void -DirectFB_DeviceInformation(IDirectFB * dfb) -{ - DFBGraphicsDeviceDescription desc; - int n; - - dfb->GetDeviceDescription(dfb, &desc); - - SDL_DFB_LOG( "DirectFB Device Information"); - SDL_DFB_LOG( "==========================="); - SDL_DFB_LOG( "Name: %s", desc.name); - SDL_DFB_LOG( "Vendor: %s", desc.vendor); - SDL_DFB_LOG( "Driver Name: %s", desc.driver.name); - SDL_DFB_LOG( "Driver Vendor: %s", desc.driver.vendor); - SDL_DFB_LOG( "Driver Version: %d.%d", desc.driver.major, - desc.driver.minor); - - SDL_DFB_LOG( "Video memoory: %d", desc.video_memory); - - SDL_DFB_LOG( "Blitting flags:"); - for (n = 0; blitting_flags[n].flag; n++) { - if (desc.blitting_flags & blitting_flags[n].flag) - SDL_DFB_LOG( " %s", blitting_flags[n].name); - } - - SDL_DFB_LOG( "Drawing flags:"); - for (n = 0; drawing_flags[n].flag; n++) { - if (desc.drawing_flags & drawing_flags[n].flag) - SDL_DFB_LOG( " %s", drawing_flags[n].name); - } - - - SDL_DFB_LOG( "Acceleration flags:"); - for (n = 0; acceleration_mask[n].mask; n++) { - if (desc.acceleration_mask & acceleration_mask[n].mask) - SDL_DFB_LOG( " %s", acceleration_mask[n].name); - } - - -} - -static int readBoolEnv(const char *env_name, int def_val) -{ - char *stemp; - - stemp = SDL_getenv(env_name); - if (stemp) - return atoi(stemp); - else - return def_val; -} - -static int -DirectFB_VideoInit(_THIS) -{ - IDirectFB *dfb = NULL; - DFB_DeviceData *devdata = NULL; - DFBResult ret; - - SDL_DFB_ALLOC_CLEAR(devdata, sizeof(*devdata)); - - SDL_DFB_CHECKERR(DirectFBInit(NULL, NULL)); - - /* avoid switching to the framebuffer when we - * are running X11 */ - ret = readBoolEnv(DFBENV_USE_X11_CHECK , 1); - if (ret) { - if (SDL_getenv("DISPLAY")) - DirectFBSetOption("system", "x11"); - else - DirectFBSetOption("disable-module", "x11input"); - } - - /* FIXME: Reenable as default once multi kbd/mouse interface is sorted out */ - devdata->use_linux_input = readBoolEnv(DFBENV_USE_LINUX_INPUT, 0); /* default: on */ - - if (!devdata->use_linux_input) - { - SDL_DFB_LOG("Disabling linux input\n"); - DirectFBSetOption("disable-module", "linux_input"); - } - - SDL_DFB_CHECKERR(DirectFBCreate(&dfb)); - - DirectFB_DeviceInformation(dfb); - - devdata->use_yuv_underlays = readBoolEnv(DFBENV_USE_YUV_UNDERLAY, 0); /* default: off */ - devdata->use_yuv_direct = readBoolEnv(DFBENV_USE_YUV_DIRECT, 0); /* default is off! */ - - /* Create global Eventbuffer for axis events */ - if (devdata->use_linux_input) { - SDL_DFB_CHECKERR(dfb->CreateInputEventBuffer(dfb, DICAPS_ALL, - DFB_TRUE, - &devdata->events)); - } else { - SDL_DFB_CHECKERR(dfb->CreateInputEventBuffer(dfb, DICAPS_AXES - /* DICAPS_ALL */ , - DFB_TRUE, - &devdata->events)); - } - - /* simple window manager support */ - devdata->has_own_wm = readBoolEnv(DFBENV_USE_WM, 0); - - devdata->initialized = 1; - - devdata->dfb = dfb; - devdata->firstwin = NULL; - devdata->grabbed_window = NULL; - - _this->driverdata = devdata; - - DirectFB_InitModes(_this); - -#if SDL_DIRECTFB_OPENGL - DirectFB_GL_Initialize(_this); -#endif - - DirectFB_InitMouse(_this); - DirectFB_InitKeyboard(_this); - - return 0; - - - error: - SDL_DFB_FREE(devdata); - SDL_DFB_RELEASE(dfb); - return -1; -} - -static void -DirectFB_VideoQuit(_THIS) -{ - DFB_DeviceData *devdata = (DFB_DeviceData *) _this->driverdata; - - DirectFB_QuitModes(_this); - DirectFB_QuitKeyboard(_this); - DirectFB_QuitMouse(_this); - - devdata->events->Reset(devdata->events); - SDL_DFB_RELEASE(devdata->events); - SDL_DFB_RELEASE(devdata->dfb); - -#if SDL_DIRECTFB_OPENGL - DirectFB_GL_Shutdown(_this); -#endif - - devdata->initialized = 0; -} - -/* DirectFB driver general support functions */ - -static const struct { - DFBSurfacePixelFormat dfb; - Uint32 sdl; -} pixelformat_tab[] = -{ - { DSPF_RGB32, SDL_PIXELFORMAT_RGB888 }, /* 24 bit RGB (4 byte, nothing@24, red 8@16, green 8@8, blue 8@0) */ - { DSPF_ARGB, SDL_PIXELFORMAT_ARGB8888 }, /* 32 bit ARGB (4 byte, alpha 8@24, red 8@16, green 8@8, blue 8@0) */ - { DSPF_RGB16, SDL_PIXELFORMAT_RGB565 }, /* 16 bit RGB (2 byte, red 5@11, green 6@5, blue 5@0) */ - { DSPF_RGB332, SDL_PIXELFORMAT_RGB332 }, /* 8 bit RGB (1 byte, red 3@5, green 3@2, blue 2@0) */ - { DSPF_ARGB4444, SDL_PIXELFORMAT_ARGB4444 }, /* 16 bit ARGB (2 byte, alpha 4@12, red 4@8, green 4@4, blue 4@0) */ - { DSPF_ARGB1555, SDL_PIXELFORMAT_ARGB1555 }, /* 16 bit ARGB (2 byte, alpha 1@15, red 5@10, green 5@5, blue 5@0) */ - { DSPF_RGB24, SDL_PIXELFORMAT_RGB24 }, /* 24 bit RGB (3 byte, red 8@16, green 8@8, blue 8@0) */ - { DSPF_RGB444, SDL_PIXELFORMAT_RGB444 }, /* 16 bit RGB (2 byte, nothing @12, red 4@8, green 4@4, blue 4@0) */ - { DSPF_YV12, SDL_PIXELFORMAT_YV12 }, /* 12 bit YUV (8 bit Y plane followed by 8 bit quarter size V/U planes) */ - { DSPF_I420,SDL_PIXELFORMAT_IYUV }, /* 12 bit YUV (8 bit Y plane followed by 8 bit quarter size U/V planes) */ - { DSPF_YUY2, SDL_PIXELFORMAT_YUY2 }, /* 16 bit YUV (4 byte/ 2 pixel, macropixel contains CbYCrY [31:0]) */ - { DSPF_UYVY, SDL_PIXELFORMAT_UYVY }, /* 16 bit YUV (4 byte/ 2 pixel, macropixel contains YCbYCr [31:0]) */ - { DSPF_RGB555, SDL_PIXELFORMAT_RGB555 }, /* 16 bit RGB (2 byte, nothing @15, red 5@10, green 5@5, blue 5@0) */ -#if (ENABLE_LUT8) - { DSPF_LUT8, SDL_PIXELFORMAT_INDEX8 }, /* 8 bit LUT (8 bit color and alpha lookup from palette) */ -#endif - -#if (DFB_VERSION_ATLEAST(1,2,0)) - { DSPF_BGR555, SDL_PIXELFORMAT_BGR555 }, /* 16 bit BGR (2 byte, nothing @15, blue 5@10, green 5@5, red 5@0) */ -#else - { DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR555 }, -#endif - - /* Pfff ... nonmatching formats follow */ - - { DSPF_ALUT44, SDL_PIXELFORMAT_UNKNOWN }, /* 8 bit ALUT (1 byte, alpha 4@4, color lookup 4@0) */ - { DSPF_A8, SDL_PIXELFORMAT_UNKNOWN }, /* 8 bit alpha (1 byte, alpha 8@0), e.g. anti-aliased glyphs */ - { DSPF_AiRGB, SDL_PIXELFORMAT_UNKNOWN }, /* 32 bit ARGB (4 byte, inv. alpha 8@24, red 8@16, green 8@8, blue 8@0) */ - { DSPF_A1, SDL_PIXELFORMAT_UNKNOWN }, /* 1 bit alpha (1 byte/ 8 pixel, most significant bit used first) */ - { DSPF_NV12, SDL_PIXELFORMAT_UNKNOWN }, /* 12 bit YUV (8 bit Y plane followed by one 16 bit quarter size CbCr [15:0] plane) */ - { DSPF_NV16, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit YUV (8 bit Y plane followed by one 16 bit half width CbCr [15:0] plane) */ - { DSPF_ARGB2554, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit ARGB (2 byte, alpha 2@14, red 5@9, green 5@4, blue 4@0) */ - { DSPF_NV21, SDL_PIXELFORMAT_UNKNOWN }, /* 12 bit YUV (8 bit Y plane followed by one 16 bit quarter size CrCb [15:0] plane) */ - { DSPF_AYUV, SDL_PIXELFORMAT_UNKNOWN }, /* 32 bit AYUV (4 byte, alpha 8@24, Y 8@16, Cb 8@8, Cr 8@0) */ - { DSPF_A4, SDL_PIXELFORMAT_UNKNOWN }, /* 4 bit alpha (1 byte/ 2 pixel, more significant nibble used first) */ - { DSPF_ARGB1666, SDL_PIXELFORMAT_UNKNOWN }, /* 1 bit alpha (3 byte/ alpha 1@18, red 6@16, green 6@6, blue 6@0) */ - { DSPF_ARGB6666, SDL_PIXELFORMAT_UNKNOWN }, /* 6 bit alpha (3 byte/ alpha 6@18, red 6@16, green 6@6, blue 6@0) */ - { DSPF_RGB18, SDL_PIXELFORMAT_UNKNOWN }, /* 6 bit RGB (3 byte/ red 6@16, green 6@6, blue 6@0) */ - { DSPF_LUT2, SDL_PIXELFORMAT_UNKNOWN }, /* 2 bit LUT (1 byte/ 4 pixel, 2 bit color and alpha lookup from palette) */ - -#if (DFB_VERSION_ATLEAST(1,3,0)) - { DSPF_RGBA4444, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit RGBA (2 byte, red 4@12, green 4@8, blue 4@4, alpha 4@0) */ -#endif - -#if (DFB_VERSION_ATLEAST(1,4,3)) - { DSPF_RGBA5551, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit RGBA (2 byte, red 5@11, green 5@6, blue 5@1, alpha 1@0) */ - { DSPF_YUV444P, SDL_PIXELFORMAT_UNKNOWN }, /* 24 bit full YUV planar (8 bit Y plane followed by an 8 bit Cb and an 8 bit Cr plane) */ - { DSPF_ARGB8565, SDL_PIXELFORMAT_UNKNOWN }, /* 24 bit ARGB (3 byte, alpha 8@16, red 5@11, green 6@5, blue 5@0) */ - { DSPF_AVYU, SDL_PIXELFORMAT_UNKNOWN }, /* 32 bit AVYU 4:4:4 (4 byte, alpha 8@24, Cr 8@16, Y 8@8, Cb 8@0) */ - { DSPF_VYU, SDL_PIXELFORMAT_UNKNOWN }, /* 24 bit VYU 4:4:4 (3 byte, Cr 8@16, Y 8@8, Cb 8@0) */ -#endif - - { DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX1LSB }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX1MSB }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX4LSB }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX4MSB }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR24 }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR888 }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_RGBA8888 }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_ABGR8888 }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_BGRA8888 }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_ARGB2101010 }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_ABGR4444 }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_ABGR1555 }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR565 }, - { DSPF_UNKNOWN, SDL_PIXELFORMAT_YVYU }, /**< Packed mode: Y0+V0+Y1+U0 (1 pla */ -}; - -Uint32 -DirectFB_DFBToSDLPixelFormat(DFBSurfacePixelFormat pixelformat) -{ - int i; - - for (i=0; pixelformat_tab[i].dfb != DSPF_UNKNOWN; i++) - if (pixelformat_tab[i].dfb == pixelformat) - { - return pixelformat_tab[i].sdl; - } - return SDL_PIXELFORMAT_UNKNOWN; -} - -DFBSurfacePixelFormat -DirectFB_SDLToDFBPixelFormat(Uint32 format) -{ - int i; - - for (i=0; pixelformat_tab[i].dfb != DSPF_UNKNOWN; i++) - if (pixelformat_tab[i].sdl == format) - { - return pixelformat_tab[i].dfb; - } - return DSPF_UNKNOWN; -} - -void DirectFB_SetSupportedPixelFormats(SDL_RendererInfo* ri) -{ - int i, j; - - for (i=0, j=0; pixelformat_tab[i].dfb != DSPF_UNKNOWN; i++) - if (pixelformat_tab[i].sdl != SDL_PIXELFORMAT_UNKNOWN) - ri->texture_formats[j++] = pixelformat_tab[i].sdl; - ri->num_texture_formats = j; -} - -#endif /* SDL_VIDEO_DRIVER_DIRECTFB */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_video.h b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_video.h deleted file mode 100644 index b36ace0dd60..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_video.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#ifndef _SDL_DirectFB_video_h -#define _SDL_DirectFB_video_h - -#include <directfb.h> -#include <directfb_version.h> - -#include "../SDL_sysvideo.h" -#include "SDL_scancode.h" -#include "SDL_render.h" - -#include "SDL_log.h" - -#define DFB_VERSIONNUM(X, Y, Z) \ - ((X)*1000 + (Y)*100 + (Z)) - -#define DFB_COMPILEDVERSION \ - DFB_VERSIONNUM(DIRECTFB_MAJOR_VERSION, DIRECTFB_MINOR_VERSION, DIRECTFB_MICRO_VERSION) - -#define DFB_VERSION_ATLEAST(X, Y, Z) \ - (DFB_COMPILEDVERSION >= DFB_VERSIONNUM(X, Y, Z)) - -#if (DFB_VERSION_ATLEAST(1,0,0)) -#ifdef SDL_VIDEO_OPENGL -#define SDL_DIRECTFB_OPENGL 1 -#endif -#else -#error "SDL_DIRECTFB: Please compile against libdirectfb version >= 1.0.0" -#endif - -/* Set below to 1 to compile with (old) multi mice/keyboard api. Code left in - * in case we see this again ... - */ - -#define USE_MULTI_API (0) - -/* Support for LUT8/INDEX8 pixel format. - * This is broken in DirectFB 1.4.3. It works in 1.4.0 and 1.4.5 - * occurred. - */ - -#if (DFB_COMPILEDVERSION == DFB_VERSIONNUM(1, 4, 3)) -#define ENABLE_LUT8 (0) -#else -#define ENABLE_LUT8 (1) -#endif - -#define DIRECTFB_DEBUG 1 - -#define DFBENV_USE_YUV_UNDERLAY "SDL_DIRECTFB_YUV_UNDERLAY" /* Default: off */ -#define DFBENV_USE_YUV_DIRECT "SDL_DIRECTFB_YUV_DIRECT" /* Default: off */ -#define DFBENV_USE_X11_CHECK "SDL_DIRECTFB_X11_CHECK" /* Default: on */ -#define DFBENV_USE_LINUX_INPUT "SDL_DIRECTFB_LINUX_INPUT" /* Default: on */ -#define DFBENV_USE_WM "SDL_DIRECTFB_WM" /* Default: off */ - -#define SDL_DFB_RELEASE(x) do { if ( (x) != NULL ) { SDL_DFB_CHECK(x->Release(x)); x = NULL; } } while (0) -#define SDL_DFB_FREE(x) do { SDL_free((x)); (x) = NULL; } while (0) -#define SDL_DFB_UNLOCK(x) do { if ( (x) != NULL ) { x->Unlock(x); } } while (0) - -#define SDL_DFB_CONTEXT "SDL_DirectFB" - -#define SDL_DFB_ERR(x...) SDL_LogError(SDL_LOG_CATEGORY_ERROR, x) - -#if (DIRECTFB_DEBUG) -#define SDL_DFB_LOG(x...) SDL_LogInfo(SDL_LOG_CATEGORY_VIDEO, x) - -#define SDL_DFB_DEBUG(x...) SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, x) - -static SDL_INLINE DFBResult sdl_dfb_check(DFBResult ret, const char *src_file, int src_line) { - if (ret != DFB_OK) { - SDL_DFB_LOG("%s (%d):%s", src_file, src_line, DirectFBErrorString (ret) ); - SDL_SetError("%s:%s", SDL_DFB_CONTEXT, DirectFBErrorString (ret) ); - } - return ret; -} - -#define SDL_DFB_CHECK(x...) do { sdl_dfb_check( x, __FILE__, __LINE__); } while (0) -#define SDL_DFB_CHECKERR(x...) do { if ( sdl_dfb_check( x, __FILE__, __LINE__) != DFB_OK ) goto error; } while (0) - -#else - -#define SDL_DFB_CHECK(x...) x -#define SDL_DFB_CHECKERR(x...) do { if (x != DFB_OK ) goto error; } while (0) -#define SDL_DFB_LOG(x...) do {} while (0) -#define SDL_DFB_DEBUG(x...) do {} while (0) - -#endif - - -#define SDL_DFB_CALLOC(r, n, s) \ - do { \ - r = SDL_calloc (n, s); \ - if (!(r)) { \ - SDL_DFB_ERR("Out of memory"); \ - SDL_OutOfMemory(); \ - goto error; \ - } \ - } while (0) - -#define SDL_DFB_ALLOC_CLEAR(r, s) SDL_DFB_CALLOC(r, 1, s) - -/* Private display data */ - -#define SDL_DFB_DEVICEDATA(dev) DFB_DeviceData *devdata = (dev ? (DFB_DeviceData *) ((dev)->driverdata) : NULL) - -#define DFB_MAX_SCREENS 10 - -typedef struct _DFB_KeyboardData DFB_KeyboardData; -struct _DFB_KeyboardData -{ - const SDL_Scancode *map; /* keyboard scancode map */ - int map_size; /* size of map */ - int map_adjust; /* index adjust */ - int is_generic; /* generic keyboard */ - int id; -}; - -typedef struct _DFB_DeviceData DFB_DeviceData; -struct _DFB_DeviceData -{ - int initialized; - - IDirectFB *dfb; - int num_mice; - int mouse_id[0x100]; - int num_keyboard; - DFB_KeyboardData keyboard[10]; - SDL_Window *firstwin; - - int use_yuv_underlays; - int use_yuv_direct; - int use_linux_input; - int has_own_wm; - - - /* window grab */ - SDL_Window *grabbed_window; - - /* global events */ - IDirectFBEventBuffer *events; -}; - -Uint32 DirectFB_DFBToSDLPixelFormat(DFBSurfacePixelFormat pixelformat); -DFBSurfacePixelFormat DirectFB_SDLToDFBPixelFormat(Uint32 format); -void DirectFB_SetSupportedPixelFormats(SDL_RendererInfo *ri); - - -#endif /* _SDL_DirectFB_video_h */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_window.c b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_window.c deleted file mode 100644 index 40bbe6aee2a..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_window.c +++ /dev/null @@ -1,545 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DIRECTFB - -#include "SDL_DirectFB_video.h" -#include "SDL_DirectFB_modes.h" -#include "SDL_DirectFB_window.h" -#include "SDL_DirectFB_shape.h" - -#if SDL_DIRECTFB_OPENGL -#include "SDL_DirectFB_opengl.h" -#endif - -#include "SDL_syswm.h" - -#include "../SDL_pixels_c.h" - -int -DirectFB_CreateWindow(_THIS, SDL_Window * window) -{ - SDL_DFB_DEVICEDATA(_this); - SDL_DFB_DISPLAYDATA(window); - DFB_WindowData *windata = NULL; - DFBWindowOptions wopts; - DFBWindowDescription desc; - int x, y; - int bshaped = 0; - - SDL_DFB_ALLOC_CLEAR(window->driverdata, sizeof(DFB_WindowData)); - SDL_memset(&desc, 0, sizeof(DFBWindowDescription)); - windata = (DFB_WindowData *) window->driverdata; - - windata->is_managed = devdata->has_own_wm; -#if 1 - SDL_DFB_CHECKERR(devdata->dfb->SetCooperativeLevel(devdata->dfb, - DFSCL_NORMAL)); - SDL_DFB_CHECKERR(dispdata->layer->SetCooperativeLevel(dispdata->layer, - DLSCL_ADMINISTRATIVE)); -#endif - /* FIXME ... ughh, ugly */ - if (window->x == -1000 && window->y == -1000) - bshaped = 1; - - /* Fill the window description. */ - x = window->x; - y = window->y; - - DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h); - - /* Create Window */ - desc.caps = 0; - desc.flags = - DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_POSX | DWDESC_POSY | DWDESC_SURFACE_CAPS; - - if (bshaped) { - desc.flags |= DWDESC_CAPS; - desc.caps |= DWCAPS_ALPHACHANNEL; - } - else - { - desc.flags |= DWDESC_PIXELFORMAT; - } - - if (!(window->flags & SDL_WINDOW_BORDERLESS)) - desc.caps |= DWCAPS_NODECORATION; - - desc.posx = x; - desc.posy = y; - desc.width = windata->size.w; - desc.height = windata->size.h; - desc.pixelformat = dispdata->pixelformat; - desc.surface_caps = DSCAPS_PREMULTIPLIED; -#if DIRECTFB_MAJOR_VERSION == 1 && DIRECTFB_MINOR_VERSION >= 6 - if (window->flags & SDL_WINDOW_OPENGL) { - desc.surface_caps |= DSCAPS_GL; - } -#endif - - /* Create the window. */ - SDL_DFB_CHECKERR(dispdata->layer->CreateWindow(dispdata->layer, &desc, - &windata->dfbwin)); - - /* Set Options */ - SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts)); - - /* explicit rescaling of surface */ - wopts |= DWOP_SCALE; - if (window->flags & SDL_WINDOW_RESIZABLE) { - wopts &= ~DWOP_KEEP_SIZE; - } - else { - wopts |= DWOP_KEEP_SIZE; - } - - if (window->flags & SDL_WINDOW_FULLSCREEN) { - wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_STACKING | DWOP_KEEP_SIZE; - SDL_DFB_CHECK(windata->dfbwin->SetStackingClass(windata->dfbwin, DWSC_UPPER)); - } - - if (bshaped) { - wopts |= DWOP_SHAPED | DWOP_ALPHACHANNEL; - wopts &= ~DWOP_OPAQUE_REGION; - } - - SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts)); - - /* See what we got */ - SDL_DFB_CHECK(DirectFB_WM_GetClientSize - (_this, window, &window->w, &window->h)); - - /* Get the window's surface. */ - SDL_DFB_CHECKERR(windata->dfbwin->GetSurface(windata->dfbwin, - &windata->window_surface)); - - /* And get a subsurface for rendering */ - SDL_DFB_CHECKERR(windata->window_surface-> - GetSubSurface(windata->window_surface, &windata->client, - &windata->surface)); - - SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0xFF)); - - /* Create Eventbuffer */ - - SDL_DFB_CHECKERR(windata->dfbwin->CreateEventBuffer(windata->dfbwin, - &windata-> - eventbuffer)); - SDL_DFB_CHECKERR(windata->dfbwin-> - EnableEvents(windata->dfbwin, DWET_ALL)); - - /* Create a font */ - /* FIXME: once during Video_Init */ - windata->font = NULL; - - /* Make it the top most window. */ - SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin)); - - /* remember parent */ - /* windata->sdlwin = window; */ - - /* Add to list ... */ - - windata->next = devdata->firstwin; - windata->opacity = 0xFF; - devdata->firstwin = window; - - /* Draw Frame */ - DirectFB_WM_RedrawLayout(_this, window); - - return 0; - error: - SDL_DFB_RELEASE(windata->surface); - SDL_DFB_RELEASE(windata->dfbwin); - return -1; -} - -int -DirectFB_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) -{ - return SDL_Unsupported(); -} - -void -DirectFB_SetWindowTitle(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - - if (windata->is_managed) { - windata->wm_needs_redraw = 1; - DirectFB_WM_RedrawLayout(_this, window); - } else { - SDL_Unsupported(); - } -} - -void -DirectFB_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) -{ - SDL_DFB_DEVICEDATA(_this); - SDL_DFB_WINDOWDATA(window); - SDL_Surface *surface = NULL; - - if (icon) { - SDL_PixelFormat format; - DFBSurfaceDescription dsc; - Uint32 *dest; - Uint32 *p; - int pitch, i; - - /* Convert the icon to ARGB for modern window managers */ - SDL_InitFormat(&format, SDL_PIXELFORMAT_ARGB8888); - surface = SDL_ConvertSurface(icon, &format, 0); - if (!surface) { - return; - } - dsc.flags = - DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS; - dsc.caps = DSCAPS_VIDEOONLY; - dsc.width = surface->w; - dsc.height = surface->h; - dsc.pixelformat = DSPF_ARGB; - - SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc, - &windata->icon)); - - SDL_DFB_CHECKERR(windata->icon->Lock(windata->icon, DSLF_WRITE, - (void *) &dest, &pitch)); - - p = surface->pixels; - for (i = 0; i < surface->h; i++) - memcpy((char *) dest + i * pitch, - (char *) p + i * surface->pitch, 4 * surface->w); - - SDL_DFB_CHECK(windata->icon->Unlock(windata->icon)); - SDL_FreeSurface(surface); - } else { - SDL_DFB_RELEASE(windata->icon); - } - return; - error: - SDL_FreeSurface(surface); - SDL_DFB_RELEASE(windata->icon); - return; -} - -void -DirectFB_SetWindowPosition(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - int x, y; - - x = window->x; - y = window->y; - - DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h); - SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, x, y)); -} - -void -DirectFB_SetWindowSize(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - - if(SDL_IsShapedWindow(window)) - DirectFB_ResizeWindowShape(window); - - if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { - int cw; - int ch; - - /* Make sure all events are disabled for this operation ! */ - SDL_DFB_CHECKERR(windata->dfbwin->DisableEvents(windata->dfbwin, - DWET_ALL)); - SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize(_this, window, &cw, &ch)); - - if (cw != window->w || ch != window->h) { - - DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h); - SDL_DFB_CHECKERR(windata->dfbwin->Resize(windata->dfbwin, - windata->size.w, - windata->size.h)); - } - - SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize - (_this, window, &window->w, &window->h)); - DirectFB_AdjustWindowSurface(window); - - SDL_DFB_CHECKERR(windata->dfbwin->EnableEvents(windata->dfbwin, - DWET_ALL)); - - } - return; - error: - SDL_DFB_CHECK(windata->dfbwin->EnableEvents(windata->dfbwin, DWET_ALL)); - return; -} - -void -DirectFB_ShowWindow(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - - SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, windata->opacity)); - -} - -void -DirectFB_HideWindow(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - - SDL_DFB_CHECK(windata->dfbwin->GetOpacity(windata->dfbwin, &windata->opacity)); - SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0)); -} - -void -DirectFB_RaiseWindow(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - - SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin)); - SDL_DFB_CHECK(windata->dfbwin->RequestFocus(windata->dfbwin)); -} - -void -DirectFB_MaximizeWindow(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - DFBWindowOptions wopts; - - SDL_DFB_CHECK(windata->dfbwin->GetPosition(windata->dfbwin, - &windata->restore.x, &windata->restore.y)); - SDL_DFB_CHECK(windata->dfbwin->GetSize(windata->dfbwin, &windata->restore.w, - &windata->restore.h)); - - DirectFB_WM_AdjustWindowLayout(window, window->flags | SDL_WINDOW_MAXIMIZED, display->current_mode.w, display->current_mode.h) ; - - SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, 0, 0)); - SDL_DFB_CHECK(windata->dfbwin->Resize(windata->dfbwin, - display->current_mode.w, display->current_mode.h)); - - /* Set Options */ - SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts)); - wopts |= DWOP_KEEP_SIZE | DWOP_KEEP_POSITION; - SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts)); -} - -void -DirectFB_MinimizeWindow(_THIS, SDL_Window * window) -{ - /* FIXME: Size to 32x32 ? */ - - SDL_Unsupported(); -} - -void -DirectFB_RestoreWindow(_THIS, SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - DFBWindowOptions wopts; - - /* Set Options */ - SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts)); - wopts &= ~(DWOP_KEEP_SIZE | DWOP_KEEP_POSITION); - SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts)); - - /* Window layout */ - DirectFB_WM_AdjustWindowLayout(window, window->flags & ~(SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED), - windata->restore.w, windata->restore.h); - SDL_DFB_CHECK(windata->dfbwin->Resize(windata->dfbwin, windata->restore.w, - windata->restore.h)); - SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, windata->restore.x, - windata->restore.y)); - - if (!(window->flags & SDL_WINDOW_RESIZABLE)) - wopts |= DWOP_KEEP_SIZE; - - if (window->flags & SDL_WINDOW_FULLSCREEN) - wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_SIZE; - SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts)); - - -} - -void -DirectFB_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) -{ - SDL_DFB_DEVICEDATA(_this); - SDL_DFB_WINDOWDATA(window); - DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) : NULL); - - if ((window->flags & SDL_WINDOW_INPUT_GRABBED)) { - if (gwindata != NULL) - { - SDL_DFB_CHECK(gwindata->dfbwin->UngrabPointer(gwindata->dfbwin)); - SDL_DFB_CHECK(gwindata->dfbwin->UngrabKeyboard(gwindata->dfbwin)); - } - SDL_DFB_CHECK(windata->dfbwin->GrabPointer(windata->dfbwin)); - SDL_DFB_CHECK(windata->dfbwin->GrabKeyboard(windata->dfbwin)); - devdata->grabbed_window = window; - } else { - SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin)); - SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin)); - devdata->grabbed_window = NULL; - } -} - -void -DirectFB_DestroyWindow(_THIS, SDL_Window * window) -{ - SDL_DFB_DEVICEDATA(_this); - SDL_DFB_WINDOWDATA(window); - DFB_WindowData *p; - - /* Some cleanups */ - SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin)); - SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin)); - -#if SDL_DIRECTFB_OPENGL - DirectFB_GL_DestroyWindowContexts(_this, window); -#endif - - if (window->shaper) - { - SDL_ShapeData *data = window->shaper->driverdata; - SDL_DFB_CHECK(data->surface->ReleaseSource(data->surface)); - SDL_DFB_RELEASE(data->surface); - SDL_DFB_FREE(data); - SDL_DFB_FREE(window->shaper); - } - - SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, NULL)); - SDL_DFB_CHECK(windata->surface->ReleaseSource(windata->surface)); - SDL_DFB_CHECK(windata->window_surface->ReleaseSource(windata->window_surface)); - SDL_DFB_RELEASE(windata->icon); - SDL_DFB_RELEASE(windata->font); - SDL_DFB_RELEASE(windata->eventbuffer); - SDL_DFB_RELEASE(windata->surface); - SDL_DFB_RELEASE(windata->window_surface); - - SDL_DFB_RELEASE(windata->dfbwin); - - /* Remove from list ... */ - - p = devdata->firstwin->driverdata; - - while (p && p->next != window) - p = (p->next ? p->next->driverdata : NULL); - if (p) - p->next = windata->next; - else - devdata->firstwin = windata->next; - SDL_free(windata); - return; -} - -SDL_bool -DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo * info) -{ - SDL_DFB_DEVICEDATA(_this); - SDL_DFB_WINDOWDATA(window); - - if (info->version.major == SDL_MAJOR_VERSION && - info->version.minor == SDL_MINOR_VERSION) { - info->subsystem = SDL_SYSWM_DIRECTFB; - info->info.dfb.dfb = devdata->dfb; - info->info.dfb.window = windata->dfbwin; - info->info.dfb.surface = windata->surface; - return SDL_TRUE; - } else { - SDL_SetError("Application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } -} - -void -DirectFB_AdjustWindowSurface(SDL_Window * window) -{ - SDL_DFB_WINDOWDATA(window); - int adjust = windata->wm_needs_redraw; - int cw, ch; - - DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h); - - SDL_DFB_CHECKERR(windata-> - window_surface->GetSize(windata->window_surface, &cw, - &ch)); - if (cw != windata->size.w || ch != windata->size.h) { - adjust = 1; - } - - if (adjust) { -#if SDL_DIRECTFB_OPENGL - DirectFB_GL_FreeWindowContexts(SDL_GetVideoDevice(), window); -#endif - -#if (DFB_VERSION_ATLEAST(1,2,1)) - SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin, - windata->size.w, - windata->size.h)); - SDL_DFB_CHECKERR(windata->surface->MakeSubSurface(windata->surface, - windata-> - window_surface, - &windata->client)); -#else - DFBWindowOptions opts; - - SDL_DFB_CHECKERR(windata->dfbwin->GetOptions(windata->dfbwin, &opts)); - /* recreate subsurface */ - SDL_DFB_RELEASE(windata->surface); - - if (opts & DWOP_SCALE) - SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin, - windata->size.w, - windata->size.h)); - SDL_DFB_CHECKERR(windata->window_surface-> - GetSubSurface(windata->window_surface, - &windata->client, &windata->surface)); -#endif - DirectFB_WM_RedrawLayout(SDL_GetVideoDevice(), window); - -#if SDL_DIRECTFB_OPENGL - DirectFB_GL_ReAllocWindowContexts(SDL_GetVideoDevice(), window); -#endif - } - error: - return; -} - -int -DirectFB_SetWindowOpacity(_THIS, SDL_Window * window, float opacity) -{ - const Uint8 alpha = (Uint8) ((unsigned int) (opacity * 255.0f)); - SDL_DFB_WINDOWDATA(window); - SDL_DFB_CHECKERR(windata->dfbwin->SetOpacity(windata->dfbwin, alpha)); - windata->opacity = alpha; - return 0; - -error: - return -1; -} - -#endif /* SDL_VIDEO_DRIVER_DIRECTFB */ diff --git a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_window.h b/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_window.h deleted file mode 100644 index 4b997081227..00000000000 --- a/3rdparty/SDL2/src/video/directfb/SDL_DirectFB_window.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_directfb_window_h -#define _SDL_directfb_window_h - -#include "SDL_DirectFB_video.h" -#include "SDL_DirectFB_WM.h" - -#define SDL_DFB_WINDOWDATA(win) DFB_WindowData *windata = ((win) ? (DFB_WindowData *) ((win)->driverdata) : NULL) - -typedef struct _DFB_WindowData DFB_WindowData; -struct _DFB_WindowData -{ - IDirectFBSurface *window_surface; /* window surface */ - IDirectFBSurface *surface; /* client drawing surface */ - IDirectFBWindow *dfbwin; - IDirectFBEventBuffer *eventbuffer; - /* SDL_Window *sdlwin; */ - SDL_Window *next; - Uint8 opacity; - DFBRectangle client; - DFBDimension size; - DFBRectangle restore; - - /* WM extras */ - int is_managed; - int wm_needs_redraw; - IDirectFBSurface *icon; - IDirectFBFont *font; - DFB_Theme theme; - - /* WM moving and sizing */ - int wm_grab; - int wm_lastx; - int wm_lasty; -}; - -extern int DirectFB_CreateWindow(_THIS, SDL_Window * window); -extern int DirectFB_CreateWindowFrom(_THIS, SDL_Window * window, - const void *data); -extern void DirectFB_SetWindowTitle(_THIS, SDL_Window * window); -extern void DirectFB_SetWindowIcon(_THIS, SDL_Window * window, - SDL_Surface * icon); - -extern void DirectFB_SetWindowPosition(_THIS, SDL_Window * window); -extern void DirectFB_SetWindowSize(_THIS, SDL_Window * window); -extern void DirectFB_ShowWindow(_THIS, SDL_Window * window); -extern void DirectFB_HideWindow(_THIS, SDL_Window * window); -extern void DirectFB_RaiseWindow(_THIS, SDL_Window * window); -extern void DirectFB_MaximizeWindow(_THIS, SDL_Window * window); -extern void DirectFB_MinimizeWindow(_THIS, SDL_Window * window); -extern void DirectFB_RestoreWindow(_THIS, SDL_Window * window); -extern void DirectFB_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed); -extern void DirectFB_DestroyWindow(_THIS, SDL_Window * window); -extern SDL_bool DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo *info); - -extern void DirectFB_AdjustWindowSurface(SDL_Window * window); -extern int DirectFB_SetWindowOpacity(_THIS, SDL_Window * window, float opacity); - -#endif /* _SDL_directfb_window_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/dummy/SDL_nullevents.c b/3rdparty/SDL2/src/video/dummy/SDL_nullevents.c deleted file mode 100644 index a5a94430457..00000000000 --- a/3rdparty/SDL2/src/video/dummy/SDL_nullevents.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DUMMY - -/* Being a null driver, there's no event stream. We just define stubs for - most of the API. */ - -#include "../../events/SDL_events_c.h" - -#include "SDL_nullvideo.h" -#include "SDL_nullevents_c.h" - -void -DUMMY_PumpEvents(_THIS) -{ - /* do nothing. */ -} - -#endif /* SDL_VIDEO_DRIVER_DUMMY */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/dummy/SDL_nullevents_c.h b/3rdparty/SDL2/src/video/dummy/SDL_nullevents_c.h deleted file mode 100644 index d2f78698d50..00000000000 --- a/3rdparty/SDL2/src/video/dummy/SDL_nullevents_c.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#include "SDL_nullvideo.h" - -extern void DUMMY_PumpEvents(_THIS); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/dummy/SDL_nullframebuffer.c b/3rdparty/SDL2/src/video/dummy/SDL_nullframebuffer.c deleted file mode 100644 index 01c8a5abb29..00000000000 --- a/3rdparty/SDL2/src/video/dummy/SDL_nullframebuffer.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DUMMY - -#include "../SDL_sysvideo.h" -#include "SDL_nullframebuffer_c.h" - - -#define DUMMY_SURFACE "_SDL_DummySurface" - -int SDL_DUMMY_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch) -{ - SDL_Surface *surface; - const Uint32 surface_format = SDL_PIXELFORMAT_RGB888; - int w, h; - int bpp; - Uint32 Rmask, Gmask, Bmask, Amask; - - /* Free the old framebuffer surface */ - surface = (SDL_Surface *) SDL_GetWindowData(window, DUMMY_SURFACE); - SDL_FreeSurface(surface); - - /* Create a new one */ - SDL_PixelFormatEnumToMasks(surface_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); - SDL_GetWindowSize(window, &w, &h); - surface = SDL_CreateRGBSurface(0, w, h, bpp, Rmask, Gmask, Bmask, Amask); - if (!surface) { - return -1; - } - - /* Save the info and return! */ - SDL_SetWindowData(window, DUMMY_SURFACE, surface); - *format = surface_format; - *pixels = surface->pixels; - *pitch = surface->pitch; - return 0; -} - -int SDL_DUMMY_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects) -{ - static int frame_number; - SDL_Surface *surface; - - surface = (SDL_Surface *) SDL_GetWindowData(window, DUMMY_SURFACE); - if (!surface) { - return SDL_SetError("Couldn't find dummy surface for window"); - } - - /* Send the data to the display */ - if (SDL_getenv("SDL_VIDEO_DUMMY_SAVE_FRAMES")) { - char file[128]; - SDL_snprintf(file, sizeof(file), "SDL_window%d-%8.8d.bmp", - SDL_GetWindowID(window), ++frame_number); - SDL_SaveBMP(surface, file); - } - return 0; -} - -void SDL_DUMMY_DestroyWindowFramebuffer(_THIS, SDL_Window * window) -{ - SDL_Surface *surface; - - surface = (SDL_Surface *) SDL_SetWindowData(window, DUMMY_SURFACE, NULL); - SDL_FreeSurface(surface); -} - -#endif /* SDL_VIDEO_DRIVER_DUMMY */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/dummy/SDL_nullframebuffer_c.h b/3rdparty/SDL2/src/video/dummy/SDL_nullframebuffer_c.h deleted file mode 100644 index 37d198f90e9..00000000000 --- a/3rdparty/SDL2/src/video/dummy/SDL_nullframebuffer_c.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -extern int SDL_DUMMY_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch); -extern int SDL_DUMMY_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects); -extern void SDL_DUMMY_DestroyWindowFramebuffer(_THIS, SDL_Window * window); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/dummy/SDL_nullvideo.c b/3rdparty/SDL2/src/video/dummy/SDL_nullvideo.c deleted file mode 100644 index 96f47813ade..00000000000 --- a/3rdparty/SDL2/src/video/dummy/SDL_nullvideo.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_DUMMY - -/* Dummy SDL video driver implementation; this is just enough to make an - * SDL-based application THINK it's got a working video driver, for - * applications that call SDL_Init(SDL_INIT_VIDEO) when they don't need it, - * and also for use as a collection of stubs when porting SDL to a new - * platform for which you haven't yet written a valid video driver. - * - * This is also a great way to determine bottlenecks: if you think that SDL - * is a performance problem for a given platform, enable this driver, and - * then see if your application runs faster without video overhead. - * - * Initial work by Ryan C. Gordon (icculus@icculus.org). A good portion - * of this was cut-and-pasted from Stephane Peter's work in the AAlib - * SDL video driver. Renamed to "DUMMY" by Sam Lantinga. - */ - -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../../events/SDL_events_c.h" - -#include "SDL_nullvideo.h" -#include "SDL_nullevents_c.h" -#include "SDL_nullframebuffer_c.h" - -#define DUMMYVID_DRIVER_NAME "dummy" - -/* Initialization/Query functions */ -static int DUMMY_VideoInit(_THIS); -static int DUMMY_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -static void DUMMY_VideoQuit(_THIS); - -/* DUMMY driver bootstrap functions */ - -static int -DUMMY_Available(void) -{ - const char *envr = SDL_getenv("SDL_VIDEODRIVER"); - if ((envr) && (SDL_strcmp(envr, DUMMYVID_DRIVER_NAME) == 0)) { - return (1); - } - - return (0); -} - -static void -DUMMY_DeleteDevice(SDL_VideoDevice * device) -{ - SDL_free(device); -} - -static SDL_VideoDevice * -DUMMY_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (!device) { - SDL_OutOfMemory(); - return (0); - } - - /* Set the function pointers */ - device->VideoInit = DUMMY_VideoInit; - device->VideoQuit = DUMMY_VideoQuit; - device->SetDisplayMode = DUMMY_SetDisplayMode; - device->PumpEvents = DUMMY_PumpEvents; - device->CreateWindowFramebuffer = SDL_DUMMY_CreateWindowFramebuffer; - device->UpdateWindowFramebuffer = SDL_DUMMY_UpdateWindowFramebuffer; - device->DestroyWindowFramebuffer = SDL_DUMMY_DestroyWindowFramebuffer; - - device->free = DUMMY_DeleteDevice; - - return device; -} - -VideoBootStrap DUMMY_bootstrap = { - DUMMYVID_DRIVER_NAME, "SDL dummy video driver", - DUMMY_Available, DUMMY_CreateDevice -}; - - -int -DUMMY_VideoInit(_THIS) -{ - SDL_DisplayMode mode; - - /* Use a fake 32-bpp desktop mode */ - mode.format = SDL_PIXELFORMAT_RGB888; - mode.w = 1024; - mode.h = 768; - mode.refresh_rate = 0; - mode.driverdata = NULL; - if (SDL_AddBasicVideoDisplay(&mode) < 0) { - return -1; - } - - SDL_zero(mode); - SDL_AddDisplayMode(&_this->displays[0], &mode); - - /* We're done! */ - return 0; -} - -static int -DUMMY_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - return 0; -} - -void -DUMMY_VideoQuit(_THIS) -{ -} - -#endif /* SDL_VIDEO_DRIVER_DUMMY */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/dummy/SDL_nullvideo.h b/3rdparty/SDL2/src/video/dummy/SDL_nullvideo.h deleted file mode 100644 index 0126ba1837b..00000000000 --- a/3rdparty/SDL2/src/video/dummy/SDL_nullvideo.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_nullvideo_h -#define _SDL_nullvideo_h - -#include "../SDL_sysvideo.h" - -#endif /* _SDL_nullvideo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenevents.c b/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenevents.c deleted file mode 100644 index a4720e40224..00000000000 --- a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenevents.c +++ /dev/null @@ -1,680 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_EMSCRIPTEN - -#include <emscripten/html5.h> - -#include "../../events/SDL_events_c.h" -#include "../../events/SDL_keyboard_c.h" -#include "../../events/SDL_touch_c.h" - -#include "SDL_emscriptenevents.h" -#include "SDL_emscriptenvideo.h" - -#include "SDL_hints.h" - -#define FULLSCREEN_MASK ( SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN ) - -/* -.keyCode to scancode -https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent -https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode -*/ -static const SDL_Scancode emscripten_scancode_table[] = { - /* 0 */ SDL_SCANCODE_UNKNOWN, - /* 1 */ SDL_SCANCODE_UNKNOWN, - /* 2 */ SDL_SCANCODE_UNKNOWN, - /* 3 */ SDL_SCANCODE_CANCEL, - /* 4 */ SDL_SCANCODE_UNKNOWN, - /* 5 */ SDL_SCANCODE_UNKNOWN, - /* 6 */ SDL_SCANCODE_HELP, - /* 7 */ SDL_SCANCODE_UNKNOWN, - /* 8 */ SDL_SCANCODE_BACKSPACE, - /* 9 */ SDL_SCANCODE_TAB, - /* 10 */ SDL_SCANCODE_UNKNOWN, - /* 11 */ SDL_SCANCODE_UNKNOWN, - /* 12 */ SDL_SCANCODE_UNKNOWN, - /* 13 */ SDL_SCANCODE_RETURN, - /* 14 */ SDL_SCANCODE_UNKNOWN, - /* 15 */ SDL_SCANCODE_UNKNOWN, - /* 16 */ SDL_SCANCODE_LSHIFT, - /* 17 */ SDL_SCANCODE_LCTRL, - /* 18 */ SDL_SCANCODE_LALT, - /* 19 */ SDL_SCANCODE_PAUSE, - /* 20 */ SDL_SCANCODE_CAPSLOCK, - /* 21 */ SDL_SCANCODE_UNKNOWN, - /* 22 */ SDL_SCANCODE_UNKNOWN, - /* 23 */ SDL_SCANCODE_UNKNOWN, - /* 24 */ SDL_SCANCODE_UNKNOWN, - /* 25 */ SDL_SCANCODE_UNKNOWN, - /* 26 */ SDL_SCANCODE_UNKNOWN, - /* 27 */ SDL_SCANCODE_ESCAPE, - /* 28 */ SDL_SCANCODE_UNKNOWN, - /* 29 */ SDL_SCANCODE_UNKNOWN, - /* 30 */ SDL_SCANCODE_UNKNOWN, - /* 31 */ SDL_SCANCODE_UNKNOWN, - /* 32 */ SDL_SCANCODE_SPACE, - /* 33 */ SDL_SCANCODE_PAGEUP, - /* 34 */ SDL_SCANCODE_PAGEDOWN, - /* 35 */ SDL_SCANCODE_END, - /* 36 */ SDL_SCANCODE_HOME, - /* 37 */ SDL_SCANCODE_LEFT, - /* 38 */ SDL_SCANCODE_UP, - /* 39 */ SDL_SCANCODE_RIGHT, - /* 40 */ SDL_SCANCODE_DOWN, - /* 41 */ SDL_SCANCODE_UNKNOWN, - /* 42 */ SDL_SCANCODE_UNKNOWN, - /* 43 */ SDL_SCANCODE_UNKNOWN, - /* 44 */ SDL_SCANCODE_UNKNOWN, - /* 45 */ SDL_SCANCODE_INSERT, - /* 46 */ SDL_SCANCODE_DELETE, - /* 47 */ SDL_SCANCODE_UNKNOWN, - /* 48 */ SDL_SCANCODE_0, - /* 49 */ SDL_SCANCODE_1, - /* 50 */ SDL_SCANCODE_2, - /* 51 */ SDL_SCANCODE_3, - /* 52 */ SDL_SCANCODE_4, - /* 53 */ SDL_SCANCODE_5, - /* 54 */ SDL_SCANCODE_6, - /* 55 */ SDL_SCANCODE_7, - /* 56 */ SDL_SCANCODE_8, - /* 57 */ SDL_SCANCODE_9, - /* 58 */ SDL_SCANCODE_UNKNOWN, - /* 59 */ SDL_SCANCODE_SEMICOLON, - /* 60 */ SDL_SCANCODE_UNKNOWN, - /* 61 */ SDL_SCANCODE_EQUALS, - /* 62 */ SDL_SCANCODE_UNKNOWN, - /* 63 */ SDL_SCANCODE_UNKNOWN, - /* 64 */ SDL_SCANCODE_UNKNOWN, - /* 65 */ SDL_SCANCODE_A, - /* 66 */ SDL_SCANCODE_B, - /* 67 */ SDL_SCANCODE_C, - /* 68 */ SDL_SCANCODE_D, - /* 69 */ SDL_SCANCODE_E, - /* 70 */ SDL_SCANCODE_F, - /* 71 */ SDL_SCANCODE_G, - /* 72 */ SDL_SCANCODE_H, - /* 73 */ SDL_SCANCODE_I, - /* 74 */ SDL_SCANCODE_J, - /* 75 */ SDL_SCANCODE_K, - /* 76 */ SDL_SCANCODE_L, - /* 77 */ SDL_SCANCODE_M, - /* 78 */ SDL_SCANCODE_N, - /* 79 */ SDL_SCANCODE_O, - /* 80 */ SDL_SCANCODE_P, - /* 81 */ SDL_SCANCODE_Q, - /* 82 */ SDL_SCANCODE_R, - /* 83 */ SDL_SCANCODE_S, - /* 84 */ SDL_SCANCODE_T, - /* 85 */ SDL_SCANCODE_U, - /* 86 */ SDL_SCANCODE_V, - /* 87 */ SDL_SCANCODE_W, - /* 88 */ SDL_SCANCODE_X, - /* 89 */ SDL_SCANCODE_Y, - /* 90 */ SDL_SCANCODE_Z, - /* 91 */ SDL_SCANCODE_LGUI, - /* 92 */ SDL_SCANCODE_UNKNOWN, - /* 93 */ SDL_SCANCODE_APPLICATION, - /* 94 */ SDL_SCANCODE_UNKNOWN, - /* 95 */ SDL_SCANCODE_UNKNOWN, - /* 96 */ SDL_SCANCODE_KP_0, - /* 97 */ SDL_SCANCODE_KP_1, - /* 98 */ SDL_SCANCODE_KP_2, - /* 99 */ SDL_SCANCODE_KP_3, - /* 100 */ SDL_SCANCODE_KP_4, - /* 101 */ SDL_SCANCODE_KP_5, - /* 102 */ SDL_SCANCODE_KP_6, - /* 103 */ SDL_SCANCODE_KP_7, - /* 104 */ SDL_SCANCODE_KP_8, - /* 105 */ SDL_SCANCODE_KP_9, - /* 106 */ SDL_SCANCODE_KP_MULTIPLY, - /* 107 */ SDL_SCANCODE_KP_PLUS, - /* 108 */ SDL_SCANCODE_UNKNOWN, - /* 109 */ SDL_SCANCODE_KP_MINUS, - /* 110 */ SDL_SCANCODE_KP_PERIOD, - /* 111 */ SDL_SCANCODE_KP_DIVIDE, - /* 112 */ SDL_SCANCODE_F1, - /* 113 */ SDL_SCANCODE_F2, - /* 114 */ SDL_SCANCODE_F3, - /* 115 */ SDL_SCANCODE_F4, - /* 116 */ SDL_SCANCODE_F5, - /* 117 */ SDL_SCANCODE_F6, - /* 118 */ SDL_SCANCODE_F7, - /* 119 */ SDL_SCANCODE_F8, - /* 120 */ SDL_SCANCODE_F9, - /* 121 */ SDL_SCANCODE_F10, - /* 122 */ SDL_SCANCODE_F11, - /* 123 */ SDL_SCANCODE_F12, - /* 124 */ SDL_SCANCODE_F13, - /* 125 */ SDL_SCANCODE_F14, - /* 126 */ SDL_SCANCODE_F15, - /* 127 */ SDL_SCANCODE_F16, - /* 128 */ SDL_SCANCODE_F17, - /* 129 */ SDL_SCANCODE_F18, - /* 130 */ SDL_SCANCODE_F19, - /* 131 */ SDL_SCANCODE_F20, - /* 132 */ SDL_SCANCODE_F21, - /* 133 */ SDL_SCANCODE_F22, - /* 134 */ SDL_SCANCODE_F23, - /* 135 */ SDL_SCANCODE_F24, - /* 136 */ SDL_SCANCODE_UNKNOWN, - /* 137 */ SDL_SCANCODE_UNKNOWN, - /* 138 */ SDL_SCANCODE_UNKNOWN, - /* 139 */ SDL_SCANCODE_UNKNOWN, - /* 140 */ SDL_SCANCODE_UNKNOWN, - /* 141 */ SDL_SCANCODE_UNKNOWN, - /* 142 */ SDL_SCANCODE_UNKNOWN, - /* 143 */ SDL_SCANCODE_UNKNOWN, - /* 144 */ SDL_SCANCODE_NUMLOCKCLEAR, - /* 145 */ SDL_SCANCODE_SCROLLLOCK, - /* 146 */ SDL_SCANCODE_UNKNOWN, - /* 147 */ SDL_SCANCODE_UNKNOWN, - /* 148 */ SDL_SCANCODE_UNKNOWN, - /* 149 */ SDL_SCANCODE_UNKNOWN, - /* 150 */ SDL_SCANCODE_UNKNOWN, - /* 151 */ SDL_SCANCODE_UNKNOWN, - /* 152 */ SDL_SCANCODE_UNKNOWN, - /* 153 */ SDL_SCANCODE_UNKNOWN, - /* 154 */ SDL_SCANCODE_UNKNOWN, - /* 155 */ SDL_SCANCODE_UNKNOWN, - /* 156 */ SDL_SCANCODE_UNKNOWN, - /* 157 */ SDL_SCANCODE_UNKNOWN, - /* 158 */ SDL_SCANCODE_UNKNOWN, - /* 159 */ SDL_SCANCODE_UNKNOWN, - /* 160 */ SDL_SCANCODE_UNKNOWN, - /* 161 */ SDL_SCANCODE_UNKNOWN, - /* 162 */ SDL_SCANCODE_UNKNOWN, - /* 163 */ SDL_SCANCODE_UNKNOWN, - /* 164 */ SDL_SCANCODE_UNKNOWN, - /* 165 */ SDL_SCANCODE_UNKNOWN, - /* 166 */ SDL_SCANCODE_UNKNOWN, - /* 167 */ SDL_SCANCODE_UNKNOWN, - /* 168 */ SDL_SCANCODE_UNKNOWN, - /* 169 */ SDL_SCANCODE_UNKNOWN, - /* 170 */ SDL_SCANCODE_UNKNOWN, - /* 171 */ SDL_SCANCODE_UNKNOWN, - /* 172 */ SDL_SCANCODE_UNKNOWN, - /* 173 */ SDL_SCANCODE_MINUS, /*FX*/ - /* 174 */ SDL_SCANCODE_VOLUMEDOWN, /*IE, Chrome*/ - /* 175 */ SDL_SCANCODE_VOLUMEUP, /*IE, Chrome*/ - /* 176 */ SDL_SCANCODE_AUDIONEXT, /*IE, Chrome*/ - /* 177 */ SDL_SCANCODE_AUDIOPREV, /*IE, Chrome*/ - /* 178 */ SDL_SCANCODE_UNKNOWN, - /* 179 */ SDL_SCANCODE_AUDIOPLAY, /*IE, Chrome*/ - /* 180 */ SDL_SCANCODE_UNKNOWN, - /* 181 */ SDL_SCANCODE_AUDIOMUTE, /*FX*/ - /* 182 */ SDL_SCANCODE_VOLUMEDOWN, /*FX*/ - /* 183 */ SDL_SCANCODE_VOLUMEUP, /*FX*/ - /* 184 */ SDL_SCANCODE_UNKNOWN, - /* 185 */ SDL_SCANCODE_UNKNOWN, - /* 186 */ SDL_SCANCODE_SEMICOLON, /*IE, Chrome, D3E legacy*/ - /* 187 */ SDL_SCANCODE_EQUALS, /*IE, Chrome, D3E legacy*/ - /* 188 */ SDL_SCANCODE_COMMA, - /* 189 */ SDL_SCANCODE_MINUS, /*IE, Chrome, D3E legacy*/ - /* 190 */ SDL_SCANCODE_PERIOD, - /* 191 */ SDL_SCANCODE_SLASH, - /* 192 */ SDL_SCANCODE_GRAVE, /*FX, D3E legacy (SDL_SCANCODE_APOSTROPHE in IE/Chrome)*/ - /* 193 */ SDL_SCANCODE_UNKNOWN, - /* 194 */ SDL_SCANCODE_UNKNOWN, - /* 195 */ SDL_SCANCODE_UNKNOWN, - /* 196 */ SDL_SCANCODE_UNKNOWN, - /* 197 */ SDL_SCANCODE_UNKNOWN, - /* 198 */ SDL_SCANCODE_UNKNOWN, - /* 199 */ SDL_SCANCODE_UNKNOWN, - /* 200 */ SDL_SCANCODE_UNKNOWN, - /* 201 */ SDL_SCANCODE_UNKNOWN, - /* 202 */ SDL_SCANCODE_UNKNOWN, - /* 203 */ SDL_SCANCODE_UNKNOWN, - /* 204 */ SDL_SCANCODE_UNKNOWN, - /* 205 */ SDL_SCANCODE_UNKNOWN, - /* 206 */ SDL_SCANCODE_UNKNOWN, - /* 207 */ SDL_SCANCODE_UNKNOWN, - /* 208 */ SDL_SCANCODE_UNKNOWN, - /* 209 */ SDL_SCANCODE_UNKNOWN, - /* 210 */ SDL_SCANCODE_UNKNOWN, - /* 211 */ SDL_SCANCODE_UNKNOWN, - /* 212 */ SDL_SCANCODE_UNKNOWN, - /* 213 */ SDL_SCANCODE_UNKNOWN, - /* 214 */ SDL_SCANCODE_UNKNOWN, - /* 215 */ SDL_SCANCODE_UNKNOWN, - /* 216 */ SDL_SCANCODE_UNKNOWN, - /* 217 */ SDL_SCANCODE_UNKNOWN, - /* 218 */ SDL_SCANCODE_UNKNOWN, - /* 219 */ SDL_SCANCODE_LEFTBRACKET, - /* 220 */ SDL_SCANCODE_BACKSLASH, - /* 221 */ SDL_SCANCODE_RIGHTBRACKET, - /* 222 */ SDL_SCANCODE_APOSTROPHE, /*FX, D3E legacy*/ -}; - - -/* "borrowed" from SDL_windowsevents.c */ -int -Emscripten_ConvertUTF32toUTF8(Uint32 codepoint, char * text) -{ - if (codepoint <= 0x7F) { - text[0] = (char) codepoint; - text[1] = '\0'; - } else if (codepoint <= 0x7FF) { - text[0] = 0xC0 | (char) ((codepoint >> 6) & 0x1F); - text[1] = 0x80 | (char) (codepoint & 0x3F); - text[2] = '\0'; - } else if (codepoint <= 0xFFFF) { - text[0] = 0xE0 | (char) ((codepoint >> 12) & 0x0F); - text[1] = 0x80 | (char) ((codepoint >> 6) & 0x3F); - text[2] = 0x80 | (char) (codepoint & 0x3F); - text[3] = '\0'; - } else if (codepoint <= 0x10FFFF) { - text[0] = 0xF0 | (char) ((codepoint >> 18) & 0x0F); - text[1] = 0x80 | (char) ((codepoint >> 12) & 0x3F); - text[2] = 0x80 | (char) ((codepoint >> 6) & 0x3F); - text[3] = 0x80 | (char) (codepoint & 0x3F); - text[4] = '\0'; - } else { - return SDL_FALSE; - } - return SDL_TRUE; -} - -EM_BOOL -Emscripten_HandleMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) -{ - SDL_WindowData *window_data = userData; - int mx, my; - static double residualx = 0, residualy = 0; - EmscriptenPointerlockChangeEvent pointerlock_status; - - /* rescale (in case canvas is being scaled)*/ - double client_w, client_h, xscale, yscale; - emscripten_get_element_css_size(NULL, &client_w, &client_h); - xscale = window_data->window->w / client_w; - yscale = window_data->window->h / client_h; - - /* check for pointer lock */ - int isPointerLockSupported = emscripten_get_pointerlock_status(&pointerlock_status); - int isPointerLocked = isPointerLockSupported == EMSCRIPTEN_RESULT_SUCCESS ? pointerlock_status.isActive : SDL_FALSE; - - if (isPointerLocked) { - residualx += mouseEvent->movementX * xscale; - residualy += mouseEvent->movementY * yscale; - /* Let slow sub-pixel motion accumulate. Don't lose it. */ - mx = residualx; - residualx -= mx; - my = residualy; - residualy -= my; - } else { - mx = mouseEvent->canvasX * xscale; - my = mouseEvent->canvasY * yscale; - } - - SDL_SendMouseMotion(window_data->window, 0, isPointerLocked, mx, my); - return 0; -} - -EM_BOOL -Emscripten_HandleMouseButton(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) -{ - SDL_WindowData *window_data = userData; - uint32_t sdl_button; - switch (mouseEvent->button) { - case 0: - sdl_button = SDL_BUTTON_LEFT; - break; - case 1: - sdl_button = SDL_BUTTON_MIDDLE; - break; - case 2: - sdl_button = SDL_BUTTON_RIGHT; - break; - default: - return 0; - } - - SDL_EventType sdl_event_type = (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN ? SDL_PRESSED : SDL_RELEASED); - SDL_SendMouseButton(window_data->window, 0, sdl_event_type, sdl_button); - return SDL_GetEventState(sdl_event_type) == SDL_ENABLE; -} - -EM_BOOL -Emscripten_HandleMouseFocus(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) -{ - SDL_WindowData *window_data = userData; - - int mx = mouseEvent->canvasX, my = mouseEvent->canvasY; - EmscriptenPointerlockChangeEvent pointerlock_status; - - /* check for pointer lock */ - int isPointerLockSupported = emscripten_get_pointerlock_status(&pointerlock_status); - int isPointerLocked = isPointerLockSupported == EMSCRIPTEN_RESULT_SUCCESS ? pointerlock_status.isActive : SDL_FALSE; - - if (!isPointerLocked) { - /* rescale (in case canvas is being scaled)*/ - double client_w, client_h; - emscripten_get_element_css_size(NULL, &client_w, &client_h); - - mx = mx * (window_data->window->w / client_w); - my = my * (window_data->window->h / client_h); - SDL_SendMouseMotion(window_data->window, 0, isPointerLocked, mx, my); - } - - SDL_SetMouseFocus(eventType == EMSCRIPTEN_EVENT_MOUSEENTER ? window_data->window : NULL); - return SDL_GetEventState(SDL_WINDOWEVENT) == SDL_ENABLE; -} - -EM_BOOL -Emscripten_HandleWheel(int eventType, const EmscriptenWheelEvent *wheelEvent, void *userData) -{ - SDL_WindowData *window_data = userData; - SDL_SendMouseWheel(window_data->window, 0, wheelEvent->deltaX, -wheelEvent->deltaY, SDL_MOUSEWHEEL_NORMAL); - return SDL_GetEventState(SDL_MOUSEWHEEL) == SDL_ENABLE; -} - -EM_BOOL -Emscripten_HandleFocus(int eventType, const EmscriptenFocusEvent *wheelEvent, void *userData) -{ - SDL_WindowData *window_data = userData; - /* If the user switches away while keys are pressed (such as - * via Alt+Tab), key release events won't be received. */ - if (eventType == EMSCRIPTEN_EVENT_BLUR) { - SDL_ResetKeyboard(); - } - - - SDL_SendWindowEvent(window_data->window, eventType == EMSCRIPTEN_EVENT_FOCUS ? SDL_WINDOWEVENT_FOCUS_GAINED : SDL_WINDOWEVENT_FOCUS_LOST, 0, 0); - return SDL_GetEventState(SDL_WINDOWEVENT) == SDL_ENABLE; -} - -EM_BOOL -Emscripten_HandleTouch(int eventType, const EmscriptenTouchEvent *touchEvent, void *userData) -{ - SDL_WindowData *window_data = userData; - int i; - double client_w, client_h; - int preventDefault = 0; - - SDL_TouchID deviceId = 1; - if (SDL_AddTouch(deviceId, "") < 0) { - return 0; - } - - emscripten_get_element_css_size(NULL, &client_w, &client_h); - - for (i = 0; i < touchEvent->numTouches; i++) { - SDL_FingerID id; - float x, y; - - if (!touchEvent->touches[i].isChanged) - continue; - - id = touchEvent->touches[i].identifier; - x = touchEvent->touches[i].canvasX / client_w; - y = touchEvent->touches[i].canvasY / client_h; - - if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) { - if (!window_data->finger_touching) { - window_data->finger_touching = SDL_TRUE; - window_data->first_finger = id; - SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, x, y); - SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT); - } - SDL_SendTouch(deviceId, id, SDL_TRUE, x, y, 1.0f); - - if (!preventDefault && SDL_GetEventState(SDL_FINGERDOWN) == SDL_ENABLE) { - preventDefault = 1; - } - } else if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) { - if ((window_data->finger_touching) && (window_data->first_finger == id)) { - SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, x, y); - } - SDL_SendTouchMotion(deviceId, id, x, y, 1.0f); - - if (!preventDefault && SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) { - preventDefault = 1; - } - } else { - if ((window_data->finger_touching) && (window_data->first_finger == id)) { - SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT); - window_data->finger_touching = SDL_FALSE; - } - SDL_SendTouch(deviceId, id, SDL_FALSE, x, y, 1.0f); - - if (!preventDefault && SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) { - preventDefault = 1; - } - } - } - - return preventDefault; -} - -EM_BOOL -Emscripten_HandleKey(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData) -{ - Uint32 scancode; - - /* .keyCode is deprecated, but still the most reliable way to get keys */ - if (keyEvent->keyCode < SDL_arraysize(emscripten_scancode_table)) { - scancode = emscripten_scancode_table[keyEvent->keyCode]; - - if (scancode != SDL_SCANCODE_UNKNOWN) { - - if (keyEvent->location == DOM_KEY_LOCATION_RIGHT) { - switch (scancode) { - case SDL_SCANCODE_LSHIFT: - scancode = SDL_SCANCODE_RSHIFT; - break; - case SDL_SCANCODE_LCTRL: - scancode = SDL_SCANCODE_RCTRL; - break; - case SDL_SCANCODE_LALT: - scancode = SDL_SCANCODE_RALT; - break; - case SDL_SCANCODE_LGUI: - scancode = SDL_SCANCODE_RGUI; - break; - } - } - SDL_SendKeyboardKey(eventType == EMSCRIPTEN_EVENT_KEYDOWN ? SDL_PRESSED : SDL_RELEASED, scancode); - } - } - - SDL_bool prevent_default = SDL_GetEventState(eventType == EMSCRIPTEN_EVENT_KEYDOWN ? SDL_KEYDOWN : SDL_KEYUP) == SDL_ENABLE; - - /* if TEXTINPUT events are enabled we can't prevent keydown or we won't get keypress - * we need to ALWAYS prevent backspace and tab otherwise chrome takes action and does bad navigation UX - */ - if (eventType == EMSCRIPTEN_EVENT_KEYDOWN && SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE && keyEvent->keyCode != 8 /* backspace */ && keyEvent->keyCode != 9 /* tab */) - prevent_default = SDL_FALSE; - - return prevent_default; -} - -EM_BOOL -Emscripten_HandleKeyPress(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData) -{ - char text[5]; - if (Emscripten_ConvertUTF32toUTF8(keyEvent->charCode, text)) { - SDL_SendKeyboardText(text); - } - return SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE; -} - -EM_BOOL -Emscripten_HandleFullscreenChange(int eventType, const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent, void *userData) -{ - SDL_WindowData *window_data = userData; - if(fullscreenChangeEvent->isFullscreen) - { - window_data->window->flags |= window_data->requested_fullscreen_mode; - - window_data->requested_fullscreen_mode = 0; - - if(!window_data->requested_fullscreen_mode) - window_data->window->flags |= SDL_WINDOW_FULLSCREEN; /*we didn't reqest fullscreen*/ - } - else - { - window_data->window->flags &= ~FULLSCREEN_MASK; - } - - return 0; -} - -EM_BOOL -Emscripten_HandleResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) -{ - SDL_WindowData *window_data = userData; - - /* update pixel ratio */ - window_data->pixel_ratio = emscripten_get_device_pixel_ratio(); - - if(!(window_data->window->flags & FULLSCREEN_MASK)) - { - /* this will only work if the canvas size is set through css */ - if(window_data->window->flags & SDL_WINDOW_RESIZABLE) - { - double w = window_data->window->w; - double h = window_data->window->h; - - if(window_data->external_size) { - emscripten_get_element_css_size(NULL, &w, &h); - } - - emscripten_set_canvas_size(w * window_data->pixel_ratio, h * window_data->pixel_ratio); - - /* set_canvas_size unsets this */ - if (!window_data->external_size && window_data->pixel_ratio != 1.0f) { - emscripten_set_element_css_size(NULL, w, h); - } - - SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, w, h); - } - } - - return 0; -} - -EM_BOOL -Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData) -{ - /*this is used during fullscreen changes*/ - SDL_WindowData *window_data = userData; - - if(window_data->fullscreen_resize) - { - double css_w, css_h; - emscripten_get_element_css_size(NULL, &css_w, &css_h); - SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, css_w, css_h); - } - - return 0; -} - -EM_BOOL -Emscripten_HandleVisibilityChange(int eventType, const EmscriptenVisibilityChangeEvent *visEvent, void *userData) -{ - SDL_WindowData *window_data = userData; - SDL_SendWindowEvent(window_data->window, visEvent->hidden ? SDL_WINDOWEVENT_HIDDEN : SDL_WINDOWEVENT_SHOWN, 0, 0); - return 0; -} - -void -Emscripten_RegisterEventHandlers(SDL_WindowData *data) -{ - /* There is only one window and that window is the canvas */ - emscripten_set_mousemove_callback("#canvas", data, 0, Emscripten_HandleMouseMove); - - emscripten_set_mousedown_callback("#canvas", data, 0, Emscripten_HandleMouseButton); - emscripten_set_mouseup_callback("#document", data, 0, Emscripten_HandleMouseButton); - - emscripten_set_mouseenter_callback("#canvas", data, 0, Emscripten_HandleMouseFocus); - emscripten_set_mouseleave_callback("#canvas", data, 0, Emscripten_HandleMouseFocus); - - emscripten_set_wheel_callback("#canvas", data, 0, Emscripten_HandleWheel); - - emscripten_set_focus_callback("#window", data, 0, Emscripten_HandleFocus); - emscripten_set_blur_callback("#window", data, 0, Emscripten_HandleFocus); - - emscripten_set_touchstart_callback("#canvas", data, 0, Emscripten_HandleTouch); - emscripten_set_touchend_callback("#canvas", data, 0, Emscripten_HandleTouch); - emscripten_set_touchmove_callback("#canvas", data, 0, Emscripten_HandleTouch); - emscripten_set_touchcancel_callback("#canvas", data, 0, Emscripten_HandleTouch); - - /* Keyboard events are awkward */ - const char *keyElement = SDL_GetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT); - if (!keyElement) keyElement = "#window"; - - emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey); - emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey); - emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress); - - emscripten_set_fullscreenchange_callback("#document", data, 0, Emscripten_HandleFullscreenChange); - - emscripten_set_resize_callback("#window", data, 0, Emscripten_HandleResize); - - emscripten_set_visibilitychange_callback(data, 0, Emscripten_HandleVisibilityChange); -} - -void -Emscripten_UnregisterEventHandlers(SDL_WindowData *data) -{ - /* only works due to having one window */ - emscripten_set_mousemove_callback("#canvas", NULL, 0, NULL); - - emscripten_set_mousedown_callback("#canvas", NULL, 0, NULL); - emscripten_set_mouseup_callback("#document", NULL, 0, NULL); - - emscripten_set_mouseenter_callback("#canvas", NULL, 0, NULL); - emscripten_set_mouseleave_callback("#canvas", NULL, 0, NULL); - - emscripten_set_wheel_callback("#canvas", NULL, 0, NULL); - - emscripten_set_focus_callback("#window", NULL, 0, NULL); - emscripten_set_blur_callback("#window", NULL, 0, NULL); - - emscripten_set_touchstart_callback("#canvas", NULL, 0, NULL); - emscripten_set_touchend_callback("#canvas", NULL, 0, NULL); - emscripten_set_touchmove_callback("#canvas", NULL, 0, NULL); - emscripten_set_touchcancel_callback("#canvas", NULL, 0, NULL); - - const char *target = SDL_GetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT); - if (!target) { - target = "#window"; - } - - emscripten_set_keydown_callback(target, NULL, 0, NULL); - emscripten_set_keyup_callback(target, NULL, 0, NULL); - - emscripten_set_keypress_callback(target, NULL, 0, NULL); - - emscripten_set_fullscreenchange_callback("#document", NULL, 0, NULL); - - emscripten_set_resize_callback("#window", NULL, 0, NULL); - - emscripten_set_visibilitychange_callback(NULL, 0, NULL); -} - -#endif /* SDL_VIDEO_DRIVER_EMSCRIPTEN */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenevents.h b/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenevents.h deleted file mode 100644 index 089ff60da5c..00000000000 --- a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenevents.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef _SDL_emscriptenevents_h -#define _SDL_emscriptenevents_h - -#include "SDL_emscriptenvideo.h" - -extern void -Emscripten_RegisterEventHandlers(SDL_WindowData *data); - -extern void -Emscripten_UnregisterEventHandlers(SDL_WindowData *data); - -extern int -Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData); -#endif /* _SDL_emscriptenevents_h */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenframebuffer.c b/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenframebuffer.c deleted file mode 100644 index 8a6a465d94f..00000000000 --- a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenframebuffer.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_EMSCRIPTEN - -#include "SDL_emscriptenvideo.h" -#include "SDL_emscriptenframebuffer.h" - - -int Emscripten_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch) -{ - SDL_Surface *surface; - const Uint32 surface_format = SDL_PIXELFORMAT_BGR888; - int w, h; - int bpp; - Uint32 Rmask, Gmask, Bmask, Amask; - - /* Free the old framebuffer surface */ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - surface = data->surface; - SDL_FreeSurface(surface); - - /* Create a new one */ - SDL_PixelFormatEnumToMasks(surface_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); - SDL_GetWindowSize(window, &w, &h); - - surface = SDL_CreateRGBSurface(0, w, h, bpp, Rmask, Gmask, Bmask, Amask); - if (!surface) { - return -1; - } - - /* Save the info and return! */ - data->surface = surface; - *format = surface_format; - *pixels = surface->pixels; - *pitch = surface->pitch; - return 0; -} - -int Emscripten_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects) -{ - SDL_Surface *surface; - - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - surface = data->surface; - if (!surface) { - return SDL_SetError("Couldn't find framebuffer surface for window"); - } - - /* Send the data to the display */ - - EM_ASM_INT({ - var w = $0; - var h = $1; - var pixels = $2; - - if (!Module['SDL2']) Module['SDL2'] = {}; - var SDL2 = Module['SDL2']; - if (SDL2.ctxCanvas !== Module['canvas']) { - SDL2.ctx = Module['createContext'](Module['canvas'], false, true); - SDL2.ctxCanvas = Module['canvas']; - } - if (SDL2.w !== w || SDL2.h !== h || SDL2.imageCtx !== SDL2.ctx) { - SDL2.image = SDL2.ctx.createImageData(w, h); - SDL2.w = w; - SDL2.h = h; - SDL2.imageCtx = SDL2.ctx; - } - var data = SDL2.image.data; - var src = pixels >> 2; - var dst = 0; - var num; - if (typeof CanvasPixelArray !== 'undefined' && data instanceof CanvasPixelArray) { - // IE10/IE11: ImageData objects are backed by the deprecated CanvasPixelArray, - // not UInt8ClampedArray. These don't have buffers, so we need to revert - // to copying a byte at a time. We do the undefined check because modern - // browsers do not define CanvasPixelArray anymore. - num = data.length; - while (dst < num) { - var val = HEAP32[src]; // This is optimized. Instead, we could do {{{ makeGetValue('buffer', 'dst', 'i32') }}}; - data[dst ] = val & 0xff; - data[dst+1] = (val >> 8) & 0xff; - data[dst+2] = (val >> 16) & 0xff; - data[dst+3] = 0xff; - src++; - dst += 4; - } - } else { - if (SDL2.data32Data !== data) { - SDL2.data32 = new Int32Array(data.buffer); - SDL2.data8 = new Uint8Array(data.buffer); - } - var data32 = SDL2.data32; - num = data32.length; - // logically we need to do - // while (dst < num) { - // data32[dst++] = HEAP32[src++] | 0xff000000 - // } - // the following code is faster though, because - // .set() is almost free - easily 10x faster due to - // native memcpy efficiencies, and the remaining loop - // just stores, not load + store, so it is faster - data32.set(HEAP32.subarray(src, src + num)); - var data8 = SDL2.data8; - var i = 3; - var j = i + 4*num; - if (num % 8 == 0) { - // unrolling gives big speedups - while (i < j) { - data8[i] = 0xff; - i = i + 4 | 0; - data8[i] = 0xff; - i = i + 4 | 0; - data8[i] = 0xff; - i = i + 4 | 0; - data8[i] = 0xff; - i = i + 4 | 0; - data8[i] = 0xff; - i = i + 4 | 0; - data8[i] = 0xff; - i = i + 4 | 0; - data8[i] = 0xff; - i = i + 4 | 0; - data8[i] = 0xff; - i = i + 4 | 0; - } - } else { - while (i < j) { - data8[i] = 0xff; - i = i + 4 | 0; - } - } - } - - SDL2.ctx.putImageData(SDL2.image, 0, 0); - return 0; - }, surface->w, surface->h, surface->pixels); - - /*if (SDL_getenv("SDL_VIDEO_Emscripten_SAVE_FRAMES")) { - static int frame_number = 0; - char file[128]; - SDL_snprintf(file, sizeof(file), "SDL_window%d-%8.8d.bmp", - SDL_GetWindowID(window), ++frame_number); - SDL_SaveBMP(surface, file); - }*/ - return 0; -} - -void Emscripten_DestroyWindowFramebuffer(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - - SDL_FreeSurface(data->surface); - data->surface = NULL; -} - -#endif /* SDL_VIDEO_DRIVER_EMSCRIPTEN */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenframebuffer.h b/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenframebuffer.h deleted file mode 100644 index b2a6d3b3700..00000000000 --- a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenframebuffer.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_emscriptenframebuffer_h -#define _SDL_emscriptenframebuffer_h - -extern int Emscripten_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch); -extern int Emscripten_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects); -extern void Emscripten_DestroyWindowFramebuffer(_THIS, SDL_Window * window); - -#endif /* _SDL_emscriptenframebuffer_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenmouse.c b/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenmouse.c deleted file mode 100644 index 512ad2220da..00000000000 --- a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenmouse.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_EMSCRIPTEN - -#include <emscripten/emscripten.h> -#include <emscripten/html5.h> - -#include "SDL_emscriptenmouse.h" - -#include "../../events/SDL_mouse_c.h" -#include "SDL_assert.h" - - -static SDL_Cursor* -Emscripten_CreateDefaultCursor() -{ - SDL_Cursor* cursor; - Emscripten_CursorData *curdata; - - cursor = SDL_calloc(1, sizeof(SDL_Cursor)); - if (cursor) { - curdata = (Emscripten_CursorData *) SDL_calloc(1, sizeof(*curdata)); - if (!curdata) { - SDL_OutOfMemory(); - SDL_free(cursor); - return NULL; - } - - curdata->system_cursor = "default"; - cursor->driverdata = curdata; - } - else { - SDL_OutOfMemory(); - } - - return cursor; -} - -/* -static SDL_Cursor* -Emscripten_CreateCursor(SDL_Surface* sruface, int hot_x, int hot_y) -{ - return Emscripten_CreateDefaultCursor(); -} -*/ - -static SDL_Cursor* -Emscripten_CreateSystemCursor(SDL_SystemCursor id) -{ - SDL_Cursor *cursor; - Emscripten_CursorData *curdata; - const char *cursor_name = NULL; - - switch(id) { - case SDL_SYSTEM_CURSOR_ARROW: - cursor_name = "default"; - break; - case SDL_SYSTEM_CURSOR_IBEAM: - cursor_name = "text"; - break; - case SDL_SYSTEM_CURSOR_WAIT: - cursor_name = "wait"; - break; - case SDL_SYSTEM_CURSOR_CROSSHAIR: - cursor_name = "crosshair"; - break; - case SDL_SYSTEM_CURSOR_WAITARROW: - cursor_name = "progress"; - break; - case SDL_SYSTEM_CURSOR_SIZENWSE: - cursor_name = "nwse-resize"; - break; - case SDL_SYSTEM_CURSOR_SIZENESW: - cursor_name = "nesw-resize"; - break; - case SDL_SYSTEM_CURSOR_SIZEWE: - cursor_name = "ew-resize"; - break; - case SDL_SYSTEM_CURSOR_SIZENS: - cursor_name = "ns-resize"; - break; - case SDL_SYSTEM_CURSOR_SIZEALL: - break; - case SDL_SYSTEM_CURSOR_NO: - cursor_name = "not-allowed"; - break; - case SDL_SYSTEM_CURSOR_HAND: - cursor_name = "pointer"; - break; - default: - SDL_assert(0); - return NULL; - } - - cursor = (SDL_Cursor *) SDL_calloc(1, sizeof(*cursor)); - if (!cursor) { - SDL_OutOfMemory(); - return NULL; - } - curdata = (Emscripten_CursorData *) SDL_calloc(1, sizeof(*curdata)); - if (!curdata) { - SDL_OutOfMemory(); - SDL_free(cursor); - return NULL; - } - - curdata->system_cursor = cursor_name; - cursor->driverdata = curdata; - - return cursor; -} - -static void -Emscripten_FreeCursor(SDL_Cursor* cursor) -{ - Emscripten_CursorData *curdata; - if (cursor) { - curdata = (Emscripten_CursorData *) cursor->driverdata; - - if (curdata != NULL) { - SDL_free(cursor->driverdata); - } - - SDL_free(cursor); - } -} - -static int -Emscripten_ShowCursor(SDL_Cursor* cursor) -{ - Emscripten_CursorData *curdata; - if (SDL_GetMouseFocus() != NULL) { - if(cursor && cursor->driverdata) { - curdata = (Emscripten_CursorData *) cursor->driverdata; - - if(curdata->system_cursor) { - EM_ASM_INT({ - if (Module['canvas']) { - Module['canvas'].style['cursor'] = Module['Pointer_stringify']($0); - } - return 0; - }, curdata->system_cursor); - } - } - else { - EM_ASM( - if (Module['canvas']) { - Module['canvas'].style['cursor'] = 'none'; - } - ); - } - } - return 0; -} - -static void -Emscripten_WarpMouse(SDL_Window* window, int x, int y) -{ - SDL_Unsupported(); -} - -static int -Emscripten_SetRelativeMouseMode(SDL_bool enabled) -{ - /* TODO: pointer lock isn't actually enabled yet */ - if(enabled) { - if(emscripten_request_pointerlock(NULL, 1) >= EMSCRIPTEN_RESULT_SUCCESS) { - return 0; - } - } else { - if(emscripten_exit_pointerlock() >= EMSCRIPTEN_RESULT_SUCCESS) { - return 0; - } - } - return -1; -} - -void -Emscripten_InitMouse() -{ - SDL_Mouse* mouse = SDL_GetMouse(); - -/* - mouse->CreateCursor = Emscripten_CreateCursor; -*/ - mouse->ShowCursor = Emscripten_ShowCursor; - mouse->FreeCursor = Emscripten_FreeCursor; - mouse->WarpMouse = Emscripten_WarpMouse; - mouse->CreateSystemCursor = Emscripten_CreateSystemCursor; - mouse->SetRelativeMouseMode = Emscripten_SetRelativeMouseMode; - - SDL_SetDefaultCursor(Emscripten_CreateDefaultCursor()); -} - -void -Emscripten_FiniMouse() -{ - SDL_Mouse* mouse = SDL_GetMouse(); - - Emscripten_FreeCursor(mouse->def_cursor); - mouse->def_cursor = NULL; - - mouse->CreateCursor = NULL; - mouse->ShowCursor = NULL; - mouse->FreeCursor = NULL; - mouse->WarpMouse = NULL; - mouse->CreateSystemCursor = NULL; - mouse->SetRelativeMouseMode = NULL; -} - -#endif /* SDL_VIDEO_DRIVER_EMSCRIPTEN */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenmouse.h b/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenmouse.h deleted file mode 100644 index 76ea849ede8..00000000000 --- a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenmouse.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef _SDL_emscriptenmouse_h -#define _SDL_emscriptenmouse_h - -typedef struct _Emscripten_CursorData -{ - const char *system_cursor; -} Emscripten_CursorData; - -extern void -Emscripten_InitMouse(); - -extern void -Emscripten_FiniMouse(); - -#endif /* _SDL_emscriptenmouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenopengles.c b/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenopengles.c deleted file mode 100644 index 12a37c60481..00000000000 --- a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenopengles.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_EMSCRIPTEN && SDL_VIDEO_OPENGL_EGL - -#include <emscripten/emscripten.h> -#include <GLES2/gl2.h> - -#include "SDL_emscriptenvideo.h" -#include "SDL_emscriptenopengles.h" - -#define LOAD_FUNC(NAME) _this->egl_data->NAME = NAME; - -/* EGL implementation of SDL OpenGL support */ - -int -Emscripten_GLES_LoadLibrary(_THIS, const char *path) { - /*we can't load EGL dynamically*/ - _this->egl_data = (struct SDL_EGL_VideoData *) SDL_calloc(1, sizeof(SDL_EGL_VideoData)); - if (!_this->egl_data) { - return SDL_OutOfMemory(); - } - - LOAD_FUNC(eglGetDisplay); - LOAD_FUNC(eglInitialize); - LOAD_FUNC(eglTerminate); - LOAD_FUNC(eglGetProcAddress); - LOAD_FUNC(eglChooseConfig); - LOAD_FUNC(eglGetConfigAttrib); - LOAD_FUNC(eglCreateContext); - LOAD_FUNC(eglDestroyContext); - LOAD_FUNC(eglCreateWindowSurface); - LOAD_FUNC(eglDestroySurface); - LOAD_FUNC(eglMakeCurrent); - LOAD_FUNC(eglSwapBuffers); - LOAD_FUNC(eglSwapInterval); - LOAD_FUNC(eglWaitNative); - LOAD_FUNC(eglWaitGL); - LOAD_FUNC(eglBindAPI); - - _this->egl_data->egl_display = _this->egl_data->eglGetDisplay(EGL_DEFAULT_DISPLAY); - if (!_this->egl_data->egl_display) { - return SDL_SetError("Could not get EGL display"); - } - - if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) { - return SDL_SetError("Could not initialize EGL"); - } - - _this->gl_config.driver_loaded = 1; - - if (path) { - SDL_strlcpy(_this->gl_config.driver_path, path, sizeof(_this->gl_config.driver_path) - 1); - } else { - *_this->gl_config.driver_path = '\0'; - } - - return 0; -} - -void -Emscripten_GLES_DeleteContext(_THIS, SDL_GLContext context) -{ - /* - WebGL contexts can't actually be deleted, so we need to reset it. - ES2 renderer resets state on init anyway, clearing the canvas should be enough - */ - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - - SDL_EGL_DeleteContext(_this, context); -} - -SDL_EGL_CreateContext_impl(Emscripten) -SDL_EGL_SwapWindow_impl(Emscripten) -SDL_EGL_MakeCurrent_impl(Emscripten) - -void -Emscripten_GLES_GetDrawableSize(_THIS, SDL_Window * window, int * w, int * h) -{ - SDL_WindowData *data; - if (window->driverdata) { - data = (SDL_WindowData *) window->driverdata; - - if (w) { - *w = window->w * data->pixel_ratio; - } - - if (h) { - *h = window->h * data->pixel_ratio; - } - } -} - -#endif /* SDL_VIDEO_DRIVER_EMSCRIPTEN && SDL_VIDEO_OPENGL_EGL */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenopengles.h b/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenopengles.h deleted file mode 100644 index edafed82202..00000000000 --- a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenopengles.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_emscriptenopengles_h -#define _SDL_emscriptenopengles_h - -#if SDL_VIDEO_DRIVER_EMSCRIPTEN && SDL_VIDEO_OPENGL_EGL - -#include "../SDL_sysvideo.h" -#include "../SDL_egl_c.h" - -/* OpenGLES functions */ -#define Emscripten_GLES_GetAttribute SDL_EGL_GetAttribute -#define Emscripten_GLES_GetProcAddress SDL_EGL_GetProcAddress -#define Emscripten_GLES_UnloadLibrary SDL_EGL_UnloadLibrary -#define Emscripten_GLES_SetSwapInterval SDL_EGL_SetSwapInterval -#define Emscripten_GLES_GetSwapInterval SDL_EGL_GetSwapInterval - -extern int Emscripten_GLES_LoadLibrary(_THIS, const char *path); -extern void Emscripten_GLES_DeleteContext(_THIS, SDL_GLContext context); -extern SDL_GLContext Emscripten_GLES_CreateContext(_THIS, SDL_Window * window); -extern void Emscripten_GLES_SwapWindow(_THIS, SDL_Window * window); -extern int Emscripten_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); -extern void Emscripten_GLES_GetDrawableSize(_THIS, SDL_Window * window, int * w, int * h); - -#endif /* SDL_VIDEO_DRIVER_EMSCRIPTEN && SDL_VIDEO_OPENGL_EGL */ - -#endif /* _SDL_emscriptenopengles_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenvideo.c b/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenvideo.c deleted file mode 100644 index 847bb4cf84d..00000000000 --- a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenvideo.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_EMSCRIPTEN - -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "SDL_hints.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../SDL_egl_c.h" -#include "../../events/SDL_events_c.h" - -#include "SDL_emscriptenvideo.h" -#include "SDL_emscriptenopengles.h" -#include "SDL_emscriptenframebuffer.h" -#include "SDL_emscriptenevents.h" -#include "SDL_emscriptenmouse.h" - -#define EMSCRIPTENVID_DRIVER_NAME "emscripten" - -/* Initialization/Query functions */ -static int Emscripten_VideoInit(_THIS); -static int Emscripten_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -static void Emscripten_VideoQuit(_THIS); - -static int Emscripten_CreateWindow(_THIS, SDL_Window * window); -static void Emscripten_SetWindowSize(_THIS, SDL_Window * window); -static void Emscripten_DestroyWindow(_THIS, SDL_Window * window); -static void Emscripten_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen); -static void Emscripten_PumpEvents(_THIS); -static void Emscripten_SetWindowTitle(_THIS, SDL_Window * window); - - -/* Emscripten driver bootstrap functions */ - -static int -Emscripten_Available(void) -{ - return (1); -} - -static void -Emscripten_DeleteDevice(SDL_VideoDevice * device) -{ - SDL_free(device); -} - -static SDL_VideoDevice * -Emscripten_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (!device) { - SDL_OutOfMemory(); - return (0); - } - - /* Firefox sends blur event which would otherwise prevent full screen - * when the user clicks to allow full screen. - * See https://bugzilla.mozilla.org/show_bug.cgi?id=1144964 - */ - SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0"); - - /* Set the function pointers */ - device->VideoInit = Emscripten_VideoInit; - device->VideoQuit = Emscripten_VideoQuit; - device->SetDisplayMode = Emscripten_SetDisplayMode; - - - device->PumpEvents = Emscripten_PumpEvents; - - device->CreateWindow = Emscripten_CreateWindow; - /*device->CreateWindowFrom = Emscripten_CreateWindowFrom;*/ - device->SetWindowTitle = Emscripten_SetWindowTitle; - /*device->SetWindowIcon = Emscripten_SetWindowIcon; - device->SetWindowPosition = Emscripten_SetWindowPosition;*/ - device->SetWindowSize = Emscripten_SetWindowSize; - /*device->ShowWindow = Emscripten_ShowWindow; - device->HideWindow = Emscripten_HideWindow; - device->RaiseWindow = Emscripten_RaiseWindow; - device->MaximizeWindow = Emscripten_MaximizeWindow; - device->MinimizeWindow = Emscripten_MinimizeWindow; - device->RestoreWindow = Emscripten_RestoreWindow; - device->SetWindowGrab = Emscripten_SetWindowGrab;*/ - device->DestroyWindow = Emscripten_DestroyWindow; - device->SetWindowFullscreen = Emscripten_SetWindowFullscreen; - - device->CreateWindowFramebuffer = Emscripten_CreateWindowFramebuffer; - device->UpdateWindowFramebuffer = Emscripten_UpdateWindowFramebuffer; - device->DestroyWindowFramebuffer = Emscripten_DestroyWindowFramebuffer; - - device->GL_LoadLibrary = Emscripten_GLES_LoadLibrary; - device->GL_GetProcAddress = Emscripten_GLES_GetProcAddress; - device->GL_UnloadLibrary = Emscripten_GLES_UnloadLibrary; - device->GL_CreateContext = Emscripten_GLES_CreateContext; - device->GL_MakeCurrent = Emscripten_GLES_MakeCurrent; - device->GL_SetSwapInterval = Emscripten_GLES_SetSwapInterval; - device->GL_GetSwapInterval = Emscripten_GLES_GetSwapInterval; - device->GL_SwapWindow = Emscripten_GLES_SwapWindow; - device->GL_DeleteContext = Emscripten_GLES_DeleteContext; - device->GL_GetDrawableSize = Emscripten_GLES_GetDrawableSize; - - device->free = Emscripten_DeleteDevice; - - return device; -} - -VideoBootStrap Emscripten_bootstrap = { - EMSCRIPTENVID_DRIVER_NAME, "SDL emscripten video driver", - Emscripten_Available, Emscripten_CreateDevice -}; - - -int -Emscripten_VideoInit(_THIS) -{ - SDL_DisplayMode mode; - - /* Use a fake 32-bpp desktop mode */ - mode.format = SDL_PIXELFORMAT_RGB888; - - mode.w = EM_ASM_INT_V({ - return screen.width; - }); - - mode.h = EM_ASM_INT_V({ - return screen.height; - }); - - mode.refresh_rate = 0; - mode.driverdata = NULL; - if (SDL_AddBasicVideoDisplay(&mode) < 0) { - return -1; - } - - SDL_zero(mode); - SDL_AddDisplayMode(&_this->displays[0], &mode); - - Emscripten_InitMouse(); - - /* We're done! */ - return 0; -} - -static int -Emscripten_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - /* can't do this */ - return 0; -} - -static void -Emscripten_VideoQuit(_THIS) -{ - Emscripten_FiniMouse(); -} - -static void -Emscripten_PumpEvents(_THIS) -{ - /* do nothing. */ -} - -static int -Emscripten_CreateWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *wdata; - double scaled_w, scaled_h; - double css_w, css_h; - - /* Allocate window internal data */ - wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); - if (wdata == NULL) { - return SDL_OutOfMemory(); - } - - if (window->flags & SDL_WINDOW_ALLOW_HIGHDPI) { - wdata->pixel_ratio = emscripten_get_device_pixel_ratio(); - } else { - wdata->pixel_ratio = 1.0f; - } - - scaled_w = SDL_floor(window->w * wdata->pixel_ratio); - scaled_h = SDL_floor(window->h * wdata->pixel_ratio); - - emscripten_set_canvas_size(scaled_w, scaled_h); - - emscripten_get_element_css_size(NULL, &css_w, &css_h); - - wdata->external_size = SDL_floor(css_w) != scaled_w || SDL_floor(css_h) != scaled_h; - - if ((window->flags & SDL_WINDOW_RESIZABLE) && wdata->external_size) { - /* external css has resized us */ - scaled_w = css_w * wdata->pixel_ratio; - scaled_h = css_h * wdata->pixel_ratio; - - emscripten_set_canvas_size(scaled_w, scaled_h); - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, css_w, css_h); - } - - /* if the size is not being controlled by css, we need to scale down for hidpi */ - if (!wdata->external_size) { - if (wdata->pixel_ratio != 1.0f) { - /*scale canvas down*/ - emscripten_set_element_css_size(NULL, window->w, window->h); - } - } - - if (window->flags & SDL_WINDOW_OPENGL) { - if (!_this->egl_data) { - if (SDL_GL_LoadLibrary(NULL) < 0) { - return -1; - } - } - wdata->egl_surface = SDL_EGL_CreateSurface(_this, 0); - - if (wdata->egl_surface == EGL_NO_SURFACE) { - return SDL_SetError("Could not create GLES window surface"); - } - } - - wdata->window = window; - - /* Setup driver data for this window */ - window->driverdata = wdata; - - /* One window, it always has focus */ - SDL_SetMouseFocus(window); - SDL_SetKeyboardFocus(window); - - Emscripten_RegisterEventHandlers(wdata); - - /* Window has been successfully created */ - return 0; -} - -static void Emscripten_SetWindowSize(_THIS, SDL_Window * window) -{ - SDL_WindowData *data; - - if (window->driverdata) { - data = (SDL_WindowData *) window->driverdata; - /* update pixel ratio */ - data->pixel_ratio = emscripten_get_device_pixel_ratio(); - emscripten_set_canvas_size(window->w * data->pixel_ratio, window->h * data->pixel_ratio); - - /*scale canvas down*/ - if (!data->external_size && data->pixel_ratio != 1.0f) { - emscripten_set_element_css_size(NULL, window->w, window->h); - } - } -} - -static void -Emscripten_DestroyWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data; - - if(window->driverdata) { - data = (SDL_WindowData *) window->driverdata; - - Emscripten_UnregisterEventHandlers(data); - if (data->egl_surface != EGL_NO_SURFACE) { - SDL_EGL_DestroySurface(_this, data->egl_surface); - data->egl_surface = EGL_NO_SURFACE; - } - SDL_free(window->driverdata); - window->driverdata = NULL; - } -} - -static void -Emscripten_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen) -{ - SDL_WindowData *data; - if(window->driverdata) { - data = (SDL_WindowData *) window->driverdata; - - if(fullscreen) { - EmscriptenFullscreenStrategy strategy; - SDL_bool is_desktop_fullscreen = (window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP; - int res; - - strategy.scaleMode = is_desktop_fullscreen ? EMSCRIPTEN_FULLSCREEN_SCALE_STRETCH : EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT; - - if(!is_desktop_fullscreen) { - strategy.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE; - } else if(window->flags & SDL_WINDOW_ALLOW_HIGHDPI) { - strategy.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_HIDEF; - } else { - strategy.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_STDDEF; - } - - strategy.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT; - - strategy.canvasResizedCallback = Emscripten_HandleCanvasResize; - strategy.canvasResizedCallbackUserData = data; - - data->requested_fullscreen_mode = window->flags & (SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN); - data->fullscreen_resize = is_desktop_fullscreen; - - res = emscripten_request_fullscreen_strategy(NULL, 1, &strategy); - if(res != EMSCRIPTEN_RESULT_SUCCESS && res != EMSCRIPTEN_RESULT_DEFERRED) { - /* unset flags, fullscreen failed */ - window->flags &= ~(SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN); - } - } - else - emscripten_exit_fullscreen(); - } -} - -static void -Emscripten_SetWindowTitle(_THIS, SDL_Window * window) { - EM_ASM_INT({ - if (typeof Module['setWindowTitle'] !== 'undefined') { - Module['setWindowTitle'](Module['Pointer_stringify']($0)); - } - return 0; - }, window->title); -} - -#endif /* SDL_VIDEO_DRIVER_EMSCRIPTEN */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenvideo.h b/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenvideo.h deleted file mode 100644 index 7618ab6cc7d..00000000000 --- a/3rdparty/SDL2/src/video/emscripten/SDL_emscriptenvideo.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_emscriptenvideo_h -#define _SDL_emscriptenvideo_h - -#include "../SDL_sysvideo.h" -#include "../../events/SDL_touch_c.h" -#include <emscripten/emscripten.h> -#include <emscripten/html5.h> - -#include <EGL/egl.h> - -typedef struct SDL_WindowData -{ -#if SDL_VIDEO_OPENGL_EGL - EGLSurface egl_surface; -#endif - SDL_Window *window; - SDL_Surface *surface; - - float pixel_ratio; - - SDL_bool external_size; - - int requested_fullscreen_mode; - SDL_bool fullscreen_resize; - - SDL_bool finger_touching; /* for mapping touch events to mice */ - SDL_FingerID first_finger; -} SDL_WindowData; - -#endif /* _SDL_emscriptenvideo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/haiku/SDL_BWin.h b/3rdparty/SDL2/src/video/haiku/SDL_BWin.h deleted file mode 100644 index a353e1acade..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_BWin.h +++ /dev/null @@ -1,670 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_BWin_h -#define _SDL_BWin_h - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../../SDL_internal.h" -#include "SDL.h" -#include "SDL_syswm.h" -#include "SDL_bframebuffer.h" - -#ifdef __cplusplus -} -#endif - -#include <stdio.h> -#include <AppKit.h> -#include <InterfaceKit.h> -#include <be/game/DirectWindow.h> -#if SDL_VIDEO_OPENGL -#include <be/opengl/GLView.h> -#endif -#include "SDL_events.h" -#include "../../main/haiku/SDL_BApp.h" - - -enum WinCommands { - BWIN_MOVE_WINDOW, - BWIN_RESIZE_WINDOW, - BWIN_SHOW_WINDOW, - BWIN_HIDE_WINDOW, - BWIN_MAXIMIZE_WINDOW, - BWIN_MINIMIZE_WINDOW, - BWIN_RESTORE_WINDOW, - BWIN_SET_TITLE, - BWIN_SET_BORDERED, - BWIN_SET_RESIZABLE, - BWIN_FULLSCREEN -}; - - -class SDL_BWin:public BDirectWindow -{ - public: - /* Constructor/Destructor */ - SDL_BWin(BRect bounds, window_look look, uint32 flags) - : BDirectWindow(bounds, "Untitled", look, B_NORMAL_WINDOW_FEEL, flags) - { - _last_buttons = 0; - -#if SDL_VIDEO_OPENGL - _SDL_GLView = NULL; -#endif - _shown = false; - _inhibit_resize = false; - _mouse_focused = false; - _prev_frame = NULL; - - /* Handle framebuffer stuff */ - _connected = _connection_disabled = false; - _buffer_created = _buffer_dirty = false; - _trash_window_buffer = false; - _buffer_locker = new BLocker(); - _bitmap = NULL; - _clips = NULL; - -#ifdef DRAWTHREAD - _draw_thread_id = spawn_thread(BE_DrawThread, "drawing_thread", - B_NORMAL_PRIORITY, (void*) this); - resume_thread(_draw_thread_id); -#endif - } - - virtual ~ SDL_BWin() - { - Lock(); - _connection_disabled = true; - int32 result; - -#if SDL_VIDEO_OPENGL - if (_SDL_GLView) { - _SDL_GLView->UnlockGL(); - RemoveChild(_SDL_GLView); /* Why was this outside the if - statement before? */ - } - -#endif - Unlock(); -#if SDL_VIDEO_OPENGL - if (_SDL_GLView) { - delete _SDL_GLView; - } -#endif - - /* Clean up framebuffer stuff */ - _buffer_locker->Lock(); -#ifdef DRAWTHREAD - wait_for_thread(_draw_thread_id, &result); -#endif - free(_clips); - delete _buffer_locker; - } - - - /* * * * * OpenGL functionality * * * * */ -#if SDL_VIDEO_OPENGL - virtual BGLView *CreateGLView(Uint32 gl_flags) { - Lock(); - if (_SDL_GLView == NULL) { - _SDL_GLView = new BGLView(Bounds(), "SDL GLView", - B_FOLLOW_ALL_SIDES, - (B_WILL_DRAW | B_FRAME_EVENTS), - gl_flags); - } - AddChild(_SDL_GLView); - _SDL_GLView->EnableDirectMode(true); - _SDL_GLView->LockGL(); /* "New" GLViews are created */ - Unlock(); - return (_SDL_GLView); - } - - virtual void RemoveGLView() { - Lock(); - if(_SDL_GLView) { - _SDL_GLView->UnlockGL(); - RemoveChild(_SDL_GLView); - } - Unlock(); - } - - virtual void SwapBuffers(void) { - _SDL_GLView->UnlockGL(); - _SDL_GLView->LockGL(); - _SDL_GLView->SwapBuffers(); - } -#endif - - /* * * * * Framebuffering* * * * */ - virtual void DirectConnected(direct_buffer_info *info) { - if(!_connected && _connection_disabled) { - return; - } - - /* Determine if the pixel buffer is usable after this update */ - _trash_window_buffer = _trash_window_buffer - || ((info->buffer_state & B_BUFFER_RESIZED) - || (info->buffer_state & B_BUFFER_RESET) - || (info->driver_state == B_MODE_CHANGED)); - LockBuffer(); - - switch(info->buffer_state & B_DIRECT_MODE_MASK) { - case B_DIRECT_START: - _connected = true; - - case B_DIRECT_MODIFY: - if(_clips) { - free(_clips); - _clips = NULL; - } - - _num_clips = info->clip_list_count; - _clips = (clipping_rect *)malloc(_num_clips*sizeof(clipping_rect)); - if(_clips) { - memcpy(_clips, info->clip_list, - _num_clips*sizeof(clipping_rect)); - - _bits = (uint8*) info->bits; - _row_bytes = info->bytes_per_row; - _bounds = info->window_bounds; - _bytes_per_px = info->bits_per_pixel / 8; - _buffer_dirty = true; - } - break; - - case B_DIRECT_STOP: - _connected = false; - break; - } -#if SDL_VIDEO_OPENGL - if(_SDL_GLView) { - _SDL_GLView->DirectConnected(info); - } -#endif - - - /* Call the base object directconnected */ - BDirectWindow::DirectConnected(info); - - UnlockBuffer(); - - } - - - - - /* * * * * Event sending * * * * */ - /* Hook functions */ - virtual void FrameMoved(BPoint origin) { - /* Post a message to the BApp so that it can handle the window event */ - BMessage msg(BAPP_WINDOW_MOVED); - msg.AddInt32("window-x", (int)origin.x); - msg.AddInt32("window-y", (int)origin.y); - _PostWindowEvent(msg); - - /* Perform normal hook operations */ - BDirectWindow::FrameMoved(origin); - } - - virtual void FrameResized(float width, float height) { - /* Post a message to the BApp so that it can handle the window event */ - BMessage msg(BAPP_WINDOW_RESIZED); - - msg.AddInt32("window-w", (int)width + 1); - msg.AddInt32("window-h", (int)height + 1); - _PostWindowEvent(msg); - - /* Perform normal hook operations */ - BDirectWindow::FrameResized(width, height); - } - - virtual bool QuitRequested() { - BMessage msg(BAPP_WINDOW_CLOSE_REQUESTED); - _PostWindowEvent(msg); - - /* We won't allow a quit unless asked by DestroyWindow() */ - return false; - } - - virtual void WindowActivated(bool active) { - BMessage msg(BAPP_KEYBOARD_FOCUS); /* Mouse focus sold separately */ - _PostWindowEvent(msg); - } - - virtual void Zoom(BPoint origin, - float width, - float height) { - BMessage msg(BAPP_MAXIMIZE); /* Closest thing to maximization Haiku has */ - _PostWindowEvent(msg); - - /* Before the window zooms, record its size */ - if( !_prev_frame ) - _prev_frame = new BRect(Frame()); - - /* Perform normal hook operations */ - BDirectWindow::Zoom(origin, width, height); - } - - /* Member functions */ - virtual void Show() { - while(IsHidden()) { - BDirectWindow::Show(); - } - _shown = true; - - BMessage msg(BAPP_SHOW); - _PostWindowEvent(msg); - } - - virtual void Hide() { - BDirectWindow::Hide(); - _shown = false; - - BMessage msg(BAPP_HIDE); - _PostWindowEvent(msg); - } - - virtual void Minimize(bool minimize) { - BDirectWindow::Minimize(minimize); - int32 minState = (minimize ? BAPP_MINIMIZE : BAPP_RESTORE); - - BMessage msg(minState); - _PostWindowEvent(msg); - } - - - /* BView message interruption */ - virtual void DispatchMessage(BMessage * msg, BHandler * target) - { - BPoint where; /* Used by mouse moved */ - int32 buttons; /* Used for mouse button events */ - int32 key; /* Used for key events */ - - switch (msg->what) { - case B_MOUSE_MOVED: - int32 transit; - if (msg->FindPoint("where", &where) == B_OK - && msg->FindInt32("be:transit", &transit) == B_OK) { - _MouseMotionEvent(where, transit); - } - - /* FIXME: Apparently a button press/release event might be dropped - if made before before a different button is released. Does - B_MOUSE_MOVED have the data needed to check if a mouse button - state has changed? */ - if (msg->FindInt32("buttons", &buttons) == B_OK) { - _MouseButtonEvent(buttons); - } - break; - - case B_MOUSE_DOWN: - case B_MOUSE_UP: - /* _MouseButtonEvent() detects any and all buttons that may have - changed state, as well as that button's new state */ - if (msg->FindInt32("buttons", &buttons) == B_OK) { - _MouseButtonEvent(buttons); - } - break; - - case B_MOUSE_WHEEL_CHANGED: - float x, y; - if (msg->FindFloat("be:wheel_delta_x", &x) == B_OK - && msg->FindFloat("be:wheel_delta_y", &y) == B_OK) { - _MouseWheelEvent((int)x, (int)y); - } - break; - - case B_KEY_DOWN: - { - int32 i = 0; - int8 byte; - int8 bytes[4] = { 0, 0, 0, 0 }; - while (i < 4 && msg->FindInt8("byte", i, &byte) == B_OK) { - bytes[i] = byte; - i++; - } - if (msg->FindInt32("key", &key) == B_OK) { - _KeyEvent((SDL_Scancode)key, &bytes[0], i, SDL_PRESSED); - } - } - break; - - case B_UNMAPPED_KEY_DOWN: /* modifier keys are unmapped */ - if (msg->FindInt32("key", &key) == B_OK) { - _KeyEvent((SDL_Scancode)key, NULL, 0, SDL_PRESSED); - } - break; - - case B_KEY_UP: - case B_UNMAPPED_KEY_UP: /* modifier keys are unmapped */ - if (msg->FindInt32("key", &key) == B_OK) { - _KeyEvent(key, NULL, 0, SDL_RELEASED); - } - break; - - default: - /* move it after switch{} so it's always handled - that way we keep Haiku features like: - - CTRL+Q to close window (and other shortcuts) - - PrintScreen to make screenshot into /boot/home - - etc.. */ - /* BDirectWindow::DispatchMessage(msg, target); */ - break; - } - - BDirectWindow::DispatchMessage(msg, target); - } - - /* Handle command messages */ - virtual void MessageReceived(BMessage* message) { - switch (message->what) { - /* Handle commands from SDL */ - case BWIN_SET_TITLE: - _SetTitle(message); - break; - case BWIN_MOVE_WINDOW: - _MoveTo(message); - break; - case BWIN_RESIZE_WINDOW: - _ResizeTo(message); - break; - case BWIN_SET_BORDERED: - _SetBordered(message); - break; - case BWIN_SET_RESIZABLE: - _SetResizable(message); - break; - case BWIN_SHOW_WINDOW: - Show(); - break; - case BWIN_HIDE_WINDOW: - Hide(); - break; - case BWIN_MAXIMIZE_WINDOW: - BWindow::Zoom(); - break; - case BWIN_MINIMIZE_WINDOW: - Minimize(true); - break; - case BWIN_RESTORE_WINDOW: - _Restore(); - break; - case BWIN_FULLSCREEN: - _SetFullScreen(message); - break; - default: - /* Perform normal message handling */ - BDirectWindow::MessageReceived(message); - break; - } - - } - - - - /* Accessor methods */ - bool IsShown() { return _shown; } - int32 GetID() { return _id; } - uint32 GetRowBytes() { return _row_bytes; } - int32 GetFbX() { return _bounds.left; } - int32 GetFbY() { return _bounds.top; } - bool ConnectionEnabled() { return !_connection_disabled; } - bool Connected() { return _connected; } - clipping_rect *GetClips() { return _clips; } - int32 GetNumClips() { return _num_clips; } - uint8* GetBufferPx() { return _bits; } - int32 GetBytesPerPx() { return _bytes_per_px; } - bool CanTrashWindowBuffer() { return _trash_window_buffer; } - bool BufferExists() { return _buffer_created; } - bool BufferIsDirty() { return _buffer_dirty; } - BBitmap *GetBitmap() { return _bitmap; } -#if SDL_VIDEO_OPENGL - BGLView *GetGLView() { return _SDL_GLView; } -#endif - - /* Setter methods */ - void SetID(int32 id) { _id = id; } - void SetBufferExists(bool bufferExists) { _buffer_created = bufferExists; } - void LockBuffer() { _buffer_locker->Lock(); } - void UnlockBuffer() { _buffer_locker->Unlock(); } - void SetBufferDirty(bool bufferDirty) { _buffer_dirty = bufferDirty; } - void SetTrashBuffer(bool trash) { _trash_window_buffer = trash; } - void SetBitmap(BBitmap *bitmap) { _bitmap = bitmap; } - - -private: - /* Event redirection */ - void _MouseMotionEvent(BPoint &where, int32 transit) { - if(transit == B_EXITED_VIEW) { - /* Change mouse focus */ - if(_mouse_focused) { - _MouseFocusEvent(false); - } - } else { - /* Change mouse focus */ - if (!_mouse_focused) { - _MouseFocusEvent(true); - } - BMessage msg(BAPP_MOUSE_MOVED); - msg.AddInt32("x", (int)where.x); - msg.AddInt32("y", (int)where.y); - - _PostWindowEvent(msg); - } - } - - void _MouseFocusEvent(bool focusGained) { - _mouse_focused = focusGained; - BMessage msg(BAPP_MOUSE_FOCUS); - msg.AddBool("focusGained", focusGained); - _PostWindowEvent(msg); - -/* FIXME: Why were these here? - if false: be_app->SetCursor(B_HAND_CURSOR); - if true: SDL_SetCursor(NULL); */ - } - - void _MouseButtonEvent(int32 buttons) { - int32 buttonStateChange = buttons ^ _last_buttons; - - /* Make sure at least one button has changed state */ - if( !(buttonStateChange) ) { - return; - } - - /* Add any mouse button events */ - if(buttonStateChange & B_PRIMARY_MOUSE_BUTTON) { - _SendMouseButton(SDL_BUTTON_LEFT, buttons & - B_PRIMARY_MOUSE_BUTTON); - } - if(buttonStateChange & B_SECONDARY_MOUSE_BUTTON) { - _SendMouseButton(SDL_BUTTON_RIGHT, buttons & - B_PRIMARY_MOUSE_BUTTON); - } - if(buttonStateChange & B_TERTIARY_MOUSE_BUTTON) { - _SendMouseButton(SDL_BUTTON_MIDDLE, buttons & - B_PRIMARY_MOUSE_BUTTON); - } - - _last_buttons = buttons; - } - - void _SendMouseButton(int32 button, int32 state) { - BMessage msg(BAPP_MOUSE_BUTTON); - msg.AddInt32("button-id", button); - msg.AddInt32("button-state", state); - _PostWindowEvent(msg); - } - - void _MouseWheelEvent(int32 x, int32 y) { - /* Create a message to pass along to the BeApp thread */ - BMessage msg(BAPP_MOUSE_WHEEL); - msg.AddInt32("xticks", x); - msg.AddInt32("yticks", y); - _PostWindowEvent(msg); - } - - void _KeyEvent(int32 keyCode, const int8 *keyUtf8, const ssize_t & len, int32 keyState) { - /* Create a message to pass along to the BeApp thread */ - BMessage msg(BAPP_KEY); - msg.AddInt32("key-state", keyState); - msg.AddInt32("key-scancode", keyCode); - if (keyUtf8 != NULL) { - msg.AddData("key-utf8", B_INT8_TYPE, (const void*)keyUtf8, len); - } - be_app->PostMessage(&msg); - } - - void _RepaintEvent() { - /* Force a repaint: Call the SDL exposed event */ - BMessage msg(BAPP_REPAINT); - _PostWindowEvent(msg); - } - void _PostWindowEvent(BMessage &msg) { - msg.AddInt32("window-id", _id); - be_app->PostMessage(&msg); - } - - /* Command methods (functions called upon by SDL) */ - void _SetTitle(BMessage *msg) { - const char *title; - if( - msg->FindString("window-title", &title) != B_OK - ) { - return; - } - SetTitle(title); - } - - void _MoveTo(BMessage *msg) { - int32 x, y; - if( - msg->FindInt32("window-x", &x) != B_OK || - msg->FindInt32("window-y", &y) != B_OK - ) { - return; - } - MoveTo(x, y); - } - - void _ResizeTo(BMessage *msg) { - int32 w, h; - if( - msg->FindInt32("window-w", &w) != B_OK || - msg->FindInt32("window-h", &h) != B_OK - ) { - return; - } - ResizeTo(w, h); - } - - void _SetBordered(BMessage *msg) { - bool bEnabled; - if(msg->FindBool("window-border", &bEnabled) != B_OK) { - return; - } - SetLook(bEnabled ? B_BORDERED_WINDOW_LOOK : B_NO_BORDER_WINDOW_LOOK); - } - - void _SetResizable(BMessage *msg) { - bool bEnabled; - if(msg->FindBool("window-resizable", &bEnabled) != B_OK) { - return; - } - if (bEnabled) { - SetFlags(Flags() & ~(B_NOT_RESIZABLE | B_NOT_ZOOMABLE)); - } else { - SetFlags(Flags() | (B_NOT_RESIZABLE | B_NOT_ZOOMABLE)); - } - } - - void _Restore() { - if(IsMinimized()) { - Minimize(false); - } else if(IsHidden()) { - Show(); - } else if(_prev_frame != NULL) { /* Zoomed */ - MoveTo(_prev_frame->left, _prev_frame->top); - ResizeTo(_prev_frame->Width(), _prev_frame->Height()); - } - } - - void _SetFullScreen(BMessage *msg) { - bool fullscreen; - if( - msg->FindBool("fullscreen", &fullscreen) != B_OK - ) { - return; - } - SetFullScreen(fullscreen); - } - - /* Members */ -#if SDL_VIDEO_OPENGL - BGLView * _SDL_GLView; -#endif - - int32 _last_buttons; - int32 _id; /* Window id used by SDL_BApp */ - bool _mouse_focused; /* Does this window have mouse focus? */ - bool _shown; - bool _inhibit_resize; - - BRect *_prev_frame; /* Previous position and size of the window */ - - /* Framebuffer members */ - bool _connected, - _connection_disabled, - _buffer_created, - _buffer_dirty, - _trash_window_buffer; - uint8 *_bits; - uint32 _row_bytes; - clipping_rect _bounds; - BLocker *_buffer_locker; - clipping_rect *_clips; - int32 _num_clips; - int32 _bytes_per_px; - thread_id _draw_thread_id; - - BBitmap *_bitmap; -}; - - -/* FIXME: - * An explanation of framebuffer flags. - * - * _connected - Original variable used to let the drawing thread know - * when changes are being made to the other framebuffer - * members. - * _connection_disabled - Used to signal to the drawing thread that the window - * is closing, and the thread should exit. - * _buffer_created - True if the current buffer is valid - * _buffer_dirty - True if the window should be redrawn. - * _trash_window_buffer - True if the window buffer needs to be trashed partway - * through a draw cycle. Occurs when the previous - * buffer provided by DirectConnected() is invalidated. - */ -#endif diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bclipboard.cc b/3rdparty/SDL2/src/video/haiku/SDL_bclipboard.cc deleted file mode 100644 index fcd1caa269b..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bclipboard.cc +++ /dev/null @@ -1,95 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_HAIKU - -/* BWindow based framebuffer implementation */ - -#include <unistd.h> -#include <TypeConstants.h> - -#include "SDL_BWin.h" -#include "SDL_timer.h" -#include "../SDL_sysvideo.h" - -#ifdef __cplusplus -extern "C" { -#endif - -int BE_SetClipboardText(_THIS, const char *text) { - BMessage *clip = NULL; - if(be_clipboard->Lock()) { - be_clipboard->Clear(); - if((clip = be_clipboard->Data())) { - /* Presumably the string of characters is ascii-format */ - ssize_t asciiLength = 0; - for(; text[asciiLength] != 0; ++asciiLength) {} - clip->AddData("text/plain", B_MIME_TYPE, &text, asciiLength); - be_clipboard->Commit(); - } - be_clipboard->Unlock(); - } - return 0; -} - -char *BE_GetClipboardText(_THIS) { - BMessage *clip = NULL; - const char *text = NULL; - ssize_t length; - char *result; - if(be_clipboard->Lock()) { - if((clip = be_clipboard->Data())) { - /* Presumably the string of characters is ascii-format */ - clip->FindData("text/plain", B_MIME_TYPE, (const void**)&text, - &length); - } else { - be_clipboard->Unlock(); - } - be_clipboard->Unlock(); - } - - if (!text) { - result = SDL_strdup(""); - } else { - /* Copy the data and pass on to SDL */ - result = (char*)SDL_calloc(1, sizeof(char*)*length); - SDL_strlcpy(result, text, length); - } - - return result; -} - -SDL_bool BE_HasClipboardText(_THIS) { - SDL_bool result = SDL_FALSE; - char *text = BE_GetClipboardText(_this); - if (text) { - result = text[0] != '\0' ? SDL_TRUE : SDL_FALSE; - SDL_free(text); - } - return result; -} - -#ifdef __cplusplus -} -#endif - -#endif /* SDL_VIDEO_DRIVER_HAIKU */ diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bclipboard.h b/3rdparty/SDL2/src/video/haiku/SDL_bclipboard.h deleted file mode 100644 index dd31f19a558..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bclipboard.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#ifndef SDL_BCLIPBOARD_H -#define SDL_BCLIPBOARD_H - -extern int BE_SetClipboardText(_THIS, const char *text); -extern char *BE_GetClipboardText(_THIS); -extern SDL_bool BE_HasClipboardText(_THIS); - -#endif diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bevents.cc b/3rdparty/SDL2/src/video/haiku/SDL_bevents.cc deleted file mode 100644 index 36513a3b242..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bevents.cc +++ /dev/null @@ -1,39 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_HAIKU - -#include "SDL_bevents.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void BE_PumpEvents(_THIS) { - /* Since the event thread is its own thread, this isn't really necessary */ -} - -#ifdef __cplusplus -} -#endif - -#endif /* SDL_VIDEO_DRIVER_HAIKU */ diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bevents.h b/3rdparty/SDL2/src/video/haiku/SDL_bevents.h deleted file mode 100644 index cb756c9677b..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bevents.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SDL_BEVENTS_H -#define SDL_BEVENTS_H - -#include "../SDL_sysvideo.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern void BE_PumpEvents(_THIS); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bframebuffer.cc b/3rdparty/SDL2/src/video/haiku/SDL_bframebuffer.cc deleted file mode 100644 index 5e6a300e8e2..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bframebuffer.cc +++ /dev/null @@ -1,254 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_HAIKU - -#include "SDL_bframebuffer.h" - -#include <AppKit.h> -#include <InterfaceKit.h> -#include "SDL_bmodes.h" -#include "SDL_BWin.h" - -#include "../../main/haiku/SDL_BApp.h" - -#ifdef __cplusplus -extern "C" { -#endif - -int32 BE_UpdateOnce(SDL_Window *window); - -static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) { - return ((SDL_BWin*)(window->driverdata)); -} - -static SDL_INLINE SDL_BApp *_GetBeApp() { - return ((SDL_BApp*)be_app); -} - -int BE_CreateWindowFramebuffer(_THIS, SDL_Window * window, - Uint32 * format, - void ** pixels, int *pitch) { - SDL_BWin *bwin = _ToBeWin(window); - BScreen bscreen; - if(!bscreen.IsValid()) { - return -1; - } - - while(!bwin->Connected()) { snooze(100); } - - /* Make sure we have exclusive access to frame buffer data */ - bwin->LockBuffer(); - - /* format */ - display_mode bmode; - bscreen.GetMode(&bmode); - int32 bpp = BE_ColorSpaceToBitsPerPixel(bmode.space); - *format = BE_BPPToSDLPxFormat(bpp); - - /* Create the new bitmap object */ - BBitmap *bitmap = bwin->GetBitmap(); - - if(bitmap) { - delete bitmap; - } - bitmap = new BBitmap(bwin->Bounds(), (color_space)bmode.space, - false, /* Views not accepted */ - true); /* Contiguous memory required */ - - if(bitmap->InitCheck() != B_OK) { - return SDL_SetError("Could not initialize back buffer!\n"); - } - - - bwin->SetBitmap(bitmap); - - /* Set the pixel pointer */ - *pixels = bitmap->Bits(); - - /* pitch = width of window, in bytes */ - *pitch = bitmap->BytesPerRow(); - - bwin->SetBufferExists(true); - bwin->SetTrashBuffer(false); - bwin->UnlockBuffer(); - return 0; -} - - - -int BE_UpdateWindowFramebuffer(_THIS, SDL_Window * window, - const SDL_Rect * rects, int numrects) { - if(!window) - return 0; - - SDL_BWin *bwin = _ToBeWin(window); - -#ifdef DRAWTHREAD - bwin->LockBuffer(); - bwin->SetBufferDirty(true); - bwin->UnlockBuffer(); -#else - bwin->SetBufferDirty(true); - BE_UpdateOnce(window); -#endif - - return 0; -} - -int32 BE_DrawThread(void *data) { - SDL_BWin *bwin = (SDL_BWin*)data; - - BScreen bscreen; - if(!bscreen.IsValid()) { - return -1; - } - - while(bwin->ConnectionEnabled()) { - if( bwin->Connected() && bwin->BufferExists() && bwin->BufferIsDirty() ) { - bwin->LockBuffer(); - BBitmap *bitmap = NULL; - bitmap = bwin->GetBitmap(); - int32 windowPitch = bitmap->BytesPerRow(); - int32 bufferPitch = bwin->GetRowBytes(); - uint8 *windowpx; - uint8 *bufferpx; - - int32 BPP = bwin->GetBytesPerPx(); - int32 windowSub = bwin->GetFbX() * BPP + - bwin->GetFbY() * windowPitch; - clipping_rect *clips = bwin->GetClips(); - int32 numClips = bwin->GetNumClips(); - int i, y; - - /* Blit each clipping rectangle */ - bscreen.WaitForRetrace(); - for(i = 0; i < numClips; ++i) { - clipping_rect rc = clips[i]; - /* Get addresses of the start of each clipping rectangle */ - int32 width = clips[i].right - clips[i].left + 1; - int32 height = clips[i].bottom - clips[i].top + 1; - bufferpx = bwin->GetBufferPx() + - clips[i].top * bufferPitch + clips[i].left * BPP; - windowpx = (uint8*)bitmap->Bits() + - clips[i].top * windowPitch + clips[i].left * BPP - - windowSub; - - /* Copy each row of pixels from the window buffer into the frame - buffer */ - for(y = 0; y < height; ++y) - { - - if(bwin->CanTrashWindowBuffer()) { - goto escape; /* Break out before the buffer is killed */ - } - - memcpy(bufferpx, windowpx, width * BPP); - bufferpx += bufferPitch; - windowpx += windowPitch; - } - } - - bwin->SetBufferDirty(false); -escape: - bwin->UnlockBuffer(); - } else { - snooze(16000); - } - } - - return B_OK; -} - -void BE_DestroyWindowFramebuffer(_THIS, SDL_Window * window) { - SDL_BWin *bwin = _ToBeWin(window); - - bwin->LockBuffer(); - - /* Free and clear the window buffer */ - BBitmap *bitmap = bwin->GetBitmap(); - delete bitmap; - bwin->SetBitmap(NULL); - bwin->SetBufferExists(false); - bwin->UnlockBuffer(); -} - - -/* - * TODO: - * This was written to test if certain errors were caused by threading issues. - * The specific issues have since become rare enough that they may have been - * solved, but I doubt it- they were pretty sporadic before now. - */ -int32 BE_UpdateOnce(SDL_Window *window) { - SDL_BWin *bwin = _ToBeWin(window); - BScreen bscreen; - if(!bscreen.IsValid()) { - return -1; - } - - if(bwin->ConnectionEnabled() && bwin->Connected()) { - bwin->LockBuffer(); - int32 windowPitch = window->surface->pitch; - int32 bufferPitch = bwin->GetRowBytes(); - uint8 *windowpx; - uint8 *bufferpx; - - int32 BPP = bwin->GetBytesPerPx(); - uint8 *windowBaseAddress = (uint8*)window->surface->pixels; - int32 windowSub = bwin->GetFbX() * BPP + - bwin->GetFbY() * windowPitch; - clipping_rect *clips = bwin->GetClips(); - int32 numClips = bwin->GetNumClips(); - int i, y; - - /* Blit each clipping rectangle */ - bscreen.WaitForRetrace(); - for(i = 0; i < numClips; ++i) { - clipping_rect rc = clips[i]; - /* Get addresses of the start of each clipping rectangle */ - int32 width = clips[i].right - clips[i].left + 1; - int32 height = clips[i].bottom - clips[i].top + 1; - bufferpx = bwin->GetBufferPx() + - clips[i].top * bufferPitch + clips[i].left * BPP; - windowpx = windowBaseAddress + - clips[i].top * windowPitch + clips[i].left * BPP - windowSub; - - /* Copy each row of pixels from the window buffer into the frame - buffer */ - for(y = 0; y < height; ++y) - { - memcpy(bufferpx, windowpx, width * BPP); - bufferpx += bufferPitch; - windowpx += windowPitch; - } - } - bwin->UnlockBuffer(); - } - return 0; -} - -#ifdef __cplusplus -} -#endif - -#endif /* SDL_VIDEO_DRIVER_HAIKU */ diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bframebuffer.h b/3rdparty/SDL2/src/video/haiku/SDL_bframebuffer.h deleted file mode 100644 index d6be21f4d06..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bframebuffer.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SDL_BFRAMEBUFFER_H -#define SDL_BFRAMEBUFFER_H -#include <SupportDefs.h> -#ifdef __cplusplus -extern "C" { -#endif - -#define DRAWTHREAD - -#include "../SDL_sysvideo.h" - -extern int BE_CreateWindowFramebuffer(_THIS, SDL_Window * window, - Uint32 * format, - void ** pixels, int *pitch); -extern int BE_UpdateWindowFramebuffer(_THIS, SDL_Window * window, - const SDL_Rect * rects, int numrects); -extern void BE_DestroyWindowFramebuffer(_THIS, SDL_Window * window); -extern int32 BE_DrawThread(void *data); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bkeyboard.cc b/3rdparty/SDL2/src/video/haiku/SDL_bkeyboard.cc deleted file mode 100644 index 0ae3d3fc109..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bkeyboard.cc +++ /dev/null @@ -1,188 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_HAIKU - -#include <SupportDefs.h> -#include <support/UTF8.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#include "SDL_events.h" -#include "SDL_keycode.h" - -#include "SDL_bkeyboard.h" - - -#define KEYMAP_SIZE 128 - - -static SDL_Scancode keymap[KEYMAP_SIZE]; -static int8 keystate[KEYMAP_SIZE]; - -void BE_InitOSKeymap() { - for( uint i = 0; i < SDL_TABLESIZE(keymap); ++i ) { - keymap[i] = SDL_SCANCODE_UNKNOWN; - } - - for( uint i = 0; i < KEYMAP_SIZE; ++i ) { - keystate[i] = SDL_RELEASED; - } - - keymap[0x01] = SDL_GetScancodeFromKey(SDLK_ESCAPE); - keymap[B_F1_KEY] = SDL_GetScancodeFromKey(SDLK_F1); - keymap[B_F2_KEY] = SDL_GetScancodeFromKey(SDLK_F2); - keymap[B_F3_KEY] = SDL_GetScancodeFromKey(SDLK_F3); - keymap[B_F4_KEY] = SDL_GetScancodeFromKey(SDLK_F4); - keymap[B_F5_KEY] = SDL_GetScancodeFromKey(SDLK_F5); - keymap[B_F6_KEY] = SDL_GetScancodeFromKey(SDLK_F6); - keymap[B_F7_KEY] = SDL_GetScancodeFromKey(SDLK_F7); - keymap[B_F8_KEY] = SDL_GetScancodeFromKey(SDLK_F8); - keymap[B_F9_KEY] = SDL_GetScancodeFromKey(SDLK_F9); - keymap[B_F10_KEY] = SDL_GetScancodeFromKey(SDLK_F10); - keymap[B_F11_KEY] = SDL_GetScancodeFromKey(SDLK_F11); - keymap[B_F12_KEY] = SDL_GetScancodeFromKey(SDLK_F12); - keymap[B_PRINT_KEY] = SDL_GetScancodeFromKey(SDLK_PRINTSCREEN); - keymap[B_SCROLL_KEY] = SDL_GetScancodeFromKey(SDLK_SCROLLLOCK); - keymap[B_PAUSE_KEY] = SDL_GetScancodeFromKey(SDLK_PAUSE); - keymap[0x11] = SDL_GetScancodeFromKey(SDLK_BACKQUOTE); - keymap[0x12] = SDL_GetScancodeFromKey(SDLK_1); - keymap[0x13] = SDL_GetScancodeFromKey(SDLK_2); - keymap[0x14] = SDL_GetScancodeFromKey(SDLK_3); - keymap[0x15] = SDL_GetScancodeFromKey(SDLK_4); - keymap[0x16] = SDL_GetScancodeFromKey(SDLK_5); - keymap[0x17] = SDL_GetScancodeFromKey(SDLK_6); - keymap[0x18] = SDL_GetScancodeFromKey(SDLK_7); - keymap[0x19] = SDL_GetScancodeFromKey(SDLK_8); - keymap[0x1a] = SDL_GetScancodeFromKey(SDLK_9); - keymap[0x1b] = SDL_GetScancodeFromKey(SDLK_0); - keymap[0x1c] = SDL_GetScancodeFromKey(SDLK_MINUS); - keymap[0x1d] = SDL_GetScancodeFromKey(SDLK_EQUALS); - keymap[0x1e] = SDL_GetScancodeFromKey(SDLK_BACKSPACE); - keymap[0x1f] = SDL_GetScancodeFromKey(SDLK_INSERT); - keymap[0x20] = SDL_GetScancodeFromKey(SDLK_HOME); - keymap[0x21] = SDL_GetScancodeFromKey(SDLK_PAGEUP); - keymap[0x22] = SDL_GetScancodeFromKey(SDLK_NUMLOCKCLEAR); - keymap[0x23] = SDL_GetScancodeFromKey(SDLK_KP_DIVIDE); - keymap[0x24] = SDL_GetScancodeFromKey(SDLK_KP_MULTIPLY); - keymap[0x25] = SDL_GetScancodeFromKey(SDLK_KP_MINUS); - keymap[0x26] = SDL_GetScancodeFromKey(SDLK_TAB); - keymap[0x27] = SDL_GetScancodeFromKey(SDLK_q); - keymap[0x28] = SDL_GetScancodeFromKey(SDLK_w); - keymap[0x29] = SDL_GetScancodeFromKey(SDLK_e); - keymap[0x2a] = SDL_GetScancodeFromKey(SDLK_r); - keymap[0x2b] = SDL_GetScancodeFromKey(SDLK_t); - keymap[0x2c] = SDL_GetScancodeFromKey(SDLK_y); - keymap[0x2d] = SDL_GetScancodeFromKey(SDLK_u); - keymap[0x2e] = SDL_GetScancodeFromKey(SDLK_i); - keymap[0x2f] = SDL_GetScancodeFromKey(SDLK_o); - keymap[0x30] = SDL_GetScancodeFromKey(SDLK_p); - keymap[0x31] = SDL_GetScancodeFromKey(SDLK_LEFTBRACKET); - keymap[0x32] = SDL_GetScancodeFromKey(SDLK_RIGHTBRACKET); - keymap[0x33] = SDL_GetScancodeFromKey(SDLK_BACKSLASH); - keymap[0x34] = SDL_GetScancodeFromKey(SDLK_DELETE); - keymap[0x35] = SDL_GetScancodeFromKey(SDLK_END); - keymap[0x36] = SDL_GetScancodeFromKey(SDLK_PAGEDOWN); - keymap[0x37] = SDL_GetScancodeFromKey(SDLK_KP_7); - keymap[0x38] = SDL_GetScancodeFromKey(SDLK_KP_8); - keymap[0x39] = SDL_GetScancodeFromKey(SDLK_KP_9); - keymap[0x3a] = SDL_GetScancodeFromKey(SDLK_KP_PLUS); - keymap[0x3b] = SDL_GetScancodeFromKey(SDLK_CAPSLOCK); - keymap[0x3c] = SDL_GetScancodeFromKey(SDLK_a); - keymap[0x3d] = SDL_GetScancodeFromKey(SDLK_s); - keymap[0x3e] = SDL_GetScancodeFromKey(SDLK_d); - keymap[0x3f] = SDL_GetScancodeFromKey(SDLK_f); - keymap[0x40] = SDL_GetScancodeFromKey(SDLK_g); - keymap[0x41] = SDL_GetScancodeFromKey(SDLK_h); - keymap[0x42] = SDL_GetScancodeFromKey(SDLK_j); - keymap[0x43] = SDL_GetScancodeFromKey(SDLK_k); - keymap[0x44] = SDL_GetScancodeFromKey(SDLK_l); - keymap[0x45] = SDL_GetScancodeFromKey(SDLK_SEMICOLON); - keymap[0x46] = SDL_GetScancodeFromKey(SDLK_QUOTE); - keymap[0x47] = SDL_GetScancodeFromKey(SDLK_RETURN); - keymap[0x48] = SDL_GetScancodeFromKey(SDLK_KP_4); - keymap[0x49] = SDL_GetScancodeFromKey(SDLK_KP_5); - keymap[0x4a] = SDL_GetScancodeFromKey(SDLK_KP_6); - keymap[0x4b] = SDL_GetScancodeFromKey(SDLK_LSHIFT); - keymap[0x4c] = SDL_GetScancodeFromKey(SDLK_z); - keymap[0x4d] = SDL_GetScancodeFromKey(SDLK_x); - keymap[0x4e] = SDL_GetScancodeFromKey(SDLK_c); - keymap[0x4f] = SDL_GetScancodeFromKey(SDLK_v); - keymap[0x50] = SDL_GetScancodeFromKey(SDLK_b); - keymap[0x51] = SDL_GetScancodeFromKey(SDLK_n); - keymap[0x52] = SDL_GetScancodeFromKey(SDLK_m); - keymap[0x53] = SDL_GetScancodeFromKey(SDLK_COMMA); - keymap[0x54] = SDL_GetScancodeFromKey(SDLK_PERIOD); - keymap[0x55] = SDL_GetScancodeFromKey(SDLK_SLASH); - keymap[0x56] = SDL_GetScancodeFromKey(SDLK_RSHIFT); - keymap[0x57] = SDL_GetScancodeFromKey(SDLK_UP); - keymap[0x58] = SDL_GetScancodeFromKey(SDLK_KP_1); - keymap[0x59] = SDL_GetScancodeFromKey(SDLK_KP_2); - keymap[0x5a] = SDL_GetScancodeFromKey(SDLK_KP_3); - keymap[0x5b] = SDL_GetScancodeFromKey(SDLK_KP_ENTER); - keymap[0x5c] = SDL_GetScancodeFromKey(SDLK_LCTRL); - keymap[0x5d] = SDL_GetScancodeFromKey(SDLK_LALT); - keymap[0x5e] = SDL_GetScancodeFromKey(SDLK_SPACE); - keymap[0x5f] = SDL_GetScancodeFromKey(SDLK_RALT); - keymap[0x60] = SDL_GetScancodeFromKey(SDLK_RCTRL); - keymap[0x61] = SDL_GetScancodeFromKey(SDLK_LEFT); - keymap[0x62] = SDL_GetScancodeFromKey(SDLK_DOWN); - keymap[0x63] = SDL_GetScancodeFromKey(SDLK_RIGHT); - keymap[0x64] = SDL_GetScancodeFromKey(SDLK_KP_0); - keymap[0x65] = SDL_GetScancodeFromKey(SDLK_KP_PERIOD); - keymap[0x66] = SDL_GetScancodeFromKey(SDLK_LGUI); - keymap[0x67] = SDL_GetScancodeFromKey(SDLK_RGUI); - keymap[0x68] = SDL_GetScancodeFromKey(SDLK_MENU); - keymap[0x69] = SDL_GetScancodeFromKey(SDLK_2); /* SDLK_EURO */ - keymap[0x6a] = SDL_GetScancodeFromKey(SDLK_KP_EQUALS); - keymap[0x6b] = SDL_GetScancodeFromKey(SDLK_POWER); -} - -SDL_Scancode BE_GetScancodeFromBeKey(int32 bkey) { - if(bkey > 0 && bkey < (int32)SDL_TABLESIZE(keymap)) { - return keymap[bkey]; - } else { - return SDL_SCANCODE_UNKNOWN; - } -} - -int8 BE_GetKeyState(int32 bkey) { - if(bkey > 0 && bkey < KEYMAP_SIZE) { - return keystate[bkey]; - } else { - return SDL_RELEASED; - } -} - -void BE_SetKeyState(int32 bkey, int8 state) { - if(bkey > 0 && bkey < KEYMAP_SIZE) { - keystate[bkey] = state; - } -} - -#ifdef __cplusplus -} -#endif - -#endif /* SDL_VIDEO_DRIVER_HAIKU */ diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bkeyboard.h b/3rdparty/SDL2/src/video/haiku/SDL_bkeyboard.h deleted file mode 100644 index 63279942149..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bkeyboard.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SDL_BKEYBOARD_H -#define SDL_BKEYBOARD_H - -#include <SupportDefs.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../../../include/SDL_keyboard.h" - -extern void BE_InitOSKeymap(); -extern SDL_Scancode BE_GetScancodeFromBeKey(int32 bkey); -extern int8 BE_GetKeyState(int32 bkey); -extern void BE_SetKeyState(int32 bkey, int8 state); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bmodes.cc b/3rdparty/SDL2/src/video/haiku/SDL_bmodes.cc deleted file mode 100644 index 84aeb1f07bc..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bmodes.cc +++ /dev/null @@ -1,331 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_HAIKU - -#include <AppKit.h> -#include <InterfaceKit.h> -#include "SDL_bmodes.h" -#include "SDL_BWin.h" - -#if SDL_VIDEO_OPENGL -#include "SDL_bopengl.h" -#endif - -#include "../../main/haiku/SDL_BApp.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define WRAP_BMODE 1 /* FIXME: Some debate as to whether this is necessary */ - -#if WRAP_BMODE -/* This wrapper is here so that the driverdata can be freed without freeing - the display_mode structure */ -typedef struct SDL_DisplayModeData { - display_mode *bmode; -}; -#endif - -static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) { - return ((SDL_BWin*)(window->driverdata)); -} - -static SDL_INLINE SDL_BApp *_GetBeApp() { - return ((SDL_BApp*)be_app); -} - -static SDL_INLINE display_mode * _ExtractBMode(SDL_DisplayMode *mode) { -#if WRAP_BMODE - return ((SDL_DisplayModeData*)mode->driverdata)->bmode; -#else - return (display_mode*)(mode->driverdata); -#endif -} - -/* Copied from haiku/trunk/src/preferences/screen/ScreenMode.cpp */ -static float get_refresh_rate(display_mode &mode) { - return float(mode.timing.pixel_clock * 1000) - / float(mode.timing.h_total * mode.timing.v_total); -} - - -#if 0 -/* TODO: - * This is a useful debugging tool. Uncomment and insert into code as needed. - */ -void _SpoutModeData(display_mode *bmode) { - printf("BMode:\n"); - printf("\tw,h = (%i,%i)\n", bmode->virtual_width, bmode->virtual_height); - printf("\th,v = (%i,%i)\n", bmode->h_display_start, - bmode->v_display_start); - if(bmode->flags) { - printf("\tFlags:\n"); - if(bmode->flags & B_SCROLL) { - printf("\t\tB_SCROLL\n"); - } - if(bmode->flags & B_8_BIT_DAC) { - printf("\t\tB_8_BIT_DAC\n"); - } - if(bmode->flags & B_HARDWARE_CURSOR) { - printf("\t\tB_HARDWARE_CURSOR\n"); - } - if(bmode->flags & B_PARALLEL_ACCESS) { - printf("\t\tB_PARALLEL_ACCESS\n"); - } - if(bmode->flags & B_DPMS) { - printf("\t\tB_DPMS\n"); - } - if(bmode->flags & B_IO_FB_NA) { - printf("\t\tB_IO_FB_NA\n"); - } - } - printf("\tTiming:\n"); - printf("\t\tpx clock: %i\n", bmode->timing.pixel_clock); - printf("\t\th - display: %i sync start: %i sync end: %i total: %i\n", - bmode->timing.h_display, bmode->timing.h_sync_start, - bmode->timing.h_sync_end, bmode->timing.h_total); - printf("\t\tv - display: %i sync start: %i sync end: %i total: %i\n", - bmode->timing.v_display, bmode->timing.v_sync_start, - bmode->timing.v_sync_end, bmode->timing.v_total); - if(bmode->timing.flags) { - printf("\t\tFlags:\n"); - if(bmode->timing.flags & B_BLANK_PEDESTAL) { - printf("\t\t\tB_BLANK_PEDESTAL\n"); - } - if(bmode->timing.flags & B_TIMING_INTERLACED) { - printf("\t\t\tB_TIMING_INTERLACED\n"); - } - if(bmode->timing.flags & B_POSITIVE_HSYNC) { - printf("\t\t\tB_POSITIVE_HSYNC\n"); - } - if(bmode->timing.flags & B_POSITIVE_VSYNC) { - printf("\t\t\tB_POSITIVE_VSYNC\n"); - } - if(bmode->timing.flags & B_SYNC_ON_GREEN) { - printf("\t\t\tB_SYNC_ON_GREEN\n"); - } - } -} -#endif - - - -int32 BE_ColorSpaceToBitsPerPixel(uint32 colorspace) -{ - int bitsperpixel; - - bitsperpixel = 0; - switch (colorspace) { - case B_CMAP8: - bitsperpixel = 8; - break; - case B_RGB15: - case B_RGBA15: - case B_RGB15_BIG: - case B_RGBA15_BIG: - bitsperpixel = 15; - break; - case B_RGB16: - case B_RGB16_BIG: - bitsperpixel = 16; - break; - case B_RGB32: - case B_RGBA32: - case B_RGB32_BIG: - case B_RGBA32_BIG: - bitsperpixel = 32; - break; - default: - break; - } - return(bitsperpixel); -} - -int32 BE_BPPToSDLPxFormat(int32 bpp) { - /* Translation taken from SDL_windowsmodes.c */ - switch (bpp) { - case 32: - return SDL_PIXELFORMAT_RGB888; - break; - case 24: /* May not be supported by Haiku */ - return SDL_PIXELFORMAT_RGB24; - break; - case 16: - return SDL_PIXELFORMAT_RGB565; - break; - case 15: - return SDL_PIXELFORMAT_RGB555; - break; - case 8: - return SDL_PIXELFORMAT_INDEX8; - break; - case 4: /* May not be supported by Haiku */ - return SDL_PIXELFORMAT_INDEX4LSB; - break; - } - - /* May never get here, but safer and needed to shut up compiler */ - SDL_SetError("Invalid bpp value"); - return 0; -} - -static void _BDisplayModeToSdlDisplayMode(display_mode *bmode, - SDL_DisplayMode *mode) { - mode->w = bmode->virtual_width; - mode->h = bmode->virtual_height; - mode->refresh_rate = (int)get_refresh_rate(*bmode); - -#if WRAP_BMODE - SDL_DisplayModeData *data = (SDL_DisplayModeData*)SDL_calloc(1, - sizeof(SDL_DisplayModeData)); - data->bmode = bmode; - - mode->driverdata = data; - -#else - - mode->driverdata = bmode; -#endif - - /* Set the format */ - int32 bpp = BE_ColorSpaceToBitsPerPixel(bmode->space); - mode->format = BE_BPPToSDLPxFormat(bpp); -} - -/* Later, there may be more than one monitor available */ -static void _AddDisplay(BScreen *screen) { - SDL_VideoDisplay display; - SDL_DisplayMode *mode = (SDL_DisplayMode*)SDL_calloc(1, - sizeof(SDL_DisplayMode)); - display_mode *bmode = (display_mode*)SDL_calloc(1, sizeof(display_mode)); - screen->GetMode(bmode); - - _BDisplayModeToSdlDisplayMode(bmode, mode); - - SDL_zero(display); - display.desktop_mode = *mode; - display.current_mode = *mode; - - SDL_AddVideoDisplay(&display); -} - -/* - * Functions called by SDL - */ - -int BE_InitModes(_THIS) { - BScreen screen; - - /* TODO: When Haiku supports multiple display screens, call - _AddDisplayScreen() for each of them. */ - _AddDisplay(&screen); - return 0; -} - -int BE_QuitModes(_THIS) { - /* FIXME: Nothing really needs to be done here at the moment? */ - return 0; -} - - -int BE_GetDisplayBounds(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect) { - BScreen bscreen; - BRect rc = bscreen.Frame(); - rect->x = (int)rc.left; - rect->y = (int)rc.top; - rect->w = (int)rc.Width() + 1; - rect->h = (int)rc.Height() + 1; - return 0; -} - -void BE_GetDisplayModes(_THIS, SDL_VideoDisplay *display) { - /* Get the current screen */ - BScreen bscreen; - - /* Iterate through all of the modes */ - SDL_DisplayMode mode; - display_mode this_bmode; - display_mode *bmodes; - uint32 count, i; - - /* Get graphics-hardware supported modes */ - bscreen.GetModeList(&bmodes, &count); - bscreen.GetMode(&this_bmode); - - for(i = 0; i < count; ++i) { - // FIXME: Apparently there are errors with colorspace changes - if (bmodes[i].space == this_bmode.space) { - _BDisplayModeToSdlDisplayMode(&bmodes[i], &mode); - SDL_AddDisplayMode(display, &mode); - } - } - free(bmodes); -} - - -int BE_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode){ - /* Get the current screen */ - BScreen bscreen; - if(!bscreen.IsValid()) { - printf(__FILE__": %d - ERROR: BAD SCREEN\n", __LINE__); - } - - /* Set the mode using the driver data */ - display_mode *bmode = _ExtractBMode(mode); - - - /* FIXME: Is the first option always going to be the right one? */ - uint32 c = 0, i; - display_mode *bmode_list; - bscreen.GetModeList(&bmode_list, &c); - for(i = 0; i < c; ++i) { - if( bmode_list[i].space == bmode->space && - bmode_list[i].virtual_width == bmode->virtual_width && - bmode_list[i].virtual_height == bmode->virtual_height ) { - bmode = &bmode_list[i]; - break; - } - } - - if(bscreen.SetMode(bmode) != B_OK) { - return SDL_SetError("Bad video mode\n"); - } - - free(bmode_list); - -#if SDL_VIDEO_OPENGL - /* FIXME: Is there some way to reboot the OpenGL context? This doesn't - help */ -// BE_GL_RebootContexts(_this); -#endif - - return 0; -} - -#ifdef __cplusplus -} -#endif - -#endif /* SDL_VIDEO_DRIVER_HAIKU */ diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bmodes.h b/3rdparty/SDL2/src/video/haiku/SDL_bmodes.h deleted file mode 100644 index c3882ba580d..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bmodes.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SDL_BMODES_H -#define SDL_BMODES_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../SDL_sysvideo.h" - -extern int32 BE_ColorSpaceToBitsPerPixel(uint32 colorspace); -extern int32 BE_BPPToSDLPxFormat(int32 bpp); - -extern int BE_InitModes(_THIS); -extern int BE_QuitModes(_THIS); -extern int BE_GetDisplayBounds(_THIS, SDL_VideoDisplay *display, - SDL_Rect *rect); -extern void BE_GetDisplayModes(_THIS, SDL_VideoDisplay *display); -extern int BE_SetDisplayMode(_THIS, SDL_VideoDisplay *display, - SDL_DisplayMode *mode); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bopengl.cc b/3rdparty/SDL2/src/video/haiku/SDL_bopengl.cc deleted file mode 100644 index 15454f1007b..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bopengl.cc +++ /dev/null @@ -1,219 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_HAIKU - -#include "SDL_bopengl.h" - -#include <unistd.h> -#include <KernelKit.h> -#include <OpenGLKit.h> -#include "SDL_BWin.h" -#include "../../main/haiku/SDL_BApp.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define BGL_FLAGS BGL_RGB | BGL_DOUBLE - -static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) { - return ((SDL_BWin*)(window->driverdata)); -} - -static SDL_INLINE SDL_BApp *_GetBeApp() { - return ((SDL_BApp*)be_app); -} - -/* Passing a NULL path means load pointers from the application */ -int BE_GL_LoadLibrary(_THIS, const char *path) -{ -/* FIXME: Is this working correctly? */ - image_info info; - int32 cookie = 0; - while (get_next_image_info(0, &cookie, &info) == B_OK) { - void *location = NULL; - if( get_image_symbol(info.id, "glBegin", B_SYMBOL_TYPE_ANY, - &location) == B_OK) { - - _this->gl_config.dll_handle = (void *) info.id; - _this->gl_config.driver_loaded = 1; - SDL_strlcpy(_this->gl_config.driver_path, "libGL.so", - SDL_arraysize(_this->gl_config.driver_path)); - } - } - return 0; -} - -void *BE_GL_GetProcAddress(_THIS, const char *proc) -{ - if (_this->gl_config.dll_handle != NULL) { - void *location = NULL; - status_t err; - if ((err = - get_image_symbol((image_id) _this->gl_config.dll_handle, - proc, B_SYMBOL_TYPE_ANY, - &location)) == B_OK) { - return location; - } else { - SDL_SetError("Couldn't find OpenGL symbol"); - return NULL; - } - } else { - SDL_SetError("OpenGL library not loaded"); - return NULL; - } -} - - - - -void BE_GL_SwapWindow(_THIS, SDL_Window * window) { - _ToBeWin(window)->SwapBuffers(); -} - -int BE_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) { - _GetBeApp()->SetCurrentContext(((SDL_BWin*)context)->GetGLView()); - return 0; -} - - -SDL_GLContext BE_GL_CreateContext(_THIS, SDL_Window * window) { - /* FIXME: Not sure what flags should be included here; may want to have - most of them */ - SDL_BWin *bwin = _ToBeWin(window); - bwin->CreateGLView(BGL_FLAGS); - return (SDL_GLContext)(bwin); -} - -void BE_GL_DeleteContext(_THIS, SDL_GLContext context) { - /* Currently, automatically unlocks the view */ - ((SDL_BWin*)context)->RemoveGLView(); -} - - -int BE_GL_SetSwapInterval(_THIS, int interval) { - /* TODO: Implement this, if necessary? */ - return 0; -} - -int BE_GL_GetSwapInterval(_THIS) { - /* TODO: Implement this, if necessary? */ - return 0; -} - - -void BE_GL_UnloadLibrary(_THIS) { - /* TODO: Implement this, if necessary? */ -} - - -/* FIXME: This function is meant to clear the OpenGL context when the video - mode changes (see SDL_bmodes.cc), but it doesn't seem to help, and is not - currently in use. */ -void BE_GL_RebootContexts(_THIS) { - SDL_Window *window = _this->windows; - while(window) { - SDL_BWin *bwin = _ToBeWin(window); - if(bwin->GetGLView()) { - bwin->LockLooper(); - bwin->RemoveGLView(); - bwin->CreateGLView(BGL_FLAGS); - bwin->UnlockLooper(); - } - window = window->next; - } -} - - -#if 0 /* Functions from 1.2 that do not appear to be used in 1.3 */ - - int BE_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value) - { - /* - FIXME? Right now BE_GL_GetAttribute shouldn't be called between glBegin() and glEnd() - it doesn't use "cached" values - */ - switch (attrib) { - case SDL_GL_RED_SIZE: - glGetIntegerv(GL_RED_BITS, (GLint *) value); - break; - case SDL_GL_GREEN_SIZE: - glGetIntegerv(GL_GREEN_BITS, (GLint *) value); - break; - case SDL_GL_BLUE_SIZE: - glGetIntegerv(GL_BLUE_BITS, (GLint *) value); - break; - case SDL_GL_ALPHA_SIZE: - glGetIntegerv(GL_ALPHA_BITS, (GLint *) value); - break; - case SDL_GL_DOUBLEBUFFER: - glGetBooleanv(GL_DOUBLEBUFFER, (GLboolean *) value); - break; - case SDL_GL_BUFFER_SIZE: - int v; - glGetIntegerv(GL_RED_BITS, (GLint *) & v); - *value = v; - glGetIntegerv(GL_GREEN_BITS, (GLint *) & v); - *value += v; - glGetIntegerv(GL_BLUE_BITS, (GLint *) & v); - *value += v; - glGetIntegerv(GL_ALPHA_BITS, (GLint *) & v); - *value += v; - break; - case SDL_GL_DEPTH_SIZE: - glGetIntegerv(GL_DEPTH_BITS, (GLint *) value); /* Mesa creates 16 only? r5 always 32 */ - break; - case SDL_GL_STENCIL_SIZE: - glGetIntegerv(GL_STENCIL_BITS, (GLint *) value); - break; - case SDL_GL_ACCUM_RED_SIZE: - glGetIntegerv(GL_ACCUM_RED_BITS, (GLint *) value); - break; - case SDL_GL_ACCUM_GREEN_SIZE: - glGetIntegerv(GL_ACCUM_GREEN_BITS, (GLint *) value); - break; - case SDL_GL_ACCUM_BLUE_SIZE: - glGetIntegerv(GL_ACCUM_BLUE_BITS, (GLint *) value); - break; - case SDL_GL_ACCUM_ALPHA_SIZE: - glGetIntegerv(GL_ACCUM_ALPHA_BITS, (GLint *) value); - break; - case SDL_GL_STEREO: - case SDL_GL_MULTISAMPLEBUFFERS: - case SDL_GL_MULTISAMPLESAMPLES: - default: - *value = 0; - return (-1); - } - return 0; - } - -#endif - - - -#ifdef __cplusplus -} -#endif - -#endif /* SDL_VIDEO_DRIVER_HAIKU */ diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bopengl.h b/3rdparty/SDL2/src/video/haiku/SDL_bopengl.h deleted file mode 100644 index e7d475dfb79..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bopengl.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SDL_BOPENGL_H -#define SDL_BOPENGL_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../SDL_sysvideo.h" - - -extern int BE_GL_LoadLibrary(_THIS, const char *path); /* FIXME */ -extern void *BE_GL_GetProcAddress(_THIS, const char *proc); /* FIXME */ -extern void BE_GL_UnloadLibrary(_THIS); /* TODO */ -extern int BE_GL_MakeCurrent(_THIS, SDL_Window * window, - SDL_GLContext context); -extern int BE_GL_SetSwapInterval(_THIS, int interval); /* TODO */ -extern int BE_GL_GetSwapInterval(_THIS); /* TODO */ -extern void BE_GL_SwapWindow(_THIS, SDL_Window * window); -extern SDL_GLContext BE_GL_CreateContext(_THIS, SDL_Window * window); -extern void BE_GL_DeleteContext(_THIS, SDL_GLContext context); - -extern void BE_GL_RebootContexts(_THIS); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bvideo.cc b/3rdparty/SDL2/src/video/haiku/SDL_bvideo.cc deleted file mode 100644 index 8986c609c7a..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bvideo.cc +++ /dev/null @@ -1,175 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_HAIKU - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "SDL_bkeyboard.h" -#include "SDL_bwindow.h" -#include "SDL_bclipboard.h" -#include "SDL_bvideo.h" -#include "SDL_bopengl.h" -#include "SDL_bmodes.h" -#include "SDL_bframebuffer.h" -#include "SDL_bevents.h" - -/* FIXME: Undefined functions */ -// #define BE_PumpEvents NULL - #define BE_StartTextInput NULL - #define BE_StopTextInput NULL - #define BE_SetTextInputRect NULL - -// #define BE_DeleteDevice NULL - -/* End undefined functions */ - -static SDL_VideoDevice * -BE_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - /*SDL_VideoData *data;*/ - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - - device->driverdata = NULL; /* FIXME: Is this the cause of some of the - SDL_Quit() errors? */ - -/* TODO: Figure out if any initialization needs to go here */ - - /* Set the function pointers */ - device->VideoInit = BE_VideoInit; - device->VideoQuit = BE_VideoQuit; - device->GetDisplayBounds = BE_GetDisplayBounds; - device->GetDisplayModes = BE_GetDisplayModes; - device->SetDisplayMode = BE_SetDisplayMode; - device->PumpEvents = BE_PumpEvents; - - device->CreateWindow = BE_CreateWindow; - device->CreateWindowFrom = BE_CreateWindowFrom; - device->SetWindowTitle = BE_SetWindowTitle; - device->SetWindowIcon = BE_SetWindowIcon; - device->SetWindowPosition = BE_SetWindowPosition; - device->SetWindowSize = BE_SetWindowSize; - device->ShowWindow = BE_ShowWindow; - device->HideWindow = BE_HideWindow; - device->RaiseWindow = BE_RaiseWindow; - device->MaximizeWindow = BE_MaximizeWindow; - device->MinimizeWindow = BE_MinimizeWindow; - device->RestoreWindow = BE_RestoreWindow; - device->SetWindowBordered = BE_SetWindowBordered; - device->SetWindowResizable = BE_SetWindowResizable; - device->SetWindowFullscreen = BE_SetWindowFullscreen; - device->SetWindowGammaRamp = BE_SetWindowGammaRamp; - device->GetWindowGammaRamp = BE_GetWindowGammaRamp; - device->SetWindowGrab = BE_SetWindowGrab; - device->DestroyWindow = BE_DestroyWindow; - device->GetWindowWMInfo = BE_GetWindowWMInfo; - device->CreateWindowFramebuffer = BE_CreateWindowFramebuffer; - device->UpdateWindowFramebuffer = BE_UpdateWindowFramebuffer; - device->DestroyWindowFramebuffer = BE_DestroyWindowFramebuffer; - - device->shape_driver.CreateShaper = NULL; - device->shape_driver.SetWindowShape = NULL; - device->shape_driver.ResizeWindowShape = NULL; - - - device->GL_LoadLibrary = BE_GL_LoadLibrary; - device->GL_GetProcAddress = BE_GL_GetProcAddress; - device->GL_UnloadLibrary = BE_GL_UnloadLibrary; - device->GL_CreateContext = BE_GL_CreateContext; - device->GL_MakeCurrent = BE_GL_MakeCurrent; - device->GL_SetSwapInterval = BE_GL_SetSwapInterval; - device->GL_GetSwapInterval = BE_GL_GetSwapInterval; - device->GL_SwapWindow = BE_GL_SwapWindow; - device->GL_DeleteContext = BE_GL_DeleteContext; - - device->StartTextInput = BE_StartTextInput; - device->StopTextInput = BE_StopTextInput; - device->SetTextInputRect = BE_SetTextInputRect; - - device->SetClipboardText = BE_SetClipboardText; - device->GetClipboardText = BE_GetClipboardText; - device->HasClipboardText = BE_HasClipboardText; - - device->free = BE_DeleteDevice; - - return device; -} - -VideoBootStrap HAIKU_bootstrap = { - "haiku", "Haiku graphics", - BE_Available, BE_CreateDevice -}; - -void BE_DeleteDevice(SDL_VideoDevice * device) -{ - SDL_free(device->driverdata); - SDL_free(device); -} - -int BE_VideoInit(_THIS) -{ - /* Initialize the Be Application for appserver interaction */ - if (SDL_InitBeApp() < 0) { - return -1; - } - - /* Initialize video modes */ - BE_InitModes(_this); - - /* Init the keymap */ - BE_InitOSKeymap(); - - -#if SDL_VIDEO_OPENGL - /* testgl application doesn't load library, just tries to load symbols */ - /* is it correct? if so we have to load library here */ - BE_GL_LoadLibrary(_this, NULL); -#endif - - /* We're done! */ - return (0); -} - -int BE_Available(void) -{ - return (1); -} - -void BE_VideoQuit(_THIS) -{ - - BE_QuitModes(_this); - - SDL_QuitBeApp(); -} - -#ifdef __cplusplus -} -#endif - -#endif /* SDL_VIDEO_DRIVER_HAIKU */ diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bvideo.h b/3rdparty/SDL2/src/video/haiku/SDL_bvideo.h deleted file mode 100644 index ef5c740320e..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bvideo.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BVIDEO_H -#define BVIDEO_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../../main/haiku/SDL_BeApp.h" -#include "../SDL_sysvideo.h" - - -extern void BE_VideoQuit(_THIS); -extern int BE_VideoInit(_THIS); -extern void BE_DeleteDevice(_THIS); -extern int BE_Available(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bwindow.cc b/3rdparty/SDL2/src/video/haiku/SDL_bwindow.cc deleted file mode 100644 index a35471df5b4..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bwindow.cc +++ /dev/null @@ -1,229 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_HAIKU -#include "../SDL_sysvideo.h" - -#include "SDL_BWin.h" -#include <new> - -/* Define a path to window's BWIN data */ -#ifdef __cplusplus -extern "C" { -#endif - -static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) { - return ((SDL_BWin*)(window->driverdata)); -} - -static SDL_INLINE SDL_BApp *_GetBeApp() { - return ((SDL_BApp*)be_app); -} - -static int _InitWindow(_THIS, SDL_Window *window) { - uint32 flags = 0; - window_look look = B_BORDERED_WINDOW_LOOK; - - BRect bounds( - window->x, - window->y, - window->x + window->w - 1, //BeWindows have an off-by-one px w/h thing - window->y + window->h - 1 - ); - - if(window->flags & SDL_WINDOW_FULLSCREEN) { - /* TODO: Add support for this flag */ - printf(__FILE__": %d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",__LINE__); - } - if(window->flags & SDL_WINDOW_OPENGL) { - /* TODO: Add support for this flag */ - } - if(!(window->flags & SDL_WINDOW_RESIZABLE)) { - flags |= B_NOT_RESIZABLE | B_NOT_ZOOMABLE; - } - if(window->flags & SDL_WINDOW_BORDERLESS) { - look = B_NO_BORDER_WINDOW_LOOK; - } - - SDL_BWin *bwin = new(std::nothrow) SDL_BWin(bounds, look, flags); - if(bwin == NULL) - return ENOMEM; - - window->driverdata = bwin; - int32 winID = _GetBeApp()->GetID(window); - bwin->SetID(winID); - - return 0; -} - -int BE_CreateWindow(_THIS, SDL_Window *window) { - if(_InitWindow(_this, window) == ENOMEM) - return ENOMEM; - - /* Start window loop */ - _ToBeWin(window)->Show(); - return 0; -} - -int BE_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) { - - SDL_BWin *otherBWin = (SDL_BWin*)data; - if(!otherBWin->LockLooper()) - return -1; - - /* Create the new window and initialize its members */ - window->x = (int)otherBWin->Frame().left; - window->y = (int)otherBWin->Frame().top; - window->w = (int)otherBWin->Frame().Width(); - window->h = (int)otherBWin->Frame().Height(); - - /* Set SDL flags */ - if(!(otherBWin->Flags() & B_NOT_RESIZABLE)) { - window->flags |= SDL_WINDOW_RESIZABLE; - } - - /* If we are out of memory, return the error code */ - if(_InitWindow(_this, window) == ENOMEM) - return ENOMEM; - - /* TODO: Add any other SDL-supported window attributes here */ - _ToBeWin(window)->SetTitle(otherBWin->Title()); - - /* Start window loop and unlock the other window */ - _ToBeWin(window)->Show(); - - otherBWin->UnlockLooper(); - return 0; -} - -void BE_SetWindowTitle(_THIS, SDL_Window * window) { - BMessage msg(BWIN_SET_TITLE); - msg.AddString("window-title", window->title); - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) { - /* FIXME: Icons not supported by Haiku */ -} - -void BE_SetWindowPosition(_THIS, SDL_Window * window) { - BMessage msg(BWIN_MOVE_WINDOW); - msg.AddInt32("window-x", window->x); - msg.AddInt32("window-y", window->y); - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_SetWindowSize(_THIS, SDL_Window * window) { - BMessage msg(BWIN_RESIZE_WINDOW); - msg.AddInt32("window-w", window->w - 1); - msg.AddInt32("window-h", window->h - 1); - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) { - BMessage msg(BWIN_SET_BORDERED); - msg.AddBool("window-border", bordered != SDL_FALSE); - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable) { - BMessage msg(BWIN_SET_RESIZABLE); - msg.AddBool("window-resizable", resizable != SDL_FALSE); - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_ShowWindow(_THIS, SDL_Window * window) { - BMessage msg(BWIN_SHOW_WINDOW); - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_HideWindow(_THIS, SDL_Window * window) { - BMessage msg(BWIN_HIDE_WINDOW); - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_RaiseWindow(_THIS, SDL_Window * window) { - BMessage msg(BWIN_SHOW_WINDOW); /* Activate this window and move to front */ - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_MaximizeWindow(_THIS, SDL_Window * window) { - BMessage msg(BWIN_MAXIMIZE_WINDOW); - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_MinimizeWindow(_THIS, SDL_Window * window) { - BMessage msg(BWIN_MINIMIZE_WINDOW); - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_RestoreWindow(_THIS, SDL_Window * window) { - BMessage msg(BWIN_RESTORE_WINDOW); - _ToBeWin(window)->PostMessage(&msg); -} - -void BE_SetWindowFullscreen(_THIS, SDL_Window * window, - SDL_VideoDisplay * display, SDL_bool fullscreen) { - /* Haiku tracks all video display information */ - BMessage msg(BWIN_FULLSCREEN); - msg.AddBool("fullscreen", fullscreen); - _ToBeWin(window)->PostMessage(&msg); - -} - -int BE_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp) { - /* FIXME: Not Haiku supported */ - return -1; -} - -int BE_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp) { - /* FIXME: Not Haiku supported */ - return -1; -} - - -void BE_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) { - /* TODO: Implement this! */ -} - -void BE_DestroyWindow(_THIS, SDL_Window * window) { - _ToBeWin(window)->LockLooper(); /* This MUST be locked */ - _GetBeApp()->ClearID(_ToBeWin(window)); - _ToBeWin(window)->Quit(); - window->driverdata = NULL; -} - -SDL_bool BE_GetWindowWMInfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo *info) { - /* FIXME: What is the point of this? What information should be included? */ - return SDL_FALSE; -} - - - - - -#ifdef __cplusplus -} -#endif - -#endif /* SDL_VIDEO_DRIVER_HAIKU */ diff --git a/3rdparty/SDL2/src/video/haiku/SDL_bwindow.h b/3rdparty/SDL2/src/video/haiku/SDL_bwindow.h deleted file mode 100644 index 388443dac54..00000000000 --- a/3rdparty/SDL2/src/video/haiku/SDL_bwindow.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SDL_BWINDOW_H -#define SDL_BWINDOW_H - - -#include "../SDL_sysvideo.h" - - -extern int BE_CreateWindow(_THIS, SDL_Window *window); -extern int BE_CreateWindowFrom(_THIS, SDL_Window * window, const void *data); -extern void BE_SetWindowTitle(_THIS, SDL_Window * window); -extern void BE_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon); -extern void BE_SetWindowPosition(_THIS, SDL_Window * window); -extern void BE_SetWindowSize(_THIS, SDL_Window * window); -extern void BE_ShowWindow(_THIS, SDL_Window * window); -extern void BE_HideWindow(_THIS, SDL_Window * window); -extern void BE_RaiseWindow(_THIS, SDL_Window * window); -extern void BE_MaximizeWindow(_THIS, SDL_Window * window); -extern void BE_MinimizeWindow(_THIS, SDL_Window * window); -extern void BE_RestoreWindow(_THIS, SDL_Window * window); -extern void BE_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered); -extern void BE_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable); -extern void BE_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen); -extern int BE_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp); -extern int BE_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp); -extern void BE_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed); -extern void BE_DestroyWindow(_THIS, SDL_Window * window); -extern SDL_bool BE_GetWindowWMInfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo *info); - - - -#endif - diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirdyn.c b/3rdparty/SDL2/src/video/mir/SDL_mirdyn.c deleted file mode 100644 index 6bbe53759b7..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirdyn.c +++ /dev/null @@ -1,170 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_MIR - -#define DEBUG_DYNAMIC_MIR 0 - -#include "SDL_mirdyn.h" - -#if DEBUG_DYNAMIC_MIR -#include "SDL_log.h" -#endif - -#ifdef SDL_VIDEO_DRIVER_MIR_DYNAMIC - -#include "SDL_name.h" -#include "SDL_loadso.h" - -typedef struct -{ - void *lib; - const char *libname; -} mirdynlib; - -#ifndef SDL_VIDEO_DRIVER_MIR_DYNAMIC -#define SDL_VIDEO_DRIVER_MIR_DYNAMIC NULL -#endif -#ifndef SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON -#define SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON NULL -#endif - -static mirdynlib mirlibs[] = { - {NULL, SDL_VIDEO_DRIVER_MIR_DYNAMIC}, - {NULL, SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON} -}; - -static void * -MIR_GetSym(const char *fnname, int *pHasModule) -{ - int i; - void *fn = NULL; - for (i = 0; i < SDL_TABLESIZE(mirlibs); i++) { - if (mirlibs[i].lib != NULL) { - fn = SDL_LoadFunction(mirlibs[i].lib, fnname); - if (fn != NULL) - break; - } - } - -#if DEBUG_DYNAMIC_MIR - if (fn != NULL) - SDL_Log("MIR: Found '%s' in %s (%p)\n", fnname, mirlibs[i].libname, fn); - else - SDL_Log("MIR: Symbol '%s' NOT FOUND!\n", fnname); -#endif - - if (fn == NULL) - *pHasModule = 0; /* kill this module. */ - - return fn; -} - -#endif /* SDL_VIDEO_DRIVER_MIR_DYNAMIC */ - -/* Define all the function pointers and wrappers... */ -#define SDL_MIR_MODULE(modname) int SDL_MIR_HAVE_##modname = 0; -#define SDL_MIR_SYM(rc,fn,params) SDL_DYNMIRFN_##fn MIR_##fn = NULL; -#define SDL_MIR_SYM_CONST(type,name) SDL_DYMMIRCONST_##name MIR_##name = NULL; -#include "SDL_mirsym.h" - -static int mir_load_refcount = 0; - -void -SDL_MIR_UnloadSymbols(void) -{ - /* Don't actually unload if more than one module is using the libs... */ - if (mir_load_refcount > 0) { - if (--mir_load_refcount == 0) { -#ifdef SDL_VIDEO_DRIVER_MIR_DYNAMIC - int i; -#endif - - /* set all the function pointers to NULL. */ -#define SDL_MIR_MODULE(modname) SDL_MIR_HAVE_##modname = 0; -#define SDL_MIR_SYM(rc,fn,params) MIR_##fn = NULL; -#define SDL_MIR_SYM_CONST(type,name) MIR_##name = NULL; -#include "SDL_mirsym.h" - - -#ifdef SDL_VIDEO_DRIVER_MIR_DYNAMIC - for (i = 0; i < SDL_TABLESIZE(mirlibs); i++) { - if (mirlibs[i].lib != NULL) { - SDL_UnloadObject(mirlibs[i].lib); - mirlibs[i].lib = NULL; - } - } -#endif - } - } -} - -/* returns non-zero if all needed symbols were loaded. */ -int -SDL_MIR_LoadSymbols(void) -{ - int rc = 1; /* always succeed if not using Dynamic MIR stuff. */ - - /* deal with multiple modules (dga, wayland, mir, etc) needing these symbols... */ - if (mir_load_refcount++ == 0) { -#ifdef SDL_VIDEO_DRIVER_MIR_DYNAMIC - int i; - int *thismod = NULL; - for (i = 0; i < SDL_TABLESIZE(mirlibs); i++) { - if (mirlibs[i].libname != NULL) { - mirlibs[i].lib = SDL_LoadObject(mirlibs[i].libname); - } - } - -#define SDL_MIR_MODULE(modname) SDL_MIR_HAVE_##modname = 1; /* default yes */ -#include "SDL_mirsym.h" - -#define SDL_MIR_MODULE(modname) thismod = &SDL_MIR_HAVE_##modname; -#define SDL_MIR_SYM(rc,fn,params) MIR_##fn = (SDL_DYNMIRFN_##fn) MIR_GetSym(#fn,thismod); -#define SDL_MIR_SYM_CONST(type,name) MIR_##name = *(SDL_DYMMIRCONST_##name*) MIR_GetSym(#name,thismod); -#include "SDL_mirsym.h" - - if ((SDL_MIR_HAVE_MIR_CLIENT) && (SDL_MIR_HAVE_XKBCOMMON)) { - /* all required symbols loaded. */ - SDL_ClearError(); - } else { - /* in case something got loaded... */ - SDL_MIR_UnloadSymbols(); - rc = 0; - } - -#else /* no dynamic MIR */ - -#define SDL_MIR_MODULE(modname) SDL_MIR_HAVE_##modname = 1; /* default yes */ -#define SDL_MIR_SYM(rc,fn,params) MIR_##fn = fn; -#define SDL_MIR_SYM_CONST(type,name) MIR_##name = name; -#include "SDL_mirsym.h" - -#endif - } - - return rc; -} - -#endif /* SDL_VIDEO_DRIVER_MIR */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirdyn.h b/3rdparty/SDL2/src/video/mir/SDL_mirdyn.h deleted file mode 100644 index a3638cf0540..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirdyn.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_mirdyn_h -#define _SDL_mirdyn_h - -#include "../../SDL_internal.h" - -#include <EGL/egl.h> -#include <mir_toolkit/mir_client_library.h> -#include <xkbcommon/xkbcommon.h> - -#ifdef __cplusplus -extern "C" { -#endif - -int SDL_MIR_LoadSymbols(void); -void SDL_MIR_UnloadSymbols(void); - -/* Declare all the function pointers and wrappers... */ -#define SDL_MIR_SYM(rc,fn,params) \ - typedef rc (*SDL_DYNMIRFN_##fn) params; \ - extern SDL_DYNMIRFN_##fn MIR_##fn; -#define SDL_MIR_SYM_CONST(type, name) \ - typedef type SDL_DYMMIRCONST_##name; \ - extern SDL_DYMMIRCONST_##name MIR_##name; -#include "SDL_mirsym.h" - -#ifdef __cplusplus -} -#endif - -#endif /* !defined _SDL_mirdyn_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirevents.c b/3rdparty/SDL2/src/video/mir/SDL_mirevents.c deleted file mode 100644 index e36986835d1..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirevents.c +++ /dev/null @@ -1,313 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_MIR - -#include "../../events/SDL_events_c.h" -#include "../../events/SDL_keyboard_c.h" -#include "../../events/SDL_touch_c.h" -#include "../../events/scancodes_xfree86.h" - -#include "SDL_mirevents.h" -#include "SDL_mirwindow.h" - -#include <xkbcommon/xkbcommon.h> - -#include "SDL_mirdyn.h" - -static void -HandleKeyText(int32_t key_code) -{ - char text[8]; - int size = 0; - - size = MIR_xkb_keysym_to_utf8(key_code, text, sizeof text); - - if (size > 0) { - text[size] = '\0'; - SDL_SendKeyboardText(text); - } -} - -/* FIXME - Mir still needs to implement its IM API, for now we assume - a single key press produces a character. -*/ -static void -HandleKeyEvent(MirKeyboardEvent const* key_event, SDL_Window* window) -{ - xkb_keysym_t key_code; - Uint8 key_state; - int event_scancode; - uint32_t sdl_scancode = SDL_SCANCODE_UNKNOWN; - - MirKeyboardAction action = MIR_mir_keyboard_event_action(key_event); - - key_state = SDL_PRESSED; - key_code = MIR_mir_keyboard_event_key_code(key_event); - event_scancode = MIR_mir_keyboard_event_scan_code(key_event); - - if (action == mir_keyboard_action_up) - key_state = SDL_RELEASED; - - if (event_scancode < SDL_arraysize(xfree86_scancode_table2)) - sdl_scancode = xfree86_scancode_table2[event_scancode]; - - if (sdl_scancode != SDL_SCANCODE_UNKNOWN) - SDL_SendKeyboardKey(key_state, sdl_scancode); - - if (key_state == SDL_PRESSED) - HandleKeyText(key_code); -} - -static void -HandleMouseButton(SDL_Window* sdl_window, Uint8 state, MirPointerEvent const* pointer) -{ - uint32_t sdl_button = SDL_BUTTON_LEFT; - MirPointerButton button_state = mir_pointer_button_primary; - - static uint32_t old_button_states = 0; - uint32_t new_button_states = MIR_mir_pointer_event_buttons(pointer); - - // XOR on our old button states vs our new states to get the newley pressed/released button - button_state = new_button_states ^ old_button_states; - - switch (button_state) { - case mir_pointer_button_primary: - sdl_button = SDL_BUTTON_LEFT; - break; - case mir_pointer_button_secondary: - sdl_button = SDL_BUTTON_RIGHT; - break; - case mir_pointer_button_tertiary: - sdl_button = SDL_BUTTON_MIDDLE; - break; - case mir_pointer_button_forward: - sdl_button = SDL_BUTTON_X1; - break; - case mir_pointer_button_back: - sdl_button = SDL_BUTTON_X2; - break; - default: - break; - } - - old_button_states = new_button_states; - - SDL_SendMouseButton(sdl_window, 0, state, sdl_button); -} - -static void -HandleMouseMotion(SDL_Window* sdl_window, int x, int y) -{ - SDL_Mouse* mouse = SDL_GetMouse(); - SDL_SendMouseMotion(sdl_window, 0, mouse->relative_mode, x, y); -} - -static void -HandleTouchPress(int device_id, int source_id, SDL_bool down, float x, float y, float pressure) -{ - SDL_SendTouch(device_id, source_id, down, x, y, pressure); -} - -static void -HandleTouchMotion(int device_id, int source_id, float x, float y, float pressure) -{ - SDL_SendTouchMotion(device_id, source_id, x, y, pressure); -} - -static void -HandleMouseScroll(SDL_Window* sdl_window, int hscroll, int vscroll) -{ - SDL_SendMouseWheel(sdl_window, 0, hscroll, vscroll, SDL_MOUSEWHEEL_NORMAL); -} - -static void -AddTouchDevice(int device_id) -{ - if (SDL_AddTouch(device_id, "") < 0) - SDL_SetError("Error: can't add touch %s, %d", __FILE__, __LINE__); -} - -static void -HandleTouchEvent(MirTouchEvent const* touch, int device_id, SDL_Window* sdl_window) -{ - int i, point_count; - point_count = MIR_mir_touch_event_point_count(touch); - - AddTouchDevice(device_id); - - for (i = 0; i < point_count; i++) { - int id = MIR_mir_touch_event_id(touch, i); - - int width = sdl_window->w; - int height = sdl_window->h; - - float x = MIR_mir_touch_event_axis_value(touch, i, mir_touch_axis_x); - float y = MIR_mir_touch_event_axis_value(touch, i, mir_touch_axis_y); - - float n_x = x / width; - float n_y = y / height; - - float pressure = MIR_mir_touch_event_axis_value(touch, i, mir_touch_axis_pressure); - - switch (MIR_mir_touch_event_action(touch, i)) { - case mir_touch_action_up: - HandleTouchPress(device_id, id, SDL_FALSE, n_x, n_y, pressure); - break; - case mir_touch_action_down: - HandleTouchPress(device_id, id, SDL_TRUE, n_x, n_y, pressure); - break; - case mir_touch_action_change: - HandleTouchMotion(device_id, id, n_x, n_y, pressure); - break; - case mir_touch_actions: - break; - } - } -} - -static void -HandleMouseEvent(MirPointerEvent const* pointer, SDL_Window* sdl_window) -{ - SDL_SetMouseFocus(sdl_window); - - switch (MIR_mir_pointer_event_action(pointer)) { - case mir_pointer_action_button_down: - HandleMouseButton(sdl_window, SDL_PRESSED, pointer); - break; - case mir_pointer_action_button_up: - HandleMouseButton(sdl_window, SDL_RELEASED, pointer); - break; - case mir_pointer_action_motion: { - int x, y; - int hscroll, vscroll; - SDL_Mouse* mouse = SDL_GetMouse(); - x = MIR_mir_pointer_event_axis_value(pointer, mir_pointer_axis_x); - y = MIR_mir_pointer_event_axis_value(pointer, mir_pointer_axis_y); - - if (mouse) { - if (mouse->relative_mode) { - int relative_x = MIR_mir_pointer_event_axis_value(pointer, mir_pointer_axis_relative_x); - int relative_y = MIR_mir_pointer_event_axis_value(pointer, mir_pointer_axis_relative_y); - HandleMouseMotion(sdl_window, relative_x, relative_y); - } - else if (mouse->x != x || mouse->y != y) { - HandleMouseMotion(sdl_window, x, y); - } - } - - hscroll = MIR_mir_pointer_event_axis_value(pointer, mir_pointer_axis_hscroll); - vscroll = MIR_mir_pointer_event_axis_value(pointer, mir_pointer_axis_vscroll); - if (vscroll != 0 || hscroll != 0) - HandleMouseScroll(sdl_window, hscroll, vscroll); - } - break; - case mir_pointer_action_leave: - SDL_SetMouseFocus(NULL); - break; - case mir_pointer_action_enter: - default: - break; - } -} - -static void -MIR_HandleInput(MirInputEvent const* input_event, SDL_Window* window) -{ - switch (MIR_mir_input_event_get_type(input_event)) { - case (mir_input_event_type_key): - HandleKeyEvent(MIR_mir_input_event_get_keyboard_event(input_event), window); - break; - case (mir_input_event_type_pointer): - HandleMouseEvent(MIR_mir_input_event_get_pointer_event(input_event), window); - break; - case (mir_input_event_type_touch): - HandleTouchEvent(MIR_mir_input_event_get_touch_event(input_event), - MIR_mir_input_event_get_device_id(input_event), - window); - break; - default: - break; - } -} - -static void -MIR_HandleResize(MirResizeEvent const* resize_event, SDL_Window* window) -{ - int new_w = MIR_mir_resize_event_get_width (resize_event); - int new_h = MIR_mir_resize_event_get_height(resize_event); - - int old_w = window->w; - int old_h = window->h; - - if (new_w != old_w || new_h != old_h) - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, new_w, new_h); -} - -static void -MIR_HandleSurface(MirSurfaceEvent const* surface_event, SDL_Window* window) -{ - MirSurfaceAttrib attrib = MIR_mir_surface_event_get_attribute(surface_event); - int value = MIR_mir_surface_event_get_attribute_value(surface_event); - - if (attrib == mir_surface_attrib_focus) { - if (value == mir_surface_focused) { - SDL_SetKeyboardFocus(window); - } - else if (value == mir_surface_unfocused) { - SDL_SetKeyboardFocus(NULL); - } - } -} - -void -MIR_HandleEvent(MirSurface* surface, MirEvent const* ev, void* context) -{ - MirEventType event_type = MIR_mir_event_get_type(ev); - SDL_Window* window = (SDL_Window*)context; - - if (window) { - switch (event_type) { - case (mir_event_type_input): - MIR_HandleInput(MIR_mir_event_get_input_event(ev), window); - break; - case (mir_event_type_resize): - MIR_HandleResize(MIR_mir_event_get_resize_event(ev), window); - break; - case (mir_event_type_surface): - MIR_HandleSurface(MIR_mir_event_get_surface_event(ev), window); - break; - default: - break; - } - } -} - -#endif /* SDL_VIDEO_DRIVER_MIR */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirevents.h b/3rdparty/SDL2/src/video/mir/SDL_mirevents.h deleted file mode 100644 index 121c4b36503..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirevents.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#ifndef _SDL_mirevents_h -#define _SDL_mirevents_h - -#include <mir_toolkit/mir_client_library.h> - -extern void -MIR_HandleEvent(MirSurface* surface, MirEvent const* ev, void* context); - -#endif /* _SDL_mirevents_h */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirframebuffer.c b/3rdparty/SDL2/src/video/mir/SDL_mirframebuffer.c deleted file mode 100644 index 775bc0797ae..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirframebuffer.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_MIR - -#include "SDL_mirevents.h" -#include "SDL_mirframebuffer.h" -#include "SDL_mirwindow.h" - -#include "SDL_mirdyn.h" - -int -MIR_CreateWindowFramebuffer(_THIS, SDL_Window* window, Uint32* format, - void** pixels, int* pitch) -{ - MIR_Data* mir_data = _this->driverdata; - - mir_data->software = SDL_TRUE; - - if (MIR_CreateWindow(_this, window) < 0) - return SDL_SetError("Failed to created a mir window."); - - *format = MIR_GetSDLPixelFormat(mir_data->pixel_format); - if (*format == SDL_PIXELFORMAT_UNKNOWN) - return SDL_SetError("Unknown pixel format"); - - *pitch = (((window->w * SDL_BYTESPERPIXEL(*format)) + 3) & ~3); - - *pixels = SDL_malloc(window->h*(*pitch)); - if (*pixels == NULL) - return SDL_OutOfMemory(); - - return 0; -} - -int -MIR_UpdateWindowFramebuffer(_THIS, SDL_Window* window, - const SDL_Rect* rects, int numrects) -{ - MIR_Window* mir_window = window->driverdata; - - MirGraphicsRegion region; - MirBufferStream* bs; - int i, j, x, y, w, h, start; - int bytes_per_pixel, bytes_per_row, s_stride, d_stride; - char* s_dest; - char* pixels; - - bs = MIR_mir_surface_get_buffer_stream(mir_window->surface); - MIR_mir_buffer_stream_get_graphics_region(bs, ®ion); - - s_dest = region.vaddr; - pixels = (char*)window->surface->pixels; - - s_stride = window->surface->pitch; - d_stride = region.stride; - bytes_per_pixel = window->surface->format->BytesPerPixel; - - for (i = 0; i < numrects; i++) { - s_dest = region.vaddr; - pixels = (char*)window->surface->pixels; - - x = rects[i].x; - y = rects[i].y; - w = rects[i].w; - h = rects[i].h; - - if (w <= 0 || h <= 0 || (x + w) <= 0 || (y + h) <= 0) - continue; - - if (x < 0) { - x += w; - w += rects[i].x; - } - - if (y < 0) { - y += h; - h += rects[i].y; - } - - if (x + w > window->w) - w = window->w - x; - if (y + h > window->h) - h = window->h - y; - - start = y * s_stride + x; - pixels += start; - s_dest += start; - - bytes_per_row = bytes_per_pixel * w; - for (j = 0; j < h; j++) { - SDL_memcpy(s_dest, pixels, bytes_per_row); - pixels += s_stride; - s_dest += d_stride; - } - } - - MIR_mir_buffer_stream_swap_buffers_sync(bs); - - return 0; -} - -void -MIR_DestroyWindowFramebuffer(_THIS, SDL_Window* window) -{ -} - -#endif /* SDL_VIDEO_DRIVER_MIR */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirframebuffer.h b/3rdparty/SDL2/src/video/mir/SDL_mirframebuffer.h deleted file mode 100644 index 22a579c03cd..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirframebuffer.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#ifndef _SDL_mirframebuffer_h -#define _SDL_mirframebuffer_h - -#include "../SDL_sysvideo.h" - -#include "SDL_mirvideo.h" - -extern int -MIR_CreateWindowFramebuffer(_THIS, SDL_Window* sdl_window, Uint32* format, - void** pixels, int* pitch); - -extern int -MIR_UpdateWindowFramebuffer(_THIS, SDL_Window* sdl_window, - const SDL_Rect* rects, int numrects); - -extern void -MIR_DestroyWindowFramebuffer(_THIS, SDL_Window* sdl_window); - -#endif /* _SDL_mirframebuffer_h */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirmouse.c b/3rdparty/SDL2/src/video/mir/SDL_mirmouse.c deleted file mode 100644 index 1a22b28e878..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirmouse.c +++ /dev/null @@ -1,292 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_MIR - -#include "../../events/SDL_mouse_c.h" -#include "../SDL_sysvideo.h" -#include "SDL_assert.h" - -#include "SDL_mirdyn.h" - -#include "SDL_mirvideo.h" -#include "SDL_mirmouse.h" -#include "SDL_mirwindow.h" - -typedef struct -{ - MirCursorConfiguration* conf; - MirBufferStream* stream; -} MIR_Cursor; - -static SDL_Cursor* -MIR_CreateDefaultCursor() -{ - SDL_Cursor* cursor; - - cursor = SDL_calloc(1, sizeof(SDL_Cursor)); - if (cursor) { - - MIR_Cursor* mir_cursor = SDL_calloc(1, sizeof(MIR_Cursor)); - if (mir_cursor) { - mir_cursor->conf = NULL; - mir_cursor->stream = NULL; - cursor->driverdata = mir_cursor; - } - else { - SDL_OutOfMemory(); - SDL_free(cursor); - cursor = NULL; - } - } - else { - SDL_OutOfMemory(); - } - - return cursor; -} - -static void -CopySurfacePixelsToMirStream(SDL_Surface* surface, MirBufferStream* stream) -{ - char* dest, *pixels; - int i, s_w, s_h, r_stride, p_stride, bytes_per_pixel, bytes_per_row; - - MirGraphicsRegion region; - MIR_mir_buffer_stream_get_graphics_region(stream, ®ion); - - s_w = surface->w; - s_h = surface->h; - - bytes_per_pixel = surface->format->BytesPerPixel; - bytes_per_row = bytes_per_pixel * s_w; - - dest = region.vaddr; - pixels = (char*)surface->pixels; - - r_stride = region.stride; - p_stride = surface->pitch; - - for (i = 0; i < s_h; i++) - { - SDL_memcpy(dest, pixels, bytes_per_row); - dest += r_stride; - pixels += p_stride; - } -} - -static SDL_Cursor* -MIR_CreateCursor(SDL_Surface* surface, int hot_x, int hot_y) -{ - MirCursorConfiguration* conf; - MirBufferStream* stream; - - int s_w = surface->w; - int s_h = surface->h; - - MIR_Data* mir_data = (MIR_Data*)SDL_GetVideoDevice()->driverdata; - SDL_Cursor* cursor = MIR_CreateDefaultCursor(); - MIR_Cursor* mir_cursor; - - if (!cursor) { - return NULL; - } - - mir_cursor = (MIR_Cursor*)cursor->driverdata; - - stream = MIR_mir_connection_create_buffer_stream_sync(mir_data->connection, - s_w, s_h, mir_data->pixel_format, - mir_buffer_usage_software); - - conf = MIR_mir_cursor_configuration_from_buffer_stream(stream, hot_x, hot_y); - - CopySurfacePixelsToMirStream(surface, stream); - MIR_mir_buffer_stream_swap_buffers_sync(stream); - - mir_cursor->conf = conf; - mir_cursor->stream = stream; - - return cursor; -} - -static SDL_Cursor* -MIR_CreateSystemCursor(SDL_SystemCursor id) -{ - char const* cursor_name = NULL; - SDL_Cursor* cursor = MIR_CreateDefaultCursor(); - MIR_Cursor* mir_cursor = (MIR_Cursor*)cursor->driverdata; - - if (!cursor) { - return NULL; - } - - switch(id) { - case SDL_SYSTEM_CURSOR_ARROW: - cursor_name = MIR_mir_arrow_cursor_name; - break; - case SDL_SYSTEM_CURSOR_IBEAM: - cursor_name = MIR_mir_caret_cursor_name; - break; - case SDL_SYSTEM_CURSOR_WAIT: - cursor_name = MIR_mir_busy_cursor_name; - break; - case SDL_SYSTEM_CURSOR_CROSSHAIR: - /* Unsupported */ - cursor_name = MIR_mir_arrow_cursor_name; - break; - case SDL_SYSTEM_CURSOR_WAITARROW: - cursor_name = MIR_mir_busy_cursor_name; - break; - case SDL_SYSTEM_CURSOR_SIZENWSE: - cursor_name = MIR_mir_omnidirectional_resize_cursor_name; - break; - case SDL_SYSTEM_CURSOR_SIZENESW: - cursor_name = MIR_mir_omnidirectional_resize_cursor_name; - break; - case SDL_SYSTEM_CURSOR_SIZEWE: - cursor_name = MIR_mir_horizontal_resize_cursor_name; - break; - case SDL_SYSTEM_CURSOR_SIZENS: - cursor_name = MIR_mir_vertical_resize_cursor_name; - break; - case SDL_SYSTEM_CURSOR_SIZEALL: - cursor_name = MIR_mir_omnidirectional_resize_cursor_name; - break; - case SDL_SYSTEM_CURSOR_NO: - /* Unsupported */ - cursor_name = MIR_mir_closed_hand_cursor_name; - break; - case SDL_SYSTEM_CURSOR_HAND: - cursor_name = MIR_mir_open_hand_cursor_name; - break; - default: - SDL_assert(0); - return NULL; - } - - mir_cursor->conf = MIR_mir_cursor_configuration_from_name(cursor_name); - - return cursor; -} - -static void -MIR_FreeCursor(SDL_Cursor* cursor) -{ - if (cursor) { - - if (cursor->driverdata) { - MIR_Cursor* mir_cursor = (MIR_Cursor*)cursor->driverdata; - - if (mir_cursor->conf) - MIR_mir_cursor_configuration_destroy(mir_cursor->conf); - if (mir_cursor->stream) - MIR_mir_buffer_stream_release_sync(mir_cursor->stream); - - SDL_free(mir_cursor); - } - - SDL_free(cursor); - } -} - -static int -MIR_ShowCursor(SDL_Cursor* cursor) -{ - MIR_Data* mir_data = (MIR_Data*)SDL_GetVideoDevice()->driverdata; - MIR_Window* mir_window = mir_data->current_window; - - if (cursor && cursor->driverdata) { - if (mir_window && MIR_mir_surface_is_valid(mir_window->surface)) { - MIR_Cursor* mir_cursor = (MIR_Cursor*)cursor->driverdata; - - if (mir_cursor->conf) { - MIR_mir_surface_configure_cursor(mir_window->surface, mir_cursor->conf); - } - } - } - else if(mir_window && MIR_mir_surface_is_valid(mir_window->surface)) { - MIR_mir_surface_configure_cursor(mir_window->surface, NULL); - } - - return 0; -} - -static void -MIR_WarpMouse(SDL_Window* window, int x, int y) -{ - SDL_Unsupported(); -} - -static int -MIR_WarpMouseGlobal(int x, int y) -{ - return SDL_Unsupported(); -} - -static int -MIR_SetRelativeMouseMode(SDL_bool enabled) -{ - return 0; -} - -/* TODO Actually implement the cursor, need to wait for mir support */ -void -MIR_InitMouse() -{ - SDL_Mouse* mouse = SDL_GetMouse(); - - mouse->CreateCursor = MIR_CreateCursor; - mouse->ShowCursor = MIR_ShowCursor; - mouse->FreeCursor = MIR_FreeCursor; - mouse->WarpMouse = MIR_WarpMouse; - mouse->WarpMouseGlobal = MIR_WarpMouseGlobal; - mouse->CreateSystemCursor = MIR_CreateSystemCursor; - mouse->SetRelativeMouseMode = MIR_SetRelativeMouseMode; - - SDL_SetDefaultCursor(MIR_CreateDefaultCursor()); -} - -void -MIR_FiniMouse() -{ - SDL_Mouse* mouse = SDL_GetMouse(); - - MIR_FreeCursor(mouse->def_cursor); - mouse->def_cursor = NULL; - - mouse->CreateCursor = NULL; - mouse->ShowCursor = NULL; - mouse->FreeCursor = NULL; - mouse->WarpMouse = NULL; - mouse->CreateSystemCursor = NULL; - mouse->SetRelativeMouseMode = NULL; -} - -#endif /* SDL_VIDEO_DRIVER_MIR */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirmouse.h b/3rdparty/SDL2/src/video/mir/SDL_mirmouse.h deleted file mode 100644 index 94dd085615b..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirmouse.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#ifndef _SDL_mirmouse_h -#define _SDL_mirmouse_h - -extern void -MIR_InitMouse(); - -extern void -MIR_FiniMouse(); - -#endif /* _SDL_mirmouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/mir/SDL_miropengl.c b/3rdparty/SDL2/src/video/mir/SDL_miropengl.c deleted file mode 100644 index 23fabb26725..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_miropengl.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_MIR - -#include "SDL_miropengl.h" - -#include "SDL_mirdyn.h" - -void -MIR_GL_SwapWindow(_THIS, SDL_Window* window) -{ - MIR_Window* mir_wind = window->driverdata; - - SDL_EGL_SwapBuffers(_this, mir_wind->egl_surface); -} - -int -MIR_GL_MakeCurrent(_THIS, SDL_Window* window, SDL_GLContext context) -{ - if (window) { - EGLSurface egl_surface = ((MIR_Window*)window->driverdata)->egl_surface; - return SDL_EGL_MakeCurrent(_this, egl_surface, context); - } - - return SDL_EGL_MakeCurrent(_this, NULL, NULL); -} - -SDL_GLContext -MIR_GL_CreateContext(_THIS, SDL_Window* window) -{ - MIR_Window* mir_window = window->driverdata; - - SDL_GLContext context; - context = SDL_EGL_CreateContext(_this, mir_window->egl_surface); - - return context; -} - -int -MIR_GL_LoadLibrary(_THIS, const char* path) -{ - MIR_Data* mir_data = _this->driverdata; - - SDL_EGL_LoadLibrary(_this, path, MIR_mir_connection_get_egl_native_display(mir_data->connection)); - - SDL_EGL_ChooseConfig(_this); - - return 0; -} - -void -MIR_GL_UnloadLibrary(_THIS) -{ - SDL_EGL_UnloadLibrary(_this); -} - -void* -MIR_GL_GetProcAddress(_THIS, const char* proc) -{ - void* proc_addr = SDL_EGL_GetProcAddress(_this, proc); - - if (!proc_addr) { - SDL_SetError("Failed to find proc address!"); - } - - return proc_addr; -} - -#endif /* SDL_VIDEO_DRIVER_MIR */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/mir/SDL_miropengl.h b/3rdparty/SDL2/src/video/mir/SDL_miropengl.h deleted file mode 100644 index 96bb40a6d8b..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_miropengl.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#ifndef _SDL_miropengl_h -#define _SDL_miropengl_h - -#include "SDL_mirwindow.h" - -#include "../SDL_egl_c.h" - -#define MIR_GL_DeleteContext SDL_EGL_DeleteContext -#define MIR_GL_GetSwapInterval SDL_EGL_GetSwapInterval -#define MIR_GL_SetSwapInterval SDL_EGL_SetSwapInterval - -extern void -MIR_GL_SwapWindow(_THIS, SDL_Window* window); - -extern int -MIR_GL_MakeCurrent(_THIS, SDL_Window* window, SDL_GLContext context); - -extern SDL_GLContext -MIR_GL_CreateContext(_THIS, SDL_Window* window); - -extern int -MIR_GL_LoadLibrary(_THIS, const char* path); - -extern void -MIR_GL_UnloadLibrary(_THIS); - -extern void* -MIR_GL_GetProcAddress(_THIS, const char* proc); - -#endif /* _SDL_miropengl_h */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirsym.h b/3rdparty/SDL2/src/video/mir/SDL_mirsym.h deleted file mode 100644 index 4f97ed96c53..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirsym.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* *INDENT-OFF* */ - -#ifndef SDL_MIR_MODULE -#define SDL_MIR_MODULE(modname) -#endif - -#ifndef SDL_MIR_SYM -#define SDL_MIR_SYM(rc,fn,params) -#endif - -#ifndef SDL_MIR_SYM_CONST -#define SDL_MIR_SYM_CONST(type, name) -#endif - -SDL_MIR_MODULE(MIR_CLIENT) -SDL_MIR_SYM(MirSurface *,mir_surface_create_sync,(MirSurfaceSpec* spec)) -SDL_MIR_SYM(MirEGLNativeWindowType,mir_buffer_stream_get_egl_native_window,(MirBufferStream *surface)) -SDL_MIR_SYM(void,mir_buffer_stream_get_graphics_region,(MirBufferStream *stream, MirGraphicsRegion *graphics_region)) -SDL_MIR_SYM(void,mir_buffer_stream_swap_buffers_sync,(MirBufferStream *stream)) -SDL_MIR_SYM(void,mir_surface_set_event_handler,(MirSurface *surface, mir_surface_event_callback callback, void* context)) -SDL_MIR_SYM(MirSurfaceSpec*,mir_connection_create_spec_for_normal_surface,(MirConnection *connection, int width, int height, MirPixelFormat format)) -SDL_MIR_SYM(MirSurfaceSpec*,mir_connection_create_spec_for_changes,(MirConnection *connection)) -SDL_MIR_SYM(void,mir_surface_spec_set_buffer_usage,(MirSurfaceSpec *spec, MirBufferUsage usage)) -SDL_MIR_SYM(void,mir_surface_spec_set_name,(MirSurfaceSpec *spec, char const *name)) -SDL_MIR_SYM(void,mir_surface_spec_release,(MirSurfaceSpec *spec)) -SDL_MIR_SYM(void,mir_surface_spec_set_width,(MirSurfaceSpec *spec, unsigned width)) -SDL_MIR_SYM(void,mir_surface_spec_set_height,(MirSurfaceSpec *spec, unsigned height)) -SDL_MIR_SYM(void,mir_surface_spec_set_min_width,(MirSurfaceSpec *spec, unsigned min_width)) -SDL_MIR_SYM(void,mir_surface_spec_set_min_height,(MirSurfaceSpec *spec, unsigned min_height)) -SDL_MIR_SYM(void,mir_surface_spec_set_max_width,(MirSurfaceSpec *spec, unsigned max_width)) -SDL_MIR_SYM(void,mir_surface_spec_set_max_height,(MirSurfaceSpec *spec, unsigned max_height)) -SDL_MIR_SYM(void,mir_surface_spec_set_type,(MirSurfaceSpec *spec, MirSurfaceType type)) -SDL_MIR_SYM(void,mir_surface_spec_set_state,(MirSurfaceSpec *spec, MirSurfaceState state)) -SDL_MIR_SYM(void,mir_surface_spec_set_pointer_confinement,(MirSurfaceSpec *spec, MirPointerConfinementState state)) -SDL_MIR_SYM(void,mir_surface_apply_spec,(MirSurface *surface, MirSurfaceSpec *spec)) -SDL_MIR_SYM(void,mir_surface_get_parameters,(MirSurface *surface, MirSurfaceParameters *params)) -SDL_MIR_SYM(MirBufferStream*,mir_surface_get_buffer_stream,(MirSurface *surface)) -SDL_MIR_SYM(MirCursorConfiguration*,mir_cursor_configuration_from_buffer_stream,(MirBufferStream const* stream, int hot_x, int hot_y)) -SDL_MIR_SYM(MirBufferStream*,mir_connection_create_buffer_stream_sync,(MirConnection *connection, int w, int h, MirPixelFormat format, MirBufferUsage usage)) -SDL_MIR_SYM(MirKeyboardAction,mir_keyboard_event_action,(MirKeyboardEvent const *event)) -SDL_MIR_SYM(xkb_keysym_t,mir_keyboard_event_key_code,(MirKeyboardEvent const *event)) -SDL_MIR_SYM(int,mir_keyboard_event_scan_code,(MirKeyboardEvent const *event)) -SDL_MIR_SYM(bool,mir_pointer_event_button_state,(MirPointerEvent const *event, MirPointerButton button)) -SDL_MIR_SYM(MirPointerButtons,mir_pointer_event_buttons,(MirPointerEvent const *event)) -SDL_MIR_SYM(MirInputDeviceId,mir_input_event_get_device_id,(MirInputEvent const* ev)) -SDL_MIR_SYM(MirTouchId,mir_touch_event_id,(MirTouchEvent const *event, size_t touch_index)) -SDL_MIR_SYM(float,mir_touch_event_axis_value,(MirTouchEvent const *event, size_t touch_index, MirTouchAxis axis)) -SDL_MIR_SYM(MirTouchAction,mir_touch_event_action,(MirTouchEvent const *event, size_t touch_index)) -SDL_MIR_SYM(MirPointerAction,mir_pointer_event_action,(MirPointerEvent const *event)) -SDL_MIR_SYM(float,mir_pointer_event_axis_value,(MirPointerEvent const *event, MirPointerAxis)) -SDL_MIR_SYM(MirEventType,mir_event_get_type,(MirEvent const *event)) -SDL_MIR_SYM(MirInputEventType,mir_input_event_get_type,(MirInputEvent const *event)) -SDL_MIR_SYM(MirInputEvent const*,mir_event_get_input_event,(MirEvent const *event)) -SDL_MIR_SYM(MirResizeEvent const*,mir_event_get_resize_event,(MirEvent const *event)) -SDL_MIR_SYM(MirKeyboardEvent const*,mir_input_event_get_keyboard_event,(MirInputEvent const *event)) -SDL_MIR_SYM(MirPointerEvent const*,mir_input_event_get_pointer_event,(MirInputEvent const *event)) -SDL_MIR_SYM(MirTouchEvent const*,mir_input_event_get_touch_event,(MirInputEvent const *event)) -SDL_MIR_SYM(MirSurfaceEvent const*,mir_event_get_surface_event,(MirEvent const *event)) -SDL_MIR_SYM(unsigned int,mir_touch_event_point_count,(MirTouchEvent const *event)) -SDL_MIR_SYM(void,mir_connection_get_available_surface_formats,(MirConnection* connection, MirPixelFormat* formats, unsigned const int format_size, unsigned int *num_valid_formats)) -SDL_MIR_SYM(MirEGLNativeDisplayType,mir_connection_get_egl_native_display,(MirConnection *connection)) -SDL_MIR_SYM(bool,mir_connection_is_valid,(MirConnection *connection)) -SDL_MIR_SYM(void,mir_connection_release,(MirConnection *connection)) -SDL_MIR_SYM(MirPixelFormat,mir_connection_get_egl_pixel_format,(MirConnection* connection, void* egldisplay, void* eglconfig)) -SDL_MIR_SYM(MirConnection *,mir_connect_sync,(char const *server, char const *app_name)) -SDL_MIR_SYM(char const *,mir_surface_get_error_message,(MirSurface *surface)) -SDL_MIR_SYM(bool,mir_surface_is_valid,(MirSurface *surface)) -SDL_MIR_SYM(void,mir_surface_release_sync,(MirSurface *surface)) -SDL_MIR_SYM(void,mir_buffer_stream_release_sync,(MirBufferStream *stream)) -SDL_MIR_SYM(MirCursorConfiguration*,mir_cursor_configuration_from_name,(char const* cursor_name)) -SDL_MIR_SYM(MirWaitHandle*,mir_surface_configure_cursor,(MirSurface* surface, MirCursorConfiguration const* conf)) -SDL_MIR_SYM(void,mir_cursor_configuration_destroy,(MirCursorConfiguration* conf)) -SDL_MIR_SYM(int,mir_resize_event_get_width,(MirResizeEvent const* resize_event)) -SDL_MIR_SYM(int,mir_resize_event_get_height,(MirResizeEvent const* resize_event)) -SDL_MIR_SYM(char const*,mir_connection_get_error_message,(MirConnection* connection)) -SDL_MIR_SYM(MirSurfaceAttrib,mir_surface_event_get_attribute,(MirSurfaceEvent const* surface_event)) -SDL_MIR_SYM(int,mir_surface_event_get_attribute_value,(MirSurfaceEvent const* surface_event)) -SDL_MIR_SYM(void,mir_wait_for,(MirWaitHandle* handle)) -SDL_MIR_SYM(MirDisplayConfig*,mir_connection_create_display_configuration,(MirConnection* connection)) -SDL_MIR_SYM(void,mir_display_config_release,(MirDisplayConfig* config)) -SDL_MIR_SYM(int,mir_display_config_get_num_outputs,(MirDisplayConfig const* config)) -SDL_MIR_SYM(MirOutput*,mir_display_config_get_mutable_output,(MirDisplayConfig* config, size_t index)) -SDL_MIR_SYM(int,mir_output_get_num_modes,(MirOutput const* output)) -SDL_MIR_SYM(MirPixelFormat,mir_output_get_current_pixel_format,(MirOutput const* output)) -SDL_MIR_SYM(int,mir_output_get_position_x,(MirOutput const* output)) -SDL_MIR_SYM(int,mir_output_get_position_y,(MirOutput const* output)) -SDL_MIR_SYM(bool,mir_output_is_enabled,(MirOutput const* output)) -SDL_MIR_SYM(MirOutputConnectionState,mir_output_get_connection_state,(MirOutput const* output)) -SDL_MIR_SYM(size_t,mir_output_get_preferred_mode_index,(MirOutput const* output)) -SDL_MIR_SYM(MirOutputType,mir_output_get_type,(MirOutput const* output)) -SDL_MIR_SYM(char const*,mir_output_type_name,(MirOutputType type)) -SDL_MIR_SYM(void,mir_output_set_current_mode,(MirOutput* output, MirOutputMode const* mode)) -SDL_MIR_SYM(MirOutputMode const*,mir_output_get_mode,(MirOutput const* output, size_t index)) -SDL_MIR_SYM(int,mir_output_mode_get_width,(MirOutputMode const* mode)) -SDL_MIR_SYM(int,mir_output_mode_get_height,(MirOutputMode const* mode)) -SDL_MIR_SYM(double,mir_output_mode_get_refresh_rate,(MirOutputMode const* mode)) -SDL_MIR_SYM(MirOutputGammaSupported,mir_output_is_gamma_supported,(MirOutput const* output)) -SDL_MIR_SYM(uint32_t,mir_output_get_gamma_size,(MirOutput const* output)) -SDL_MIR_SYM(void,mir_output_get_gamma,(MirOutput const* output, uint16_t* red, uint16_t* green, uint16_t* blue, uint32_t size)) -SDL_MIR_SYM(void,mir_output_set_gamma,(MirOutput* output, uint16_t const* red, uint16_t const* green, uint16_t const* blue, uint32_t size)) - -SDL_MIR_SYM_CONST(char const*,mir_omnidirectional_resize_cursor_name) -SDL_MIR_SYM_CONST(char const*,mir_busy_cursor_name) -SDL_MIR_SYM_CONST(char const*,mir_arrow_cursor_name) -SDL_MIR_SYM_CONST(char const*,mir_caret_cursor_name) -SDL_MIR_SYM_CONST(char const*,mir_vertical_resize_cursor_name) -SDL_MIR_SYM_CONST(char const*,mir_horizontal_resize_cursor_name) -SDL_MIR_SYM_CONST(char const*,mir_open_hand_cursor_name) -SDL_MIR_SYM_CONST(char const*,mir_closed_hand_cursor_name) -SDL_MIR_SYM_CONST(char const*,mir_disabled_cursor_name) - -SDL_MIR_MODULE(XKBCOMMON) -SDL_MIR_SYM(int,xkb_keysym_to_utf8,(xkb_keysym_t keysym, char *buffer, size_t size)) - -#undef SDL_MIR_MODULE -#undef SDL_MIR_SYM -#undef SDL_MIR_SYM_CONST - -/* *INDENT-ON* */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirvideo.c b/3rdparty/SDL2/src/video/mir/SDL_mirvideo.c deleted file mode 100644 index 6a8f9e4824b..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirvideo.c +++ /dev/null @@ -1,400 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_MIR - -#include "SDL_mirwindow.h" -#include "SDL_video.h" - -#include "SDL_mirframebuffer.h" -#include "SDL_mirmouse.h" -#include "SDL_miropengl.h" -#include "SDL_mirvideo.h" - -#include "SDL_mirdyn.h" - -#define MIR_DRIVER_NAME "mir" - -static const Uint32 mir_pixel_format_to_sdl_format[] = { - SDL_PIXELFORMAT_UNKNOWN, /* mir_pixel_format_invalid */ - SDL_PIXELFORMAT_ABGR8888, /* mir_pixel_format_abgr_8888 */ - SDL_PIXELFORMAT_BGR888, /* mir_pixel_format_xbgr_8888 */ - SDL_PIXELFORMAT_ARGB8888, /* mir_pixel_format_argb_8888 */ - SDL_PIXELFORMAT_RGB888, /* mir_pixel_format_xrgb_8888 */ - SDL_PIXELFORMAT_BGR24, /* mir_pixel_format_bgr_888 */ - SDL_PIXELFORMAT_RGB24, /* mir_pixel_format_rgb_888 */ - SDL_PIXELFORMAT_RGB565, /* mir_pixel_format_rgb_565 */ - SDL_PIXELFORMAT_RGBA5551, /* mir_pixel_format_rgba_5551 */ - SDL_PIXELFORMAT_RGBA4444 /* mir_pixel_format_rgba_4444 */ -}; - -Uint32 -MIR_GetSDLPixelFormat(MirPixelFormat format) -{ - return mir_pixel_format_to_sdl_format[format]; -} - -static int -MIR_VideoInit(_THIS); - -static void -MIR_VideoQuit(_THIS); - -static int -MIR_GetDisplayBounds(_THIS, SDL_VideoDisplay* display, SDL_Rect* rect); - -static void -MIR_GetDisplayModes(_THIS, SDL_VideoDisplay* sdl_display); - -static int -MIR_SetDisplayMode(_THIS, SDL_VideoDisplay* sdl_display, SDL_DisplayMode* mode); - -static SDL_WindowShaper* -MIR_CreateShaper(SDL_Window* window) -{ - /* FIXME Im not sure if mir support this atm, will have to come back to this */ - return NULL; -} - -static int -MIR_SetWindowShape(SDL_WindowShaper* shaper, SDL_Surface* shape, SDL_WindowShapeMode* shape_mode) -{ - return SDL_Unsupported(); -} - -static int -MIR_ResizeWindowShape(SDL_Window* window) -{ - return SDL_Unsupported(); -} - -static int -MIR_Available() -{ - int available = 0; - - if (SDL_MIR_LoadSymbols()) { - /* !!! FIXME: try to make a MirConnection here. */ - available = 1; - SDL_MIR_UnloadSymbols(); - } - - return available; -} - -static void -MIR_DeleteDevice(SDL_VideoDevice* device) -{ - SDL_free(device); - SDL_MIR_UnloadSymbols(); -} - -static void -MIR_PumpEvents(_THIS) -{ -} - -static SDL_VideoDevice* -MIR_CreateDevice(int device_index) -{ - MIR_Data* mir_data; - SDL_VideoDevice* device = NULL; - - if (!SDL_MIR_LoadSymbols()) { - return NULL; - } - - device = SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (!device) { - SDL_MIR_UnloadSymbols(); - SDL_OutOfMemory(); - return NULL; - } - - mir_data = SDL_calloc(1, sizeof(MIR_Data)); - if (!mir_data) { - SDL_free(device); - SDL_MIR_UnloadSymbols(); - SDL_OutOfMemory(); - return NULL; - } - - device->driverdata = mir_data; - - /* mirvideo */ - device->VideoInit = MIR_VideoInit; - device->VideoQuit = MIR_VideoQuit; - device->GetDisplayBounds = MIR_GetDisplayBounds; - device->GetDisplayModes = MIR_GetDisplayModes; - device->SetDisplayMode = MIR_SetDisplayMode; - device->free = MIR_DeleteDevice; - - /* miropengles */ - device->GL_SwapWindow = MIR_GL_SwapWindow; - device->GL_MakeCurrent = MIR_GL_MakeCurrent; - device->GL_CreateContext = MIR_GL_CreateContext; - device->GL_DeleteContext = MIR_GL_DeleteContext; - device->GL_LoadLibrary = MIR_GL_LoadLibrary; - device->GL_UnloadLibrary = MIR_GL_UnloadLibrary; - device->GL_GetSwapInterval = MIR_GL_GetSwapInterval; - device->GL_SetSwapInterval = MIR_GL_SetSwapInterval; - device->GL_GetProcAddress = MIR_GL_GetProcAddress; - - /* mirwindow */ - device->CreateWindow = MIR_CreateWindow; - device->DestroyWindow = MIR_DestroyWindow; - device->GetWindowWMInfo = MIR_GetWindowWMInfo; - device->SetWindowFullscreen = MIR_SetWindowFullscreen; - device->MaximizeWindow = MIR_MaximizeWindow; - device->MinimizeWindow = MIR_MinimizeWindow; - device->RestoreWindow = MIR_RestoreWindow; - device->ShowWindow = MIR_RestoreWindow; - device->HideWindow = MIR_HideWindow; - device->SetWindowSize = MIR_SetWindowSize; - device->SetWindowMinimumSize = MIR_SetWindowMinimumSize; - device->SetWindowMaximumSize = MIR_SetWindowMaximumSize; - device->SetWindowTitle = MIR_SetWindowTitle; - device->SetWindowGrab = MIR_SetWindowGrab; - device->SetWindowGammaRamp = MIR_SetWindowGammaRamp; - device->GetWindowGammaRamp = MIR_GetWindowGammaRamp; - - device->CreateWindowFrom = NULL; - device->SetWindowIcon = NULL; - device->RaiseWindow = NULL; - device->SetWindowBordered = NULL; - device->SetWindowResizable = NULL; - device->OnWindowEnter = NULL; - device->SetWindowPosition = NULL; - - /* mirframebuffer */ - device->CreateWindowFramebuffer = MIR_CreateWindowFramebuffer; - device->UpdateWindowFramebuffer = MIR_UpdateWindowFramebuffer; - device->DestroyWindowFramebuffer = MIR_DestroyWindowFramebuffer; - - device->shape_driver.CreateShaper = MIR_CreateShaper; - device->shape_driver.SetWindowShape = MIR_SetWindowShape; - device->shape_driver.ResizeWindowShape = MIR_ResizeWindowShape; - - device->PumpEvents = MIR_PumpEvents; - - device->SuspendScreenSaver = NULL; - - device->StartTextInput = NULL; - device->StopTextInput = NULL; - device->SetTextInputRect = NULL; - - device->HasScreenKeyboardSupport = NULL; - device->ShowScreenKeyboard = NULL; - device->HideScreenKeyboard = NULL; - device->IsScreenKeyboardShown = NULL; - - device->SetClipboardText = NULL; - device->GetClipboardText = NULL; - device->HasClipboardText = NULL; - - device->ShowMessageBox = NULL; - - return device; -} - -VideoBootStrap MIR_bootstrap = { - MIR_DRIVER_NAME, "SDL Mir video driver", - MIR_Available, MIR_CreateDevice -}; - -static SDL_DisplayMode -MIR_ConvertModeToSDLMode(MirOutputMode const* mode, MirPixelFormat format) -{ - SDL_DisplayMode sdl_mode = { - .format = MIR_GetSDLPixelFormat(format), - .w = MIR_mir_output_mode_get_width(mode), - .h = MIR_mir_output_mode_get_height(mode), - .refresh_rate = MIR_mir_output_mode_get_refresh_rate(mode), - .driverdata = NULL - }; - - return sdl_mode; -} - -static void -MIR_AddModeToDisplay(SDL_VideoDisplay* display, MirOutputMode const* mode, MirPixelFormat format) -{ - SDL_DisplayMode sdl_mode = MIR_ConvertModeToSDLMode(mode, format); - SDL_AddDisplayMode(display, &sdl_mode); -} - -static void -MIR_InitDisplayFromOutput(_THIS, MirOutput* output) -{ - SDL_VideoDisplay display; - int m; - - MirPixelFormat format = MIR_mir_output_get_current_pixel_format(output); - int num_modes = MIR_mir_output_get_num_modes(output); - SDL_DisplayMode current_mode = MIR_ConvertModeToSDLMode(mir_output_get_current_mode(output), format); - - SDL_zero(display); - - // Unfortunate cast, but SDL_AddVideoDisplay will strdup this pointer so its read-only in this case. - display.name = (char*)MIR_mir_output_type_name(MIR_mir_output_get_type(output)); - - for (m = 0; m < num_modes; m++) { - MirOutputMode const* mode = MIR_mir_output_get_mode(output, m); - MIR_AddModeToDisplay(&display, mode, format); - } - - display.desktop_mode = current_mode; - display.current_mode = current_mode; - - display.driverdata = output; - SDL_AddVideoDisplay(&display); -} - -static void -MIR_InitDisplays(_THIS) -{ - MIR_Data* mir_data = _this->driverdata; - int num_outputs = MIR_mir_display_config_get_num_outputs(mir_data->display_config); - int d; - - for (d = 0; d < num_outputs; d++) { - MirOutput* output = MIR_mir_display_config_get_mutable_output(mir_data->display_config, d); - SDL_bool enabled = MIR_mir_output_is_enabled(output); - MirOutputConnectionState state = MIR_mir_output_get_connection_state(output); - - if (enabled && state == mir_output_connection_state_connected) { - MIR_InitDisplayFromOutput(_this, output); - } - } -} - -static int -MIR_VideoInit(_THIS) -{ - MIR_Data* mir_data = _this->driverdata; - - mir_data->connection = MIR_mir_connect_sync(NULL, __PRETTY_FUNCTION__); - mir_data->current_window = NULL; - mir_data->software = SDL_FALSE; - mir_data->pixel_format = mir_pixel_format_invalid; - - if (!MIR_mir_connection_is_valid(mir_data->connection)) { - return SDL_SetError("Failed to connect to the mir server: %s", - MIR_mir_connection_get_error_message(mir_data->connection)); - } - - mir_data->display_config = MIR_mir_connection_create_display_configuration(mir_data->connection); - - MIR_InitDisplays(_this); - MIR_InitMouse(); - - return 0; -} - -static void -MIR_CleanUpDisplayConfig(_THIS) -{ - MIR_Data* mir_data = _this->driverdata; - int i; - - // SDL_VideoQuit frees the display driverdata, we own it not them - for (i = 0; i < _this->num_displays; ++i) { - _this->displays[i].driverdata = NULL; - } - - MIR_mir_display_config_release(mir_data->display_config); -} - -static void -MIR_VideoQuit(_THIS) -{ - MIR_Data* mir_data = _this->driverdata; - - MIR_CleanUpDisplayConfig(_this); - - MIR_FiniMouse(); - - MIR_GL_DeleteContext(_this, NULL); - MIR_GL_UnloadLibrary(_this); - - MIR_mir_connection_release(mir_data->connection); - - SDL_free(mir_data); - _this->driverdata = NULL; -} - -static int -MIR_GetDisplayBounds(_THIS, SDL_VideoDisplay* display, SDL_Rect* rect) -{ - MirOutput const* output = display->driverdata; - - rect->x = MIR_mir_output_get_position_x(output); - rect->y = MIR_mir_output_get_position_y(output); - rect->w = display->current_mode.w; - rect->h = display->current_mode.h; - - return 0; -} - -static void -MIR_GetDisplayModes(_THIS, SDL_VideoDisplay* display) -{ -} - -static int -MIR_SetDisplayMode(_THIS, SDL_VideoDisplay* display, SDL_DisplayMode* mode) -{ - int m; - MirOutput* output = display->driverdata; - int num_modes = MIR_mir_output_get_num_modes(output); - Uint32 sdl_format = MIR_GetSDLPixelFormat( - MIR_mir_output_get_current_pixel_format(output)); - - for (m = 0; m < num_modes; m++) { - MirOutputMode const* mir_mode = MIR_mir_output_get_mode(output, m); - int width = MIR_mir_output_mode_get_width(mir_mode); - int height = MIR_mir_output_mode_get_height(mir_mode); - double refresh_rate = MIR_mir_output_mode_get_refresh_rate(mir_mode); - - if (mode->format == sdl_format && - mode->w == width && - mode->h == height && - mode->refresh_rate == refresh_rate) { - - // FIXME Currently wont actually *set* anything. Need to wait for applying display changes - MIR_mir_output_set_current_mode(output, mir_mode); - return 0; - } - } - - return -1; -} - -#endif /* SDL_VIDEO_DRIVER_MIR */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirvideo.h b/3rdparty/SDL2/src/video/mir/SDL_mirvideo.h deleted file mode 100644 index 71ef4ecc19c..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirvideo.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#ifndef _SDL_mirvideo_h_ -#define _SDL_mirvideo_h_ - -#include <EGL/egl.h> -#include <mir_toolkit/mir_client_library.h> - -typedef struct MIR_Window MIR_Window; - -typedef struct -{ - MirConnection* connection; - MirDisplayConfig* display_config; - MIR_Window* current_window; - SDL_bool software; - MirPixelFormat pixel_format; -} MIR_Data; - -extern Uint32 -MIR_GetSDLPixelFormat(MirPixelFormat format); - -#endif /* _SDL_mirvideo_h_ */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirwindow.c b/3rdparty/SDL2/src/video/mir/SDL_mirwindow.c deleted file mode 100644 index 1bf9016a0b4..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirwindow.c +++ /dev/null @@ -1,422 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_MIR - -#include "../SDL_egl_c.h" -#include "../SDL_sysvideo.h" -#include "../../events/SDL_keyboard_c.h" - -#include "SDL_mirevents.h" -#include "SDL_mirwindow.h" - -#include "SDL_mirdyn.h" - -int -IsSurfaceValid(MIR_Window* mir_window) -{ - if (!MIR_mir_surface_is_valid(mir_window->surface)) { - const char* error = MIR_mir_surface_get_error_message(mir_window->surface); - return SDL_SetError("Failed to created a mir surface: %s", error); - } - - return 0; -} - -MirPixelFormat -FindValidPixelFormat(MIR_Data* mir_data) -{ - unsigned int pf_size = 32; - unsigned int valid_formats; - unsigned int f; - - MirPixelFormat formats[pf_size]; - MIR_mir_connection_get_available_surface_formats(mir_data->connection, formats, - pf_size, &valid_formats); - - for (f = 0; f < valid_formats; f++) { - MirPixelFormat cur_pf = formats[f]; - - if (cur_pf == mir_pixel_format_abgr_8888 || - cur_pf == mir_pixel_format_xbgr_8888 || - cur_pf == mir_pixel_format_argb_8888 || - cur_pf == mir_pixel_format_xrgb_8888) { - - return cur_pf; - } - } - - return mir_pixel_format_invalid; -} - -int -MIR_CreateWindow(_THIS, SDL_Window* window) -{ - MIR_Window* mir_window; - MIR_Data* mir_data; - MirPixelFormat pixel_format; - MirBufferUsage buffer_usage; - - MirSurfaceSpec* spec; - - mir_window = SDL_calloc(1, sizeof(MIR_Window)); - if (!mir_window) - return SDL_OutOfMemory(); - - mir_data = _this->driverdata; - window->driverdata = mir_window; - - if (window->x == SDL_WINDOWPOS_UNDEFINED) - window->x = 0; - - if (window->y == SDL_WINDOWPOS_UNDEFINED) - window->y = 0; - - mir_window->mir_data = mir_data; - mir_window->sdl_window = window; - - if (window->flags & SDL_WINDOW_OPENGL) { - pixel_format = MIR_mir_connection_get_egl_pixel_format(mir_data->connection, - _this->egl_data->egl_display, - _this->egl_data->egl_config); - } - else { - pixel_format = FindValidPixelFormat(mir_data); - } - - mir_data->pixel_format = pixel_format; - if (pixel_format == mir_pixel_format_invalid) { - return SDL_SetError("Failed to find a valid pixel format."); - } - - buffer_usage = mir_buffer_usage_hardware; - if (mir_data->software) - buffer_usage = mir_buffer_usage_software; - - spec = MIR_mir_connection_create_spec_for_normal_surface(mir_data->connection, - window->w, - window->h, - pixel_format); - - MIR_mir_surface_spec_set_buffer_usage(spec, buffer_usage); - MIR_mir_surface_spec_set_name(spec, "Mir surface"); - - if (window->flags & SDL_WINDOW_INPUT_FOCUS) - SDL_SetKeyboardFocus(window); - - mir_window->surface = MIR_mir_surface_create_sync(spec); - MIR_mir_surface_set_event_handler(mir_window->surface, MIR_HandleEvent, window); - - MIR_mir_surface_spec_release(spec); - - if (!MIR_mir_surface_is_valid(mir_window->surface)) { - return SDL_SetError("Failed to created a mir surface: %s", - MIR_mir_surface_get_error_message(mir_window->surface)); - } - - if (window->flags & SDL_WINDOW_OPENGL) { - EGLNativeWindowType egl_native_window = - (EGLNativeWindowType)MIR_mir_buffer_stream_get_egl_native_window( - MIR_mir_surface_get_buffer_stream(mir_window->surface)); - - mir_window->egl_surface = SDL_EGL_CreateSurface(_this, egl_native_window); - - if (mir_window->egl_surface == EGL_NO_SURFACE) { - return SDL_SetError("Failed to created a window surface %p", - _this->egl_data->egl_display); - } - } - else { - mir_window->egl_surface = EGL_NO_SURFACE; - } - - mir_data->current_window = mir_window; - - return 0; -} - -void -MIR_DestroyWindow(_THIS, SDL_Window* window) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - - if (mir_data) { - SDL_EGL_DestroySurface(_this, mir_window->egl_surface); - MIR_mir_surface_release_sync(mir_window->surface); - - mir_data->current_window = NULL; - - SDL_free(mir_window); - } - window->driverdata = NULL; -} - -SDL_bool -MIR_GetWindowWMInfo(_THIS, SDL_Window* window, SDL_SysWMinfo* info) -{ - if (info->version.major == SDL_MAJOR_VERSION && - info->version.minor == SDL_MINOR_VERSION) { - MIR_Window* mir_window = window->driverdata; - - info->subsystem = SDL_SYSWM_MIR; - info->info.mir.connection = mir_window->mir_data->connection; - info->info.mir.surface = mir_window->surface; - - return SDL_TRUE; - } - - return SDL_FALSE; -} - -void -MIR_SetWindowFullscreen(_THIS, SDL_Window* window, - SDL_VideoDisplay* display, - SDL_bool fullscreen) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - MirSurfaceSpec* spec; - MirSurfaceState state; - - if (IsSurfaceValid(mir_window) < 0) - return; - - if (fullscreen) { - state = mir_surface_state_fullscreen; - } else { - state = mir_surface_state_restored; - } - - spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection); - MIR_mir_surface_spec_set_state(spec, state); - - MIR_mir_surface_apply_spec(mir_window->surface, spec); - MIR_mir_surface_spec_release(spec); -} - -void -MIR_MaximizeWindow(_THIS, SDL_Window* window) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - MirSurfaceSpec* spec; - - if (IsSurfaceValid(mir_window) < 0) - return; - - spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection); - MIR_mir_surface_spec_set_state(spec, mir_surface_state_maximized); - - MIR_mir_surface_apply_spec(mir_window->surface, spec); - MIR_mir_surface_spec_release(spec); -} - -void -MIR_MinimizeWindow(_THIS, SDL_Window* window) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - MirSurfaceSpec* spec; - - if (IsSurfaceValid(mir_window) < 0) - return; - - spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection); - MIR_mir_surface_spec_set_state(spec, mir_surface_state_minimized); - - MIR_mir_surface_apply_spec(mir_window->surface, spec); - MIR_mir_surface_spec_release(spec); -} - -void -MIR_RestoreWindow(_THIS, SDL_Window * window) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - MirSurfaceSpec* spec; - - if (IsSurfaceValid(mir_window) < 0) - return; - - spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection); - MIR_mir_surface_spec_set_state(spec, mir_surface_state_restored); - - MIR_mir_surface_apply_spec(mir_window->surface, spec); - MIR_mir_surface_spec_release(spec); -} - -void -MIR_HideWindow(_THIS, SDL_Window* window) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - MirSurfaceSpec* spec; - - if (IsSurfaceValid(mir_window) < 0) - return; - - spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection); - MIR_mir_surface_spec_set_state(spec, mir_surface_state_hidden); - - MIR_mir_surface_apply_spec(mir_window->surface, spec); - MIR_mir_surface_spec_release(spec); -} - -void -MIR_SetWindowSize(_THIS, SDL_Window* window) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - MirSurfaceSpec* spec; - - if (IsSurfaceValid(mir_window) < 0) - return; - - /* You cannot set the x/y of a mir window! So only update w/h */ - spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection); - MIR_mir_surface_spec_set_width (spec, window->w); - MIR_mir_surface_spec_set_height(spec, window->h); - - MIR_mir_surface_apply_spec(mir_window->surface, spec); - MIR_mir_surface_spec_release(spec); -} - -void -MIR_SetWindowMinimumSize(_THIS, SDL_Window* window) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - MirSurfaceSpec* spec; - - if (IsSurfaceValid(mir_window) < 0) - return; - - spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection); - MIR_mir_surface_spec_set_min_width (spec, window->min_w); - MIR_mir_surface_spec_set_min_height(spec, window->min_h); - - MIR_mir_surface_apply_spec(mir_window->surface, spec); - MIR_mir_surface_spec_release(spec); -} - -void -MIR_SetWindowMaximumSize(_THIS, SDL_Window* window) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - MirSurfaceSpec* spec; - - if (IsSurfaceValid(mir_window) < 0) - return; - - spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection); - MIR_mir_surface_spec_set_max_width (spec, window->max_w); - MIR_mir_surface_spec_set_max_height(spec, window->max_h); - - MIR_mir_surface_apply_spec(mir_window->surface, spec); - MIR_mir_surface_spec_release(spec); -} - -void -MIR_SetWindowTitle(_THIS, SDL_Window* window) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - char const* title = window->title ? window->title : ""; - MirSurfaceSpec* spec; - - if (IsSurfaceValid(mir_window) < 0) - return; - - spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection); - MIR_mir_surface_spec_set_name(spec, title); - - MIR_mir_surface_apply_spec(mir_window->surface, spec); - MIR_mir_surface_spec_release(spec); -} - -void -MIR_SetWindowGrab(_THIS, SDL_Window* window, SDL_bool grabbed) -{ - MIR_Data* mir_data = _this->driverdata; - MIR_Window* mir_window = window->driverdata; - MirPointerConfinementState confined = mir_pointer_unconfined; - MirSurfaceSpec* spec; - - if (grabbed) - confined = mir_pointer_confined_to_surface; - - spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection); - MIR_mir_surface_spec_set_pointer_confinement(spec, confined); - - MIR_mir_surface_apply_spec(mir_window->surface, spec); - MIR_mir_surface_spec_release(spec); -} - -int -MIR_SetWindowGammaRamp(_THIS, SDL_Window* window, Uint16 const* ramp) -{ - MirOutput* output = SDL_GetDisplayForWindow(window)->driverdata; - Uint32 ramp_size = 256; - - // FIXME Need to apply the changes to the output, once that public API function is around - if (MIR_mir_output_is_gamma_supported(output) == mir_output_gamma_supported) { - MIR_mir_output_set_gamma(output, - ramp + ramp_size * 0, - ramp + ramp_size * 1, - ramp + ramp_size * 2, - ramp_size); - return 0; - } - - return -1; -} - -int -MIR_GetWindowGammaRamp(_THIS, SDL_Window* window, Uint16* ramp) -{ - MirOutput* output = SDL_GetDisplayForWindow(window)->driverdata; - Uint32 ramp_size = 256; - - if (MIR_mir_output_is_gamma_supported(output) == mir_output_gamma_supported) { - if (MIR_mir_output_get_gamma_size(output) == ramp_size) { - MIR_mir_output_get_gamma(output, - ramp + ramp_size * 0, - ramp + ramp_size * 1, - ramp + ramp_size * 2, - ramp_size); - return 0; - } - } - - return -1; -} - -#endif /* SDL_VIDEO_DRIVER_MIR */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/mir/SDL_mirwindow.h b/3rdparty/SDL2/src/video/mir/SDL_mirwindow.h deleted file mode 100644 index c4084aa4efc..00000000000 --- a/3rdparty/SDL2/src/video/mir/SDL_mirwindow.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com> -*/ - -#ifndef _SDL_mirwindow_h -#define _SDL_mirwindow_h - -#include "../SDL_sysvideo.h" -#include "SDL_syswm.h" - -#include "SDL_mirvideo.h" - -struct MIR_Window { - SDL_Window* sdl_window; - MIR_Data* mir_data; - - MirSurface* surface; - EGLSurface egl_surface; -}; - - -extern int -MIR_CreateWindow(_THIS, SDL_Window* window); - -extern void -MIR_DestroyWindow(_THIS, SDL_Window* window); - -extern void -MIR_SetWindowFullscreen(_THIS, SDL_Window* window, - SDL_VideoDisplay* display, - SDL_bool fullscreen); - -extern void -MIR_MaximizeWindow(_THIS, SDL_Window* window); - -extern void -MIR_MinimizeWindow(_THIS, SDL_Window* window); - -extern void -MIR_RestoreWindow(_THIS, SDL_Window* window); - -extern void -MIR_HideWindow(_THIS, SDL_Window* window); - -extern SDL_bool -MIR_GetWindowWMInfo(_THIS, SDL_Window* window, SDL_SysWMinfo* info); - -extern void -MIR_SetWindowSize(_THIS, SDL_Window* window); - -extern void -MIR_SetWindowMinimumSize(_THIS, SDL_Window* window); - -extern void -MIR_SetWindowMaximumSize(_THIS, SDL_Window* window); - -extern void -MIR_SetWindowTitle(_THIS, SDL_Window* window); - -extern void -MIR_SetWindowGrab(_THIS, SDL_Window* window, SDL_bool grabbed); - -extern int -MIR_SetWindowGammaRamp(_THIS, SDL_Window* window, Uint16 const* ramp); - -extern int -MIR_GetWindowGammaRamp(_THIS, SDL_Window* window, Uint16* ramp); - -#endif /* _SDL_mirwindow_h */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/nacl/SDL_naclevents.c b/3rdparty/SDL2/src/video/nacl/SDL_naclevents.c deleted file mode 100644 index d6ebbdf8702..00000000000 --- a/3rdparty/SDL2/src/video/nacl/SDL_naclevents.c +++ /dev/null @@ -1,438 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_NACL - -#include "SDL.h" -#include "../../events/SDL_sysevents.h" -#include "../../events/SDL_events_c.h" -#include "SDL_naclevents_c.h" -#include "SDL_naclvideo.h" -#include "ppapi_simple/ps_event.h" - -/* Ref: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent */ - -static SDL_Scancode NACL_Keycodes[] = { - SDL_SCANCODE_UNKNOWN, /* 0 */ - SDL_SCANCODE_UNKNOWN, /* 1 */ - SDL_SCANCODE_UNKNOWN, /* 2 */ - SDL_SCANCODE_CANCEL, /* DOM_VK_CANCEL 3 */ - SDL_SCANCODE_UNKNOWN, /* 4 */ - SDL_SCANCODE_UNKNOWN, /* 5 */ - SDL_SCANCODE_HELP, /* DOM_VK_HELP 6 */ - SDL_SCANCODE_UNKNOWN, /* 7 */ - SDL_SCANCODE_BACKSPACE, /* DOM_VK_BACK_SPACE 8 */ - SDL_SCANCODE_TAB, /* DOM_VK_TAB 9 */ - SDL_SCANCODE_UNKNOWN, /* 10 */ - SDL_SCANCODE_UNKNOWN, /* 11 */ - SDL_SCANCODE_CLEAR, /* DOM_VK_CLEAR 12 */ - SDL_SCANCODE_RETURN, /* DOM_VK_RETURN 13 */ - SDL_SCANCODE_RETURN, /* DOM_VK_ENTER 14 */ - SDL_SCANCODE_UNKNOWN, /* 15 */ - SDL_SCANCODE_LSHIFT, /* DOM_VK_SHIFT 16 */ - SDL_SCANCODE_LCTRL, /* DOM_VK_CONTROL 17 */ - SDL_SCANCODE_LALT, /* DOM_VK_ALT 18 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_PAUSE 19 */ - SDL_SCANCODE_CAPSLOCK, /* DOM_VK_CAPS_LOCK 20 */ - SDL_SCANCODE_LANG1, /* DOM_VK_KANA DOM_VK_HANGUL 21 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_EISU 22 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_JUNJA 23 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_FINAL 24 */ - SDL_SCANCODE_LANG2, /* DOM_VK_HANJA DOM_VK_KANJI 25 */ - SDL_SCANCODE_UNKNOWN, /* 26 */ - SDL_SCANCODE_ESCAPE, /* DOM_VK_ESCAPE 27 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_CONVERT 28 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_NONCONVERT 29 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_ACCEPT 30 */ - SDL_SCANCODE_MODE, /* DOM_VK_MODECHANGE 31 */ - SDL_SCANCODE_SPACE, /* DOM_VK_SPACE 32 */ - SDL_SCANCODE_PAGEUP, /* DOM_VK_PAGE_UP 33 */ - SDL_SCANCODE_PAGEDOWN, /* DOM_VK_PAGE_DOWN 34 */ - SDL_SCANCODE_END, /* DOM_VK_END 35 */ - SDL_SCANCODE_HOME, /* DOM_VK_HOME 36 */ - SDL_SCANCODE_LEFT, /* DOM_VK_LEFT 37 */ - SDL_SCANCODE_UP, /* DOM_VK_UP 38 */ - SDL_SCANCODE_RIGHT, /* DOM_VK_RIGHT 39 */ - SDL_SCANCODE_DOWN, /* DOM_VK_DOWN 40 */ - SDL_SCANCODE_SELECT, /* DOM_VK_SELECT 41 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_PRINT 42 */ - SDL_SCANCODE_EXECUTE, /* DOM_VK_EXECUTE 43 */ - SDL_SCANCODE_PRINTSCREEN, /* DOM_VK_PRINTSCREEN 44 */ - SDL_SCANCODE_INSERT, /* DOM_VK_INSERT 45 */ - SDL_SCANCODE_DELETE, /* DOM_VK_DELETE 46 */ - SDL_SCANCODE_UNKNOWN, /* 47 */ - SDL_SCANCODE_0, /* DOM_VK_0 48 */ - SDL_SCANCODE_1, /* DOM_VK_1 49 */ - SDL_SCANCODE_2, /* DOM_VK_2 50 */ - SDL_SCANCODE_3, /* DOM_VK_3 51 */ - SDL_SCANCODE_4, /* DOM_VK_4 52 */ - SDL_SCANCODE_5, /* DOM_VK_5 53 */ - SDL_SCANCODE_6, /* DOM_VK_6 54 */ - SDL_SCANCODE_7, /* DOM_VK_7 55 */ - SDL_SCANCODE_8, /* DOM_VK_8 56 */ - SDL_SCANCODE_9, /* DOM_VK_9 57 */ - SDL_SCANCODE_KP_COLON, /* DOM_VK_COLON 58 */ - SDL_SCANCODE_SEMICOLON, /* DOM_VK_SEMICOLON 59 */ - SDL_SCANCODE_KP_LESS, /* DOM_VK_LESS_THAN 60 */ - SDL_SCANCODE_EQUALS, /* DOM_VK_EQUALS 61 */ - SDL_SCANCODE_KP_GREATER, /* DOM_VK_GREATER_THAN 62 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_QUESTION_MARK 63 */ - SDL_SCANCODE_KP_AT, /* DOM_VK_AT 64 */ - SDL_SCANCODE_A, /* DOM_VK_A 65 */ - SDL_SCANCODE_B, /* DOM_VK_B 66 */ - SDL_SCANCODE_C, /* DOM_VK_C 67 */ - SDL_SCANCODE_D, /* DOM_VK_D 68 */ - SDL_SCANCODE_E, /* DOM_VK_E 69 */ - SDL_SCANCODE_F, /* DOM_VK_F 70 */ - SDL_SCANCODE_G, /* DOM_VK_G 71 */ - SDL_SCANCODE_H, /* DOM_VK_H 72 */ - SDL_SCANCODE_I, /* DOM_VK_I 73 */ - SDL_SCANCODE_J, /* DOM_VK_J 74 */ - SDL_SCANCODE_K, /* DOM_VK_K 75 */ - SDL_SCANCODE_L, /* DOM_VK_L 76 */ - SDL_SCANCODE_M, /* DOM_VK_M 77 */ - SDL_SCANCODE_N, /* DOM_VK_N 78 */ - SDL_SCANCODE_O, /* DOM_VK_O 79 */ - SDL_SCANCODE_P, /* DOM_VK_P 80 */ - SDL_SCANCODE_Q, /* DOM_VK_Q 81 */ - SDL_SCANCODE_R, /* DOM_VK_R 82 */ - SDL_SCANCODE_S, /* DOM_VK_S 83 */ - SDL_SCANCODE_T, /* DOM_VK_T 84 */ - SDL_SCANCODE_U, /* DOM_VK_U 85 */ - SDL_SCANCODE_V, /* DOM_VK_V 86 */ - SDL_SCANCODE_W, /* DOM_VK_W 87 */ - SDL_SCANCODE_X, /* DOM_VK_X 88 */ - SDL_SCANCODE_Y, /* DOM_VK_Y 89 */ - SDL_SCANCODE_Z, /* DOM_VK_Z 90 */ - SDL_SCANCODE_LGUI, /* DOM_VK_WIN 91 */ - SDL_SCANCODE_UNKNOWN, /* 92 */ - SDL_SCANCODE_APPLICATION, /* DOM_VK_CONTEXT_MENU 93 */ - SDL_SCANCODE_UNKNOWN, /* 94 */ - SDL_SCANCODE_SLEEP, /* DOM_VK_SLEEP 95 */ - SDL_SCANCODE_KP_0, /* DOM_VK_NUMPAD0 96 */ - SDL_SCANCODE_KP_1, /* DOM_VK_NUMPAD1 97 */ - SDL_SCANCODE_KP_2, /* DOM_VK_NUMPAD2 98 */ - SDL_SCANCODE_KP_3, /* DOM_VK_NUMPAD3 99 */ - SDL_SCANCODE_KP_4, /* DOM_VK_NUMPAD4 100 */ - SDL_SCANCODE_KP_5, /* DOM_VK_NUMPAD5 101 */ - SDL_SCANCODE_KP_6, /* DOM_VK_NUMPAD6 102 */ - SDL_SCANCODE_KP_7, /* DOM_VK_NUMPAD7 103 */ - SDL_SCANCODE_KP_8, /* DOM_VK_NUMPAD8 104 */ - SDL_SCANCODE_KP_9, /* DOM_VK_NUMPAD9 105 */ - SDL_SCANCODE_KP_MULTIPLY, /* DOM_VK_MULTIPLY 106 */ - SDL_SCANCODE_KP_PLUS, /* DOM_VK_ADD 107 */ - SDL_SCANCODE_KP_COMMA, /* DOM_VK_SEPARATOR 108 */ - SDL_SCANCODE_KP_MINUS, /* DOM_VK_SUBTRACT 109 */ - SDL_SCANCODE_KP_PERIOD, /* DOM_VK_DECIMAL 110 */ - SDL_SCANCODE_KP_DIVIDE, /* DOM_VK_DIVIDE 111 */ - SDL_SCANCODE_F1, /* DOM_VK_F1 112 */ - SDL_SCANCODE_F2, /* DOM_VK_F2 113 */ - SDL_SCANCODE_F3, /* DOM_VK_F3 114 */ - SDL_SCANCODE_F4, /* DOM_VK_F4 115 */ - SDL_SCANCODE_F5, /* DOM_VK_F5 116 */ - SDL_SCANCODE_F6, /* DOM_VK_F6 117 */ - SDL_SCANCODE_F7, /* DOM_VK_F7 118 */ - SDL_SCANCODE_F8, /* DOM_VK_F8 119 */ - SDL_SCANCODE_F9, /* DOM_VK_F9 120 */ - SDL_SCANCODE_F10, /* DOM_VK_F10 121 */ - SDL_SCANCODE_F11, /* DOM_VK_F11 122 */ - SDL_SCANCODE_F12, /* DOM_VK_F12 123 */ - SDL_SCANCODE_F13, /* DOM_VK_F13 124 */ - SDL_SCANCODE_F14, /* DOM_VK_F14 125 */ - SDL_SCANCODE_F15, /* DOM_VK_F15 126 */ - SDL_SCANCODE_F16, /* DOM_VK_F16 127 */ - SDL_SCANCODE_F17, /* DOM_VK_F17 128 */ - SDL_SCANCODE_F18, /* DOM_VK_F18 129 */ - SDL_SCANCODE_F19, /* DOM_VK_F19 130 */ - SDL_SCANCODE_F20, /* DOM_VK_F20 131 */ - SDL_SCANCODE_F21, /* DOM_VK_F21 132 */ - SDL_SCANCODE_F22, /* DOM_VK_F22 133 */ - SDL_SCANCODE_F23, /* DOM_VK_F23 134 */ - SDL_SCANCODE_F24, /* DOM_VK_F24 135 */ - SDL_SCANCODE_UNKNOWN, /* 136 */ - SDL_SCANCODE_UNKNOWN, /* 137 */ - SDL_SCANCODE_UNKNOWN, /* 138 */ - SDL_SCANCODE_UNKNOWN, /* 139 */ - SDL_SCANCODE_UNKNOWN, /* 140 */ - SDL_SCANCODE_UNKNOWN, /* 141 */ - SDL_SCANCODE_UNKNOWN, /* 142 */ - SDL_SCANCODE_UNKNOWN, /* 143 */ - SDL_SCANCODE_NUMLOCKCLEAR, /* DOM_VK_NUM_LOCK 144 */ - SDL_SCANCODE_SCROLLLOCK, /* DOM_VK_SCROLL_LOCK 145 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_FJ_JISHO 146 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_FJ_MASSHOU 147 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_FJ_TOUROKU 148 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_FJ_LOYA 149 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_FJ_ROYA 150 */ - SDL_SCANCODE_UNKNOWN, /* 151 */ - SDL_SCANCODE_UNKNOWN, /* 152 */ - SDL_SCANCODE_UNKNOWN, /* 153 */ - SDL_SCANCODE_UNKNOWN, /* 154 */ - SDL_SCANCODE_UNKNOWN, /* 155 */ - SDL_SCANCODE_UNKNOWN, /* 156 */ - SDL_SCANCODE_UNKNOWN, /* 157 */ - SDL_SCANCODE_UNKNOWN, /* 158 */ - SDL_SCANCODE_UNKNOWN, /* 159 */ - SDL_SCANCODE_GRAVE, /* DOM_VK_CIRCUMFLEX 160 */ - SDL_SCANCODE_KP_EXCLAM, /* DOM_VK_EXCLAMATION 161 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_DOUBLE_QUOTE 162 */ - SDL_SCANCODE_KP_HASH, /* DOM_VK_HASH 163 */ - SDL_SCANCODE_CURRENCYUNIT, /* DOM_VK_DOLLAR 164 */ - SDL_SCANCODE_KP_PERCENT, /* DOM_VK_PERCENT 165 */ - SDL_SCANCODE_KP_AMPERSAND, /* DOM_VK_AMPERSAND 166 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_UNDERSCORE 167 */ - SDL_SCANCODE_KP_LEFTPAREN, /* DOM_VK_OPEN_PAREN 168 */ - SDL_SCANCODE_KP_RIGHTPAREN, /* DOM_VK_CLOSE_PAREN 169 */ - SDL_SCANCODE_KP_MULTIPLY, /* DOM_VK_ASTERISK 170 */ - SDL_SCANCODE_KP_PLUS, /* DOM_VK_PLUS 171 */ - SDL_SCANCODE_KP_PLUS, /* DOM_VK_PIPE 172 */ - SDL_SCANCODE_MINUS, /* DOM_VK_HYPHEN_MINUS 173 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_OPEN_CURLY_BRACKET 174 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_CLOSE_CURLY_BRACKET 175 */ - SDL_SCANCODE_NONUSBACKSLASH, /* DOM_VK_TILDE 176 */ - SDL_SCANCODE_UNKNOWN, /* 177 */ - SDL_SCANCODE_UNKNOWN, /* 178 */ - SDL_SCANCODE_UNKNOWN, /* 179 */ - SDL_SCANCODE_UNKNOWN, /* 180 */ - SDL_SCANCODE_MUTE, /* DOM_VK_VOLUME_MUTE 181 */ - SDL_SCANCODE_VOLUMEDOWN, /* DOM_VK_VOLUME_DOWN 182 */ - SDL_SCANCODE_VOLUMEUP, /* DOM_VK_VOLUME_UP 183 */ - SDL_SCANCODE_UNKNOWN, /* 184 */ - SDL_SCANCODE_UNKNOWN, /* 185 */ - SDL_SCANCODE_UNKNOWN, /* 186 */ - SDL_SCANCODE_UNKNOWN, /* 187 */ - SDL_SCANCODE_COMMA, /* DOM_VK_COMMA 188 */ - SDL_SCANCODE_UNKNOWN, /* 189 */ - SDL_SCANCODE_PERIOD, /* DOM_VK_PERIOD 190 */ - SDL_SCANCODE_SLASH, /* DOM_VK_SLASH 191 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_BACK_QUOTE 192 */ - SDL_SCANCODE_UNKNOWN, /* 193 */ - SDL_SCANCODE_UNKNOWN, /* 194 */ - SDL_SCANCODE_UNKNOWN, /* 195 */ - SDL_SCANCODE_UNKNOWN, /* 196 */ - SDL_SCANCODE_UNKNOWN, /* 197 */ - SDL_SCANCODE_UNKNOWN, /* 198 */ - SDL_SCANCODE_UNKNOWN, /* 199 */ - SDL_SCANCODE_UNKNOWN, /* 200 */ - SDL_SCANCODE_UNKNOWN, /* 201 */ - SDL_SCANCODE_UNKNOWN, /* 202 */ - SDL_SCANCODE_UNKNOWN, /* 203 */ - SDL_SCANCODE_UNKNOWN, /* 204 */ - SDL_SCANCODE_UNKNOWN, /* 205 */ - SDL_SCANCODE_UNKNOWN, /* 206 */ - SDL_SCANCODE_UNKNOWN, /* 207 */ - SDL_SCANCODE_UNKNOWN, /* 208 */ - SDL_SCANCODE_UNKNOWN, /* 209 */ - SDL_SCANCODE_UNKNOWN, /* 210 */ - SDL_SCANCODE_UNKNOWN, /* 211 */ - SDL_SCANCODE_UNKNOWN, /* 212 */ - SDL_SCANCODE_UNKNOWN, /* 213 */ - SDL_SCANCODE_UNKNOWN, /* 214 */ - SDL_SCANCODE_UNKNOWN, /* 215 */ - SDL_SCANCODE_UNKNOWN, /* 216 */ - SDL_SCANCODE_UNKNOWN, /* 217 */ - SDL_SCANCODE_UNKNOWN, /* 218 */ - SDL_SCANCODE_LEFTBRACKET, /* DOM_VK_OPEN_BRACKET 219 */ - SDL_SCANCODE_BACKSLASH, /* DOM_VK_BACK_SLASH 220 */ - SDL_SCANCODE_RIGHTBRACKET, /* DOM_VK_CLOSE_BRACKET 221 */ - SDL_SCANCODE_APOSTROPHE, /* DOM_VK_QUOTE 222 */ - SDL_SCANCODE_UNKNOWN, /* 223 */ - SDL_SCANCODE_RGUI, /* DOM_VK_META 224 */ - SDL_SCANCODE_RALT, /* DOM_VK_ALTGR 225 */ - SDL_SCANCODE_UNKNOWN, /* 226 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_ICO_HELP 227 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_ICO_00 228 */ - SDL_SCANCODE_UNKNOWN, /* 229 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_ICO_CLEAR 230 */ - SDL_SCANCODE_UNKNOWN, /* 231 */ - SDL_SCANCODE_UNKNOWN, /* 232 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_RESET 233 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_JUMP 234 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_PA1 235 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_PA2 236 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_PA3 237 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_WSCTRL 238 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_CUSEL 239 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_ATTN 240 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_FINISH 241 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_COPY 242 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_AUTO 243 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_ENLW 244 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_BACKTAB 245 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_ATTN 246 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_CRSEL 247 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_EXSEL 248 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_EREOF 249 */ - SDL_SCANCODE_AUDIOPLAY, /* DOM_VK_PLAY 250 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_ZOOM 251 */ - SDL_SCANCODE_UNKNOWN, /* 252 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_PA1 253 */ - SDL_SCANCODE_UNKNOWN, /* DOM_VK_WIN_OEM_CLEAR 254 */ - SDL_SCANCODE_UNKNOWN, /* 255 */ -}; - -static Uint8 SDL_NACL_translate_mouse_button(int32_t button) { - switch (button) { - case PP_INPUTEVENT_MOUSEBUTTON_LEFT: - return SDL_BUTTON_LEFT; - case PP_INPUTEVENT_MOUSEBUTTON_MIDDLE: - return SDL_BUTTON_MIDDLE; - case PP_INPUTEVENT_MOUSEBUTTON_RIGHT: - return SDL_BUTTON_RIGHT; - - case PP_INPUTEVENT_MOUSEBUTTON_NONE: - default: - return 0; - } -} - -static SDL_Scancode -SDL_NACL_translate_keycode(int keycode) -{ - SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN; - - if (keycode < SDL_arraysize(NACL_Keycodes)) { - scancode = NACL_Keycodes[keycode]; - } - if (scancode == SDL_SCANCODE_UNKNOWN) { - SDL_Log("The key you just pressed is not recognized by SDL. To help get this fixed, please report this to the SDL mailing list <sdl@libsdl.org> NACL KeyCode %d \n", keycode); - } - return scancode; -} - -void NACL_PumpEvents(_THIS) { - PSEvent* ps_event; - PP_Resource event; - PP_InputEvent_Type type; - PP_InputEvent_Modifier modifiers; - struct PP_Rect rect; - struct PP_FloatPoint fp; - struct PP_Point location; - struct PP_Var var; - const char *str; - char text[64]; - Uint32 str_len; - SDL_VideoData *driverdata = (SDL_VideoData *) _this->driverdata; - SDL_Mouse *mouse = SDL_GetMouse(); - - if (driverdata->window) { - while ((ps_event = PSEventTryAcquire()) != NULL) { - event = ps_event->as_resource; - switch(ps_event->type) { - /* From DidChangeView, contains a view resource */ - case PSE_INSTANCE_DIDCHANGEVIEW: - driverdata->ppb_view->GetRect(event, &rect); - NACL_SetScreenResolution(rect.size.width, rect.size.height, SDL_PIXELFORMAT_UNKNOWN); - // FIXME: Rebuild context? See life.c UpdateContext - break; - - /* From HandleInputEvent, contains an input resource. */ - case PSE_INSTANCE_HANDLEINPUT: - type = driverdata->ppb_input_event->GetType(event); - modifiers = driverdata->ppb_input_event->GetModifiers(event); - switch(type) { - case PP_INPUTEVENT_TYPE_MOUSEDOWN: - SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_NACL_translate_mouse_button(driverdata->ppb_mouse_input_event->GetButton(event))); - break; - case PP_INPUTEVENT_TYPE_MOUSEUP: - SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_NACL_translate_mouse_button(driverdata->ppb_mouse_input_event->GetButton(event))); - break; - case PP_INPUTEVENT_TYPE_WHEEL: - /* FIXME: GetTicks provides high resolution scroll events */ - fp = driverdata->ppb_wheel_input_event->GetDelta(event); - SDL_SendMouseWheel(mouse->focus, mouse->mouseID, (int) fp.x, (int) fp.y, SDL_MOUSEWHEEL_NORMAL); - break; - - case PP_INPUTEVENT_TYPE_MOUSEENTER: - case PP_INPUTEVENT_TYPE_MOUSELEAVE: - /* FIXME: Mouse Focus */ - break; - - - case PP_INPUTEVENT_TYPE_MOUSEMOVE: - location = driverdata->ppb_mouse_input_event->GetPosition(event); - SDL_SendMouseMotion(mouse->focus, mouse->mouseID, SDL_FALSE, location.x, location.y); - break; - - case PP_INPUTEVENT_TYPE_TOUCHSTART: - case PP_INPUTEVENT_TYPE_TOUCHMOVE: - case PP_INPUTEVENT_TYPE_TOUCHEND: - case PP_INPUTEVENT_TYPE_TOUCHCANCEL: - /* FIXME: Touch events */ - break; - - case PP_INPUTEVENT_TYPE_KEYDOWN: - SDL_SendKeyboardKey(SDL_PRESSED, SDL_NACL_translate_keycode(driverdata->ppb_keyboard_input_event->GetKeyCode(event))); - break; - - case PP_INPUTEVENT_TYPE_KEYUP: - SDL_SendKeyboardKey(SDL_RELEASED, SDL_NACL_translate_keycode(driverdata->ppb_keyboard_input_event->GetKeyCode(event))); - break; - - case PP_INPUTEVENT_TYPE_CHAR: - var = driverdata->ppb_keyboard_input_event->GetCharacterText(event); - str = driverdata->ppb_var->VarToUtf8(var, &str_len); - /* str is not null terminated! */ - if ( str_len >= SDL_arraysize(text) ) { - str_len = SDL_arraysize(text) - 1; - } - SDL_strlcpy(text, str, str_len ); - text[str_len] = '\0'; - - SDL_SendKeyboardText(text); - /* FIXME: Do we have to handle ref counting? driverdata->ppb_var->Release(var);*/ - break; - - default: - break; - } - break; - - - /* From HandleMessage, contains a PP_Var. */ - case PSE_INSTANCE_HANDLEMESSAGE: - break; - - /* From DidChangeFocus, contains a PP_Bool with the current focus state. */ - case PSE_INSTANCE_DIDCHANGEFOCUS: - break; - - /* When the 3D context is lost, no resource. */ - case PSE_GRAPHICS3D_GRAPHICS3DCONTEXTLOST: - break; - - /* When the mouse lock is lost. */ - case PSE_MOUSELOCK_MOUSELOCKLOST: - break; - - default: - break; - } - - PSEventRelease(ps_event); - } - } -} - -#endif /* SDL_VIDEO_DRIVER_NACL */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/nacl/SDL_naclevents_c.h b/3rdparty/SDL2/src/video/nacl/SDL_naclevents_c.h deleted file mode 100644 index 3255578c320..00000000000 --- a/3rdparty/SDL2/src/video/nacl/SDL_naclevents_c.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_naclevents_c_h -#define _SDL_naclevents_c_h - -#include "SDL_naclvideo.h" - -extern void NACL_PumpEvents(_THIS); - -#endif /* _SDL_naclevents_c_h */ diff --git a/3rdparty/SDL2/src/video/nacl/SDL_naclglue.c b/3rdparty/SDL2/src/video/nacl/SDL_naclglue.c deleted file mode 100644 index 79f5b0f90b2..00000000000 --- a/3rdparty/SDL2/src/video/nacl/SDL_naclglue.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_NACL -#endif /* SDL_VIDEO_DRIVER_NACL */ diff --git a/3rdparty/SDL2/src/video/nacl/SDL_naclopengles.c b/3rdparty/SDL2/src/video/nacl/SDL_naclopengles.c deleted file mode 100644 index e11245135c8..00000000000 --- a/3rdparty/SDL2/src/video/nacl/SDL_naclopengles.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_NACL - -/* NaCl SDL video GLES 2 driver implementation */ - -#include "SDL_video.h" -#include "SDL_naclvideo.h" - -#if SDL_LOADSO_DLOPEN -#include "dlfcn.h" -#endif - -#include "ppapi/gles2/gl2ext_ppapi.h" -#include "ppapi_simple/ps.h" - -/* GL functions */ -int -NACL_GLES_LoadLibrary(_THIS, const char *path) -{ - /* FIXME: Support dynamic linking when PNACL supports it */ - return glInitializePPAPI(PSGetInterface) == 0; -} - -void * -NACL_GLES_GetProcAddress(_THIS, const char *proc) -{ -#if SDL_LOADSO_DLOPEN - return dlsym( 0 /* RTLD_DEFAULT */, proc); -#else - return NULL; -#endif -} - -void -NACL_GLES_UnloadLibrary(_THIS) -{ - /* FIXME: Support dynamic linking when PNACL supports it */ - glTerminatePPAPI(); -} - -int -NACL_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext sdl_context) -{ - SDL_VideoData *driverdata = (SDL_VideoData *) _this->driverdata; - /* FIXME: Check threading issues...otherwise use a hardcoded _this->context across all threads */ - driverdata->ppb_instance->BindGraphics(driverdata->instance, (PP_Resource) sdl_context); - glSetCurrentContextPPAPI((PP_Resource) sdl_context); - return 0; -} - -SDL_GLContext -NACL_GLES_CreateContext(_THIS, SDL_Window * window) -{ - SDL_VideoData *driverdata = (SDL_VideoData *) _this->driverdata; - PP_Resource context, share_context = 0; - /* 64 seems nice. */ - Sint32 attribs[64]; - int i = 0; - - if (_this->gl_config.share_with_current_context) { - share_context = (PP_Resource) SDL_GL_GetCurrentContext(); - } - - /* FIXME: Some ATTRIBS from PP_Graphics3DAttrib are not set here */ - - attribs[i++] = PP_GRAPHICS3DATTRIB_WIDTH; - attribs[i++] = window->w; - attribs[i++] = PP_GRAPHICS3DATTRIB_HEIGHT; - attribs[i++] = window->h; - attribs[i++] = PP_GRAPHICS3DATTRIB_RED_SIZE; - attribs[i++] = _this->gl_config.red_size; - attribs[i++] = PP_GRAPHICS3DATTRIB_GREEN_SIZE; - attribs[i++] = _this->gl_config.green_size; - attribs[i++] = PP_GRAPHICS3DATTRIB_BLUE_SIZE; - attribs[i++] = _this->gl_config.blue_size; - - if (_this->gl_config.alpha_size) { - attribs[i++] = PP_GRAPHICS3DATTRIB_ALPHA_SIZE; - attribs[i++] = _this->gl_config.alpha_size; - } - - /*if (_this->gl_config.buffer_size) { - attribs[i++] = EGL_BUFFER_SIZE; - attribs[i++] = _this->gl_config.buffer_size; - }*/ - - attribs[i++] = PP_GRAPHICS3DATTRIB_DEPTH_SIZE; - attribs[i++] = _this->gl_config.depth_size; - - if (_this->gl_config.stencil_size) { - attribs[i++] = PP_GRAPHICS3DATTRIB_STENCIL_SIZE; - attribs[i++] = _this->gl_config.stencil_size; - } - - if (_this->gl_config.multisamplebuffers) { - attribs[i++] = PP_GRAPHICS3DATTRIB_SAMPLE_BUFFERS; - attribs[i++] = _this->gl_config.multisamplebuffers; - } - - if (_this->gl_config.multisamplesamples) { - attribs[i++] = PP_GRAPHICS3DATTRIB_SAMPLES; - attribs[i++] = _this->gl_config.multisamplesamples; - } - - attribs[i++] = PP_GRAPHICS3DATTRIB_NONE; - - context = driverdata->ppb_graphics->Create(driverdata->instance, share_context, attribs); - - if (context) { - /* We need to make the context current, otherwise nothing works */ - SDL_GL_MakeCurrent(window, (SDL_GLContext) context); - } - - return (SDL_GLContext) context; -} - - - -int -NACL_GLES_SetSwapInterval(_THIS, int interval) -{ - /* STUB */ - return 0; -} - -int -NACL_GLES_GetSwapInterval(_THIS) -{ - /* STUB */ - return 0; -} - -void -NACL_GLES_SwapWindow(_THIS, SDL_Window * window) -{ - SDL_VideoData *driverdata = (SDL_VideoData *) _this->driverdata; - struct PP_CompletionCallback callback = { NULL, 0, PP_COMPLETIONCALLBACK_FLAG_NONE }; - driverdata->ppb_graphics->SwapBuffers((PP_Resource) SDL_GL_GetCurrentContext(), callback ); -} - -void -NACL_GLES_DeleteContext(_THIS, SDL_GLContext context) -{ - SDL_VideoData *driverdata = (SDL_VideoData *) _this->driverdata; - driverdata->ppb_core->ReleaseResource((PP_Resource) context); -} - -#endif /* SDL_VIDEO_DRIVER_NACL */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/nacl/SDL_naclopengles.h b/3rdparty/SDL2/src/video/nacl/SDL_naclopengles.h deleted file mode 100644 index 1845e81915d..00000000000 --- a/3rdparty/SDL2/src/video/nacl/SDL_naclopengles.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_naclgl_h -#define _SDL_naclgl_h - -extern int NACL_GLES_LoadLibrary(_THIS, const char *path); -extern void *NACL_GLES_GetProcAddress(_THIS, const char *proc); -extern void NACL_GLES_UnloadLibrary(_THIS); -extern SDL_GLContext NACL_GLES_CreateContext(_THIS, SDL_Window * window); -extern int NACL_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); -extern int NACL_GLES_SetSwapInterval(_THIS, int interval); -extern int NACL_GLES_GetSwapInterval(_THIS); -extern void NACL_GLES_SwapWindow(_THIS, SDL_Window * window); -extern void NACL_GLES_DeleteContext(_THIS, SDL_GLContext context); - -#endif /* _SDL_naclgl_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/nacl/SDL_naclvideo.c b/3rdparty/SDL2/src/video/nacl/SDL_naclvideo.c deleted file mode 100644 index 467155c67af..00000000000 --- a/3rdparty/SDL2/src/video/nacl/SDL_naclvideo.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_NACL - -#include "ppapi/c/pp_errors.h" -#include "ppapi/c/pp_instance.h" -#include "ppapi_simple/ps.h" -#include "ppapi_simple/ps_interface.h" -#include "ppapi_simple/ps_event.h" -#include "nacl_io/nacl_io.h" - -#include "SDL_naclvideo.h" -#include "SDL_naclwindow.h" -#include "SDL_naclevents_c.h" -#include "SDL_naclopengles.h" -#include "SDL_video.h" -#include "../SDL_sysvideo.h" -#include "../../events/SDL_events_c.h" - -#define NACLVID_DRIVER_NAME "nacl" - -/* Static init required because NACL_SetScreenResolution - * may appear even before SDL starts and we want to remember - * the window width and height - */ -static SDL_VideoData nacl = {0}; - -void -NACL_SetScreenResolution(int width, int height, Uint32 format) -{ - PP_Resource context; - - nacl.w = width; - nacl.h = height; - nacl.format = format; - - if (nacl.window) { - nacl.window->w = width; - nacl.window->h = height; - SDL_SendWindowEvent(nacl.window, SDL_WINDOWEVENT_RESIZED, width, height); - } - - /* FIXME: Check threading issues...otherwise use a hardcoded _this->context across all threads */ - context = (PP_Resource) SDL_GL_GetCurrentContext(); - if (context) { - PSInterfaceGraphics3D()->ResizeBuffers(context, width, height); - } - -} - - - -/* Initialization/Query functions */ -static int NACL_VideoInit(_THIS); -static void NACL_VideoQuit(_THIS); - -static int NACL_Available(void) { - return PSGetInstanceId() != 0; -} - -static void NACL_DeleteDevice(SDL_VideoDevice *device) { - SDL_VideoData *driverdata = (SDL_VideoData*) device->driverdata; - driverdata->ppb_core->ReleaseResource((PP_Resource) driverdata->ppb_message_loop); - SDL_free(device->driverdata); - SDL_free(device); -} - -static int -NACL_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - return 0; -} - -static SDL_VideoDevice *NACL_CreateDevice(int devindex) { - SDL_VideoDevice *device; - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (!device) { - SDL_OutOfMemory(); - return NULL; - } - device->driverdata = &nacl; - - /* Set the function pointers */ - device->VideoInit = NACL_VideoInit; - device->VideoQuit = NACL_VideoQuit; - device->PumpEvents = NACL_PumpEvents; - - device->CreateWindow = NACL_CreateWindow; - device->SetWindowTitle = NACL_SetWindowTitle; - device->DestroyWindow = NACL_DestroyWindow; - - device->SetDisplayMode = NACL_SetDisplayMode; - - device->free = NACL_DeleteDevice; - - /* GL pointers */ - device->GL_LoadLibrary = NACL_GLES_LoadLibrary; - device->GL_GetProcAddress = NACL_GLES_GetProcAddress; - device->GL_UnloadLibrary = NACL_GLES_UnloadLibrary; - device->GL_CreateContext = NACL_GLES_CreateContext; - device->GL_MakeCurrent = NACL_GLES_MakeCurrent; - device->GL_SetSwapInterval = NACL_GLES_SetSwapInterval; - device->GL_GetSwapInterval = NACL_GLES_GetSwapInterval; - device->GL_SwapWindow = NACL_GLES_SwapWindow; - device->GL_DeleteContext = NACL_GLES_DeleteContext; - - - return device; -} - -VideoBootStrap NACL_bootstrap = { - NACLVID_DRIVER_NAME, "SDL Native Client Video Driver", - NACL_Available, NACL_CreateDevice -}; - -int NACL_VideoInit(_THIS) { - SDL_VideoData *driverdata = (SDL_VideoData *) _this->driverdata; - SDL_DisplayMode mode; - - SDL_zero(mode); - mode.format = driverdata->format; - mode.w = driverdata->w; - mode.h = driverdata->h; - mode.refresh_rate = 0; - mode.driverdata = NULL; - if (SDL_AddBasicVideoDisplay(&mode) < 0) { - return -1; - } - - SDL_AddDisplayMode(&_this->displays[0], &mode); - - PSInterfaceInit(); - driverdata->instance = PSGetInstanceId(); - driverdata->ppb_graphics = PSInterfaceGraphics3D(); - driverdata->ppb_message_loop = PSInterfaceMessageLoop(); - driverdata->ppb_core = PSInterfaceCore(); - driverdata->ppb_fullscreen = PSInterfaceFullscreen(); - driverdata->ppb_instance = PSInterfaceInstance(); - driverdata->ppb_image_data = PSInterfaceImageData(); - driverdata->ppb_view = PSInterfaceView(); - driverdata->ppb_var = PSInterfaceVar(); - driverdata->ppb_input_event = (PPB_InputEvent*) PSGetInterface(PPB_INPUT_EVENT_INTERFACE); - driverdata->ppb_keyboard_input_event = (PPB_KeyboardInputEvent*) PSGetInterface(PPB_KEYBOARD_INPUT_EVENT_INTERFACE); - driverdata->ppb_mouse_input_event = (PPB_MouseInputEvent*) PSGetInterface(PPB_MOUSE_INPUT_EVENT_INTERFACE); - driverdata->ppb_wheel_input_event = (PPB_WheelInputEvent*) PSGetInterface(PPB_WHEEL_INPUT_EVENT_INTERFACE); - driverdata->ppb_touch_input_event = (PPB_TouchInputEvent*) PSGetInterface(PPB_TOUCH_INPUT_EVENT_INTERFACE); - - - driverdata->message_loop = driverdata->ppb_message_loop->Create(driverdata->instance); - - PSEventSetFilter(PSE_ALL); - - /* We're done! */ - return 0; -} - -void NACL_VideoQuit(_THIS) { -} - -#endif /* SDL_VIDEO_DRIVER_NACL */ -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/nacl/SDL_naclvideo.h b/3rdparty/SDL2/src/video/nacl/SDL_naclvideo.h deleted file mode 100644 index 174a6e77cee..00000000000 --- a/3rdparty/SDL2/src/video/nacl/SDL_naclvideo.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_naclvideo_h -#define _SDL_naclvideo_h - -#include "../SDL_sysvideo.h" -#include "ppapi_simple/ps_interface.h" -#include "ppapi/c/pp_input_event.h" - - -/* Hidden "this" pointer for the video functions */ -#define _THIS SDL_VideoDevice *_this - - -/* Private display data */ - -typedef struct SDL_VideoData { - Uint32 format; - int w, h; - SDL_Window *window; - - const PPB_Graphics3D *ppb_graphics; - const PPB_MessageLoop *ppb_message_loop; - const PPB_Core *ppb_core; - const PPB_Fullscreen *ppb_fullscreen; - const PPB_Instance *ppb_instance; - const PPB_ImageData *ppb_image_data; - const PPB_View *ppb_view; - const PPB_Var *ppb_var; - const PPB_InputEvent *ppb_input_event; - const PPB_KeyboardInputEvent *ppb_keyboard_input_event; - const PPB_MouseInputEvent *ppb_mouse_input_event; - const PPB_WheelInputEvent *ppb_wheel_input_event; - const PPB_TouchInputEvent *ppb_touch_input_event; - - PP_Resource message_loop; - PP_Instance instance; - - /* FIXME: Check threading issues...otherwise use a hardcoded _this->context across all threads */ - /* PP_Resource context; */ - -} SDL_VideoData; - -extern void NACL_SetScreenResolution(int width, int height, Uint32 format); - - -#endif /* _SDL_naclvideo_h */ diff --git a/3rdparty/SDL2/src/video/nacl/SDL_naclwindow.c b/3rdparty/SDL2/src/video/nacl/SDL_naclwindow.c deleted file mode 100644 index 32d1e6d7e87..00000000000 --- a/3rdparty/SDL2/src/video/nacl/SDL_naclwindow.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_NACL - -#include "../SDL_sysvideo.h" - -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_keyboard_c.h" -#include "SDL_naclvideo.h" -#include "SDL_naclwindow.h" - -int -NACL_CreateWindow(_THIS, SDL_Window * window) -{ - SDL_VideoData *driverdata = (SDL_VideoData *) _this->driverdata; - - if (driverdata->window) { - SDL_SetError("NaCl only supports one window"); - return -1; - } - driverdata->window = window; - - /* Adjust the window data to match the screen */ - window->x = 0; - window->y = 0; - window->w = driverdata->w; - window->h = driverdata->h; - - window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */ - window->flags |= SDL_WINDOW_FULLSCREEN; /* window is always fullscreen */ - window->flags &= ~SDL_WINDOW_HIDDEN; - window->flags |= SDL_WINDOW_SHOWN; /* only one window on NaCl */ - window->flags |= SDL_WINDOW_INPUT_FOCUS; /* always has input focus */ - window->flags |= SDL_WINDOW_OPENGL; - - SDL_SetMouseFocus(window); - SDL_SetKeyboardFocus(window); - - return 0; -} - -void -NACL_SetWindowTitle(_THIS, SDL_Window * window) -{ - /* TODO */ -} - -void -NACL_DestroyWindow(_THIS, SDL_Window * window) -{ - SDL_VideoData *driverdata = (SDL_VideoData *) _this->driverdata; - if (window == driverdata->window) { - driverdata->window = NULL; - } -} - -#endif /* SDL_VIDEO_DRIVER_NACL */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/nacl/SDL_naclwindow.h b/3rdparty/SDL2/src/video/nacl/SDL_naclwindow.h deleted file mode 100644 index 617bfc3abb7..00000000000 --- a/3rdparty/SDL2/src/video/nacl/SDL_naclwindow.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_naclwindow_h -#define _SDL_naclwindow_h - -extern int NACL_CreateWindow(_THIS, SDL_Window * window); -extern void NACL_SetWindowTitle(_THIS, SDL_Window * window); -extern void NACL_DestroyWindow(_THIS, SDL_Window * window); - -#endif /* _SDL_naclwindow_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/pandora/SDL_pandora.c b/3rdparty/SDL2/src/video/pandora/SDL_pandora.c deleted file mode 100644 index 7afa54306f1..00000000000 --- a/3rdparty/SDL2/src/video/pandora/SDL_pandora.c +++ /dev/null @@ -1,834 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_PANDORA - -/* SDL internals */ -#include "../SDL_sysvideo.h" -#include "SDL_version.h" -#include "SDL_syswm.h" -#include "SDL_loadso.h" -#include "SDL_events.h" -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_keyboard_c.h" - -/* PND declarations */ -#include "SDL_pandora.h" -#include "SDL_pandora_events.h" - -/* WIZ declarations */ -#include "GLES/gl.h" -#ifdef WIZ_GLES_LITE -static NativeWindowType hNativeWnd = 0; /* A handle to the window we will create. */ -#endif - -static int -PND_available(void) -{ - return 1; -} - -static void -PND_destroy(SDL_VideoDevice * device) -{ - if (device->driverdata != NULL) { - SDL_free(device->driverdata); - device->driverdata = NULL; - } - SDL_free(device); -} - -static SDL_VideoDevice * -PND_create() -{ - SDL_VideoDevice *device; - SDL_VideoData *phdata; - int status; - - /* Check if pandora could be initialized */ - status = PND_available(); - if (status == 0) { - /* PND could not be used */ - return NULL; - } - - /* Initialize SDL_VideoDevice structure */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (device == NULL) { - SDL_OutOfMemory(); - return NULL; - } - - /* Initialize internal Pandora specific data */ - phdata = (SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); - if (phdata == NULL) { - SDL_OutOfMemory(); - SDL_free(device); - return NULL; - } - - device->driverdata = phdata; - - phdata->egl_initialized = SDL_TRUE; - - - /* Setup amount of available displays */ - device->num_displays = 0; - - /* Set device free function */ - device->free = PND_destroy; - - /* Setup all functions which we can handle */ - device->VideoInit = PND_videoinit; - device->VideoQuit = PND_videoquit; - device->GetDisplayModes = PND_getdisplaymodes; - device->SetDisplayMode = PND_setdisplaymode; - device->CreateWindow = PND_createwindow; - device->CreateWindowFrom = PND_createwindowfrom; - device->SetWindowTitle = PND_setwindowtitle; - device->SetWindowIcon = PND_setwindowicon; - device->SetWindowPosition = PND_setwindowposition; - device->SetWindowSize = PND_setwindowsize; - device->ShowWindow = PND_showwindow; - device->HideWindow = PND_hidewindow; - device->RaiseWindow = PND_raisewindow; - device->MaximizeWindow = PND_maximizewindow; - device->MinimizeWindow = PND_minimizewindow; - device->RestoreWindow = PND_restorewindow; - device->SetWindowGrab = PND_setwindowgrab; - device->DestroyWindow = PND_destroywindow; - device->GetWindowWMInfo = PND_getwindowwminfo; - device->GL_LoadLibrary = PND_gl_loadlibrary; - device->GL_GetProcAddress = PND_gl_getprocaddres; - device->GL_UnloadLibrary = PND_gl_unloadlibrary; - device->GL_CreateContext = PND_gl_createcontext; - device->GL_MakeCurrent = PND_gl_makecurrent; - device->GL_SetSwapInterval = PND_gl_setswapinterval; - device->GL_GetSwapInterval = PND_gl_getswapinterval; - device->GL_SwapWindow = PND_gl_swapwindow; - device->GL_DeleteContext = PND_gl_deletecontext; - device->PumpEvents = PND_PumpEvents; - - /* !!! FIXME: implement SetWindowBordered */ - - return device; -} - -VideoBootStrap PND_bootstrap = { -#ifdef WIZ_GLES_LITE - "wiz", - "SDL Wiz Video Driver", -#else - "pandora", - "SDL Pandora Video Driver", -#endif - PND_available, - PND_create -}; - -/*****************************************************************************/ -/* SDL Video and Display initialization/handling functions */ -/*****************************************************************************/ -int -PND_videoinit(_THIS) -{ - SDL_VideoDisplay display; - SDL_DisplayMode current_mode; - - SDL_zero(current_mode); -#ifdef WIZ_GLES_LITE - current_mode.w = 320; - current_mode.h = 240; -#else - current_mode.w = 800; - current_mode.h = 480; -#endif - current_mode.refresh_rate = 60; - current_mode.format = SDL_PIXELFORMAT_RGB565; - current_mode.driverdata = NULL; - - SDL_zero(display); - display.desktop_mode = current_mode; - display.current_mode = current_mode; - display.driverdata = NULL; - - SDL_AddVideoDisplay(&display); - - return 1; -} - -void -PND_videoquit(_THIS) -{ - -} - -void -PND_getdisplaymodes(_THIS, SDL_VideoDisplay * display) -{ - -} - -int -PND_setdisplaymode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - return 0; -} - -int -PND_createwindow(_THIS, SDL_Window * window) -{ - SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; - - SDL_WindowData *wdata; - - /* Allocate window internal data */ - wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); - if (wdata == NULL) { - return SDL_OutOfMemory(); - } - - /* Setup driver data for this window */ - window->driverdata = wdata; - - /* Check if window must support OpenGL ES rendering */ - if ((window->flags & SDL_WINDOW_OPENGL) == SDL_WINDOW_OPENGL) { - - EGLBoolean initstatus; - - /* Mark this window as OpenGL ES compatible */ - wdata->uses_gles = SDL_TRUE; - - /* Create connection to OpenGL ES */ - if (phdata->egl_display == EGL_NO_DISPLAY) { - phdata->egl_display = eglGetDisplay((NativeDisplayType) 0); - if (phdata->egl_display == EGL_NO_DISPLAY) { - return SDL_SetError("PND: Can't get connection to OpenGL ES"); - } - - initstatus = eglInitialize(phdata->egl_display, NULL, NULL); - if (initstatus != EGL_TRUE) { - return SDL_SetError("PND: Can't init OpenGL ES library"); - } - } - - phdata->egl_refcount++; - } - - /* Window has been successfully created */ - return 0; -} - -int -PND_createwindowfrom(_THIS, SDL_Window * window, const void *data) -{ - return -1; -} - -void -PND_setwindowtitle(_THIS, SDL_Window * window) -{ -} -void -PND_setwindowicon(_THIS, SDL_Window * window, SDL_Surface * icon) -{ -} -void -PND_setwindowposition(_THIS, SDL_Window * window) -{ -} -void -PND_setwindowsize(_THIS, SDL_Window * window) -{ -} -void -PND_showwindow(_THIS, SDL_Window * window) -{ -} -void -PND_hidewindow(_THIS, SDL_Window * window) -{ -} -void -PND_raisewindow(_THIS, SDL_Window * window) -{ -} -void -PND_maximizewindow(_THIS, SDL_Window * window) -{ -} -void -PND_minimizewindow(_THIS, SDL_Window * window) -{ -} -void -PND_restorewindow(_THIS, SDL_Window * window) -{ -} -void -PND_setwindowgrab(_THIS, SDL_Window * window, SDL_bool grabbed) -{ -} -void -PND_destroywindow(_THIS, SDL_Window * window) -{ - SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; - eglTerminate(phdata->egl_display); -} - -/*****************************************************************************/ -/* SDL Window Manager function */ -/*****************************************************************************/ -SDL_bool -PND_getwindowwminfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info) -{ - if (info->version.major <= SDL_MAJOR_VERSION) { - return SDL_TRUE; - } else { - SDL_SetError("application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } - - /* Failed to get window manager information */ - return SDL_FALSE; -} - -/*****************************************************************************/ -/* SDL OpenGL/OpenGL ES functions */ -/*****************************************************************************/ -int -PND_gl_loadlibrary(_THIS, const char *path) -{ - /* Check if OpenGL ES library is specified for GF driver */ - if (path == NULL) { - path = SDL_getenv("SDL_OPENGL_LIBRARY"); - if (path == NULL) { - path = SDL_getenv("SDL_OPENGLES_LIBRARY"); - } - } - - /* Check if default library loading requested */ - if (path == NULL) { - /* Already linked with GF library which provides egl* subset of */ - /* functions, use Common profile of OpenGL ES library by default */ -#ifdef WIZ_GLES_LITE - path = "/lib/libopengles_lite.so"; -#else - path = "/usr/lib/libGLES_CM.so"; -#endif - } - - /* Load dynamic library */ - _this->gl_config.dll_handle = SDL_LoadObject(path); - if (!_this->gl_config.dll_handle) { - /* Failed to load new GL ES library */ - return SDL_SetError("PND: Failed to locate OpenGL ES library"); - } - - /* Store OpenGL ES library path and name */ - SDL_strlcpy(_this->gl_config.driver_path, path, - SDL_arraysize(_this->gl_config.driver_path)); - - /* New OpenGL ES library is loaded */ - return 0; -} - -void * -PND_gl_getprocaddres(_THIS, const char *proc) -{ - void *function_address; - - /* Try to get function address through the egl interface */ - function_address = eglGetProcAddress(proc); - if (function_address != NULL) { - return function_address; - } - - /* Then try to get function in the OpenGL ES library */ - if (_this->gl_config.dll_handle) { - function_address = - SDL_LoadFunction(_this->gl_config.dll_handle, proc); - if (function_address != NULL) { - return function_address; - } - } - - /* Failed to get GL ES function address pointer */ - SDL_SetError("PND: Cannot locate OpenGL ES function name"); - return NULL; -} - -void -PND_gl_unloadlibrary(_THIS) -{ - SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; - - if (phdata->egl_initialized == SDL_TRUE) { - /* Unload OpenGL ES library */ - if (_this->gl_config.dll_handle) { - SDL_UnloadObject(_this->gl_config.dll_handle); - _this->gl_config.dll_handle = NULL; - } - } else { - SDL_SetError("PND: GF initialization failed, no OpenGL ES support"); - } -} - -SDL_GLContext -PND_gl_createcontext(_THIS, SDL_Window * window) -{ - SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; - SDL_WindowData *wdata = (SDL_WindowData *) window->driverdata; - EGLBoolean status; - EGLint configs; - uint32_t attr_pos; - EGLint attr_value; - EGLint cit; - - /* Check if EGL was initialized */ - if (phdata->egl_initialized != SDL_TRUE) { - SDL_SetError("PND: EGL initialization failed, no OpenGL ES support"); - return NULL; - } - - /* Prepare attributes list to pass them to OpenGL ES */ - attr_pos = 0; - wdata->gles_attributes[attr_pos++] = EGL_SURFACE_TYPE; - wdata->gles_attributes[attr_pos++] = EGL_WINDOW_BIT; - wdata->gles_attributes[attr_pos++] = EGL_RED_SIZE; - wdata->gles_attributes[attr_pos++] = _this->gl_config.red_size; - wdata->gles_attributes[attr_pos++] = EGL_GREEN_SIZE; - wdata->gles_attributes[attr_pos++] = _this->gl_config.green_size; - wdata->gles_attributes[attr_pos++] = EGL_BLUE_SIZE; - wdata->gles_attributes[attr_pos++] = _this->gl_config.blue_size; - wdata->gles_attributes[attr_pos++] = EGL_ALPHA_SIZE; - - /* Setup alpha size in bits */ - if (_this->gl_config.alpha_size) { - wdata->gles_attributes[attr_pos++] = _this->gl_config.alpha_size; - } else { - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - } - - /* Setup color buffer size */ - if (_this->gl_config.buffer_size) { - wdata->gles_attributes[attr_pos++] = EGL_BUFFER_SIZE; - wdata->gles_attributes[attr_pos++] = _this->gl_config.buffer_size; - } else { - wdata->gles_attributes[attr_pos++] = EGL_BUFFER_SIZE; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - } - - /* Setup depth buffer bits */ - wdata->gles_attributes[attr_pos++] = EGL_DEPTH_SIZE; - wdata->gles_attributes[attr_pos++] = _this->gl_config.depth_size; - - /* Setup stencil bits */ - if (_this->gl_config.stencil_size) { - wdata->gles_attributes[attr_pos++] = EGL_STENCIL_SIZE; - wdata->gles_attributes[attr_pos++] = _this->gl_config.buffer_size; - } else { - wdata->gles_attributes[attr_pos++] = EGL_STENCIL_SIZE; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - } - - /* Set number of samples in multisampling */ - if (_this->gl_config.multisamplesamples) { - wdata->gles_attributes[attr_pos++] = EGL_SAMPLES; - wdata->gles_attributes[attr_pos++] = - _this->gl_config.multisamplesamples; - } - - /* Multisample buffers, OpenGL ES 1.0 spec defines 0 or 1 buffer */ - if (_this->gl_config.multisamplebuffers) { - wdata->gles_attributes[attr_pos++] = EGL_SAMPLE_BUFFERS; - wdata->gles_attributes[attr_pos++] = - _this->gl_config.multisamplebuffers; - } - - /* Finish attributes list */ - wdata->gles_attributes[attr_pos] = EGL_NONE; - - /* Request first suitable framebuffer configuration */ - status = eglChooseConfig(phdata->egl_display, wdata->gles_attributes, - wdata->gles_configs, 1, &configs); - if (status != EGL_TRUE) { - SDL_SetError("PND: Can't find closest configuration for OpenGL ES"); - return NULL; - } - - /* Check if nothing has been found, try "don't care" settings */ - if (configs == 0) { - int32_t it; - int32_t jt; - GLint depthbits[4] = { 32, 24, 16, EGL_DONT_CARE }; - - for (it = 0; it < 4; it++) { - for (jt = 16; jt >= 0; jt--) { - /* Don't care about color buffer bits, use what exist */ - /* Replace previous set data with EGL_DONT_CARE */ - attr_pos = 0; - wdata->gles_attributes[attr_pos++] = EGL_SURFACE_TYPE; - wdata->gles_attributes[attr_pos++] = EGL_WINDOW_BIT; - wdata->gles_attributes[attr_pos++] = EGL_RED_SIZE; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - wdata->gles_attributes[attr_pos++] = EGL_GREEN_SIZE; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - wdata->gles_attributes[attr_pos++] = EGL_BLUE_SIZE; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - wdata->gles_attributes[attr_pos++] = EGL_ALPHA_SIZE; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - wdata->gles_attributes[attr_pos++] = EGL_BUFFER_SIZE; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - - /* Try to find requested or smallest depth */ - if (_this->gl_config.depth_size) { - wdata->gles_attributes[attr_pos++] = EGL_DEPTH_SIZE; - wdata->gles_attributes[attr_pos++] = depthbits[it]; - } else { - wdata->gles_attributes[attr_pos++] = EGL_DEPTH_SIZE; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - } - - if (_this->gl_config.stencil_size) { - wdata->gles_attributes[attr_pos++] = EGL_STENCIL_SIZE; - wdata->gles_attributes[attr_pos++] = jt; - } else { - wdata->gles_attributes[attr_pos++] = EGL_STENCIL_SIZE; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - } - - wdata->gles_attributes[attr_pos++] = EGL_SAMPLES; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - wdata->gles_attributes[attr_pos++] = EGL_SAMPLE_BUFFERS; - wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE; - wdata->gles_attributes[attr_pos] = EGL_NONE; - - /* Request first suitable framebuffer configuration */ - status = - eglChooseConfig(phdata->egl_display, - wdata->gles_attributes, - wdata->gles_configs, 1, &configs); - - if (status != EGL_TRUE) { - SDL_SetError - ("PND: Can't find closest configuration for OpenGL ES"); - return NULL; - } - if (configs != 0) { - break; - } - } - if (configs != 0) { - break; - } - } - - /* No available configs */ - if (configs == 0) { - SDL_SetError("PND: Can't find any configuration for OpenGL ES"); - return NULL; - } - } - - /* Initialize config index */ - wdata->gles_config = 0; - - /* Now check each configuration to find out the best */ - for (cit = 0; cit < configs; cit++) { - uint32_t stencil_found; - uint32_t depth_found; - - stencil_found = 0; - depth_found = 0; - - if (_this->gl_config.stencil_size) { - status = - eglGetConfigAttrib(phdata->egl_display, - wdata->gles_configs[cit], EGL_STENCIL_SIZE, - &attr_value); - if (status == EGL_TRUE) { - if (attr_value != 0) { - stencil_found = 1; - } - } - } else { - stencil_found = 1; - } - - if (_this->gl_config.depth_size) { - status = - eglGetConfigAttrib(phdata->egl_display, - wdata->gles_configs[cit], EGL_DEPTH_SIZE, - &attr_value); - if (status == EGL_TRUE) { - if (attr_value != 0) { - depth_found = 1; - } - } - } else { - depth_found = 1; - } - - /* Exit from loop if found appropriate configuration */ - if ((depth_found != 0) && (stencil_found != 0)) { - break; - } - } - - /* If best could not be found, use first */ - if (cit == configs) { - cit = 0; - } - wdata->gles_config = cit; - - /* Create OpenGL ES context */ - wdata->gles_context = - eglCreateContext(phdata->egl_display, - wdata->gles_configs[wdata->gles_config], NULL, NULL); - if (wdata->gles_context == EGL_NO_CONTEXT) { - SDL_SetError("PND: OpenGL ES context creation has been failed"); - return NULL; - } - -#ifdef WIZ_GLES_LITE - if( !hNativeWnd ) { - hNativeWnd = (NativeWindowType)malloc(16*1024); - - if(!hNativeWnd) - printf( "Error: Wiz framebuffer allocatation failed\n" ); - else - printf( "SDL: Wiz framebuffer allocated: %X\n", hNativeWnd ); - } - else { - printf( "SDL: Wiz framebuffer already allocated: %X\n", hNativeWnd ); - } - - wdata->gles_surface = - eglCreateWindowSurface(phdata->egl_display, - wdata->gles_configs[wdata->gles_config], - hNativeWnd, NULL ); -#else - wdata->gles_surface = - eglCreateWindowSurface(phdata->egl_display, - wdata->gles_configs[wdata->gles_config], - (NativeWindowType) 0, NULL); -#endif - - - if (wdata->gles_surface == 0) { - SDL_SetError("Error : eglCreateWindowSurface failed;\n"); - return NULL; - } - - /* Make just created context current */ - status = - eglMakeCurrent(phdata->egl_display, wdata->gles_surface, - wdata->gles_surface, wdata->gles_context); - if (status != EGL_TRUE) { - /* Destroy OpenGL ES surface */ - eglDestroySurface(phdata->egl_display, wdata->gles_surface); - eglDestroyContext(phdata->egl_display, wdata->gles_context); - wdata->gles_context = EGL_NO_CONTEXT; - SDL_SetError("PND: Can't set OpenGL ES context on creation"); - return NULL; - } - - _this->gl_config.accelerated = 1; - - /* Always clear stereo enable, since OpenGL ES do not supports stereo */ - _this->gl_config.stereo = 0; - - /* Get back samples and samplebuffers configurations. Rest framebuffer */ - /* parameters could be obtained through the OpenGL ES API */ - status = - eglGetConfigAttrib(phdata->egl_display, - wdata->gles_configs[wdata->gles_config], - EGL_SAMPLES, &attr_value); - if (status == EGL_TRUE) { - _this->gl_config.multisamplesamples = attr_value; - } - status = - eglGetConfigAttrib(phdata->egl_display, - wdata->gles_configs[wdata->gles_config], - EGL_SAMPLE_BUFFERS, &attr_value); - if (status == EGL_TRUE) { - _this->gl_config.multisamplebuffers = attr_value; - } - - /* Get back stencil and depth buffer sizes */ - status = - eglGetConfigAttrib(phdata->egl_display, - wdata->gles_configs[wdata->gles_config], - EGL_DEPTH_SIZE, &attr_value); - if (status == EGL_TRUE) { - _this->gl_config.depth_size = attr_value; - } - status = - eglGetConfigAttrib(phdata->egl_display, - wdata->gles_configs[wdata->gles_config], - EGL_STENCIL_SIZE, &attr_value); - if (status == EGL_TRUE) { - _this->gl_config.stencil_size = attr_value; - } - - /* Under PND OpenGL ES output can't be double buffered */ - _this->gl_config.double_buffer = 0; - - /* GL ES context was successfully created */ - return wdata->gles_context; -} - -int -PND_gl_makecurrent(_THIS, SDL_Window * window, SDL_GLContext context) -{ - SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; - SDL_WindowData *wdata; - EGLBoolean status; - - if (phdata->egl_initialized != SDL_TRUE) { - return SDL_SetError("PND: GF initialization failed, no OpenGL ES support"); - } - - if ((window == NULL) && (context == NULL)) { - status = - eglMakeCurrent(phdata->egl_display, EGL_NO_SURFACE, - EGL_NO_SURFACE, EGL_NO_CONTEXT); - if (status != EGL_TRUE) { - /* Failed to set current GL ES context */ - return SDL_SetError("PND: Can't set OpenGL ES context"); - } - } else { - wdata = (SDL_WindowData *) window->driverdata; - if (wdata->gles_surface == EGL_NO_SURFACE) { - return SDL_SetError - ("PND: OpenGL ES surface is not initialized for this window"); - } - if (wdata->gles_context == EGL_NO_CONTEXT) { - return SDL_SetError - ("PND: OpenGL ES context is not initialized for this window"); - } - if (wdata->gles_context != context) { - return SDL_SetError - ("PND: OpenGL ES context is not belong to this window"); - } - status = - eglMakeCurrent(phdata->egl_display, wdata->gles_surface, - wdata->gles_surface, wdata->gles_context); - if (status != EGL_TRUE) { - /* Failed to set current GL ES context */ - return SDL_SetError("PND: Can't set OpenGL ES context"); - } - } - return 0; -} - -int -PND_gl_setswapinterval(_THIS, int interval) -{ - SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; - EGLBoolean status; - - if (phdata->egl_initialized != SDL_TRUE) { - return SDL_SetError("PND: EGL initialization failed, no OpenGL ES support"); - } - - /* Check if OpenGL ES connection has been initialized */ - if (phdata->egl_display != EGL_NO_DISPLAY) { - /* Set swap OpenGL ES interval */ - status = eglSwapInterval(phdata->egl_display, interval); - if (status == EGL_TRUE) { - /* Return success to upper level */ - phdata->swapinterval = interval; - return 0; - } - } - - /* Failed to set swap interval */ - return SDL_SetError("PND: Cannot set swap interval"); -} - -int -PND_gl_getswapinterval(_THIS) -{ - return ((SDL_VideoData *) _this->driverdata)->swapinterval; -} - -void -PND_gl_swapwindow(_THIS, SDL_Window * window) -{ - SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; - SDL_WindowData *wdata = (SDL_WindowData *) window->driverdata; - - if (phdata->egl_initialized != SDL_TRUE) { - SDL_SetError("PND: GLES initialization failed, no OpenGL ES support"); - return; - } - - /* Many applications do not uses glFinish(), so we call it for them */ - glFinish(); - - /* Wait until OpenGL ES rendering is completed */ - eglWaitGL(); - - eglSwapBuffers(phdata->egl_display, wdata->gles_surface); -} - -void -PND_gl_deletecontext(_THIS, SDL_GLContext context) -{ - SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; - EGLBoolean status; - - if (phdata->egl_initialized != SDL_TRUE) { - SDL_SetError("PND: GLES initialization failed, no OpenGL ES support"); - return; - } - - /* Check if OpenGL ES connection has been initialized */ - if (phdata->egl_display != EGL_NO_DISPLAY) { - if (context != EGL_NO_CONTEXT) { - status = eglDestroyContext(phdata->egl_display, context); - if (status != EGL_TRUE) { - /* Error during OpenGL ES context destroying */ - SDL_SetError("PND: OpenGL ES context destroy error"); - return; - } - } - } - -#ifdef WIZ_GLES_LITE - if( hNativeWnd != 0 ) - { - free(hNativeWnd); - hNativeWnd = 0; - printf( "SDL: Wiz framebuffer released\n" ); - } -#endif - - return; -} - -#endif /* SDL_VIDEO_DRIVER_PANDORA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/pandora/SDL_pandora.h b/3rdparty/SDL2/src/video/pandora/SDL_pandora.h deleted file mode 100644 index 859b7ee5d05..00000000000 --- a/3rdparty/SDL2/src/video/pandora/SDL_pandora.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef __SDL_PANDORA_H__ -#define __SDL_PANDORA_H__ - -#include <GLES/egl.h> - -#include "../../SDL_internal.h" -#include "../SDL_sysvideo.h" - -typedef struct SDL_VideoData -{ - SDL_bool egl_initialized; /* OpenGL ES device initialization status */ - EGLDisplay egl_display; /* OpenGL ES display connection */ - uint32_t egl_refcount; /* OpenGL ES reference count */ - uint32_t swapinterval; /* OpenGL ES default swap interval */ - -} SDL_VideoData; - - -typedef struct SDL_DisplayData -{ - -} SDL_DisplayData; - - -typedef struct SDL_WindowData -{ - SDL_bool uses_gles; /* if true window must support OpenGL ES */ - - EGLConfig gles_configs[32]; - EGLint gles_config; /* OpenGL ES configuration index */ - EGLContext gles_context; /* OpenGL ES context */ - EGLint gles_attributes[256]; /* OpenGL ES attributes for context */ - EGLSurface gles_surface; /* OpenGL ES target rendering surface */ - -} SDL_WindowData; - - -/****************************************************************************/ -/* SDL_VideoDevice functions declaration */ -/****************************************************************************/ - -/* Display and window functions */ -int PND_videoinit(_THIS); -void PND_videoquit(_THIS); -void PND_getdisplaymodes(_THIS, SDL_VideoDisplay * display); -int PND_setdisplaymode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -int PND_createwindow(_THIS, SDL_Window * window); -int PND_createwindowfrom(_THIS, SDL_Window * window, const void *data); -void PND_setwindowtitle(_THIS, SDL_Window * window); -void PND_setwindowicon(_THIS, SDL_Window * window, SDL_Surface * icon); -void PND_setwindowposition(_THIS, SDL_Window * window); -void PND_setwindowsize(_THIS, SDL_Window * window); -void PND_showwindow(_THIS, SDL_Window * window); -void PND_hidewindow(_THIS, SDL_Window * window); -void PND_raisewindow(_THIS, SDL_Window * window); -void PND_maximizewindow(_THIS, SDL_Window * window); -void PND_minimizewindow(_THIS, SDL_Window * window); -void PND_restorewindow(_THIS, SDL_Window * window); -void PND_setwindowgrab(_THIS, SDL_Window * window, SDL_bool grabbed); -void PND_destroywindow(_THIS, SDL_Window * window); - -/* Window manager function */ -SDL_bool PND_getwindowwminfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo *info); - -/* OpenGL/OpenGL ES functions */ -int PND_gl_loadlibrary(_THIS, const char *path); -void *PND_gl_getprocaddres(_THIS, const char *proc); -void PND_gl_unloadlibrary(_THIS); -SDL_GLContext PND_gl_createcontext(_THIS, SDL_Window * window); -int PND_gl_makecurrent(_THIS, SDL_Window * window, SDL_GLContext context); -int PND_gl_setswapinterval(_THIS, int interval); -int PND_gl_getswapinterval(_THIS); -void PND_gl_swapwindow(_THIS, SDL_Window * window); -void PND_gl_deletecontext(_THIS, SDL_GLContext context); - - -#endif /* __SDL_PANDORA_H__ */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/pandora/SDL_pandora_events.c b/3rdparty/SDL2/src/video/pandora/SDL_pandora_events.c deleted file mode 100644 index d22d0c759bb..00000000000 --- a/3rdparty/SDL2/src/video/pandora/SDL_pandora_events.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_PANDORA - -/* Being a null driver, there's no event stream. We just define stubs for - most of the API. */ - -#include "../../events/SDL_events_c.h" - -void -PND_PumpEvents(_THIS) -{ - /* Not implemented. */ -} - -#endif /* SDL_VIDEO_DRIVER_PANDORA */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/pandora/SDL_pandora_events.h b/3rdparty/SDL2/src/video/pandora/SDL_pandora_events.h deleted file mode 100644 index e9f8d7cfa4c..00000000000 --- a/3rdparty/SDL2/src/video/pandora/SDL_pandora_events.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -extern void PND_PumpEvents(_THIS); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/psp/SDL_pspevents.c b/3rdparty/SDL2/src/video/psp/SDL_pspevents.c deleted file mode 100644 index 71267272d62..00000000000 --- a/3rdparty/SDL2/src/video/psp/SDL_pspevents.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_PSP - -/* Being a null driver, there's no event stream. We just define stubs for - most of the API. */ - -#include "SDL.h" -#include "../../events/SDL_sysevents.h" -#include "../../events/SDL_events_c.h" -#include "../../events/SDL_keyboard_c.h" -#include "SDL_pspvideo.h" -#include "SDL_pspevents_c.h" -#include "SDL_keyboard.h" -#include "../../thread/SDL_systhread.h" -#include <psphprm.h> - -#ifdef PSPIRKEYB -#include <pspirkeyb.h> -#include <pspirkeyb_rawkeys.h> - -#define IRKBD_CONFIG_FILE NULL /* this will take ms0:/seplugins/pspirkeyb.ini */ - -static int irkbd_ready = 0; -static SDL_Keycode keymap[256]; -#endif - -static enum PspHprmKeys hprm = 0; -static SDL_sem *event_sem = NULL; -static SDL_Thread *thread = NULL; -static int running = 0; -static struct { - enum PspHprmKeys id; - SDL_Keycode sym; -} keymap_psp[] = { - { PSP_HPRM_PLAYPAUSE, SDLK_F10 }, - { PSP_HPRM_FORWARD, SDLK_F11 }, - { PSP_HPRM_BACK, SDLK_F12 }, - { PSP_HPRM_VOL_UP, SDLK_F13 }, - { PSP_HPRM_VOL_DOWN, SDLK_F14 }, - { PSP_HPRM_HOLD, SDLK_F15 } -}; - -int EventUpdate(void *data) -{ - while (running) { - SDL_SemWait(event_sem); - sceHprmPeekCurrentKey(&hprm); - SDL_SemPost(event_sem); - /* Delay 1/60th of a second */ - sceKernelDelayThread(1000000 / 60); - } - return 0; -} - -void PSP_PumpEvents(_THIS) -{ - int i; - enum PspHprmKeys keys; - enum PspHprmKeys changed; - static enum PspHprmKeys old_keys = 0; - SDL_Keysym sym; - - SDL_SemWait(event_sem); - keys = hprm; - SDL_SemPost(event_sem); - - /* HPRM Keyboard */ - changed = old_keys ^ keys; - old_keys = keys; - if(changed) { - for(i=0; i<sizeof(keymap_psp)/sizeof(keymap_psp[0]); i++) { - if(changed & keymap_psp[i].id) { - sym.scancode = keymap_psp[i].id; - sym.sym = keymap_psp[i].sym; - - /* out of date - SDL_PrivateKeyboard((keys & keymap_psp[i].id) ? - SDL_PRESSED : SDL_RELEASED, - &sym); - */ - SDL_SendKeyboardKey((keys & keymap_psp[i].id) ? - SDL_PRESSED : SDL_RELEASED, SDL_GetScancodeFromKey(keymap_psp[i].sym)); - } - } - } - -#ifdef PSPIRKEYB - if (irkbd_ready) { - unsigned char buffer[255]; - int i, length, count; - SIrKeybScanCodeData *scanData; - - if(pspIrKeybReadinput(buffer, &length) >= 0) { - if((length % sizeof(SIrKeybScanCodeData)) == 0){ - count = length / sizeof(SIrKeybScanCodeData); - for( i=0; i < count; i++ ) { - unsigned char raw, pressed; - scanData=(SIrKeybScanCodeData*) buffer+i; - raw = scanData->raw; - pressed = scanData->pressed; - sym.scancode = raw; - sym.sym = keymap[raw]; - /* not tested */ - /* SDL_PrivateKeyboard(pressed?SDL_PRESSED:SDL_RELEASED, &sym); */ - SDL_SendKeyboardKey((keys & keymap_psp[i].id) ? - SDL_PRESSED : SDL_RELEASED, SDL_GetScancodeFromKey(keymap[raw])); - - } - } - } - } -#endif - sceKernelDelayThread(0); - - return; -} - -void PSP_InitOSKeymap(_THIS) -{ -#ifdef PSPIRKEYB - int i; - for (i=0; i<SDL_TABLESIZE(keymap); ++i) - keymap[i] = SDLK_UNKNOWN; - - keymap[KEY_ESC] = SDLK_ESCAPE; - - keymap[KEY_F1] = SDLK_F1; - keymap[KEY_F2] = SDLK_F2; - keymap[KEY_F3] = SDLK_F3; - keymap[KEY_F4] = SDLK_F4; - keymap[KEY_F5] = SDLK_F5; - keymap[KEY_F6] = SDLK_F6; - keymap[KEY_F7] = SDLK_F7; - keymap[KEY_F8] = SDLK_F8; - keymap[KEY_F9] = SDLK_F9; - keymap[KEY_F10] = SDLK_F10; - keymap[KEY_F11] = SDLK_F11; - keymap[KEY_F12] = SDLK_F12; - keymap[KEY_F13] = SDLK_PRINT; - keymap[KEY_F14] = SDLK_PAUSE; - - keymap[KEY_GRAVE] = SDLK_BACKQUOTE; - keymap[KEY_1] = SDLK_1; - keymap[KEY_2] = SDLK_2; - keymap[KEY_3] = SDLK_3; - keymap[KEY_4] = SDLK_4; - keymap[KEY_5] = SDLK_5; - keymap[KEY_6] = SDLK_6; - keymap[KEY_7] = SDLK_7; - keymap[KEY_8] = SDLK_8; - keymap[KEY_9] = SDLK_9; - keymap[KEY_0] = SDLK_0; - keymap[KEY_MINUS] = SDLK_MINUS; - keymap[KEY_EQUAL] = SDLK_EQUALS; - keymap[KEY_BACKSPACE] = SDLK_BACKSPACE; - - keymap[KEY_TAB] = SDLK_TAB; - keymap[KEY_Q] = SDLK_q; - keymap[KEY_W] = SDLK_w; - keymap[KEY_E] = SDLK_e; - keymap[KEY_R] = SDLK_r; - keymap[KEY_T] = SDLK_t; - keymap[KEY_Y] = SDLK_y; - keymap[KEY_U] = SDLK_u; - keymap[KEY_I] = SDLK_i; - keymap[KEY_O] = SDLK_o; - keymap[KEY_P] = SDLK_p; - keymap[KEY_LEFTBRACE] = SDLK_LEFTBRACKET; - keymap[KEY_RIGHTBRACE] = SDLK_RIGHTBRACKET; - keymap[KEY_ENTER] = SDLK_RETURN; - - keymap[KEY_CAPSLOCK] = SDLK_CAPSLOCK; - keymap[KEY_A] = SDLK_a; - keymap[KEY_S] = SDLK_s; - keymap[KEY_D] = SDLK_d; - keymap[KEY_F] = SDLK_f; - keymap[KEY_G] = SDLK_g; - keymap[KEY_H] = SDLK_h; - keymap[KEY_J] = SDLK_j; - keymap[KEY_K] = SDLK_k; - keymap[KEY_L] = SDLK_l; - keymap[KEY_SEMICOLON] = SDLK_SEMICOLON; - keymap[KEY_APOSTROPHE] = SDLK_QUOTE; - keymap[KEY_BACKSLASH] = SDLK_BACKSLASH; - - keymap[KEY_Z] = SDLK_z; - keymap[KEY_X] = SDLK_x; - keymap[KEY_C] = SDLK_c; - keymap[KEY_V] = SDLK_v; - keymap[KEY_B] = SDLK_b; - keymap[KEY_N] = SDLK_n; - keymap[KEY_M] = SDLK_m; - keymap[KEY_COMMA] = SDLK_COMMA; - keymap[KEY_DOT] = SDLK_PERIOD; - keymap[KEY_SLASH] = SDLK_SLASH; - - keymap[KEY_SPACE] = SDLK_SPACE; - - keymap[KEY_UP] = SDLK_UP; - keymap[KEY_DOWN] = SDLK_DOWN; - keymap[KEY_LEFT] = SDLK_LEFT; - keymap[KEY_RIGHT] = SDLK_RIGHT; - - keymap[KEY_HOME] = SDLK_HOME; - keymap[KEY_END] = SDLK_END; - keymap[KEY_INSERT] = SDLK_INSERT; - keymap[KEY_DELETE] = SDLK_DELETE; - - keymap[KEY_NUMLOCK] = SDLK_NUMLOCK; - keymap[KEY_LEFTMETA] = SDLK_LSUPER; - - keymap[KEY_KPSLASH] = SDLK_KP_DIVIDE; - keymap[KEY_KPASTERISK] = SDLK_KP_MULTIPLY; - keymap[KEY_KPMINUS] = SDLK_KP_MINUS; - keymap[KEY_KPPLUS] = SDLK_KP_PLUS; - keymap[KEY_KPDOT] = SDLK_KP_PERIOD; - keymap[KEY_KPEQUAL] = SDLK_KP_EQUALS; - - keymap[KEY_LEFTCTRL] = SDLK_LCTRL; - keymap[KEY_RIGHTCTRL] = SDLK_RCTRL; - keymap[KEY_LEFTALT] = SDLK_LALT; - keymap[KEY_RIGHTALT] = SDLK_RALT; - keymap[KEY_LEFTSHIFT] = SDLK_LSHIFT; - keymap[KEY_RIGHTSHIFT] = SDLK_RSHIFT; -#endif -} - -void PSP_EventInit(_THIS) -{ -#ifdef PSPIRKEYB - int outputmode = PSP_IRKBD_OUTPUT_MODE_SCANCODE; - int ret = pspIrKeybInit(IRKBD_CONFIG_FILE, 0); - if (ret == PSP_IRKBD_RESULT_OK) { - pspIrKeybOutputMode(outputmode); - irkbd_ready = 1; - } else { - irkbd_ready = 0; - } -#endif - /* Start thread to read data */ - if((event_sem = SDL_CreateSemaphore(1)) == NULL) { - SDL_SetError("Can't create input semaphore\n"); - return; - } - running = 1; - if((thread = SDL_CreateThreadInternal(EventUpdate, "PSPInputThread", 4096, NULL)) == NULL) { - SDL_SetError("Can't create input thread\n"); - return; - } -} - -void PSP_EventQuit(_THIS) -{ - running = 0; - SDL_WaitThread(thread, NULL); - SDL_DestroySemaphore(event_sem); -#ifdef PSPIRKEYB - if (irkbd_ready) { - pspIrKeybFinish(); - irkbd_ready = 0; - } -#endif -} - -/* end of SDL_pspevents.c ... */ - -#endif /* SDL_VIDEO_DRIVER_PSP */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/psp/SDL_pspevents_c.h b/3rdparty/SDL2/src/video/psp/SDL_pspevents_c.h deleted file mode 100644 index e1929d23744..00000000000 --- a/3rdparty/SDL2/src/video/psp/SDL_pspevents_c.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "SDL_pspvideo.h" - -/* Variables and functions exported by SDL_sysevents.c to other parts - of the native video subsystem (SDL_sysvideo.c) -*/ -extern void PSP_InitOSKeymap(_THIS); -extern void PSP_PumpEvents(_THIS); - -/* end of SDL_pspevents_c.h ... */ - diff --git a/3rdparty/SDL2/src/video/psp/SDL_pspgl.c b/3rdparty/SDL2/src/video/psp/SDL_pspgl.c deleted file mode 100644 index e4f81e9ee47..00000000000 --- a/3rdparty/SDL2/src/video/psp/SDL_pspgl.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_PSP - -#include <stdlib.h> -#include <string.h> - -#include "SDL_error.h" -#include "SDL_pspvideo.h" -#include "SDL_pspgl_c.h" - -/*****************************************************************************/ -/* SDL OpenGL/OpenGL ES functions */ -/*****************************************************************************/ -#define EGLCHK(stmt) \ - do { \ - EGLint err; \ - \ - stmt; \ - err = eglGetError(); \ - if (err != EGL_SUCCESS) { \ - SDL_SetError("EGL error %d", err); \ - return 0; \ - } \ - } while (0) - -int -PSP_GL_LoadLibrary(_THIS, const char *path) -{ - if (!_this->gl_config.driver_loaded) { - _this->gl_config.driver_loaded = 1; - } - - return 0; -} - -/* pspgl doesn't provide this call, so stub it out since SDL requires it. -#define GLSTUB(func,params) void func params {} - -GLSTUB(glOrtho,(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, - GLdouble zNear, GLdouble zFar)) -*/ -void * -PSP_GL_GetProcAddress(_THIS, const char *proc) -{ - return eglGetProcAddress(proc); -} - -void -PSP_GL_UnloadLibrary(_THIS) -{ - eglTerminate(_this->gl_data->display); -} - -static EGLint width = 480; -static EGLint height = 272; - -SDL_GLContext -PSP_GL_CreateContext(_THIS, SDL_Window * window) -{ - - SDL_WindowData *wdata = (SDL_WindowData *) window->driverdata; - - EGLint attribs[32]; - EGLDisplay display; - EGLContext context; - EGLSurface surface; - EGLConfig config; - EGLint num_configs; - int i; - - - /* EGL init taken from glutCreateWindow() in PSPGL's glut.c. */ - EGLCHK(display = eglGetDisplay(0)); - EGLCHK(eglInitialize(display, NULL, NULL)); - wdata->uses_gles = SDL_TRUE; - window->flags |= SDL_WINDOW_FULLSCREEN; - - /* Setup the config based on SDL's current values. */ - i = 0; - attribs[i++] = EGL_RED_SIZE; - attribs[i++] = _this->gl_config.red_size; - attribs[i++] = EGL_GREEN_SIZE; - attribs[i++] = _this->gl_config.green_size; - attribs[i++] = EGL_BLUE_SIZE; - attribs[i++] = _this->gl_config.blue_size; - attribs[i++] = EGL_DEPTH_SIZE; - attribs[i++] = _this->gl_config.depth_size; - - if (_this->gl_config.alpha_size) - { - attribs[i++] = EGL_ALPHA_SIZE; - attribs[i++] = _this->gl_config.alpha_size; - } - if (_this->gl_config.stencil_size) - { - attribs[i++] = EGL_STENCIL_SIZE; - attribs[i++] = _this->gl_config.stencil_size; - } - - attribs[i++] = EGL_NONE; - - EGLCHK(eglChooseConfig(display, attribs, &config, 1, &num_configs)); - - if (num_configs == 0) - { - SDL_SetError("No valid EGL configs for requested mode"); - return 0; - } - - EGLCHK(eglGetConfigAttrib(display, config, EGL_WIDTH, &width)); - EGLCHK(eglGetConfigAttrib(display, config, EGL_HEIGHT, &height)); - - EGLCHK(context = eglCreateContext(display, config, NULL, NULL)); - EGLCHK(surface = eglCreateWindowSurface(display, config, 0, NULL)); - EGLCHK(eglMakeCurrent(display, surface, surface, context)); - - _this->gl_data->display = display; - _this->gl_data->context = context; - _this->gl_data->surface = surface; - - - return context; -} - -int -PSP_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) -{ - if (!eglMakeCurrent(_this->gl_data->display, _this->gl_data->surface, - _this->gl_data->surface, _this->gl_data->context)) - { - return SDL_SetError("Unable to make EGL context current"); - } - return 0; -} - -int -PSP_GL_SetSwapInterval(_THIS, int interval) -{ - EGLBoolean status; - status = eglSwapInterval(_this->gl_data->display, interval); - if (status == EGL_TRUE) { - /* Return success to upper level */ - _this->gl_data->swapinterval = interval; - return 0; - } - /* Failed to set swap interval */ - return SDL_SetError("Unable to set the EGL swap interval"); -} - -int -PSP_GL_GetSwapInterval(_THIS) -{ - return _this->gl_data->swapinterval; -} - -void -PSP_GL_SwapWindow(_THIS, SDL_Window * window) -{ - eglSwapBuffers(_this->gl_data->display, _this->gl_data->surface); -} - -void -PSP_GL_DeleteContext(_THIS, SDL_GLContext context) -{ - SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; - EGLBoolean status; - - if (phdata->egl_initialized != SDL_TRUE) { - SDL_SetError("PSP: GLES initialization failed, no OpenGL ES support"); - return; - } - - /* Check if OpenGL ES connection has been initialized */ - if (_this->gl_data->display != EGL_NO_DISPLAY) { - if (context != EGL_NO_CONTEXT) { - status = eglDestroyContext(_this->gl_data->display, context); - if (status != EGL_TRUE) { - /* Error during OpenGL ES context destroying */ - SDL_SetError("PSP: OpenGL ES context destroy error"); - return; - } - } - } - - return; -} - -#endif /* SDL_VIDEO_DRIVER_PSP */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/psp/SDL_pspgl_c.h b/3rdparty/SDL2/src/video/psp/SDL_pspgl_c.h deleted file mode 100644 index 308b027290e..00000000000 --- a/3rdparty/SDL2/src/video/psp/SDL_pspgl_c.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_pspgl_c_h -#define _SDL_pspgl_c_h - - -#include <GLES/egl.h> -#include <GLES/gl.h> - -#include "SDL_pspvideo.h" - - -typedef struct SDL_GLDriverData { - EGLDisplay display; - EGLContext context; - EGLSurface surface; - uint32_t swapinterval; -}SDL_GLDriverData; - -extern void * PSP_GL_GetProcAddress(_THIS, const char *proc); -extern int PSP_GL_MakeCurrent(_THIS,SDL_Window * window, SDL_GLContext context); -extern void PSP_GL_SwapBuffers(_THIS); - -extern void PSP_GL_SwapWindow(_THIS, SDL_Window * window); -extern SDL_GLContext PSP_GL_CreateContext(_THIS, SDL_Window * window); - -extern int PSP_GL_LoadLibrary(_THIS, const char *path); -extern void PSP_GL_UnloadLibrary(_THIS); -extern int PSP_GL_SetSwapInterval(_THIS, int interval); -extern int PSP_GL_GetSwapInterval(_THIS); - - -#endif /* _SDL_pspgl_c_h */ diff --git a/3rdparty/SDL2/src/video/psp/SDL_pspmouse.c b/3rdparty/SDL2/src/video/psp/SDL_pspmouse.c deleted file mode 100644 index b7c3d2b9986..00000000000 --- a/3rdparty/SDL2/src/video/psp/SDL_pspmouse.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_PSP - -#include <stdio.h> - -#include "SDL_error.h" -#include "SDL_mouse.h" -#include "../../events/SDL_events_c.h" - -#include "SDL_pspmouse_c.h" - - -/* The implementation dependent data for the window manager cursor */ -struct WMcursor { - int unused; -}; - -#endif /* SDL_VIDEO_DRIVER_PSP */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/psp/SDL_pspmouse_c.h b/3rdparty/SDL2/src/video/psp/SDL_pspmouse_c.h deleted file mode 100644 index 2a3df68efbb..00000000000 --- a/3rdparty/SDL2/src/video/psp/SDL_pspmouse_c.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "SDL_pspvideo.h" - -/* Functions to be exported */ diff --git a/3rdparty/SDL2/src/video/psp/SDL_pspvideo.c b/3rdparty/SDL2/src/video/psp/SDL_pspvideo.c deleted file mode 100644 index 381e4899ea1..00000000000 --- a/3rdparty/SDL2/src/video/psp/SDL_pspvideo.c +++ /dev/null @@ -1,329 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_PSP - -/* SDL internals */ -#include "../SDL_sysvideo.h" -#include "SDL_version.h" -#include "SDL_syswm.h" -#include "SDL_loadso.h" -#include "SDL_events.h" -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_keyboard_c.h" - - - -/* PSP declarations */ -#include "SDL_pspvideo.h" -#include "SDL_pspevents_c.h" -#include "SDL_pspgl_c.h" - -/* unused -static SDL_bool PSP_initialized = SDL_FALSE; -*/ -static int -PSP_Available(void) -{ - return 1; -} - -static void -PSP_Destroy(SDL_VideoDevice * device) -{ -/* SDL_VideoData *phdata = (SDL_VideoData *) device->driverdata; */ - - if (device->driverdata != NULL) { - device->driverdata = NULL; - } -} - -static SDL_VideoDevice * -PSP_Create() -{ - SDL_VideoDevice *device; - SDL_VideoData *phdata; - SDL_GLDriverData *gldata; - int status; - - /* Check if PSP could be initialized */ - status = PSP_Available(); - if (status == 0) { - /* PSP could not be used */ - return NULL; - } - - /* Initialize SDL_VideoDevice structure */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (device == NULL) { - SDL_OutOfMemory(); - return NULL; - } - - /* Initialize internal PSP specific data */ - phdata = (SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); - if (phdata == NULL) { - SDL_OutOfMemory(); - SDL_free(device); - return NULL; - } - - gldata = (SDL_GLDriverData *) SDL_calloc(1, sizeof(SDL_GLDriverData)); - if (gldata == NULL) { - SDL_OutOfMemory(); - SDL_free(device); - SDL_free(phdata); - return NULL; - } - device->gl_data = gldata; - - device->driverdata = phdata; - - phdata->egl_initialized = SDL_TRUE; - - - /* Setup amount of available displays */ - device->num_displays = 0; - - /* Set device free function */ - device->free = PSP_Destroy; - - /* Setup all functions which we can handle */ - device->VideoInit = PSP_VideoInit; - device->VideoQuit = PSP_VideoQuit; - device->GetDisplayModes = PSP_GetDisplayModes; - device->SetDisplayMode = PSP_SetDisplayMode; - device->CreateWindow = PSP_CreateWindow; - device->CreateWindowFrom = PSP_CreateWindowFrom; - device->SetWindowTitle = PSP_SetWindowTitle; - device->SetWindowIcon = PSP_SetWindowIcon; - device->SetWindowPosition = PSP_SetWindowPosition; - device->SetWindowSize = PSP_SetWindowSize; - device->ShowWindow = PSP_ShowWindow; - device->HideWindow = PSP_HideWindow; - device->RaiseWindow = PSP_RaiseWindow; - device->MaximizeWindow = PSP_MaximizeWindow; - device->MinimizeWindow = PSP_MinimizeWindow; - device->RestoreWindow = PSP_RestoreWindow; - device->SetWindowGrab = PSP_SetWindowGrab; - device->DestroyWindow = PSP_DestroyWindow; - device->GetWindowWMInfo = PSP_GetWindowWMInfo; - device->GL_LoadLibrary = PSP_GL_LoadLibrary; - device->GL_GetProcAddress = PSP_GL_GetProcAddress; - device->GL_UnloadLibrary = PSP_GL_UnloadLibrary; - device->GL_CreateContext = PSP_GL_CreateContext; - device->GL_MakeCurrent = PSP_GL_MakeCurrent; - device->GL_SetSwapInterval = PSP_GL_SetSwapInterval; - device->GL_GetSwapInterval = PSP_GL_GetSwapInterval; - device->GL_SwapWindow = PSP_GL_SwapWindow; - device->GL_DeleteContext = PSP_GL_DeleteContext; - device->HasScreenKeyboardSupport = PSP_HasScreenKeyboardSupport; - device->ShowScreenKeyboard = PSP_ShowScreenKeyboard; - device->HideScreenKeyboard = PSP_HideScreenKeyboard; - device->IsScreenKeyboardShown = PSP_IsScreenKeyboardShown; - - device->PumpEvents = PSP_PumpEvents; - - return device; -} - -VideoBootStrap PSP_bootstrap = { - "PSP", - "PSP Video Driver", - PSP_Available, - PSP_Create -}; - -/*****************************************************************************/ -/* SDL Video and Display initialization/handling functions */ -/*****************************************************************************/ -int -PSP_VideoInit(_THIS) -{ - SDL_VideoDisplay display; - SDL_DisplayMode current_mode; - - SDL_zero(current_mode); - - current_mode.w = 480; - current_mode.h = 272; - - current_mode.refresh_rate = 60; - /* 32 bpp for default */ - current_mode.format = SDL_PIXELFORMAT_ABGR8888; - - current_mode.driverdata = NULL; - - SDL_zero(display); - display.desktop_mode = current_mode; - display.current_mode = current_mode; - display.driverdata = NULL; - - SDL_AddVideoDisplay(&display); - - return 1; -} - -void -PSP_VideoQuit(_THIS) -{ - -} - -void -PSP_GetDisplayModes(_THIS, SDL_VideoDisplay * display) -{ - -} - -int -PSP_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - return 0; -} -#define EGLCHK(stmt) \ - do { \ - EGLint err; \ - \ - stmt; \ - err = eglGetError(); \ - if (err != EGL_SUCCESS) { \ - SDL_SetError("EGL error %d", err); \ - return 0; \ - } \ - } while (0) - -int -PSP_CreateWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *wdata; - - /* Allocate window internal data */ - wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); - if (wdata == NULL) { - return SDL_OutOfMemory(); - } - - /* Setup driver data for this window */ - window->driverdata = wdata; - - - /* Window has been successfully created */ - return 0; -} - -int -PSP_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) -{ - return SDL_Unsupported(); -} - -void -PSP_SetWindowTitle(_THIS, SDL_Window * window) -{ -} -void -PSP_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) -{ -} -void -PSP_SetWindowPosition(_THIS, SDL_Window * window) -{ -} -void -PSP_SetWindowSize(_THIS, SDL_Window * window) -{ -} -void -PSP_ShowWindow(_THIS, SDL_Window * window) -{ -} -void -PSP_HideWindow(_THIS, SDL_Window * window) -{ -} -void -PSP_RaiseWindow(_THIS, SDL_Window * window) -{ -} -void -PSP_MaximizeWindow(_THIS, SDL_Window * window) -{ -} -void -PSP_MinimizeWindow(_THIS, SDL_Window * window) -{ -} -void -PSP_RestoreWindow(_THIS, SDL_Window * window) -{ -} -void -PSP_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) -{ - -} -void -PSP_DestroyWindow(_THIS, SDL_Window * window) -{ -} - -/*****************************************************************************/ -/* SDL Window Manager function */ -/*****************************************************************************/ -SDL_bool -PSP_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info) -{ - if (info->version.major <= SDL_MAJOR_VERSION) { - return SDL_TRUE; - } else { - SDL_SetError("application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } - - /* Failed to get window manager information */ - return SDL_FALSE; -} - - -/* TO Write Me */ -SDL_bool PSP_HasScreenKeyboardSupport(_THIS) -{ - return SDL_FALSE; -} -void PSP_ShowScreenKeyboard(_THIS, SDL_Window *window) -{ -} -void PSP_HideScreenKeyboard(_THIS, SDL_Window *window) -{ -} -SDL_bool PSP_IsScreenKeyboardShown(_THIS, SDL_Window *window) -{ - return SDL_FALSE; -} - - -#endif /* SDL_VIDEO_DRIVER_PSP */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/psp/SDL_pspvideo.h b/3rdparty/SDL2/src/video/psp/SDL_pspvideo.h deleted file mode 100644 index f5705a9446a..00000000000 --- a/3rdparty/SDL2/src/video/psp/SDL_pspvideo.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_pspvideo_h -#define _SDL_pspvideo_h - -#include <GLES/egl.h> - -#include "../../SDL_internal.h" -#include "../SDL_sysvideo.h" - -typedef struct SDL_VideoData -{ - SDL_bool egl_initialized; /* OpenGL ES device initialization status */ - uint32_t egl_refcount; /* OpenGL ES reference count */ - - - -} SDL_VideoData; - - -typedef struct SDL_DisplayData -{ - -} SDL_DisplayData; - - -typedef struct SDL_WindowData -{ - SDL_bool uses_gles; /* if true window must support OpenGL ES */ - -} SDL_WindowData; - - - - -/****************************************************************************/ -/* SDL_VideoDevice functions declaration */ -/****************************************************************************/ - -/* Display and window functions */ -int PSP_VideoInit(_THIS); -void PSP_VideoQuit(_THIS); -void PSP_GetDisplayModes(_THIS, SDL_VideoDisplay * display); -int PSP_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -int PSP_CreateWindow(_THIS, SDL_Window * window); -int PSP_CreateWindowFrom(_THIS, SDL_Window * window, const void *data); -void PSP_SetWindowTitle(_THIS, SDL_Window * window); -void PSP_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon); -void PSP_SetWindowPosition(_THIS, SDL_Window * window); -void PSP_SetWindowSize(_THIS, SDL_Window * window); -void PSP_ShowWindow(_THIS, SDL_Window * window); -void PSP_HideWindow(_THIS, SDL_Window * window); -void PSP_RaiseWindow(_THIS, SDL_Window * window); -void PSP_MaximizeWindow(_THIS, SDL_Window * window); -void PSP_MinimizeWindow(_THIS, SDL_Window * window); -void PSP_RestoreWindow(_THIS, SDL_Window * window); -void PSP_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed); -void PSP_DestroyWindow(_THIS, SDL_Window * window); - -/* Window manager function */ -SDL_bool PSP_GetWindowWMInfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo *info); - -/* OpenGL/OpenGL ES functions */ -int PSP_GL_LoadLibrary(_THIS, const char *path); -void *PSP_GL_GetProcAddress(_THIS, const char *proc); -void PSP_GL_UnloadLibrary(_THIS); -SDL_GLContext PSP_GL_CreateContext(_THIS, SDL_Window * window); -int PSP_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); -int PSP_GL_SetSwapInterval(_THIS, int interval); -int PSP_GL_GetSwapInterval(_THIS); -void PSP_GL_SwapWindow(_THIS, SDL_Window * window); -void PSP_GL_DeleteContext(_THIS, SDL_GLContext context); - -/* PSP on screen keyboard */ -SDL_bool PSP_HasScreenKeyboardSupport(_THIS); -void PSP_ShowScreenKeyboard(_THIS, SDL_Window *window); -void PSP_HideScreenKeyboard(_THIS, SDL_Window *window); -SDL_bool PSP_IsScreenKeyboardShown(_THIS, SDL_Window *window); - -#endif /* _SDL_pspvideo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/raspberry/SDL_rpievents.c b/3rdparty/SDL2/src/video/raspberry/SDL_rpievents.c deleted file mode 100644 index 4104568ccf9..00000000000 --- a/3rdparty/SDL2/src/video/raspberry/SDL_rpievents.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_RPI - -#include "../../events/SDL_sysevents.h" -#include "../../events/SDL_events_c.h" -#include "../../events/SDL_keyboard_c.h" -#include "SDL_rpivideo.h" -#include "SDL_rpievents_c.h" - -#ifdef SDL_INPUT_LINUXEV -#include "../../core/linux/SDL_evdev.h" -#endif - -void RPI_PumpEvents(_THIS) -{ -#ifdef SDL_INPUT_LINUXEV - SDL_EVDEV_Poll(); -#endif - -} - -#endif /* SDL_VIDEO_DRIVER_RPI */ - diff --git a/3rdparty/SDL2/src/video/raspberry/SDL_rpievents_c.h b/3rdparty/SDL2/src/video/raspberry/SDL_rpievents_c.h deleted file mode 100644 index 54fc196e420..00000000000 --- a/3rdparty/SDL2/src/video/raspberry/SDL_rpievents_c.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_rpievents_c_h -#define _SDL_rpievents_c_h - -#include "SDL_rpivideo.h" - -void RPI_PumpEvents(_THIS); -void RPI_EventInit(_THIS); -void RPI_EventQuit(_THIS); - -#endif /* _SDL_rpievents_c_h */ diff --git a/3rdparty/SDL2/src/video/raspberry/SDL_rpimouse.c b/3rdparty/SDL2/src/video/raspberry/SDL_rpimouse.c deleted file mode 100644 index ae9bdfd5cbf..00000000000 --- a/3rdparty/SDL2/src/video/raspberry/SDL_rpimouse.c +++ /dev/null @@ -1,325 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_RPI - -#include "SDL_assert.h" -#include "SDL_surface.h" -#include "SDL_hints.h" - -#include "SDL_rpivideo.h" -#include "SDL_rpimouse.h" - -#include "../SDL_sysvideo.h" -#include "../../events/SDL_mouse_c.h" -#include "../../events/default_cursor.h" - -/* Copied from vc_vchi_dispmanx.h which is bugged and tries to include a non existing file */ -/* Attributes changes flag mask */ -#define ELEMENT_CHANGE_LAYER (1<<0) -#define ELEMENT_CHANGE_OPACITY (1<<1) -#define ELEMENT_CHANGE_DEST_RECT (1<<2) -#define ELEMENT_CHANGE_SRC_RECT (1<<3) -#define ELEMENT_CHANGE_MASK_RESOURCE (1<<4) -#define ELEMENT_CHANGE_TRANSFORM (1<<5) -/* End copied from vc_vchi_dispmanx.h */ - -static SDL_Cursor *RPI_CreateDefaultCursor(void); -static SDL_Cursor *RPI_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y); -static int RPI_ShowCursor(SDL_Cursor * cursor); -static void RPI_MoveCursor(SDL_Cursor * cursor); -static void RPI_FreeCursor(SDL_Cursor * cursor); -static void RPI_WarpMouse(SDL_Window * window, int x, int y); -static int RPI_WarpMouseGlobal(int x, int y); - -static SDL_Cursor * -RPI_CreateDefaultCursor(void) -{ - return SDL_CreateCursor(default_cdata, default_cmask, DEFAULT_CWIDTH, DEFAULT_CHEIGHT, DEFAULT_CHOTX, DEFAULT_CHOTY); -} - -/* Create a cursor from a surface */ -static SDL_Cursor * -RPI_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y) -{ - RPI_CursorData *curdata; - SDL_Cursor *cursor; - int ret; - VC_RECT_T dst_rect; - Uint32 dummy; - - SDL_assert(surface->format->format == SDL_PIXELFORMAT_ARGB8888); - SDL_assert(surface->pitch == surface->w * 4); - - cursor = (SDL_Cursor *) SDL_calloc(1, sizeof(*cursor)); - if (cursor == NULL) { - SDL_OutOfMemory(); - return NULL; - } - curdata = (RPI_CursorData *) SDL_calloc(1, sizeof(*curdata)); - if (curdata == NULL) { - SDL_OutOfMemory(); - SDL_free(cursor); - return NULL; - } - - curdata->hot_x = hot_x; - curdata->hot_y = hot_y; - curdata->w = surface->w; - curdata->h = surface->h; - - /* This usage is inspired by Wayland/Weston RPI code, how they figured this out is anyone's guess */ - curdata->resource = vc_dispmanx_resource_create(VC_IMAGE_ARGB8888, surface->w | (surface->pitch << 16), surface->h | (surface->h << 16), &dummy); - SDL_assert(curdata->resource); - vc_dispmanx_rect_set(&dst_rect, 0, 0, curdata->w, curdata->h); - /* A note from Weston: - * vc_dispmanx_resource_write_data() ignores ifmt, - * rect.x, rect.width, and uses stride only for computing - * the size of the transfer as rect.height * stride. - * Therefore we can only write rows starting at x=0. - */ - ret = vc_dispmanx_resource_write_data(curdata->resource, VC_IMAGE_ARGB8888, surface->pitch, surface->pixels, &dst_rect); - SDL_assert (ret == DISPMANX_SUCCESS); - - cursor->driverdata = curdata; - - return cursor; - -} - -/* Show the specified cursor, or hide if cursor is NULL */ -static int -RPI_ShowCursor(SDL_Cursor * cursor) -{ - int ret; - DISPMANX_UPDATE_HANDLE_T update; - RPI_CursorData *curdata; - VC_RECT_T src_rect, dst_rect; - SDL_Mouse *mouse; - SDL_VideoDisplay *display; - SDL_DisplayData *data; - VC_DISPMANX_ALPHA_T alpha = { DISPMANX_FLAGS_ALPHA_FROM_SOURCE /* flags */ , 255 /*opacity 0->255*/, 0 /* mask */ }; - uint32_t layer = SDL_RPI_MOUSELAYER; - const char *env; - - mouse = SDL_GetMouse(); - if (mouse == NULL) { - return -1; - } - - if (cursor == NULL) { - /* FIXME: We hide the current mouse's cursor, what we actually need is *_HideCursor */ - - if (mouse->cur_cursor != NULL && mouse->cur_cursor->driverdata != NULL) { - curdata = (RPI_CursorData *) mouse->cur_cursor->driverdata; - if (curdata->element > DISPMANX_NO_HANDLE) { - update = vc_dispmanx_update_start(10); - SDL_assert(update); - ret = vc_dispmanx_element_remove(update, curdata->element); - SDL_assert(ret == DISPMANX_SUCCESS); - ret = vc_dispmanx_update_submit_sync(update); - SDL_assert(ret == DISPMANX_SUCCESS); - curdata->element = DISPMANX_NO_HANDLE; - } - } - return 0; - } - - curdata = (RPI_CursorData *) cursor->driverdata; - if (curdata == NULL) { - return -1; - } - - if (mouse->focus == NULL) { - return -1; - } - - display = SDL_GetDisplayForWindow(mouse->focus); - if (display == NULL) { - return -1; - } - - data = (SDL_DisplayData*) display->driverdata; - if (data == NULL) { - return -1; - } - - if (curdata->element == DISPMANX_NO_HANDLE) { - vc_dispmanx_rect_set(&src_rect, 0, 0, curdata->w << 16, curdata->h << 16); - vc_dispmanx_rect_set(&dst_rect, 0, 0, curdata->w, curdata->h); - - update = vc_dispmanx_update_start(10); - SDL_assert(update); - - env = SDL_GetHint(SDL_HINT_RPI_VIDEO_LAYER); - if (env) { - layer = SDL_atoi(env) + 1; - } - - curdata->element = vc_dispmanx_element_add(update, - data->dispman_display, - layer, - &dst_rect, - curdata->resource, - &src_rect, - DISPMANX_PROTECTION_NONE, - &alpha, - DISPMANX_NO_HANDLE, // clamp - VC_IMAGE_ROT0); - SDL_assert(curdata->element > DISPMANX_NO_HANDLE); - ret = vc_dispmanx_update_submit_sync(update); - SDL_assert(ret == DISPMANX_SUCCESS); - } - - return 0; -} - -/* Free a window manager cursor */ -static void -RPI_FreeCursor(SDL_Cursor * cursor) -{ - int ret; - DISPMANX_UPDATE_HANDLE_T update; - RPI_CursorData *curdata; - - if (cursor != NULL) { - curdata = (RPI_CursorData *) cursor->driverdata; - - if (curdata != NULL) { - if (curdata->element != DISPMANX_NO_HANDLE) { - update = vc_dispmanx_update_start(10); - SDL_assert(update); - ret = vc_dispmanx_element_remove(update, curdata->element); - SDL_assert(ret == DISPMANX_SUCCESS); - ret = vc_dispmanx_update_submit_sync(update); - SDL_assert(ret == DISPMANX_SUCCESS); - } - - if (curdata->resource != DISPMANX_NO_HANDLE) { - ret = vc_dispmanx_resource_delete(curdata->resource); - SDL_assert(ret == DISPMANX_SUCCESS); - } - - SDL_free(cursor->driverdata); - } - SDL_free(cursor); - } -} - -/* Warp the mouse to (x,y) */ -static void -RPI_WarpMouse(SDL_Window * window, int x, int y) -{ - RPI_WarpMouseGlobal(x, y); -} - -/* Warp the mouse to (x,y) */ -static int -RPI_WarpMouseGlobal(int x, int y) -{ - RPI_CursorData *curdata; - DISPMANX_UPDATE_HANDLE_T update; - int ret; - VC_RECT_T dst_rect; - VC_RECT_T src_rect; - SDL_Mouse *mouse = SDL_GetMouse(); - - if (mouse == NULL || mouse->cur_cursor == NULL || mouse->cur_cursor->driverdata == NULL) { - return 0; - } - - curdata = (RPI_CursorData *) mouse->cur_cursor->driverdata; - if (curdata->element == DISPMANX_NO_HANDLE) { - return 0; - } - - update = vc_dispmanx_update_start(10); - if (!update) { - return 0; - } - - src_rect.x = 0; - src_rect.y = 0; - src_rect.width = curdata->w << 16; - src_rect.height = curdata->h << 16; - dst_rect.x = x; - dst_rect.y = y; - dst_rect.width = curdata->w; - dst_rect.height = curdata->h; - - ret = vc_dispmanx_element_change_attributes( - update, - curdata->element, - 0, - 0, - 0, - &dst_rect, - &src_rect, - DISPMANX_NO_HANDLE, - DISPMANX_NO_ROTATE); - if (ret != DISPMANX_SUCCESS) { - return SDL_SetError("vc_dispmanx_element_change_attributes() failed"); - } - - /* Submit asynchronously, otherwise the peformance suffers a lot */ - ret = vc_dispmanx_update_submit(update, 0, NULL); - if (ret != DISPMANX_SUCCESS) { - return SDL_SetError("vc_dispmanx_update_submit() failed"); - } - return 0; -} - -void -RPI_InitMouse(_THIS) -{ - /* FIXME: Using UDEV it should be possible to scan all mice - * but there's no point in doing so as there's no multimice support...yet! - */ - SDL_Mouse *mouse = SDL_GetMouse(); - - mouse->CreateCursor = RPI_CreateCursor; - mouse->ShowCursor = RPI_ShowCursor; - mouse->MoveCursor = RPI_MoveCursor; - mouse->FreeCursor = RPI_FreeCursor; - mouse->WarpMouse = RPI_WarpMouse; - mouse->WarpMouseGlobal = RPI_WarpMouseGlobal; - - SDL_SetDefaultCursor(RPI_CreateDefaultCursor()); -} - -void -RPI_QuitMouse(_THIS) -{ - -} - -/* This is called when a mouse motion event occurs */ -static void -RPI_MoveCursor(SDL_Cursor * cursor) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - RPI_WarpMouse(mouse->focus, mouse->x, mouse->y); -} - -#endif /* SDL_VIDEO_DRIVER_RPI */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/raspberry/SDL_rpimouse.h b/3rdparty/SDL2/src/video/raspberry/SDL_rpimouse.h deleted file mode 100644 index 6a4e70511f5..00000000000 --- a/3rdparty/SDL2/src/video/raspberry/SDL_rpimouse.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_RPI_mouse_h -#define _SDL_RPI_mouse_h - -#include "../SDL_sysvideo.h" - -typedef struct _RPI_CursorData RPI_CursorData; -struct _RPI_CursorData -{ - DISPMANX_RESOURCE_HANDLE_T resource; - DISPMANX_ELEMENT_HANDLE_T element; - int hot_x, hot_y; - int w, h; -}; - -#define SDL_RPI_CURSORDATA(curs) RPI_CursorData *curdata = (RPI_CursorData *) ((curs) ? (curs)->driverdata : NULL) - -extern void RPI_InitMouse(_THIS); -extern void RPI_QuitMouse(_THIS); - -#endif /* _SDL_RPI_mouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/raspberry/SDL_rpiopengles.c b/3rdparty/SDL2/src/video/raspberry/SDL_rpiopengles.c deleted file mode 100644 index 0881dbde88b..00000000000 --- a/3rdparty/SDL2/src/video/raspberry/SDL_rpiopengles.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_RPI && SDL_VIDEO_OPENGL_EGL - -#include "SDL_rpivideo.h" -#include "SDL_rpiopengles.h" - -/* EGL implementation of SDL OpenGL support */ - -int -RPI_GLES_LoadLibrary(_THIS, const char *path) { - return SDL_EGL_LoadLibrary(_this, path, EGL_DEFAULT_DISPLAY); -} - -SDL_EGL_CreateContext_impl(RPI) -SDL_EGL_SwapWindow_impl(RPI) -SDL_EGL_MakeCurrent_impl(RPI) - -#endif /* SDL_VIDEO_DRIVER_RPI && SDL_VIDEO_OPENGL_EGL */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/raspberry/SDL_rpiopengles.h b/3rdparty/SDL2/src/video/raspberry/SDL_rpiopengles.h deleted file mode 100644 index 83c80006746..00000000000 --- a/3rdparty/SDL2/src/video/raspberry/SDL_rpiopengles.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_rpiopengles_h -#define _SDL_rpiopengles_h - -#if SDL_VIDEO_DRIVER_RPI && SDL_VIDEO_OPENGL_EGL - -#include "../SDL_sysvideo.h" -#include "../SDL_egl_c.h" - -/* OpenGLES functions */ -#define RPI_GLES_GetAttribute SDL_EGL_GetAttribute -#define RPI_GLES_GetProcAddress SDL_EGL_GetProcAddress -#define RPI_GLES_UnloadLibrary SDL_EGL_UnloadLibrary -#define RPI_GLES_SetSwapInterval SDL_EGL_SetSwapInterval -#define RPI_GLES_GetSwapInterval SDL_EGL_GetSwapInterval -#define RPI_GLES_DeleteContext SDL_EGL_DeleteContext - -extern int RPI_GLES_LoadLibrary(_THIS, const char *path); -extern SDL_GLContext RPI_GLES_CreateContext(_THIS, SDL_Window * window); -extern void RPI_GLES_SwapWindow(_THIS, SDL_Window * window); -extern int RPI_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); - -#endif /* SDL_VIDEO_DRIVER_RPI && SDL_VIDEO_OPENGL_EGL */ - -#endif /* _SDL_rpiopengles_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/raspberry/SDL_rpivideo.c b/3rdparty/SDL2/src/video/raspberry/SDL_rpivideo.c deleted file mode 100644 index 67dc77b1c5e..00000000000 --- a/3rdparty/SDL2/src/video/raspberry/SDL_rpivideo.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_RPI - -/* References - * http://elinux.org/RPi_VideoCore_APIs - * https://github.com/raspberrypi/firmware/blob/master/opt/vc/src/hello_pi/hello_triangle/triangle.c - * http://cgit.freedesktop.org/wayland/weston/tree/src/rpi-renderer.c - * http://cgit.freedesktop.org/wayland/weston/tree/src/compositor-rpi.c - */ - -/* SDL internals */ -#include "../SDL_sysvideo.h" -#include "SDL_version.h" -#include "SDL_syswm.h" -#include "SDL_loadso.h" -#include "SDL_events.h" -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_keyboard_c.h" -#include "SDL_hints.h" - -#ifdef SDL_INPUT_LINUXEV -#include "../../core/linux/SDL_evdev.h" -#endif - -/* RPI declarations */ -#include "SDL_rpivideo.h" -#include "SDL_rpievents_c.h" -#include "SDL_rpiopengles.h" -#include "SDL_rpimouse.h" - -static int -RPI_Available(void) -{ - return 1; -} - -static void -RPI_Destroy(SDL_VideoDevice * device) -{ - /* SDL_VideoData *phdata = (SDL_VideoData *) device->driverdata; */ - - if (device->driverdata != NULL) { - device->driverdata = NULL; - } -} - -static SDL_VideoDevice * -RPI_Create() -{ - SDL_VideoDevice *device; - SDL_VideoData *phdata; - - /* Initialize SDL_VideoDevice structure */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (device == NULL) { - SDL_OutOfMemory(); - return NULL; - } - - /* Initialize internal data */ - phdata = (SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); - if (phdata == NULL) { - SDL_OutOfMemory(); - SDL_free(device); - return NULL; - } - - device->driverdata = phdata; - - /* Setup amount of available displays */ - device->num_displays = 0; - - /* Set device free function */ - device->free = RPI_Destroy; - - /* Setup all functions which we can handle */ - device->VideoInit = RPI_VideoInit; - device->VideoQuit = RPI_VideoQuit; - device->GetDisplayModes = RPI_GetDisplayModes; - device->SetDisplayMode = RPI_SetDisplayMode; - device->CreateWindow = RPI_CreateWindow; - device->CreateWindowFrom = RPI_CreateWindowFrom; - device->SetWindowTitle = RPI_SetWindowTitle; - device->SetWindowIcon = RPI_SetWindowIcon; - device->SetWindowPosition = RPI_SetWindowPosition; - device->SetWindowSize = RPI_SetWindowSize; - device->ShowWindow = RPI_ShowWindow; - device->HideWindow = RPI_HideWindow; - device->RaiseWindow = RPI_RaiseWindow; - device->MaximizeWindow = RPI_MaximizeWindow; - device->MinimizeWindow = RPI_MinimizeWindow; - device->RestoreWindow = RPI_RestoreWindow; - device->SetWindowGrab = RPI_SetWindowGrab; - device->DestroyWindow = RPI_DestroyWindow; - device->GetWindowWMInfo = RPI_GetWindowWMInfo; - device->GL_LoadLibrary = RPI_GLES_LoadLibrary; - device->GL_GetProcAddress = RPI_GLES_GetProcAddress; - device->GL_UnloadLibrary = RPI_GLES_UnloadLibrary; - device->GL_CreateContext = RPI_GLES_CreateContext; - device->GL_MakeCurrent = RPI_GLES_MakeCurrent; - device->GL_SetSwapInterval = RPI_GLES_SetSwapInterval; - device->GL_GetSwapInterval = RPI_GLES_GetSwapInterval; - device->GL_SwapWindow = RPI_GLES_SwapWindow; - device->GL_DeleteContext = RPI_GLES_DeleteContext; - - device->PumpEvents = RPI_PumpEvents; - - return device; -} - -VideoBootStrap RPI_bootstrap = { - "RPI", - "RPI Video Driver", - RPI_Available, - RPI_Create -}; - -/*****************************************************************************/ -/* SDL Video and Display initialization/handling functions */ -/*****************************************************************************/ -int -RPI_VideoInit(_THIS) -{ - SDL_VideoDisplay display; - SDL_DisplayMode current_mode; - SDL_DisplayData *data; - uint32_t w,h; - - /* Initialize BCM Host */ - bcm_host_init(); - - SDL_zero(current_mode); - - if (graphics_get_display_size( 0, &w, &h) < 0) { - return -1; - } - - current_mode.w = w; - current_mode.h = h; - /* FIXME: Is there a way to tell the actual refresh rate? */ - current_mode.refresh_rate = 60; - /* 32 bpp for default */ - current_mode.format = SDL_PIXELFORMAT_ABGR8888; - - current_mode.driverdata = NULL; - - SDL_zero(display); - display.desktop_mode = current_mode; - display.current_mode = current_mode; - - /* Allocate display internal data */ - data = (SDL_DisplayData *) SDL_calloc(1, sizeof(SDL_DisplayData)); - if (data == NULL) { - return SDL_OutOfMemory(); - } - - data->dispman_display = vc_dispmanx_display_open( 0 /* LCD */); - - display.driverdata = data; - - SDL_AddVideoDisplay(&display); - -#ifdef SDL_INPUT_LINUXEV - SDL_EVDEV_Init(); -#endif - - RPI_InitMouse(_this); - - return 1; -} - -void -RPI_VideoQuit(_THIS) -{ -#ifdef SDL_INPUT_LINUXEV - SDL_EVDEV_Quit(); -#endif -} - -void -RPI_GetDisplayModes(_THIS, SDL_VideoDisplay * display) -{ - /* Only one display mode available, the current one */ - SDL_AddDisplayMode(display, &display->current_mode); -} - -int -RPI_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - return 0; -} - -int -RPI_CreateWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *wdata; - SDL_VideoDisplay *display; - SDL_DisplayData *displaydata; - VC_RECT_T dst_rect; - VC_RECT_T src_rect; - VC_DISPMANX_ALPHA_T dispman_alpha; - DISPMANX_UPDATE_HANDLE_T dispman_update; - uint32_t layer = SDL_RPI_VIDEOLAYER; - const char *env; - - /* Disable alpha, otherwise the app looks composed with whatever dispman is showing (X11, console,etc) */ - dispman_alpha.flags = DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS; - dispman_alpha.opacity = 0xFF; - dispman_alpha.mask = 0; - - /* Allocate window internal data */ - wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); - if (wdata == NULL) { - return SDL_OutOfMemory(); - } - display = SDL_GetDisplayForWindow(window); - displaydata = (SDL_DisplayData *) display->driverdata; - - /* Windows have one size for now */ - window->w = display->desktop_mode.w; - window->h = display->desktop_mode.h; - - /* OpenGL ES is the law here, buddy */ - window->flags |= SDL_WINDOW_OPENGL; - - /* Create a dispman element and associate a window to it */ - dst_rect.x = 0; - dst_rect.y = 0; - dst_rect.width = window->w; - dst_rect.height = window->h; - - src_rect.x = 0; - src_rect.y = 0; - src_rect.width = window->w << 16; - src_rect.height = window->h << 16; - - env = SDL_GetHint(SDL_HINT_RPI_VIDEO_LAYER); - if (env) { - layer = SDL_atoi(env); - } - - dispman_update = vc_dispmanx_update_start( 0 ); - wdata->dispman_window.element = vc_dispmanx_element_add (dispman_update, - displaydata->dispman_display, - layer /* layer */, - &dst_rect, - 0 /*src*/, - &src_rect, - DISPMANX_PROTECTION_NONE, - &dispman_alpha /*alpha*/, - 0 /*clamp*/, - 0 /*transform*/); - wdata->dispman_window.width = window->w; - wdata->dispman_window.height = window->h; - vc_dispmanx_update_submit_sync(dispman_update); - - if (!_this->egl_data) { - if (SDL_GL_LoadLibrary(NULL) < 0) { - return -1; - } - } - wdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) &wdata->dispman_window); - - if (wdata->egl_surface == EGL_NO_SURFACE) { - return SDL_SetError("Could not create GLES window surface"); - } - - /* Setup driver data for this window */ - window->driverdata = wdata; - - /* One window, it always has focus */ - SDL_SetMouseFocus(window); - SDL_SetKeyboardFocus(window); - - /* Window has been successfully created */ - return 0; -} - -void -RPI_DestroyWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - if(data) { -#if SDL_VIDEO_OPENGL_EGL - if (data->egl_surface != EGL_NO_SURFACE) { - SDL_EGL_DestroySurface(_this, data->egl_surface); - } -#endif - SDL_free(data); - window->driverdata = NULL; - } -} - -int -RPI_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) -{ - return -1; -} - -void -RPI_SetWindowTitle(_THIS, SDL_Window * window) -{ -} -void -RPI_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) -{ -} -void -RPI_SetWindowPosition(_THIS, SDL_Window * window) -{ -} -void -RPI_SetWindowSize(_THIS, SDL_Window * window) -{ -} -void -RPI_ShowWindow(_THIS, SDL_Window * window) -{ -} -void -RPI_HideWindow(_THIS, SDL_Window * window) -{ -} -void -RPI_RaiseWindow(_THIS, SDL_Window * window) -{ -} -void -RPI_MaximizeWindow(_THIS, SDL_Window * window) -{ -} -void -RPI_MinimizeWindow(_THIS, SDL_Window * window) -{ -} -void -RPI_RestoreWindow(_THIS, SDL_Window * window) -{ -} -void -RPI_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) -{ - -} - -/*****************************************************************************/ -/* SDL Window Manager function */ -/*****************************************************************************/ -SDL_bool -RPI_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info) -{ - if (info->version.major <= SDL_MAJOR_VERSION) { - return SDL_TRUE; - } else { - SDL_SetError("application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } - - /* Failed to get window manager information */ - return SDL_FALSE; -} - -#endif /* SDL_VIDEO_DRIVER_RPI */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/raspberry/SDL_rpivideo.h b/3rdparty/SDL2/src/video/raspberry/SDL_rpivideo.h deleted file mode 100644 index 74dcf941469..00000000000 --- a/3rdparty/SDL2/src/video/raspberry/SDL_rpivideo.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef __SDL_RPIVIDEO_H__ -#define __SDL_RPIVIDEO_H__ - -#include "../../SDL_internal.h" -#include "../SDL_sysvideo.h" - -#include "bcm_host.h" -#include "GLES/gl.h" -#include "EGL/egl.h" -#include "EGL/eglext.h" - -typedef struct SDL_VideoData -{ - uint32_t egl_refcount; /* OpenGL ES reference count */ -} SDL_VideoData; - - -typedef struct SDL_DisplayData -{ - DISPMANX_DISPLAY_HANDLE_T dispman_display; -} SDL_DisplayData; - - -typedef struct SDL_WindowData -{ - EGL_DISPMANX_WINDOW_T dispman_window; -#if SDL_VIDEO_OPENGL_EGL - EGLSurface egl_surface; -#endif -} SDL_WindowData; - -#define SDL_RPI_VIDEOLAYER 10000 /* High enough so to occlude everything */ -#define SDL_RPI_MOUSELAYER SDL_RPI_VIDEOLAYER + 1 - - -/****************************************************************************/ -/* SDL_VideoDevice functions declaration */ -/****************************************************************************/ - -/* Display and window functions */ -int RPI_VideoInit(_THIS); -void RPI_VideoQuit(_THIS); -void RPI_GetDisplayModes(_THIS, SDL_VideoDisplay * display); -int RPI_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -int RPI_CreateWindow(_THIS, SDL_Window * window); -int RPI_CreateWindowFrom(_THIS, SDL_Window * window, const void *data); -void RPI_SetWindowTitle(_THIS, SDL_Window * window); -void RPI_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon); -void RPI_SetWindowPosition(_THIS, SDL_Window * window); -void RPI_SetWindowSize(_THIS, SDL_Window * window); -void RPI_ShowWindow(_THIS, SDL_Window * window); -void RPI_HideWindow(_THIS, SDL_Window * window); -void RPI_RaiseWindow(_THIS, SDL_Window * window); -void RPI_MaximizeWindow(_THIS, SDL_Window * window); -void RPI_MinimizeWindow(_THIS, SDL_Window * window); -void RPI_RestoreWindow(_THIS, SDL_Window * window); -void RPI_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed); -void RPI_DestroyWindow(_THIS, SDL_Window * window); - -/* Window manager function */ -SDL_bool RPI_GetWindowWMInfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo *info); - -/* OpenGL/OpenGL ES functions */ -int RPI_GLES_LoadLibrary(_THIS, const char *path); -void *RPI_GLES_GetProcAddress(_THIS, const char *proc); -void RPI_GLES_UnloadLibrary(_THIS); -SDL_GLContext RPI_GLES_CreateContext(_THIS, SDL_Window * window); -int RPI_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); -int RPI_GLES_SetSwapInterval(_THIS, int interval); -int RPI_GLES_GetSwapInterval(_THIS); -void RPI_GLES_SwapWindow(_THIS, SDL_Window * window); -void RPI_GLES_DeleteContext(_THIS, SDL_GLContext context); - -#endif /* __SDL_RPIVIDEO_H__ */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/sdlgenblit.pl b/3rdparty/SDL2/src/video/sdlgenblit.pl deleted file mode 100644 index 9ebffafc491..00000000000 --- a/3rdparty/SDL2/src/video/sdlgenblit.pl +++ /dev/null @@ -1,535 +0,0 @@ -#!/usr/bin/perl -w -# -# A script to generate optimized C blitters for Simple DirectMedia Layer -# http://www.libsdl.org/ - -use warnings; -use strict; - -my %file; - -# The formats potentially supported by this script: -# SDL_PIXELFORMAT_RGB332 -# SDL_PIXELFORMAT_RGB444 -# SDL_PIXELFORMAT_RGB555 -# SDL_PIXELFORMAT_ARGB4444 -# SDL_PIXELFORMAT_ARGB1555 -# SDL_PIXELFORMAT_RGB565 -# SDL_PIXELFORMAT_RGB24 -# SDL_PIXELFORMAT_BGR24 -# SDL_PIXELFORMAT_RGB888 -# SDL_PIXELFORMAT_BGR888 -# SDL_PIXELFORMAT_ARGB8888 -# SDL_PIXELFORMAT_RGBA8888 -# SDL_PIXELFORMAT_ABGR8888 -# SDL_PIXELFORMAT_BGRA8888 -# SDL_PIXELFORMAT_ARGB2101010 - -# The formats we're actually creating blitters for: -my @src_formats = ( - "RGB888", - "BGR888", - "ARGB8888", - "RGBA8888", - "ABGR8888", - "BGRA8888", -); -my @dst_formats = ( - "RGB888", - "BGR888", - "ARGB8888", -); - -my %format_size = ( - "RGB888" => 4, - "BGR888" => 4, - "ARGB8888" => 4, - "RGBA8888" => 4, - "ABGR8888" => 4, - "BGRA8888" => 4, -); - -my %format_type = ( - "RGB888" => "Uint32", - "BGR888" => "Uint32", - "ARGB8888" => "Uint32", - "RGBA8888" => "Uint32", - "ABGR8888" => "Uint32", - "BGRA8888" => "Uint32", -); - -my %get_rgba_string_ignore_alpha = ( - "RGB888" => "_R = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _B = (Uint8)_pixel;", - "BGR888" => "_B = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _R = (Uint8)_pixel;", - "ARGB8888" => "_R = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _B = (Uint8)_pixel;", - "RGBA8888" => "_R = (Uint8)(_pixel >> 24); _G = (Uint8)(_pixel >> 16); _B = (Uint8)(_pixel >> 8);", - "ABGR8888" => "_B = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _R = (Uint8)_pixel;", - "BGRA8888" => "_B = (Uint8)(_pixel >> 24); _G = (Uint8)(_pixel >> 16); _R = (Uint8)(_pixel >> 8);", -); - -my %get_rgba_string = ( - "RGB888" => $get_rgba_string_ignore_alpha{"RGB888"} . " _A = 0xFF;", - "BGR888" => $get_rgba_string_ignore_alpha{"BGR888"} . " _A = 0xFF;", - "ARGB8888" => $get_rgba_string_ignore_alpha{"ARGB8888"} . " _A = (Uint8)(_pixel >> 24);", - "RGBA8888" => $get_rgba_string_ignore_alpha{"RGBA8888"} . " _A = (Uint8)_pixel;", - "ABGR8888" => $get_rgba_string_ignore_alpha{"ABGR8888"} . " _A = (Uint8)(_pixel >> 24);", - "BGRA8888" => $get_rgba_string_ignore_alpha{"BGRA8888"} . " _A = (Uint8)_pixel;", -); - -my %set_rgba_string = ( - "RGB888" => "_pixel = ((Uint32)_R << 16) | ((Uint32)_G << 8) | _B;", - "BGR888" => "_pixel = ((Uint32)_B << 16) | ((Uint32)_G << 8) | _R;", - "ARGB8888" => "_pixel = ((Uint32)_A << 24) | ((Uint32)_R << 16) | ((Uint32)_G << 8) | _B;", - "RGBA8888" => "_pixel = ((Uint32)_R << 24) | ((Uint32)_G << 16) | ((Uint32)_B << 8) | _A;", - "ABGR8888" => "_pixel = ((Uint32)_A << 24) | ((Uint32)_B << 16) | ((Uint32)_G << 8) | _R;", - "BGRA8888" => "_pixel = ((Uint32)_B << 24) | ((Uint32)_G << 16) | ((Uint32)_R << 8) | _A;", -); - -sub open_file { - my $name = shift; - open(FILE, ">$name.new") || die "Cant' open $name.new: $!"; - print FILE <<__EOF__; -/* DO NOT EDIT! This file is generated by sdlgenblit.pl */ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken\@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* *INDENT-OFF* */ - -__EOF__ -} - -sub close_file { - my $name = shift; - print FILE <<__EOF__; -/* *INDENT-ON* */ - -/* vi: set ts=4 sw=4 expandtab: */ -__EOF__ - close FILE; - if ( ! -f $name || system("cmp -s $name $name.new") != 0 ) { - rename("$name.new", "$name"); - } else { - unlink("$name.new"); - } -} - -sub output_copydefs -{ - print FILE <<__EOF__; -extern SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[]; -__EOF__ -} - -sub output_copyfuncname -{ - my $prefix = shift; - my $src = shift; - my $dst = shift; - my $modulate = shift; - my $blend = shift; - my $scale = shift; - my $args = shift; - my $suffix = shift; - - print FILE "$prefix SDL_Blit_${src}_${dst}"; - if ( $modulate ) { - print FILE "_Modulate"; - } - if ( $blend ) { - print FILE "_Blend"; - } - if ( $scale ) { - print FILE "_Scale"; - } - if ( $args ) { - print FILE "(SDL_BlitInfo *info)"; - } - print FILE "$suffix"; -} - -sub get_rgba -{ - my $prefix = shift; - my $format = shift; - my $ignore_alpha = shift; - - my $string; - if ($ignore_alpha) { - $string = $get_rgba_string_ignore_alpha{$format}; - } else { - $string = $get_rgba_string{$format}; - } - - $string =~ s/_/$prefix/g; - if ( $prefix ne "" ) { - print FILE <<__EOF__; - ${prefix}pixel = *$prefix; -__EOF__ - } else { - print FILE <<__EOF__; - pixel = *src; -__EOF__ - } - print FILE <<__EOF__; - $string -__EOF__ -} - -sub set_rgba -{ - my $prefix = shift; - my $format = shift; - my $string = $set_rgba_string{$format}; - $string =~ s/_/$prefix/g; - print FILE <<__EOF__; - $string - *dst = ${prefix}pixel; -__EOF__ -} - -sub output_copycore -{ - my $src = shift; - my $dst = shift; - my $modulate = shift; - my $blend = shift; - my $s = ""; - my $d = ""; - - # Nice and easy... - if ( $src eq $dst && !$modulate && !$blend ) { - print FILE <<__EOF__; - *dst = *src; -__EOF__ - return; - } - - my $dst_has_alpha = ($dst =~ /A/) ? 1 : 0; - my $ignore_dst_alpha = !$dst_has_alpha && !$blend; - - if ( $blend ) { - get_rgba("src", $src, $ignore_dst_alpha); - get_rgba("dst", $dst, !$dst_has_alpha); - $s = "src"; - $d = "dst"; - } else { - get_rgba("", $src, $ignore_dst_alpha); - } - - if ( $modulate ) { - print FILE <<__EOF__; - if (flags & SDL_COPY_MODULATE_COLOR) { - ${s}R = (${s}R * modulateR) / 255; - ${s}G = (${s}G * modulateG) / 255; - ${s}B = (${s}B * modulateB) / 255; - } -__EOF__ - if (not $ignore_dst_alpha) { - print FILE <<__EOF__; - if (flags & SDL_COPY_MODULATE_ALPHA) { - ${s}A = (${s}A * modulateA) / 255; - } -__EOF__ - } - } - if ( $blend ) { - print FILE <<__EOF__; - if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ - if (${s}A < 255) { - ${s}R = (${s}R * ${s}A) / 255; - ${s}G = (${s}G * ${s}A) / 255; - ${s}B = (${s}B * ${s}A) / 255; - } - } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { - case SDL_COPY_BLEND: - ${d}R = ${s}R + ((255 - ${s}A) * ${d}R) / 255; - ${d}G = ${s}G + ((255 - ${s}A) * ${d}G) / 255; - ${d}B = ${s}B + ((255 - ${s}A) * ${d}B) / 255; -__EOF__ - - if ( $dst_has_alpha ) { - print FILE <<__EOF__; - ${d}A = ${s}A + ((255 - ${s}A) * ${d}A) / 255; -__EOF__ - } - - print FILE <<__EOF__; - break; - case SDL_COPY_ADD: - ${d}R = ${s}R + ${d}R; if (${d}R > 255) ${d}R = 255; - ${d}G = ${s}G + ${d}G; if (${d}G > 255) ${d}G = 255; - ${d}B = ${s}B + ${d}B; if (${d}B > 255) ${d}B = 255; - break; - case SDL_COPY_MOD: - ${d}R = (${s}R * ${d}R) / 255; - ${d}G = (${s}G * ${d}G) / 255; - ${d}B = (${s}B * ${d}B) / 255; - break; - } -__EOF__ - } - if ( $blend ) { - set_rgba("dst", $dst); - } else { - set_rgba("", $dst); - } -} - -sub output_copyfunc -{ - my $src = shift; - my $dst = shift; - my $modulate = shift; - my $blend = shift; - my $scale = shift; - - my $dst_has_alpha = ($dst =~ /A/) ? 1 : 0; - my $ignore_dst_alpha = !$dst_has_alpha && !$blend; - - output_copyfuncname("static void", $src, $dst, $modulate, $blend, $scale, 1, "\n"); - print FILE <<__EOF__; -{ -__EOF__ - if ( $modulate || $blend ) { - print FILE <<__EOF__; - const int flags = info->flags; -__EOF__ - } - if ( $modulate ) { - print FILE <<__EOF__; - const Uint32 modulateR = info->r; - const Uint32 modulateG = info->g; - const Uint32 modulateB = info->b; -__EOF__ - if (!$ignore_dst_alpha) { - print FILE <<__EOF__; - const Uint32 modulateA = info->a; -__EOF__ - } - } - if ( $blend ) { - print FILE <<__EOF__; - Uint32 srcpixel; - Uint32 srcR, srcG, srcB, srcA; - Uint32 dstpixel; -__EOF__ - if ($dst_has_alpha) { - print FILE <<__EOF__; - Uint32 dstR, dstG, dstB, dstA; -__EOF__ - } else { - print FILE <<__EOF__; - Uint32 dstR, dstG, dstB; -__EOF__ - } - } elsif ( $modulate || $src ne $dst ) { - print FILE <<__EOF__; - Uint32 pixel; -__EOF__ - if (!$ignore_dst_alpha) { - print FILE <<__EOF__; - Uint32 R, G, B, A; -__EOF__ - } else { - print FILE <<__EOF__; - Uint32 R, G, B; -__EOF__ - } - } - if ( $scale ) { - print FILE <<__EOF__; - int srcy, srcx; - int posy, posx; - int incy, incx; -__EOF__ - - print FILE <<__EOF__; - - srcy = 0; - posy = 0; - incy = (info->src_h << 16) / info->dst_h; - incx = (info->src_w << 16) / info->dst_w; - - while (info->dst_h--) { - $format_type{$src} *src = 0; - $format_type{$dst} *dst = ($format_type{$dst} *)info->dst; - int n = info->dst_w; - srcx = -1; - posx = 0x10000L; - while (posy >= 0x10000L) { - ++srcy; - posy -= 0x10000L; - } - while (n--) { - if (posx >= 0x10000L) { - while (posx >= 0x10000L) { - ++srcx; - posx -= 0x10000L; - } - src = ($format_type{$src} *)(info->src + (srcy * info->src_pitch) + (srcx * $format_size{$src})); -__EOF__ - print FILE <<__EOF__; - } -__EOF__ - output_copycore($src, $dst, $modulate, $blend); - print FILE <<__EOF__; - posx += incx; - ++dst; - } - posy += incy; - info->dst += info->dst_pitch; - } -__EOF__ - } else { - print FILE <<__EOF__; - - while (info->dst_h--) { - $format_type{$src} *src = ($format_type{$src} *)info->src; - $format_type{$dst} *dst = ($format_type{$dst} *)info->dst; - int n = info->dst_w; - while (n--) { -__EOF__ - output_copycore($src, $dst, $modulate, $blend); - print FILE <<__EOF__; - ++src; - ++dst; - } - info->src += info->src_pitch; - info->dst += info->dst_pitch; - } -__EOF__ - } - print FILE <<__EOF__; -} - -__EOF__ -} - -sub output_copyfunc_h -{ -} - -sub output_copyinc -{ - print FILE <<__EOF__; -#include "SDL_video.h" -#include "SDL_blit.h" -#include "SDL_blit_auto.h" - -__EOF__ -} - -sub output_copyfunctable -{ - print FILE <<__EOF__; -SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[] = { -__EOF__ - for (my $i = 0; $i <= $#src_formats; ++$i) { - my $src = $src_formats[$i]; - for (my $j = 0; $j <= $#dst_formats; ++$j) { - my $dst = $dst_formats[$j]; - for (my $modulate = 0; $modulate <= 1; ++$modulate) { - for (my $blend = 0; $blend <= 1; ++$blend) { - for (my $scale = 0; $scale <= 1; ++$scale) { - if ( $modulate || $blend || $scale ) { - print FILE " { SDL_PIXELFORMAT_$src, SDL_PIXELFORMAT_$dst, "; - my $flags = ""; - my $flag = ""; - if ( $modulate ) { - $flag = "SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA"; - if ( $flags eq "" ) { - $flags = $flag; - } else { - $flags = "$flags | $flag"; - } - } - if ( $blend ) { - $flag = "SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD"; - if ( $flags eq "" ) { - $flags = $flag; - } else { - $flags = "$flags | $flag"; - } - } - if ( $scale ) { - $flag = "SDL_COPY_NEAREST"; - if ( $flags eq "" ) { - $flags = $flag; - } else { - $flags = "$flags | $flag"; - } - } - if ( $flags eq "" ) { - $flags = "0"; - } - print FILE "($flags), SDL_CPU_ANY,"; - output_copyfuncname("", $src_formats[$i], $dst_formats[$j], $modulate, $blend, $scale, 0, " },\n"); - } - } - } - } - } - } - print FILE <<__EOF__; - { 0, 0, 0, 0, NULL } -}; - -__EOF__ -} - -sub output_copyfunc_c -{ - my $src = shift; - my $dst = shift; - - for (my $modulate = 0; $modulate <= 1; ++$modulate) { - for (my $blend = 0; $blend <= 1; ++$blend) { - for (my $scale = 0; $scale <= 1; ++$scale) { - if ( $modulate || $blend || $scale ) { - output_copyfunc($src, $dst, $modulate, $blend, $scale); - } - } - } - } -} - -open_file("SDL_blit_auto.h"); -output_copydefs(); -for (my $i = 0; $i <= $#src_formats; ++$i) { - for (my $j = 0; $j <= $#dst_formats; ++$j) { - output_copyfunc_h($src_formats[$i], $dst_formats[$j]); - } -} -print FILE "\n"; -close_file("SDL_blit_auto.h"); - -open_file("SDL_blit_auto.c"); -output_copyinc(); -for (my $i = 0; $i <= $#src_formats; ++$i) { - for (my $j = 0; $j <= $#dst_formats; ++$j) { - output_copyfunc_c($src_formats[$i], $dst_formats[$j]); - } -} -output_copyfunctable(); -close_file("SDL_blit_auto.c"); diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.h deleted file mode 100644 index edf09f50fc9..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#import <UIKit/UIKit.h> - -@interface SDLLaunchScreenController : UIViewController - -- (instancetype)init; -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; -- (void)loadView; - -@end - -@interface SDLUIKitDelegate : NSObject<UIApplicationDelegate> - -+ (id)sharedAppDelegate; -+ (NSString *)getAppDelegateClassName; - -- (void)hideLaunchScreen; - -@end - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.m deleted file mode 100644 index c94c78a4168..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.m +++ /dev/null @@ -1,535 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "../SDL_sysvideo.h" -#include "SDL_assert.h" -#include "SDL_hints.h" -#include "SDL_system.h" -#include "SDL_main.h" - -#import "SDL_uikitappdelegate.h" -#import "SDL_uikitmodes.h" -#import "SDL_uikitwindow.h" - -#include "../../events/SDL_events_c.h" - -#ifdef main -#undef main -#endif - -static int forward_argc; -static char **forward_argv; -static int exit_status; - -int main(int argc, char **argv) -{ - int i; - - /* store arguments */ - forward_argc = argc; - forward_argv = (char **)malloc((argc+1) * sizeof(char *)); - for (i = 0; i < argc; i++) { - forward_argv[i] = malloc( (strlen(argv[i])+1) * sizeof(char)); - strcpy(forward_argv[i], argv[i]); - } - forward_argv[i] = NULL; - - /* Give over control to run loop, SDLUIKitDelegate will handle most things from here */ - @autoreleasepool { - UIApplicationMain(argc, argv, nil, [SDLUIKitDelegate getAppDelegateClassName]); - } - - /* free the memory we used to hold copies of argc and argv */ - for (i = 0; i < forward_argc; i++) { - free(forward_argv[i]); - } - free(forward_argv); - - return exit_status; -} - -static void -SDL_IdleTimerDisabledChanged(void *userdata, const char *name, const char *oldValue, const char *hint) -{ - BOOL disable = (hint && *hint != '0'); - [UIApplication sharedApplication].idleTimerDisabled = disable; -} - -#if !TARGET_OS_TV -/* Load a launch image using the old UILaunchImageFile-era naming rules. */ -static UIImage * -SDL_LoadLaunchImageNamed(NSString *name, int screenh) -{ - UIInterfaceOrientation curorient = [UIApplication sharedApplication].statusBarOrientation; - UIUserInterfaceIdiom idiom = [UIDevice currentDevice].userInterfaceIdiom; - UIImage *image = nil; - - if (idiom == UIUserInterfaceIdiomPhone && screenh == 568) { - /* The image name for the iPhone 5 uses its height as a suffix. */ - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-568h", name]]; - } else if (idiom == UIUserInterfaceIdiomPad) { - /* iPad apps can launch in any orientation. */ - if (UIInterfaceOrientationIsLandscape(curorient)) { - if (curorient == UIInterfaceOrientationLandscapeLeft) { - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-LandscapeLeft", name]]; - } else { - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-LandscapeRight", name]]; - } - if (!image) { - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-Landscape", name]]; - } - } else { - if (curorient == UIInterfaceOrientationPortraitUpsideDown) { - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-PortraitUpsideDown", name]]; - } - if (!image) { - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-Portrait", name]]; - } - } - } - - if (!image) { - image = [UIImage imageNamed:name]; - } - - return image; -} -#endif /* !TARGET_OS_TV */ - -@interface SDLLaunchScreenController () - -#if !TARGET_OS_TV -- (NSUInteger)supportedInterfaceOrientations; -#endif - -@end - -@implementation SDLLaunchScreenController - -- (instancetype)init -{ - return [self initWithNibName:nil bundle:[NSBundle mainBundle]]; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - if (!(self = [super initWithNibName:nil bundle:nil])) { - return nil; - } - - NSString *screenname = nibNameOrNil; - NSBundle *bundle = nibBundleOrNil; - BOOL atleastiOS8 = UIKit_IsSystemVersionAtLeast(8.0); - - /* Launch screens were added in iOS 8. Otherwise we use launch images. */ - if (screenname && atleastiOS8) { - @try { - self.view = [bundle loadNibNamed:screenname owner:self options:nil][0]; - } - @catch (NSException *exception) { - /* If a launch screen name is specified but it fails to load, iOS - * displays a blank screen rather than falling back to an image. */ - return nil; - } - } - - if (!self.view) { - NSArray *launchimages = [bundle objectForInfoDictionaryKey:@"UILaunchImages"]; - NSString *imagename = nil; - UIImage *image = nil; - - int screenw = (int)([UIScreen mainScreen].bounds.size.width + 0.5); - int screenh = (int)([UIScreen mainScreen].bounds.size.height + 0.5); - -#if !TARGET_OS_TV - UIInterfaceOrientation curorient = [UIApplication sharedApplication].statusBarOrientation; - - /* We always want portrait-oriented size, to match UILaunchImageSize. */ - if (screenw > screenh) { - int width = screenw; - screenw = screenh; - screenh = width; - } -#endif - - /* Xcode 5 introduced a dictionary of launch images in Info.plist. */ - if (launchimages) { - for (NSDictionary *dict in launchimages) { - NSString *minversion = dict[@"UILaunchImageMinimumOSVersion"]; - NSString *sizestring = dict[@"UILaunchImageSize"]; - - /* Ignore this image if the current version is too low. */ - if (minversion && !UIKit_IsSystemVersionAtLeast(minversion.doubleValue)) { - continue; - } - - /* Ignore this image if the size doesn't match. */ - if (sizestring) { - CGSize size = CGSizeFromString(sizestring); - if ((int)(size.width + 0.5) != screenw || (int)(size.height + 0.5) != screenh) { - continue; - } - } - -#if !TARGET_OS_TV - UIInterfaceOrientationMask orientmask = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; - NSString *orientstring = dict[@"UILaunchImageOrientation"]; - - if (orientstring) { - if ([orientstring isEqualToString:@"PortraitUpsideDown"]) { - orientmask = UIInterfaceOrientationMaskPortraitUpsideDown; - } else if ([orientstring isEqualToString:@"Landscape"]) { - orientmask = UIInterfaceOrientationMaskLandscape; - } else if ([orientstring isEqualToString:@"LandscapeLeft"]) { - orientmask = UIInterfaceOrientationMaskLandscapeLeft; - } else if ([orientstring isEqualToString:@"LandscapeRight"]) { - orientmask = UIInterfaceOrientationMaskLandscapeRight; - } - } - - /* Ignore this image if the orientation doesn't match. */ - if ((orientmask & (1 << curorient)) == 0) { - continue; - } -#endif - - imagename = dict[@"UILaunchImageName"]; - } - - if (imagename) { - image = [UIImage imageNamed:imagename]; - } - } -#if !TARGET_OS_TV - else { - imagename = [bundle objectForInfoDictionaryKey:@"UILaunchImageFile"]; - - if (imagename) { - image = SDL_LoadLaunchImageNamed(imagename, screenh); - } - - if (!image) { - image = SDL_LoadLaunchImageNamed(@"Default", screenh); - } - } -#endif - - if (image) { - UIImageView *view = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds]; - UIImageOrientation imageorient = UIImageOrientationUp; - -#if !TARGET_OS_TV - /* Bugs observed / workaround tested in iOS 8.3, 7.1, and 6.1. */ - if (UIInterfaceOrientationIsLandscape(curorient)) { - if (atleastiOS8 && image.size.width < image.size.height) { - /* On iOS 8, portrait launch images displayed in forced- - * landscape mode (e.g. a standard Default.png on an iPhone - * when Info.plist only supports landscape orientations) need - * to be rotated to display in the expected orientation. */ - if (curorient == UIInterfaceOrientationLandscapeLeft) { - imageorient = UIImageOrientationRight; - } else if (curorient == UIInterfaceOrientationLandscapeRight) { - imageorient = UIImageOrientationLeft; - } - } else if (!atleastiOS8 && image.size.width > image.size.height) { - /* On iOS 7 and below, landscape launch images displayed in - * landscape mode (e.g. landscape iPad launch images) need - * to be rotated to display in the expected orientation. */ - if (curorient == UIInterfaceOrientationLandscapeLeft) { - imageorient = UIImageOrientationLeft; - } else if (curorient == UIInterfaceOrientationLandscapeRight) { - imageorient = UIImageOrientationRight; - } - } - } -#endif - - /* Create the properly oriented image. */ - view.image = [[UIImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:imageorient]; - - self.view = view; - } - } - - return self; -} - -- (void)loadView -{ - /* Do nothing. */ -} - -#if !TARGET_OS_TV -- (BOOL)shouldAutorotate -{ - /* If YES, the launch image will be incorrectly rotated in some cases. */ - return NO; -} - -- (NSUInteger)supportedInterfaceOrientations -{ - /* We keep the supported orientations unrestricted to avoid the case where - * there are no common orientations between the ones set in Info.plist and - * the ones set here (it will cause an exception in that case.) */ - return UIInterfaceOrientationMaskAll; -} -#endif /* !TARGET_OS_TV */ - -@end - -@implementation SDLUIKitDelegate { - UIWindow *launchWindow; -} - -/* convenience method */ -+ (id)sharedAppDelegate -{ - /* the delegate is set in UIApplicationMain(), which is guaranteed to be - * called before this method */ - return [UIApplication sharedApplication].delegate; -} - -+ (NSString *)getAppDelegateClassName -{ - /* subclassing notice: when you subclass this appdelegate, make sure to add - * a category to override this method and return the actual name of the - * delegate */ - return @"SDLUIKitDelegate"; -} - -- (void)hideLaunchScreen -{ - UIWindow *window = launchWindow; - - if (!window || window.hidden) { - return; - } - - launchWindow = nil; - - /* Do a nice animated fade-out (roughly matches the real launch behavior.) */ - [UIView animateWithDuration:0.2 animations:^{ - window.alpha = 0.0; - } completion:^(BOOL finished) { - window.hidden = YES; - }]; -} - -- (void)postFinishLaunch -{ - /* Hide the launch screen the next time the run loop is run. SDL apps will - * have a chance to load resources while the launch screen is still up. */ - [self performSelector:@selector(hideLaunchScreen) withObject:nil afterDelay:0.0]; - - /* run the user's application, passing argc and argv */ - SDL_iPhoneSetEventPump(SDL_TRUE); - exit_status = SDL_main(forward_argc, forward_argv); - SDL_iPhoneSetEventPump(SDL_FALSE); - - if (launchWindow) { - launchWindow.hidden = YES; - launchWindow = nil; - } - - /* exit, passing the return status from the user's application */ - /* We don't actually exit to support applications that do setup in their - * main function and then allow the Cocoa event loop to run. */ - /* exit(exit_status); */ -} - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - NSBundle *bundle = [NSBundle mainBundle]; - -#if SDL_IPHONE_LAUNCHSCREEN - /* The normal launch screen is displayed until didFinishLaunching returns, - * but SDL_main is called after that happens and there may be a noticeable - * delay between the start of SDL_main and when the first real frame is - * displayed (e.g. if resources are loaded before SDL_GL_SwapWindow is - * called), so we show the launch screen programmatically until the first - * time events are pumped. */ - UIViewController *vc = nil; - NSString *screenname = nil; - - /* tvOS only uses a plain launch image. */ -#if !TARGET_OS_TV - screenname = [bundle objectForInfoDictionaryKey:@"UILaunchStoryboardName"]; - - if (screenname && UIKit_IsSystemVersionAtLeast(8.0)) { - @try { - /* The launch storyboard is actually a nib in some older versions of - * Xcode. We'll try to load it as a storyboard first, as it's more - * modern. */ - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:screenname bundle:bundle]; - vc = [storyboard instantiateInitialViewController]; - } - @catch (NSException *exception) { - /* Do nothing (there's more code to execute below). */ - } - } -#endif - - if (vc == nil) { - vc = [[SDLLaunchScreenController alloc] initWithNibName:screenname bundle:bundle]; - } - - if (vc.view) { - launchWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - - /* We don't want the launch window immediately hidden when a real SDL - * window is shown - we fade it out ourselves when we're ready. */ - launchWindow.windowLevel = UIWindowLevelNormal + 1.0; - - /* Show the window but don't make it key. Events should always go to - * other windows when possible. */ - launchWindow.hidden = NO; - - launchWindow.rootViewController = vc; - } -#endif - - /* Set working directory to resource path */ - [[NSFileManager defaultManager] changeCurrentDirectoryPath:[bundle resourcePath]]; - - /* register a callback for the idletimer hint */ - SDL_AddHintCallback(SDL_HINT_IDLE_TIMER_DISABLED, - SDL_IdleTimerDisabledChanged, NULL); - - SDL_SetMainReady(); - [self performSelector:@selector(postFinishLaunch) withObject:nil afterDelay:0.0]; - - return YES; -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - SDL_SendAppEvent(SDL_APP_TERMINATING); -} - -- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application -{ - SDL_SendAppEvent(SDL_APP_LOWMEMORY); -} - -#if !TARGET_OS_TV -- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation -{ - BOOL isLandscape = UIInterfaceOrientationIsLandscape(application.statusBarOrientation); - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - - if (_this && _this->num_displays > 0) { - SDL_DisplayMode *desktopmode = &_this->displays[0].desktop_mode; - SDL_DisplayMode *currentmode = &_this->displays[0].current_mode; - - /* The desktop display mode should be kept in sync with the screen - * orientation so that updating a window's fullscreen state to - * SDL_WINDOW_FULLSCREEN_DESKTOP keeps the window dimensions in the - * correct orientation. */ - if (isLandscape != (desktopmode->w > desktopmode->h)) { - int height = desktopmode->w; - desktopmode->w = desktopmode->h; - desktopmode->h = height; - } - - /* Same deal with the current mode + SDL_GetCurrentDisplayMode. */ - if (isLandscape != (currentmode->w > currentmode->h)) { - int height = currentmode->w; - currentmode->w = currentmode->h; - currentmode->h = height; - } - } -} -#endif - -- (void)applicationWillResignActive:(UIApplication*)application -{ - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - if (_this) { - SDL_Window *window; - for (window = _this->windows; window != nil; window = window->next) { - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0); - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MINIMIZED, 0, 0); - } - } - SDL_SendAppEvent(SDL_APP_WILLENTERBACKGROUND); -} - -- (void)applicationDidEnterBackground:(UIApplication*)application -{ - SDL_SendAppEvent(SDL_APP_DIDENTERBACKGROUND); -} - -- (void)applicationWillEnterForeground:(UIApplication*)application -{ - SDL_SendAppEvent(SDL_APP_WILLENTERFOREGROUND); -} - -- (void)applicationDidBecomeActive:(UIApplication*)application -{ - SDL_SendAppEvent(SDL_APP_DIDENTERFOREGROUND); - - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - if (_this) { - SDL_Window *window; - for (window = _this->windows; window != nil; window = window->next) { - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_FOCUS_GAINED, 0, 0); - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESTORED, 0, 0); - } - } -} - -- (void)sendDropFileForURL:(NSURL *)url -{ - NSURL *fileURL = url.filePathURL; - if (fileURL != nil) { - SDL_SendDropFile(NULL, fileURL.path.UTF8String); - } else { - SDL_SendDropFile(NULL, url.absoluteString.UTF8String); - } - SDL_SendDropComplete(NULL); -} - -#if TARGET_OS_TV -/* TODO: Use this on iOS 9+ as well? */ -- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options -{ - /* TODO: Handle options */ - [self sendDropFileForURL:url]; - return YES; -} -#endif /* TARGET_OS_TV */ - -#if !TARGET_OS_TV -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation -{ - [self sendDropFileForURL:url]; - return YES; -} -#endif /* !TARGET_OS_TV */ - -@end - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitclipboard.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitclipboard.h deleted file mode 100644 index 7d1c35f99ee..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitclipboard.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#ifndef _SDL_uikitclipboard_h -#define _SDL_uikitclipboard_h - -#include "../SDL_sysvideo.h" - -extern int UIKit_SetClipboardText(_THIS, const char *text); -extern char *UIKit_GetClipboardText(_THIS); -extern SDL_bool UIKit_HasClipboardText(_THIS); - -extern void UIKit_InitClipboard(_THIS); -extern void UIKit_QuitClipboard(_THIS); - -#endif /* _SDL_uikitclipboard_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitclipboard.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitclipboard.m deleted file mode 100644 index 050d5885fc9..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitclipboard.m +++ /dev/null @@ -1,111 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "SDL_uikitvideo.h" -#include "../../events/SDL_clipboardevents_c.h" - -#import <UIKit/UIPasteboard.h> - -int -UIKit_SetClipboardText(_THIS, const char *text) -{ -#if TARGET_OS_TV - return SDL_SetError("The clipboard is not available on tvOS"); -#else - @autoreleasepool { - [UIPasteboard generalPasteboard].string = @(text); - return 0; - } -#endif -} - -char * -UIKit_GetClipboardText(_THIS) -{ -#if TARGET_OS_TV - return SDL_strdup(""); // Unsupported. -#else - @autoreleasepool { - UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; - NSString *string = pasteboard.string; - - if (string != nil) { - return SDL_strdup(string.UTF8String); - } else { - return SDL_strdup(""); - } - } -#endif -} - -SDL_bool -UIKit_HasClipboardText(_THIS) -{ - @autoreleasepool { -#if !TARGET_OS_TV - if ([UIPasteboard generalPasteboard].string != nil) { - return SDL_TRUE; - } -#endif - return SDL_FALSE; - } -} - -void -UIKit_InitClipboard(_THIS) -{ -#if !TARGET_OS_TV - @autoreleasepool { - SDL_VideoData *data = (__bridge SDL_VideoData *) _this->driverdata; - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - - id observer = [center addObserverForName:UIPasteboardChangedNotification - object:nil - queue:nil - usingBlock:^(NSNotification *note) { - SDL_SendClipboardUpdate(); - }]; - - data.pasteboardObserver = observer; - } -#endif -} - -void -UIKit_QuitClipboard(_THIS) -{ - @autoreleasepool { - SDL_VideoData *data = (__bridge SDL_VideoData *) _this->driverdata; - - if (data.pasteboardObserver != nil) { - [[NSNotificationCenter defaultCenter] removeObserver:data.pasteboardObserver]; - } - - data.pasteboardObserver = nil; - } -} - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitevents.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitevents.h deleted file mode 100644 index 9b1d60c59d4..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitevents.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#ifndef _SDL_uikitevents_h -#define _SDL_uikitevents_h - -#include "../SDL_sysvideo.h" - -extern void UIKit_PumpEvents(_THIS); - -#endif /* _SDL_uikitevents_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitevents.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitevents.m deleted file mode 100644 index 7083e204bba..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitevents.m +++ /dev/null @@ -1,73 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "../../events/SDL_events_c.h" - -#include "SDL_uikitvideo.h" -#include "SDL_uikitevents.h" -#include "SDL_uikitopengles.h" - -#import <Foundation/Foundation.h> - -static BOOL UIKit_EventPumpEnabled = YES; - -void -SDL_iPhoneSetEventPump(SDL_bool enabled) -{ - UIKit_EventPumpEnabled = enabled; -} - -void -UIKit_PumpEvents(_THIS) -{ - if (!UIKit_EventPumpEnabled) { - return; - } - - /* Let the run loop run for a short amount of time: long enough for - touch events to get processed (which is important to get certain - elements of Game Center's GKLeaderboardViewController to respond - to touch input), but not long enough to introduce a significant - delay in the rest of the app. - */ - const CFTimeInterval seconds = 0.000002; - - /* Pump most event types. */ - SInt32 result; - do { - result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, seconds, TRUE); - } while (result == kCFRunLoopRunHandledSource); - - /* Make sure UIScrollView objects scroll properly. */ - do { - result = CFRunLoopRunInMode((CFStringRef)UITrackingRunLoopMode, seconds, TRUE); - } while(result == kCFRunLoopRunHandledSource); - - /* See the comment in the function definition. */ - UIKit_GL_RestoreCurrentContext(); -} - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitmessagebox.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitmessagebox.h deleted file mode 100644 index 5280724135e..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitmessagebox.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -extern SDL_bool UIKit_ShowingMessageBox(); - -extern int UIKit_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitmessagebox.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitmessagebox.m deleted file mode 100644 index 5778032a064..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitmessagebox.m +++ /dev/null @@ -1,194 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "SDL.h" -#include "SDL_uikitvideo.h" -#include "SDL_uikitwindow.h" - -/* Display a UIKit message box */ - -static SDL_bool s_showingMessageBox = SDL_FALSE; - -SDL_bool -UIKit_ShowingMessageBox() -{ - return s_showingMessageBox; -} - -static void -UIKit_WaitUntilMessageBoxClosed(const SDL_MessageBoxData *messageboxdata, int *clickedindex) -{ - *clickedindex = messageboxdata->numbuttons; - - @autoreleasepool { - /* Run the main event loop until the alert has finished */ - /* Note that this needs to be done on the main thread */ - s_showingMessageBox = SDL_TRUE; - while ((*clickedindex) == messageboxdata->numbuttons) { - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; - } - s_showingMessageBox = SDL_FALSE; - } -} - -static BOOL -UIKit_ShowMessageBoxAlertController(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ -#ifdef __IPHONE_8_0 - int i; - int __block clickedindex = messageboxdata->numbuttons; - const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons; - UIWindow *window = nil; - UIWindow *alertwindow = nil; - - if (![UIAlertController class]) { - return NO; - } - - UIAlertController *alert; - alert = [UIAlertController alertControllerWithTitle:@(messageboxdata->title) - message:@(messageboxdata->message) - preferredStyle:UIAlertControllerStyleAlert]; - - for (i = 0; i < messageboxdata->numbuttons; i++) { - UIAlertAction *action; - UIAlertActionStyle style = UIAlertActionStyleDefault; - - if (buttons[i].flags & SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT) { - style = UIAlertActionStyleCancel; - } - - action = [UIAlertAction actionWithTitle:@(buttons[i].text) - style:style - handler:^(UIAlertAction *action) { - clickedindex = i; - }]; - [alert addAction:action]; - } - - if (messageboxdata->window) { - SDL_WindowData *data = (__bridge SDL_WindowData *) messageboxdata->window->driverdata; - window = data.uiwindow; - } - - if (window == nil || window.rootViewController == nil) { - alertwindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - alertwindow.rootViewController = [UIViewController new]; - alertwindow.windowLevel = UIWindowLevelAlert; - - window = alertwindow; - - [alertwindow makeKeyAndVisible]; - } - - [window.rootViewController presentViewController:alert animated:YES completion:nil]; - UIKit_WaitUntilMessageBoxClosed(messageboxdata, &clickedindex); - - if (alertwindow) { - alertwindow.hidden = YES; - } - - *buttonid = messageboxdata->buttons[clickedindex].buttonid; - return YES; -#else - return NO; -#endif /* __IPHONE_8_0 */ -} - -/* UIAlertView is deprecated in iOS 8+ in favor of UIAlertController. */ -#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 -@interface SDLAlertViewDelegate : NSObject <UIAlertViewDelegate> - -@property (nonatomic, assign) int *clickedIndex; - -@end - -@implementation SDLAlertViewDelegate - -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex -{ - if (_clickedIndex != NULL) { - *_clickedIndex = (int) buttonIndex; - } -} - -@end -#endif /* __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 */ - -static BOOL -UIKit_ShowMessageBoxAlertView(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ - /* UIAlertView is deprecated in iOS 8+ in favor of UIAlertController. */ -#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 - int i; - int clickedindex = messageboxdata->numbuttons; - const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons; - UIAlertView *alert = [[UIAlertView alloc] init]; - SDLAlertViewDelegate *delegate = [[SDLAlertViewDelegate alloc] init]; - - alert.delegate = delegate; - alert.title = @(messageboxdata->title); - alert.message = @(messageboxdata->message); - - for (i = 0; i < messageboxdata->numbuttons; i++) { - [alert addButtonWithTitle:@(buttons[i].text)]; - } - - delegate.clickedIndex = &clickedindex; - - [alert show]; - - UIKit_WaitUntilMessageBoxClosed(messageboxdata, &clickedindex); - - alert.delegate = nil; - - *buttonid = messageboxdata->buttons[clickedindex].buttonid; - return YES; -#else - return NO; -#endif /* __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 */ -} - -int -UIKit_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ - BOOL success = NO; - - @autoreleasepool { - success = UIKit_ShowMessageBoxAlertController(messageboxdata, buttonid); - if (!success) { - success = UIKit_ShowMessageBoxAlertView(messageboxdata, buttonid); - } - } - - if (!success) { - return SDL_SetError("Could not show message box."); - } - - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitmodes.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitmodes.h deleted file mode 100644 index b936df616f1..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitmodes.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_uikitmodes_h -#define _SDL_uikitmodes_h - -#include "SDL_uikitvideo.h" - -@interface SDL_DisplayData : NSObject - -@property (nonatomic, strong) UIScreen *uiscreen; - -@end - -@interface SDL_DisplayModeData : NSObject - -@property (nonatomic, strong) UIScreenMode *uiscreenmode; - -@end - -extern SDL_bool UIKit_IsDisplayLandscape(UIScreen *uiscreen); - -extern int UIKit_InitModes(_THIS); -extern void UIKit_GetDisplayModes(_THIS, SDL_VideoDisplay * display); -extern int UIKit_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -extern void UIKit_QuitModes(_THIS); -extern int UIKit_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect); - -#endif /* _SDL_uikitmodes_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitmodes.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitmodes.m deleted file mode 100644 index cd3b8d08e15..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitmodes.m +++ /dev/null @@ -1,313 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "SDL_assert.h" -#include "SDL_uikitmodes.h" - -@implementation SDL_DisplayData - -@synthesize uiscreen; - -@end - -@implementation SDL_DisplayModeData - -@synthesize uiscreenmode; - -@end - - -static int -UIKit_AllocateDisplayModeData(SDL_DisplayMode * mode, - UIScreenMode * uiscreenmode) -{ - SDL_DisplayModeData *data = nil; - - if (uiscreenmode != nil) { - /* Allocate the display mode data */ - data = [[SDL_DisplayModeData alloc] init]; - if (!data) { - return SDL_OutOfMemory(); - } - - data.uiscreenmode = uiscreenmode; - } - - mode->driverdata = (void *) CFBridgingRetain(data); - - return 0; -} - -static void -UIKit_FreeDisplayModeData(SDL_DisplayMode * mode) -{ - if (mode->driverdata != NULL) { - CFRelease(mode->driverdata); - mode->driverdata = NULL; - } -} - -static int -UIKit_AddSingleDisplayMode(SDL_VideoDisplay * display, int w, int h, - UIScreenMode * uiscreenmode) -{ - SDL_DisplayMode mode; - SDL_zero(mode); - - mode.format = SDL_PIXELFORMAT_ABGR8888; - mode.refresh_rate = 0; - if (UIKit_AllocateDisplayModeData(&mode, uiscreenmode) < 0) { - return -1; - } - - mode.w = w; - mode.h = h; - if (SDL_AddDisplayMode(display, &mode)) { - return 0; - } else { - UIKit_FreeDisplayModeData(&mode); - return -1; - } -} - -static int -UIKit_AddDisplayMode(SDL_VideoDisplay * display, int w, int h, - UIScreenMode * uiscreenmode, SDL_bool addRotation) -{ - if (UIKit_AddSingleDisplayMode(display, w, h, uiscreenmode) < 0) { - return -1; - } - - if (addRotation) { - /* Add the rotated version */ - if (UIKit_AddSingleDisplayMode(display, h, w, uiscreenmode) < 0) { - return -1; - } - } - - return 0; -} - -static int -UIKit_AddDisplay(UIScreen *uiscreen) -{ - CGSize size = uiscreen.bounds.size; - - /* Make sure the width/height are oriented correctly */ - if (UIKit_IsDisplayLandscape(uiscreen) != (size.width > size.height)) { - CGFloat height = size.width; - size.width = size.height; - size.height = height; - } - - SDL_VideoDisplay display; - SDL_DisplayMode mode; - SDL_zero(mode); - mode.format = SDL_PIXELFORMAT_ABGR8888; - mode.w = (int) size.width; - mode.h = (int) size.height; - - UIScreenMode *uiscreenmode = uiscreen.currentMode; - - if (UIKit_AllocateDisplayModeData(&mode, uiscreenmode) < 0) { - return -1; - } - - SDL_zero(display); - display.desktop_mode = mode; - display.current_mode = mode; - - /* Allocate the display data */ - SDL_DisplayData *data = [[SDL_DisplayData alloc] init]; - if (!data) { - UIKit_FreeDisplayModeData(&display.desktop_mode); - return SDL_OutOfMemory(); - } - - data.uiscreen = uiscreen; - - display.driverdata = (void *) CFBridgingRetain(data); - SDL_AddVideoDisplay(&display); - - return 0; -} - -SDL_bool -UIKit_IsDisplayLandscape(UIScreen *uiscreen) -{ -#if !TARGET_OS_TV - if (uiscreen == [UIScreen mainScreen]) { - return UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation); - } else -#endif /* !TARGET_OS_TV */ - { - CGSize size = uiscreen.bounds.size; - return (size.width > size.height); - } -} - -int -UIKit_InitModes(_THIS) -{ - @autoreleasepool { - for (UIScreen *uiscreen in [UIScreen screens]) { - if (UIKit_AddDisplay(uiscreen) < 0) { - return -1; - } - } - } - - return 0; -} - -void -UIKit_GetDisplayModes(_THIS, SDL_VideoDisplay * display) -{ - @autoreleasepool { - SDL_DisplayData *data = (__bridge SDL_DisplayData *) display->driverdata; - - SDL_bool isLandscape = UIKit_IsDisplayLandscape(data.uiscreen); - SDL_bool addRotation = (data.uiscreen == [UIScreen mainScreen]); - CGFloat scale = data.uiscreen.scale; - NSArray *availableModes = nil; - -#if TARGET_OS_TV - addRotation = SDL_FALSE; - availableModes = @[data.uiscreen.currentMode]; -#else - availableModes = data.uiscreen.availableModes; -#endif - -#ifdef __IPHONE_8_0 - /* The UIScreenMode of an iPhone 6 Plus should be 1080x1920 rather than - * 1242x2208 (414x736@3x), so we should use the native scale. */ - if ([data.uiscreen respondsToSelector:@selector(nativeScale)]) { - scale = data.uiscreen.nativeScale; - } -#endif - - for (UIScreenMode *uimode in availableModes) { - /* The size of a UIScreenMode is in pixels, but we deal exclusively - * in points (except in SDL_GL_GetDrawableSize.) */ - int w = (int)(uimode.size.width / scale); - int h = (int)(uimode.size.height / scale); - - /* Make sure the width/height are oriented correctly */ - if (isLandscape != (w > h)) { - int tmp = w; - w = h; - h = tmp; - } - - UIKit_AddDisplayMode(display, w, h, uimode, addRotation); - } - } -} - -int -UIKit_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - @autoreleasepool { - SDL_DisplayData *data = (__bridge SDL_DisplayData *) display->driverdata; - -#if !TARGET_OS_TV - SDL_DisplayModeData *modedata = (__bridge SDL_DisplayModeData *)mode->driverdata; - [data.uiscreen setCurrentMode:modedata.uiscreenmode]; -#endif - - if (data.uiscreen == [UIScreen mainScreen]) { - /* [UIApplication setStatusBarOrientation:] no longer works reliably - * in recent iOS versions, so we can't rotate the screen when setting - * the display mode. */ - if (mode->w > mode->h) { - if (!UIKit_IsDisplayLandscape(data.uiscreen)) { - return SDL_SetError("Screen orientation does not match display mode size"); - } - } else if (mode->w < mode->h) { - if (UIKit_IsDisplayLandscape(data.uiscreen)) { - return SDL_SetError("Screen orientation does not match display mode size"); - } - } - } - } - - return 0; -} - -int -UIKit_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect) -{ - @autoreleasepool { - int displayIndex = (int) (display - _this->displays); - SDL_DisplayData *data = (__bridge SDL_DisplayData *) display->driverdata; - - /* the default function iterates displays to make a fake offset, - as if all the displays were side-by-side, which is fine for iOS. */ - if (SDL_GetDisplayBounds(displayIndex, rect) < 0) { - return -1; - } - - CGRect frame = data.uiscreen.bounds; - -#if !TARGET_OS_TV - if (!UIKit_IsSystemVersionAtLeast(7.0)) { - frame = [data.uiscreen applicationFrame]; - } -#endif - - rect->x += frame.origin.x; - rect->y += frame.origin.y; - rect->w = frame.size.width; - rect->h = frame.size.height; - } - - return 0; -} - -void -UIKit_QuitModes(_THIS) -{ - /* Release Objective-C objects, so higher level doesn't free() them. */ - int i, j; - @autoreleasepool { - for (i = 0; i < _this->num_displays; i++) { - SDL_VideoDisplay *display = &_this->displays[i]; - - UIKit_FreeDisplayModeData(&display->desktop_mode); - for (j = 0; j < display->num_display_modes; j++) { - SDL_DisplayMode *mode = &display->display_modes[j]; - UIKit_FreeDisplayModeData(mode); - } - - if (display->driverdata != NULL) { - CFRelease(display->driverdata); - display->driverdata = NULL; - } - } - } -} - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitopengles.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitopengles.h deleted file mode 100644 index b52e429135f..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitopengles.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#ifndef _SDL_uikitopengles -#define _SDL_uikitopengles - -#include "../SDL_sysvideo.h" - -extern int UIKit_GL_MakeCurrent(_THIS, SDL_Window * window, - SDL_GLContext context); -extern void UIKit_GL_GetDrawableSize(_THIS, SDL_Window * window, - int * w, int * h); -extern void UIKit_GL_SwapWindow(_THIS, SDL_Window * window); -extern SDL_GLContext UIKit_GL_CreateContext(_THIS, SDL_Window * window); -extern void UIKit_GL_DeleteContext(_THIS, SDL_GLContext context); -extern void *UIKit_GL_GetProcAddress(_THIS, const char *proc); -extern int UIKit_GL_LoadLibrary(_THIS, const char *path); - -extern void UIKit_GL_RestoreCurrentContext(); - -#endif - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitopengles.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitopengles.m deleted file mode 100644 index 461ff9b8065..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitopengles.m +++ /dev/null @@ -1,249 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "SDL_uikitopengles.h" -#import "SDL_uikitopenglview.h" -#include "SDL_uikitmodes.h" -#include "SDL_uikitwindow.h" -#include "SDL_uikitevents.h" -#include "../SDL_sysvideo.h" -#include "../../events/SDL_keyboard_c.h" -#include "../../events/SDL_mouse_c.h" -#include "../../power/uikit/SDL_syspower.h" -#include "SDL_loadso.h" -#include <dlfcn.h> - -@interface SDLEAGLContext : EAGLContext - -/* The OpenGL ES context owns a view / drawable. */ -@property (nonatomic, strong) SDL_uikitopenglview *sdlView; - -@end - -@implementation SDLEAGLContext - -- (void)dealloc -{ - /* When the context is deallocated, its view should be removed from any - * SDL window that it's attached to. */ - [self.sdlView setSDLWindow:NULL]; -} - -@end - -void * -UIKit_GL_GetProcAddress(_THIS, const char *proc) -{ - /* Look through all SO's for the proc symbol. Here's why: - * -Looking for the path to the OpenGL Library seems not to work in the iOS Simulator. - * -We don't know that the path won't change in the future. */ - return dlsym(RTLD_DEFAULT, proc); -} - -/* - note that SDL_GL_DeleteContext makes it current without passing the window -*/ -int -UIKit_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) -{ - @autoreleasepool { - SDLEAGLContext *eaglcontext = (__bridge SDLEAGLContext *) context; - - if (![EAGLContext setCurrentContext:eaglcontext]) { - return SDL_SetError("Could not make EAGL context current"); - } - - if (eaglcontext) { - [eaglcontext.sdlView setSDLWindow:window]; - } - } - - return 0; -} - -void -UIKit_GL_GetDrawableSize(_THIS, SDL_Window * window, int * w, int * h) -{ - @autoreleasepool { - SDL_WindowData *data = (__bridge SDL_WindowData *)window->driverdata; - UIView *view = data.viewcontroller.view; - if ([view isKindOfClass:[SDL_uikitopenglview class]]) { - SDL_uikitopenglview *glview = (SDL_uikitopenglview *) view; - if (w) { - *w = glview.backingWidth; - } - if (h) { - *h = glview.backingHeight; - } - } - } -} - -int -UIKit_GL_LoadLibrary(_THIS, const char *path) -{ - /* We shouldn't pass a path to this function, since we've already loaded the - * library. */ - if (path != NULL) { - return SDL_SetError("iOS GL Load Library just here for compatibility"); - } - return 0; -} - -void UIKit_GL_SwapWindow(_THIS, SDL_Window * window) -{ - @autoreleasepool { - SDLEAGLContext *context = (__bridge SDLEAGLContext *) SDL_GL_GetCurrentContext(); - -#if SDL_POWER_UIKIT - /* Check once a frame to see if we should turn off the battery monitor. */ - SDL_UIKit_UpdateBatteryMonitoring(); -#endif - - [context.sdlView swapBuffers]; - - /* You need to pump events in order for the OS to make changes visible. - * We don't pump events here because we don't want iOS application events - * (low memory, terminate, etc.) to happen inside low level rendering. */ - } -} - -SDL_GLContext -UIKit_GL_CreateContext(_THIS, SDL_Window * window) -{ - @autoreleasepool { - SDLEAGLContext *context = nil; - SDL_uikitopenglview *view; - SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata; - CGRect frame = UIKit_ComputeViewFrame(window, data.uiwindow.screen); - EAGLSharegroup *sharegroup = nil; - CGFloat scale = 1.0; - int samples = 0; - int major = _this->gl_config.major_version; - int minor = _this->gl_config.minor_version; - - /* The EAGLRenderingAPI enum values currently map 1:1 to major GLES - * versions. */ - EAGLRenderingAPI api = major; - - /* iOS currently doesn't support GLES >3.0. iOS 6 also only supports up - * to GLES 2.0. */ - if (major > 3 || (major == 3 && (minor > 0 || !UIKit_IsSystemVersionAtLeast(7.0)))) { - SDL_SetError("OpenGL ES %d.%d context could not be created", major, minor); - return NULL; - } - - if (_this->gl_config.multisamplebuffers > 0) { - samples = _this->gl_config.multisamplesamples; - } - - if (_this->gl_config.share_with_current_context) { - EAGLContext *context = (__bridge EAGLContext *) SDL_GL_GetCurrentContext(); - sharegroup = context.sharegroup; - } - - if (window->flags & SDL_WINDOW_ALLOW_HIGHDPI) { - /* Set the scale to the natural scale factor of the screen - the - * backing dimensions of the OpenGL view will match the pixel - * dimensions of the screen rather than the dimensions in points. */ -#ifdef __IPHONE_8_0 - if ([data.uiwindow.screen respondsToSelector:@selector(nativeScale)]) { - scale = data.uiwindow.screen.nativeScale; - } else -#endif - { - scale = data.uiwindow.screen.scale; - } - } - - context = [[SDLEAGLContext alloc] initWithAPI:api sharegroup:sharegroup]; - if (!context) { - SDL_SetError("OpenGL ES %d context could not be created", _this->gl_config.major_version); - return NULL; - } - - /* construct our view, passing in SDL's OpenGL configuration data */ - view = [[SDL_uikitopenglview alloc] initWithFrame:frame - scale:scale - retainBacking:_this->gl_config.retained_backing - rBits:_this->gl_config.red_size - gBits:_this->gl_config.green_size - bBits:_this->gl_config.blue_size - aBits:_this->gl_config.alpha_size - depthBits:_this->gl_config.depth_size - stencilBits:_this->gl_config.stencil_size - sRGB:_this->gl_config.framebuffer_srgb_capable - multisamples:samples - context:context]; - - if (!view) { - return NULL; - } - - /* The context owns the view / drawable. */ - context.sdlView = view; - - if (UIKit_GL_MakeCurrent(_this, window, (__bridge SDL_GLContext) context) < 0) { - UIKit_GL_DeleteContext(_this, (SDL_GLContext) CFBridgingRetain(context)); - return NULL; - } - - /* We return a +1'd context. The window's driverdata owns the view (via - * MakeCurrent.) */ - return (SDL_GLContext) CFBridgingRetain(context); - } -} - -void -UIKit_GL_DeleteContext(_THIS, SDL_GLContext context) -{ - @autoreleasepool { - /* The context was retained in SDL_GL_CreateContext, so we release it - * here. The context's view will be detached from its window when the - * context is deallocated. */ - CFRelease(context); - } -} - -void -UIKit_GL_RestoreCurrentContext() -{ - @autoreleasepool { - /* Some iOS system functionality (such as Dictation on the on-screen - keyboard) uses its own OpenGL ES context but doesn't restore the - previous one when it's done. This is a workaround to make sure the - expected SDL-created OpenGL ES context is active after the OS is - finished running its own code for the frame. If this isn't done, the - app may crash or have other nasty symptoms when Dictation is used. - */ - EAGLContext *context = (__bridge EAGLContext *) SDL_GL_GetCurrentContext(); - if (context != NULL && [EAGLContext currentContext] != context) { - [EAGLContext setCurrentContext:context]; - } - } -} - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitopenglview.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitopenglview.h deleted file mode 100644 index 86fb5e12e38..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitopenglview.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#import <UIKit/UIKit.h> -#import <OpenGLES/EAGL.h> -#import <OpenGLES/ES3/gl.h> - -#import "SDL_uikitview.h" -#include "SDL_uikitvideo.h" - -@interface SDL_uikitopenglview : SDL_uikitview - -- (instancetype)initWithFrame:(CGRect)frame - scale:(CGFloat)scale - retainBacking:(BOOL)retained - rBits:(int)rBits - gBits:(int)gBits - bBits:(int)bBits - aBits:(int)aBits - depthBits:(int)depthBits - stencilBits:(int)stencilBits - sRGB:(BOOL)sRGB - multisamples:(int)multisamples - context:(EAGLContext *)glcontext; - -@property (nonatomic, readonly, weak) EAGLContext *context; - -/* The width and height of the drawable in pixels (as opposed to points.) */ -@property (nonatomic, readonly) int backingWidth; -@property (nonatomic, readonly) int backingHeight; - -@property (nonatomic, readonly) GLuint drawableRenderbuffer; -@property (nonatomic, readonly) GLuint drawableFramebuffer; -@property (nonatomic, readonly) GLuint msaaResolveFramebuffer; - -- (void)swapBuffers; - -- (void)updateFrame; - -@end - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitopenglview.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitopenglview.m deleted file mode 100644 index aae7ee8f239..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitopenglview.m +++ /dev/null @@ -1,384 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include <OpenGLES/EAGLDrawable.h> -#include <OpenGLES/ES2/glext.h> -#import "SDL_uikitopenglview.h" -#include "SDL_uikitwindow.h" - -@implementation SDL_uikitopenglview { - /* The renderbuffer and framebuffer used to render to this layer. */ - GLuint viewRenderbuffer, viewFramebuffer; - - /* The depth buffer that is attached to viewFramebuffer, if it exists. */ - GLuint depthRenderbuffer; - - GLenum colorBufferFormat; - - /* format of depthRenderbuffer */ - GLenum depthBufferFormat; - - /* The framebuffer and renderbuffer used for rendering with MSAA. */ - GLuint msaaFramebuffer, msaaRenderbuffer; - - /* The number of MSAA samples. */ - int samples; - - BOOL retainedBacking; -} - -@synthesize context; -@synthesize backingWidth; -@synthesize backingHeight; - -+ (Class)layerClass -{ - return [CAEAGLLayer class]; -} - -- (instancetype)initWithFrame:(CGRect)frame - scale:(CGFloat)scale - retainBacking:(BOOL)retained - rBits:(int)rBits - gBits:(int)gBits - bBits:(int)bBits - aBits:(int)aBits - depthBits:(int)depthBits - stencilBits:(int)stencilBits - sRGB:(BOOL)sRGB - multisamples:(int)multisamples - context:(EAGLContext *)glcontext -{ - if ((self = [super initWithFrame:frame])) { - const BOOL useStencilBuffer = (stencilBits != 0); - const BOOL useDepthBuffer = (depthBits != 0); - NSString *colorFormat = nil; - - context = glcontext; - samples = multisamples; - retainedBacking = retained; - - if (!context || ![EAGLContext setCurrentContext:context]) { - SDL_SetError("Could not create OpenGL ES drawable (could not make context current)"); - return nil; - } - - if (samples > 0) { - GLint maxsamples = 0; - glGetIntegerv(GL_MAX_SAMPLES, &maxsamples); - - /* Clamp the samples to the max supported count. */ - samples = MIN(samples, maxsamples); - } - - if (sRGB) { - /* sRGB EAGL drawable support was added in iOS 7. */ - if (UIKit_IsSystemVersionAtLeast(7.0)) { - colorFormat = kEAGLColorFormatSRGBA8; - colorBufferFormat = GL_SRGB8_ALPHA8; - } else { - SDL_SetError("sRGB drawables are not supported."); - return nil; - } - } else if (rBits >= 8 || gBits >= 8 || bBits >= 8) { - /* if user specifically requests rbg888 or some color format higher than 16bpp */ - colorFormat = kEAGLColorFormatRGBA8; - colorBufferFormat = GL_RGBA8; - } else { - /* default case (potentially faster) */ - colorFormat = kEAGLColorFormatRGB565; - colorBufferFormat = GL_RGB565; - } - - CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; - - eaglLayer.opaque = YES; - eaglLayer.drawableProperties = @{ - kEAGLDrawablePropertyRetainedBacking:@(retained), - kEAGLDrawablePropertyColorFormat:colorFormat - }; - - /* Set the appropriate scale (for retina display support) */ - self.contentScaleFactor = scale; - - /* Create the color Renderbuffer Object */ - glGenRenderbuffers(1, &viewRenderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); - - if (![context renderbufferStorage:GL_RENDERBUFFER fromDrawable:eaglLayer]) { - SDL_SetError("Failed to create OpenGL ES drawable"); - return nil; - } - - /* Create the Framebuffer Object */ - glGenFramebuffers(1, &viewFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); - - /* attach the color renderbuffer to the FBO */ - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer); - - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); - - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - SDL_SetError("Failed creating OpenGL ES framebuffer"); - return nil; - } - - /* When MSAA is used we'll use a separate framebuffer for rendering to, - * since we'll need to do an explicit MSAA resolve before presenting. */ - if (samples > 0) { - glGenFramebuffers(1, &msaaFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer); - - glGenRenderbuffers(1, &msaaRenderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, msaaRenderbuffer); - - glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, colorBufferFormat, backingWidth, backingHeight); - - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, msaaRenderbuffer); - } - - if (useDepthBuffer || useStencilBuffer) { - if (useStencilBuffer) { - /* Apparently you need to pack stencil and depth into one buffer. */ - depthBufferFormat = GL_DEPTH24_STENCIL8_OES; - } else if (useDepthBuffer) { - /* iOS only uses 32-bit float (exposed as fixed point 24-bit) - * depth buffers. */ - depthBufferFormat = GL_DEPTH_COMPONENT24_OES; - } - - glGenRenderbuffers(1, &depthRenderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); - - if (samples > 0) { - glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, depthBufferFormat, backingWidth, backingHeight); - } else { - glRenderbufferStorage(GL_RENDERBUFFER, depthBufferFormat, backingWidth, backingHeight); - } - - if (useDepthBuffer) { - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); - } - if (useStencilBuffer) { - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); - } - } - - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - SDL_SetError("Failed creating OpenGL ES framebuffer"); - return nil; - } - - glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); - - [self setDebugLabels]; - } - - return self; -} - -- (GLuint)drawableRenderbuffer -{ - return viewRenderbuffer; -} - -- (GLuint)drawableFramebuffer -{ - /* When MSAA is used, the MSAA draw framebuffer is used for drawing. */ - if (msaaFramebuffer) { - return msaaFramebuffer; - } else { - return viewFramebuffer; - } -} - -- (GLuint)msaaResolveFramebuffer -{ - /* When MSAA is used, the MSAA draw framebuffer is used for drawing and the - * view framebuffer is used as a MSAA resolve framebuffer. */ - if (msaaFramebuffer) { - return viewFramebuffer; - } else { - return 0; - } -} - -- (void)updateFrame -{ - GLint prevRenderbuffer = 0; - glGetIntegerv(GL_RENDERBUFFER_BINDING, &prevRenderbuffer); - - glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); - [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer]; - - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); - - if (msaaRenderbuffer != 0) { - glBindRenderbuffer(GL_RENDERBUFFER, msaaRenderbuffer); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, colorBufferFormat, backingWidth, backingHeight); - } - - if (depthRenderbuffer != 0) { - glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); - - if (samples > 0) { - glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, depthBufferFormat, backingWidth, backingHeight); - } else { - glRenderbufferStorage(GL_RENDERBUFFER, depthBufferFormat, backingWidth, backingHeight); - } - } - - glBindRenderbuffer(GL_RENDERBUFFER, prevRenderbuffer); -} - -- (void)setDebugLabels -{ - if (viewFramebuffer != 0) { - glLabelObjectEXT(GL_FRAMEBUFFER, viewFramebuffer, 0, "context FBO"); - } - - if (viewRenderbuffer != 0) { - glLabelObjectEXT(GL_RENDERBUFFER, viewRenderbuffer, 0, "context color buffer"); - } - - if (depthRenderbuffer != 0) { - if (depthBufferFormat == GL_DEPTH24_STENCIL8_OES) { - glLabelObjectEXT(GL_RENDERBUFFER, depthRenderbuffer, 0, "context depth-stencil buffer"); - } else { - glLabelObjectEXT(GL_RENDERBUFFER, depthRenderbuffer, 0, "context depth buffer"); - } - } - - if (msaaFramebuffer != 0) { - glLabelObjectEXT(GL_FRAMEBUFFER, msaaFramebuffer, 0, "context MSAA FBO"); - } - - if (msaaRenderbuffer != 0) { - glLabelObjectEXT(GL_RENDERBUFFER, msaaRenderbuffer, 0, "context MSAA renderbuffer"); - } -} - -- (void)swapBuffers -{ - if (msaaFramebuffer) { - const GLenum attachments[] = {GL_COLOR_ATTACHMENT0}; - - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, viewFramebuffer); - - /* OpenGL ES 3+ provides explicit MSAA resolves via glBlitFramebuffer. - * In OpenGL ES 1 and 2, MSAA resolves must be done via an extension. */ - if (context.API >= kEAGLRenderingAPIOpenGLES3) { - int w = backingWidth; - int h = backingHeight; - glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST); - - if (!retainedBacking) { - /* Discard the contents of the MSAA drawable color buffer. */ - glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, attachments); - } - } else { - glResolveMultisampleFramebufferAPPLE(); - - if (!retainedBacking) { - glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER, 1, attachments); - } - } - - /* We assume the "drawable framebuffer" (MSAA draw framebuffer) was - * previously bound... */ - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFramebuffer); - } - - /* viewRenderbuffer should always be bound here. Code that binds something - * else is responsible for rebinding viewRenderbuffer, to reduce duplicate - * state changes. */ - [context presentRenderbuffer:GL_RENDERBUFFER]; -} - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - int width = (int) (self.bounds.size.width * self.contentScaleFactor); - int height = (int) (self.bounds.size.height * self.contentScaleFactor); - - /* Update the color and depth buffer storage if the layer size has changed. */ - if (width != backingWidth || height != backingHeight) { - EAGLContext *prevContext = [EAGLContext currentContext]; - if (prevContext != context) { - [EAGLContext setCurrentContext:context]; - } - - [self updateFrame]; - - if (prevContext != context) { - [EAGLContext setCurrentContext:prevContext]; - } - } -} - -- (void)destroyFramebuffer -{ - if (viewFramebuffer != 0) { - glDeleteFramebuffers(1, &viewFramebuffer); - viewFramebuffer = 0; - } - - if (viewRenderbuffer != 0) { - glDeleteRenderbuffers(1, &viewRenderbuffer); - viewRenderbuffer = 0; - } - - if (depthRenderbuffer != 0) { - glDeleteRenderbuffers(1, &depthRenderbuffer); - depthRenderbuffer = 0; - } - - if (msaaFramebuffer != 0) { - glDeleteFramebuffers(1, &msaaFramebuffer); - msaaFramebuffer = 0; - } - - if (msaaRenderbuffer != 0) { - glDeleteRenderbuffers(1, &msaaRenderbuffer); - msaaRenderbuffer = 0; - } -} - -- (void)dealloc -{ - if (context && context == [EAGLContext currentContext]) { - [self destroyFramebuffer]; - [EAGLContext setCurrentContext:nil]; - } -} - -@end - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitvideo.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitvideo.h deleted file mode 100644 index aafb714d70d..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitvideo.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#ifndef _SDL_uikitvideo_h -#define _SDL_uikitvideo_h - -#include "../SDL_sysvideo.h" - -#ifdef __OBJC__ - -#include <UIKit/UIKit.h> - -@interface SDL_VideoData : NSObject - -@property (nonatomic) id pasteboardObserver; - -@end - -CGRect UIKit_ComputeViewFrame(SDL_Window *window, UIScreen *screen); - -#endif /* __OBJC__ */ - -void UIKit_SuspendScreenSaver(_THIS); - -SDL_bool UIKit_IsSystemVersionAtLeast(double version); - -#endif /* _SDL_uikitvideo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitvideo.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitvideo.m deleted file mode 100644 index 88d46175121..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitvideo.m +++ /dev/null @@ -1,207 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#import <UIKit/UIKit.h> - -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "SDL_hints.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../../events/SDL_events_c.h" - -#include "SDL_uikitvideo.h" -#include "SDL_uikitevents.h" -#include "SDL_uikitmodes.h" -#include "SDL_uikitwindow.h" -#include "SDL_uikitopengles.h" -#include "SDL_uikitclipboard.h" - -#define UIKITVID_DRIVER_NAME "uikit" - -@implementation SDL_VideoData - -@end - -/* Initialization/Query functions */ -static int UIKit_VideoInit(_THIS); -static void UIKit_VideoQuit(_THIS); - -/* DUMMY driver bootstrap functions */ - -static int -UIKit_Available(void) -{ - return 1; -} - -static void UIKit_DeleteDevice(SDL_VideoDevice * device) -{ - @autoreleasepool { - CFRelease(device->driverdata); - SDL_free(device); - } -} - -static SDL_VideoDevice * -UIKit_CreateDevice(int devindex) -{ - @autoreleasepool { - SDL_VideoDevice *device; - SDL_VideoData *data; - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (device) { - data = [SDL_VideoData new]; - } else { - SDL_free(device); - SDL_OutOfMemory(); - return (0); - } - - device->driverdata = (void *) CFBridgingRetain(data); - - /* Set the function pointers */ - device->VideoInit = UIKit_VideoInit; - device->VideoQuit = UIKit_VideoQuit; - device->GetDisplayModes = UIKit_GetDisplayModes; - device->SetDisplayMode = UIKit_SetDisplayMode; - device->PumpEvents = UIKit_PumpEvents; - device->SuspendScreenSaver = UIKit_SuspendScreenSaver; - device->CreateWindow = UIKit_CreateWindow; - device->SetWindowTitle = UIKit_SetWindowTitle; - device->ShowWindow = UIKit_ShowWindow; - device->HideWindow = UIKit_HideWindow; - device->RaiseWindow = UIKit_RaiseWindow; - device->SetWindowBordered = UIKit_SetWindowBordered; - device->SetWindowFullscreen = UIKit_SetWindowFullscreen; - device->DestroyWindow = UIKit_DestroyWindow; - device->GetWindowWMInfo = UIKit_GetWindowWMInfo; - device->GetDisplayUsableBounds = UIKit_GetDisplayUsableBounds; - - #if SDL_IPHONE_KEYBOARD - device->HasScreenKeyboardSupport = UIKit_HasScreenKeyboardSupport; - device->ShowScreenKeyboard = UIKit_ShowScreenKeyboard; - device->HideScreenKeyboard = UIKit_HideScreenKeyboard; - device->IsScreenKeyboardShown = UIKit_IsScreenKeyboardShown; - device->SetTextInputRect = UIKit_SetTextInputRect; - #endif - - device->SetClipboardText = UIKit_SetClipboardText; - device->GetClipboardText = UIKit_GetClipboardText; - device->HasClipboardText = UIKit_HasClipboardText; - - /* OpenGL (ES) functions */ - device->GL_MakeCurrent = UIKit_GL_MakeCurrent; - device->GL_GetDrawableSize = UIKit_GL_GetDrawableSize; - device->GL_SwapWindow = UIKit_GL_SwapWindow; - device->GL_CreateContext = UIKit_GL_CreateContext; - device->GL_DeleteContext = UIKit_GL_DeleteContext; - device->GL_GetProcAddress = UIKit_GL_GetProcAddress; - device->GL_LoadLibrary = UIKit_GL_LoadLibrary; - device->free = UIKit_DeleteDevice; - - device->gl_config.accelerated = 1; - - return device; - } -} - -VideoBootStrap UIKIT_bootstrap = { - UIKITVID_DRIVER_NAME, "SDL UIKit video driver", - UIKit_Available, UIKit_CreateDevice -}; - - -int -UIKit_VideoInit(_THIS) -{ - _this->gl_config.driver_loaded = 1; - - if (UIKit_InitModes(_this) < 0) { - return -1; - } - return 0; -} - -void -UIKit_VideoQuit(_THIS) -{ - UIKit_QuitModes(_this); -} - -void -UIKit_SuspendScreenSaver(_THIS) -{ - @autoreleasepool { - /* Ignore ScreenSaver API calls if the idle timer hint has been set. */ - /* FIXME: The idle timer hint should be deprecated for SDL 2.1. */ - if (!SDL_GetHintBoolean(SDL_HINT_IDLE_TIMER_DISABLED, SDL_FALSE)) { - UIApplication *app = [UIApplication sharedApplication]; - - /* Prevent the display from dimming and going to sleep. */ - app.idleTimerDisabled = (_this->suspend_screensaver != SDL_FALSE); - } - } -} - -SDL_bool -UIKit_IsSystemVersionAtLeast(double version) -{ - return [[UIDevice currentDevice].systemVersion doubleValue] >= version; -} - -CGRect -UIKit_ComputeViewFrame(SDL_Window *window, UIScreen *screen) -{ -#if !TARGET_OS_TV && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) - BOOL hasiOS7 = UIKit_IsSystemVersionAtLeast(7.0); - - if (hasiOS7 || (window->flags & (SDL_WINDOW_BORDERLESS|SDL_WINDOW_FULLSCREEN))) { - /* The view should always show behind the status bar in iOS 7+. */ - return screen.bounds; - } else { - return screen.applicationFrame; - } -#else - return screen.bounds; -#endif -} - -/* - * iOS log support. - * - * This doesn't really have aything to do with the interfaces of the SDL video - * subsystem, but we need to stuff this into an Objective-C source code file. - */ - -void SDL_NSLog(const char *text) -{ - NSLog(@"%s", text); -} - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitview.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitview.h deleted file mode 100644 index 18fa78f363a..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitview.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#import <UIKit/UIKit.h> - -#include "../SDL_sysvideo.h" - -#include "SDL_touch.h" - -@interface SDL_uikitview : UIView - -- (instancetype)initWithFrame:(CGRect)frame; - -- (void)setSDLWindow:(SDL_Window *)window; - -- (CGPoint)touchLocation:(UITouch *)touch shouldNormalize:(BOOL)normalize; -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; -- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; - -@end - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitview.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitview.m deleted file mode 100644 index c7d9f51d9ce..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitview.m +++ /dev/null @@ -1,271 +0,0 @@ - /* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "SDL_uikitview.h" - -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_touch_c.h" -#include "../../events/SDL_events_c.h" - -#import "SDL_uikitappdelegate.h" -#import "SDL_uikitmodes.h" -#import "SDL_uikitwindow.h" - -@implementation SDL_uikitview { - SDL_Window *sdlwindow; - - SDL_TouchID touchId; - UITouch * __weak firstFingerDown; -} - -- (instancetype)initWithFrame:(CGRect)frame -{ - if ((self = [super initWithFrame:frame])) { - self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - self.autoresizesSubviews = YES; - -#if !TARGET_OS_TV - self.multipleTouchEnabled = YES; -#endif - - touchId = 1; - SDL_AddTouch(touchId, ""); - } - - return self; -} - -- (void)setSDLWindow:(SDL_Window *)window -{ - SDL_WindowData *data = nil; - - if (window == sdlwindow) { - return; - } - - /* Remove ourself from the old window. */ - if (sdlwindow) { - SDL_uikitview *view = nil; - data = (__bridge SDL_WindowData *) sdlwindow->driverdata; - - [data.views removeObject:self]; - - [self removeFromSuperview]; - - /* Restore the next-oldest view in the old window. */ - view = data.views.lastObject; - - data.viewcontroller.view = view; - - data.uiwindow.rootViewController = nil; - data.uiwindow.rootViewController = data.viewcontroller; - - [data.uiwindow layoutIfNeeded]; - } - - /* Add ourself to the new window. */ - if (window) { - data = (__bridge SDL_WindowData *) window->driverdata; - - /* Make sure the SDL window has a strong reference to this view. */ - [data.views addObject:self]; - - /* Replace the view controller's old view with this one. */ - [data.viewcontroller.view removeFromSuperview]; - data.viewcontroller.view = self; - - /* The root view controller handles rotation and the status bar. - * Assigning it also adds the controller's view to the window. We - * explicitly re-set it to make sure the view is properly attached to - * the window. Just adding the sub-view if the root view controller is - * already correct causes orientation issues on iOS 7 and below. */ - data.uiwindow.rootViewController = nil; - data.uiwindow.rootViewController = data.viewcontroller; - - /* The view's bounds may not be correct until the next event cycle. That - * might happen after the current dimensions are queried, so we force a - * layout now to immediately update the bounds. */ - [data.uiwindow layoutIfNeeded]; - } - - sdlwindow = window; -} - -- (CGPoint)touchLocation:(UITouch *)touch shouldNormalize:(BOOL)normalize -{ - CGPoint point = [touch locationInView:self]; - - if (normalize) { - CGRect bounds = self.bounds; - point.x /= bounds.size.width; - point.y /= bounds.size.height; - } - - return point; -} - -- (float)pressureForTouch:(UITouch *)touch -{ -#ifdef __IPHONE_9_0 - if ([touch respondsToSelector:@selector(force)]) { - return (float) touch.force; - } -#endif - - return 1.0f; -} - -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event -{ - for (UITouch *touch in touches) { - float pressure = [self pressureForTouch:touch]; - - if (!firstFingerDown) { - CGPoint locationInView = [self touchLocation:touch shouldNormalize:NO]; - int clicks = (int) touch.tapCount; - - /* send mouse moved event */ - SDL_SendMouseMotion(sdlwindow, SDL_TOUCH_MOUSEID, 0, locationInView.x, locationInView.y); - - /* send mouse down event */ - SDL_SendMouseButtonClicks(sdlwindow, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT, clicks); - - firstFingerDown = touch; - } - - CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES]; - SDL_SendTouch(touchId, (SDL_FingerID)((size_t)touch), - SDL_TRUE, locationInView.x, locationInView.y, pressure); - } -} - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event -{ - for (UITouch *touch in touches) { - float pressure = [self pressureForTouch:touch]; - - if (touch == firstFingerDown) { - /* send mouse up */ - int clicks = (int) touch.tapCount; - SDL_SendMouseButtonClicks(sdlwindow, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT, clicks); - firstFingerDown = nil; - } - - CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES]; - SDL_SendTouch(touchId, (SDL_FingerID)((size_t)touch), - SDL_FALSE, locationInView.x, locationInView.y, pressure); - } -} - -- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event -{ - [self touchesEnded:touches withEvent:event]; -} - -- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event -{ - for (UITouch *touch in touches) { - float pressure = [self pressureForTouch:touch]; - - if (touch == firstFingerDown) { - CGPoint locationInView = [self touchLocation:touch shouldNormalize:NO]; - - /* send moved event */ - SDL_SendMouseMotion(sdlwindow, SDL_TOUCH_MOUSEID, 0, locationInView.x, locationInView.y); - } - - CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES]; - SDL_SendTouchMotion(touchId, (SDL_FingerID)((size_t)touch), - locationInView.x, locationInView.y, pressure); - } -} - -#if TARGET_OS_TV || defined(__IPHONE_9_1) -- (SDL_Scancode)scancodeFromPressType:(UIPressType)presstype -{ - switch (presstype) { - case UIPressTypeUpArrow: - return SDL_SCANCODE_UP; - case UIPressTypeDownArrow: - return SDL_SCANCODE_DOWN; - case UIPressTypeLeftArrow: - return SDL_SCANCODE_LEFT; - case UIPressTypeRightArrow: - return SDL_SCANCODE_RIGHT; - case UIPressTypeSelect: - /* HIG says: "primary button behavior" */ - return SDL_SCANCODE_SELECT; - case UIPressTypeMenu: - /* HIG says: "returns to previous screen" */ - return SDL_SCANCODE_MENU; - case UIPressTypePlayPause: - /* HIG says: "secondary button behavior" */ - return SDL_SCANCODE_PAUSE; - default: - return SDL_SCANCODE_UNKNOWN; - } -} - -- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event -{ - for (UIPress *press in presses) { - SDL_Scancode scancode = [self scancodeFromPressType:press.type]; - SDL_SendKeyboardKey(SDL_PRESSED, scancode); - } - - [super pressesBegan:presses withEvent:event]; -} - -- (void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event -{ - for (UIPress *press in presses) { - SDL_Scancode scancode = [self scancodeFromPressType:press.type]; - SDL_SendKeyboardKey(SDL_RELEASED, scancode); - } - - [super pressesEnded:presses withEvent:event]; -} - -- (void)pressesCancelled:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event -{ - for (UIPress *press in presses) { - SDL_Scancode scancode = [self scancodeFromPressType:press.type]; - SDL_SendKeyboardKey(SDL_RELEASED, scancode); - } - - [super pressesCancelled:presses withEvent:event]; -} - -- (void)pressesChanged:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event -{ - /* This is only called when the force of a press changes. */ - [super pressesChanged:presses withEvent:event]; -} -#endif /* TARGET_OS_TV || defined(__IPHONE_9_1) */ - -@end - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.h deleted file mode 100644 index 86085244105..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#import <UIKit/UIKit.h> - -#include "../SDL_sysvideo.h" - -#include "SDL_touch.h" - -#if TARGET_OS_TV -#import <GameController/GameController.h> -#define SDLRootViewController GCEventViewController -#else -#define SDLRootViewController UIViewController -#endif - -#if SDL_IPHONE_KEYBOARD -@interface SDL_uikitviewcontroller : SDLRootViewController <UITextFieldDelegate> -#else -@interface SDL_uikitviewcontroller : SDLRootViewController -#endif - -@property (nonatomic, assign) SDL_Window *window; - -- (instancetype)initWithSDLWindow:(SDL_Window *)_window; - -- (void)setAnimationCallback:(int)interval - callback:(void (*)(void*))callback - callbackParam:(void*)callbackParam; - -- (void)startAnimation; -- (void)stopAnimation; - -- (void)doLoop:(CADisplayLink*)sender; - -- (void)loadView; -- (void)viewDidLayoutSubviews; - -#if !TARGET_OS_TV -- (NSUInteger)supportedInterfaceOrientations; -- (BOOL)prefersStatusBarHidden; -#endif - -#if SDL_IPHONE_KEYBOARD -- (void)showKeyboard; -- (void)hideKeyboard; -- (void)initKeyboard; -- (void)deinitKeyboard; - -- (void)keyboardWillShow:(NSNotification *)notification; -- (void)keyboardWillHide:(NSNotification *)notification; - -- (void)updateKeyboard; - -@property (nonatomic, assign, getter=isKeyboardVisible) BOOL keyboardVisible; -@property (nonatomic, assign) SDL_Rect textInputRect; -@property (nonatomic, assign) int keyboardHeight; -#endif - -@end - -#if SDL_IPHONE_KEYBOARD -SDL_bool UIKit_HasScreenKeyboardSupport(_THIS); -void UIKit_ShowScreenKeyboard(_THIS, SDL_Window *window); -void UIKit_HideScreenKeyboard(_THIS, SDL_Window *window); -SDL_bool UIKit_IsScreenKeyboardShown(_THIS, SDL_Window *window); -void UIKit_SetTextInputRect(_THIS, SDL_Rect *rect); -#endif diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.m deleted file mode 100644 index e6e903ee4c6..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.m +++ /dev/null @@ -1,431 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "SDL_video.h" -#include "SDL_assert.h" -#include "SDL_hints.h" -#include "../SDL_sysvideo.h" -#include "../../events/SDL_events_c.h" - -#import "SDL_uikitviewcontroller.h" -#import "SDL_uikitmessagebox.h" -#include "SDL_uikitvideo.h" -#include "SDL_uikitmodes.h" -#include "SDL_uikitwindow.h" -#include "SDL_uikitopengles.h" - -#if SDL_IPHONE_KEYBOARD -#include "keyinfotable.h" -#endif - -#if TARGET_OS_TV -static void -SDL_AppleTVControllerUIHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint) -{ - @autoreleasepool { - SDL_uikitviewcontroller *viewcontroller = (__bridge SDL_uikitviewcontroller *) userdata; - viewcontroller.controllerUserInteractionEnabled = hint && (*hint != '0'); - } -} -#endif - -@implementation SDL_uikitviewcontroller { - CADisplayLink *displayLink; - int animationInterval; - void (*animationCallback)(void*); - void *animationCallbackParam; - -#if SDL_IPHONE_KEYBOARD - UITextField *textField; -#endif -} - -@synthesize window; - -- (instancetype)initWithSDLWindow:(SDL_Window *)_window -{ - if (self = [super initWithNibName:nil bundle:nil]) { - self.window = _window; - -#if SDL_IPHONE_KEYBOARD - [self initKeyboard]; -#endif - -#if TARGET_OS_TV - SDL_AddHintCallback(SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS, - SDL_AppleTVControllerUIHintChanged, - (__bridge void *) self); -#endif - } - return self; -} - -- (void)dealloc -{ -#if SDL_IPHONE_KEYBOARD - [self deinitKeyboard]; -#endif - -#if TARGET_OS_TV - SDL_DelHintCallback(SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS, - SDL_AppleTVControllerUIHintChanged, - (__bridge void *) self); -#endif -} - -- (void)setAnimationCallback:(int)interval - callback:(void (*)(void*))callback - callbackParam:(void*)callbackParam -{ - [self stopAnimation]; - - animationInterval = interval; - animationCallback = callback; - animationCallbackParam = callbackParam; - - if (animationCallback) { - [self startAnimation]; - } -} - -- (void)startAnimation -{ - displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(doLoop:)]; - [displayLink setFrameInterval:animationInterval]; - [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; -} - -- (void)stopAnimation -{ - [displayLink invalidate]; - displayLink = nil; -} - -- (void)doLoop:(CADisplayLink*)sender -{ - /* Don't run the game loop while a messagebox is up */ - if (!UIKit_ShowingMessageBox()) { - /* See the comment in the function definition. */ - UIKit_GL_RestoreCurrentContext(); - - animationCallback(animationCallbackParam); - } -} - -- (void)loadView -{ - /* Do nothing. */ -} - -- (void)viewDidLayoutSubviews -{ - const CGSize size = self.view.bounds.size; - int w = (int) size.width; - int h = (int) size.height; - - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, w, h); -} - -#if !TARGET_OS_TV -- (NSUInteger)supportedInterfaceOrientations -{ - return UIKit_GetSupportedOrientations(window); -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orient -{ - return ([self supportedInterfaceOrientations] & (1 << orient)) != 0; -} - -- (BOOL)prefersStatusBarHidden -{ - return (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) != 0; -} -#endif - -/* - ---- Keyboard related functionality below this line ---- - */ -#if SDL_IPHONE_KEYBOARD - -@synthesize textInputRect; -@synthesize keyboardHeight; -@synthesize keyboardVisible; - -/* Set ourselves up as a UITextFieldDelegate */ -- (void)initKeyboard -{ - textField = [[UITextField alloc] initWithFrame:CGRectZero]; - textField.delegate = self; - /* placeholder so there is something to delete! */ - textField.text = @" "; - - /* set UITextInputTrait properties, mostly to defaults */ - textField.autocapitalizationType = UITextAutocapitalizationTypeNone; - textField.autocorrectionType = UITextAutocorrectionTypeNo; - textField.enablesReturnKeyAutomatically = NO; - textField.keyboardAppearance = UIKeyboardAppearanceDefault; - textField.keyboardType = UIKeyboardTypeDefault; - textField.returnKeyType = UIReturnKeyDefault; - textField.secureTextEntry = NO; - - textField.hidden = YES; - keyboardVisible = NO; - -#if !TARGET_OS_TV - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - [center addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; - [center addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; -#endif -} - -- (void)setView:(UIView *)view -{ - [super setView:view]; - - [view addSubview:textField]; - - if (keyboardVisible) { - [self showKeyboard]; - } -} - -- (void)deinitKeyboard -{ -#if !TARGET_OS_TV - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - [center removeObserver:self name:UIKeyboardWillShowNotification object:nil]; - [center removeObserver:self name:UIKeyboardWillHideNotification object:nil]; -#endif -} - -/* reveal onscreen virtual keyboard */ -- (void)showKeyboard -{ - keyboardVisible = YES; - if (textField.window) { - [textField becomeFirstResponder]; - } -} - -/* hide onscreen virtual keyboard */ -- (void)hideKeyboard -{ - keyboardVisible = NO; - [textField resignFirstResponder]; -} - -- (void)keyboardWillShow:(NSNotification *)notification -{ -#if !TARGET_OS_TV - CGRect kbrect = [[notification userInfo][UIKeyboardFrameBeginUserInfoKey] CGRectValue]; - - /* The keyboard rect is in the coordinate space of the screen/window, but we - * want its height in the coordinate space of the view. */ - kbrect = [self.view convertRect:kbrect fromView:nil]; - - [self setKeyboardHeight:(int)kbrect.size.height]; -#endif -} - -- (void)keyboardWillHide:(NSNotification *)notification -{ - SDL_StopTextInput(); - [self setKeyboardHeight:0]; -} - -- (void)updateKeyboard -{ - CGAffineTransform t = self.view.transform; - CGPoint offset = CGPointMake(0.0, 0.0); - CGRect frame = UIKit_ComputeViewFrame(window, self.view.window.screen); - - if (self.keyboardHeight) { - int rectbottom = self.textInputRect.y + self.textInputRect.h; - int keybottom = self.view.bounds.size.height - self.keyboardHeight; - if (keybottom < rectbottom) { - offset.y = keybottom - rectbottom; - } - } - - /* Apply this view's transform (except any translation) to the offset, in - * order to orient it correctly relative to the frame's coordinate space. */ - t.tx = 0.0; - t.ty = 0.0; - offset = CGPointApplyAffineTransform(offset, t); - - /* Apply the updated offset to the view's frame. */ - frame.origin.x += offset.x; - frame.origin.y += offset.y; - - self.view.frame = frame; -} - -- (void)setKeyboardHeight:(int)height -{ - keyboardVisible = height > 0; - keyboardHeight = height; - [self updateKeyboard]; -} - -/* UITextFieldDelegate method. Invoked when user types something. */ -- (BOOL)textField:(UITextField *)_textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string -{ - NSUInteger len = string.length; - - if (len == 0) { - /* it wants to replace text with nothing, ie a delete */ - SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_BACKSPACE); - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_BACKSPACE); - } else { - /* go through all the characters in the string we've been sent and - * convert them to key presses */ - int i; - for (i = 0; i < len; i++) { - unichar c = [string characterAtIndex:i]; - Uint16 mod = 0; - SDL_Scancode code; - - if (c < 127) { - /* figure out the SDL_Scancode and SDL_keymod for this unichar */ - code = unicharToUIKeyInfoTable[c].code; - mod = unicharToUIKeyInfoTable[c].mod; - } else { - /* we only deal with ASCII right now */ - code = SDL_SCANCODE_UNKNOWN; - mod = 0; - } - - if (mod & KMOD_SHIFT) { - /* If character uses shift, press shift down */ - SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LSHIFT); - } - - /* send a keydown and keyup even for the character */ - SDL_SendKeyboardKey(SDL_PRESSED, code); - SDL_SendKeyboardKey(SDL_RELEASED, code); - - if (mod & KMOD_SHIFT) { - /* If character uses shift, press shift back up */ - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT); - } - } - - SDL_SendKeyboardText([string UTF8String]); - } - - return NO; /* don't allow the edit! (keep placeholder text there) */ -} - -/* Terminates the editing session */ -- (BOOL)textFieldShouldReturn:(UITextField*)_textField -{ - SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_RETURN); - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_RETURN); - SDL_StopTextInput(); - return YES; -} - -#endif - -@end - -/* iPhone keyboard addition functions */ -#if SDL_IPHONE_KEYBOARD - -static SDL_uikitviewcontroller * -GetWindowViewController(SDL_Window * window) -{ - if (!window || !window->driverdata) { - SDL_SetError("Invalid window"); - return nil; - } - - SDL_WindowData *data = (__bridge SDL_WindowData *)window->driverdata; - - return data.viewcontroller; -} - -SDL_bool -UIKit_HasScreenKeyboardSupport(_THIS) -{ - return SDL_TRUE; -} - -void -UIKit_ShowScreenKeyboard(_THIS, SDL_Window *window) -{ - @autoreleasepool { - SDL_uikitviewcontroller *vc = GetWindowViewController(window); - [vc showKeyboard]; - } -} - -void -UIKit_HideScreenKeyboard(_THIS, SDL_Window *window) -{ - @autoreleasepool { - SDL_uikitviewcontroller *vc = GetWindowViewController(window); - [vc hideKeyboard]; - } -} - -SDL_bool -UIKit_IsScreenKeyboardShown(_THIS, SDL_Window *window) -{ - @autoreleasepool { - SDL_uikitviewcontroller *vc = GetWindowViewController(window); - if (vc != nil) { - return vc.isKeyboardVisible; - } - return SDL_FALSE; - } -} - -void -UIKit_SetTextInputRect(_THIS, SDL_Rect *rect) -{ - if (!rect) { - SDL_InvalidParamError("rect"); - return; - } - - @autoreleasepool { - SDL_uikitviewcontroller *vc = GetWindowViewController(SDL_GetFocusWindow()); - if (vc != nil) { - vc.textInputRect = *rect; - - if (vc.keyboardVisible) { - [vc updateKeyboard]; - } - } - } -} - - -#endif /* SDL_IPHONE_KEYBOARD */ - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitwindow.h b/3rdparty/SDL2/src/video/uikit/SDL_uikitwindow.h deleted file mode 100644 index ed08c55d42b..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitwindow.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#ifndef _SDL_uikitwindow_h -#define _SDL_uikitwindow_h - -#include "../SDL_sysvideo.h" -#import "SDL_uikitvideo.h" -#import "SDL_uikitview.h" -#import "SDL_uikitviewcontroller.h" - -extern int UIKit_CreateWindow(_THIS, SDL_Window * window); -extern void UIKit_SetWindowTitle(_THIS, SDL_Window * window); -extern void UIKit_ShowWindow(_THIS, SDL_Window * window); -extern void UIKit_HideWindow(_THIS, SDL_Window * window); -extern void UIKit_RaiseWindow(_THIS, SDL_Window * window); -extern void UIKit_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered); -extern void UIKit_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen); -extern void UIKit_DestroyWindow(_THIS, SDL_Window * window); -extern SDL_bool UIKit_GetWindowWMInfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo * info); - -extern NSUInteger UIKit_GetSupportedOrientations(SDL_Window * window); - -@class UIWindow; - -@interface SDL_WindowData : NSObject - -@property (nonatomic, strong) UIWindow *uiwindow; -@property (nonatomic, strong) SDL_uikitviewcontroller *viewcontroller; - -/* Array of SDL_uikitviews owned by this window. */ -@property (nonatomic, copy) NSMutableArray *views; - -@end - -#endif /* _SDL_uikitwindow_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitwindow.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitwindow.m deleted file mode 100644 index 35c549b43df..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitwindow.m +++ /dev/null @@ -1,457 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "SDL_syswm.h" -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "SDL_assert.h" -#include "SDL_hints.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../../events/SDL_events_c.h" - -#include "SDL_uikitvideo.h" -#include "SDL_uikitevents.h" -#include "SDL_uikitmodes.h" -#include "SDL_uikitwindow.h" -#import "SDL_uikitappdelegate.h" - -#import "SDL_uikitview.h" -#import "SDL_uikitopenglview.h" - -#include <Foundation/Foundation.h> - -@implementation SDL_WindowData - -@synthesize uiwindow; -@synthesize viewcontroller; -@synthesize views; - -- (instancetype)init -{ - if ((self = [super init])) { - views = [NSMutableArray new]; - } - - return self; -} - -@end - -@interface SDL_uikitwindow : UIWindow - -- (void)layoutSubviews; - -@end - -@implementation SDL_uikitwindow - -- (void)layoutSubviews -{ - /* Workaround to fix window orientation issues in iOS 8+. */ - self.frame = self.screen.bounds; - [super layoutSubviews]; -} - -@end - - -static int SetupWindowData(_THIS, SDL_Window *window, UIWindow *uiwindow, SDL_bool created) -{ - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - SDL_DisplayData *displaydata = (__bridge SDL_DisplayData *) display->driverdata; - SDL_uikitview *view; - - CGRect frame = UIKit_ComputeViewFrame(window, displaydata.uiscreen); - int width = (int) frame.size.width; - int height = (int) frame.size.height; - - SDL_WindowData *data = [[SDL_WindowData alloc] init]; - if (!data) { - return SDL_OutOfMemory(); - } - - window->driverdata = (void *) CFBridgingRetain(data); - - data.uiwindow = uiwindow; - - /* only one window on iOS, always shown */ - window->flags &= ~SDL_WINDOW_HIDDEN; - - if (displaydata.uiscreen != [UIScreen mainScreen]) { - window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizable */ - window->flags &= ~SDL_WINDOW_INPUT_FOCUS; /* never has input focus */ - window->flags |= SDL_WINDOW_BORDERLESS; /* never has a status bar. */ - } - -#if !TARGET_OS_TV - if (displaydata.uiscreen == [UIScreen mainScreen]) { - NSUInteger orients = UIKit_GetSupportedOrientations(window); - BOOL supportsLandscape = (orients & UIInterfaceOrientationMaskLandscape) != 0; - BOOL supportsPortrait = (orients & (UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskPortraitUpsideDown)) != 0; - - /* Make sure the width/height are oriented correctly */ - if ((width > height && !supportsLandscape) || (height > width && !supportsPortrait)) { - int temp = width; - width = height; - height = temp; - } - } -#endif /* !TARGET_OS_TV */ - - window->x = 0; - window->y = 0; - window->w = width; - window->h = height; - - /* The View Controller will handle rotating the view when the device - * orientation changes. This will trigger resize events, if appropriate. */ - data.viewcontroller = [[SDL_uikitviewcontroller alloc] initWithSDLWindow:window]; - - /* The window will initially contain a generic view so resizes, touch events, - * etc. can be handled without an active OpenGL view/context. */ - view = [[SDL_uikitview alloc] initWithFrame:frame]; - - /* Sets this view as the controller's view, and adds the view to the window - * heirarchy. */ - [view setSDLWindow:window]; - - /* Make this window the current mouse focus for touch input */ - if (displaydata.uiscreen == [UIScreen mainScreen]) { - SDL_SetMouseFocus(window); - SDL_SetKeyboardFocus(window); - } - - return 0; -} - -int -UIKit_CreateWindow(_THIS, SDL_Window *window) -{ - @autoreleasepool { - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - SDL_DisplayData *data = (__bridge SDL_DisplayData *) display->driverdata; - - /* SDL currently puts this window at the start of display's linked list. We rely on this. */ - SDL_assert(_this->windows == window); - - /* We currently only handle a single window per display on iOS */ - if (window->next != NULL) { - return SDL_SetError("Only one window allowed per display."); - } - - /* If monitor has a resolution of 0x0 (hasn't been explicitly set by the - * user, so it's in standby), try to force the display to a resolution - * that most closely matches the desired window size. */ -#if !TARGET_OS_TV - const CGSize origsize = data.uiscreen.currentMode.size; - if ((origsize.width == 0.0f) && (origsize.height == 0.0f)) { - if (display->num_display_modes == 0) { - _this->GetDisplayModes(_this, display); - } - - int i; - const SDL_DisplayMode *bestmode = NULL; - for (i = display->num_display_modes; i >= 0; i--) { - const SDL_DisplayMode *mode = &display->display_modes[i]; - if ((mode->w >= window->w) && (mode->h >= window->h)) { - bestmode = mode; - } - } - - if (bestmode) { - SDL_DisplayModeData *modedata = (__bridge SDL_DisplayModeData *)bestmode->driverdata; - [data.uiscreen setCurrentMode:modedata.uiscreenmode]; - - /* desktop_mode doesn't change here (the higher level will - * use it to set all the screens back to their defaults - * upon window destruction, SDL_Quit(), etc. */ - display->current_mode = *bestmode; - } - } - - if (data.uiscreen == [UIScreen mainScreen]) { - if (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) { - [UIApplication sharedApplication].statusBarHidden = YES; - } else { - [UIApplication sharedApplication].statusBarHidden = NO; - } - } -#endif /* !TARGET_OS_TV */ - - /* ignore the size user requested, and make a fullscreen window */ - /* !!! FIXME: can we have a smaller view? */ - UIWindow *uiwindow = [[SDL_uikitwindow alloc] initWithFrame:data.uiscreen.bounds]; - - /* put the window on an external display if appropriate. */ - if (data.uiscreen != [UIScreen mainScreen]) { - [uiwindow setScreen:data.uiscreen]; - } - - if (SetupWindowData(_this, window, uiwindow, SDL_TRUE) < 0) { - return -1; - } - } - - return 1; -} - -void -UIKit_SetWindowTitle(_THIS, SDL_Window * window) -{ - @autoreleasepool { - SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata; - data.viewcontroller.title = @(window->title); - } -} - -void -UIKit_ShowWindow(_THIS, SDL_Window * window) -{ - @autoreleasepool { - SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata; - [data.uiwindow makeKeyAndVisible]; - } -} - -void -UIKit_HideWindow(_THIS, SDL_Window * window) -{ - @autoreleasepool { - SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata; - data.uiwindow.hidden = YES; - } -} - -void -UIKit_RaiseWindow(_THIS, SDL_Window * window) -{ - /* We don't currently offer a concept of "raising" the SDL window, since - * we only allow one per display, in the iOS fashion. - * However, we use this entry point to rebind the context to the view - * during OnWindowRestored processing. */ - _this->GL_MakeCurrent(_this, _this->current_glwin, _this->current_glctx); -} - -static void -UIKit_UpdateWindowBorder(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata; - SDL_uikitviewcontroller *viewcontroller = data.viewcontroller; - -#if !TARGET_OS_TV - if (data.uiwindow.screen == [UIScreen mainScreen]) { - if (window->flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS)) { - [UIApplication sharedApplication].statusBarHidden = YES; - } else { - [UIApplication sharedApplication].statusBarHidden = NO; - } - - /* iOS 7+ won't update the status bar until we tell it to. */ - if ([viewcontroller respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) { - [viewcontroller setNeedsStatusBarAppearanceUpdate]; - } - } - - /* Update the view's frame to account for the status bar change. */ - viewcontroller.view.frame = UIKit_ComputeViewFrame(window, data.uiwindow.screen); -#endif /* !TARGET_OS_TV */ - -#ifdef SDL_IPHONE_KEYBOARD - /* Make sure the view is offset correctly when the keyboard is visible. */ - [viewcontroller updateKeyboard]; -#endif - - [viewcontroller.view setNeedsLayout]; - [viewcontroller.view layoutIfNeeded]; -} - -void -UIKit_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) -{ - @autoreleasepool { - UIKit_UpdateWindowBorder(_this, window); - } -} - -void -UIKit_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen) -{ - @autoreleasepool { - UIKit_UpdateWindowBorder(_this, window); - } -} - -void -UIKit_DestroyWindow(_THIS, SDL_Window * window) -{ - @autoreleasepool { - if (window->driverdata != NULL) { - SDL_WindowData *data = (SDL_WindowData *) CFBridgingRelease(window->driverdata); - NSArray *views = nil; - - [data.viewcontroller stopAnimation]; - - /* Detach all views from this window. We use a copy of the array - * because setSDLWindow will remove the object from the original - * array, which would be undesirable if we were iterating over it. */ - views = [data.views copy]; - for (SDL_uikitview *view in views) { - [view setSDLWindow:NULL]; - } - - /* iOS may still hold a reference to the window after we release it. - * We want to make sure the SDL view controller isn't accessed in - * that case, because it would contain an invalid pointer to the old - * SDL window. */ - data.uiwindow.rootViewController = nil; - data.uiwindow.hidden = YES; - } - } - window->driverdata = NULL; -} - -SDL_bool -UIKit_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) -{ - @autoreleasepool { - SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata; - - if (info->version.major <= SDL_MAJOR_VERSION) { - int versionnum = SDL_VERSIONNUM(info->version.major, info->version.minor, info->version.patch); - - info->subsystem = SDL_SYSWM_UIKIT; - info->info.uikit.window = data.uiwindow; - - /* These struct members were added in SDL 2.0.4. */ - if (versionnum >= SDL_VERSIONNUM(2,0,4)) { - if ([data.viewcontroller.view isKindOfClass:[SDL_uikitopenglview class]]) { - SDL_uikitopenglview *glview = (SDL_uikitopenglview *)data.viewcontroller.view; - info->info.uikit.framebuffer = glview.drawableFramebuffer; - info->info.uikit.colorbuffer = glview.drawableRenderbuffer; - info->info.uikit.resolveFramebuffer = glview.msaaResolveFramebuffer; - } else { - info->info.uikit.framebuffer = 0; - info->info.uikit.colorbuffer = 0; - info->info.uikit.resolveFramebuffer = 0; - } - } - - return SDL_TRUE; - } else { - SDL_SetError("Application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } - } -} - -#if !TARGET_OS_TV -NSUInteger -UIKit_GetSupportedOrientations(SDL_Window * window) -{ - const char *hint = SDL_GetHint(SDL_HINT_ORIENTATIONS); - NSUInteger validOrientations = UIInterfaceOrientationMaskAll; - NSUInteger orientationMask = 0; - - @autoreleasepool { - SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata; - UIApplication *app = [UIApplication sharedApplication]; - - /* Get all possible valid orientations. If the app delegate doesn't tell - * us, we get the orientations from Info.plist via UIApplication. */ - if ([app.delegate respondsToSelector:@selector(application:supportedInterfaceOrientationsForWindow:)]) { - validOrientations = [app.delegate application:app supportedInterfaceOrientationsForWindow:data.uiwindow]; - } else if ([app respondsToSelector:@selector(supportedInterfaceOrientationsForWindow:)]) { - validOrientations = [app supportedInterfaceOrientationsForWindow:data.uiwindow]; - } - - if (hint != NULL) { - NSArray *orientations = [@(hint) componentsSeparatedByString:@" "]; - - if ([orientations containsObject:@"LandscapeLeft"]) { - orientationMask |= UIInterfaceOrientationMaskLandscapeLeft; - } - if ([orientations containsObject:@"LandscapeRight"]) { - orientationMask |= UIInterfaceOrientationMaskLandscapeRight; - } - if ([orientations containsObject:@"Portrait"]) { - orientationMask |= UIInterfaceOrientationMaskPortrait; - } - if ([orientations containsObject:@"PortraitUpsideDown"]) { - orientationMask |= UIInterfaceOrientationMaskPortraitUpsideDown; - } - } - - if (orientationMask == 0 && (window->flags & SDL_WINDOW_RESIZABLE)) { - /* any orientation is okay. */ - orientationMask = UIInterfaceOrientationMaskAll; - } - - if (orientationMask == 0) { - if (window->w >= window->h) { - orientationMask |= UIInterfaceOrientationMaskLandscape; - } - if (window->h >= window->w) { - orientationMask |= (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown); - } - } - - /* Don't allow upside-down orientation on phones, so answering calls is in the natural orientation */ - if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) { - orientationMask &= ~UIInterfaceOrientationMaskPortraitUpsideDown; - } - - /* If none of the specified orientations are actually supported by the - * app, we'll revert to what the app supports. An exception would be - * thrown by the system otherwise. */ - if ((validOrientations & orientationMask) == 0) { - orientationMask = validOrientations; - } - } - - return orientationMask; -} -#endif /* !TARGET_OS_TV */ - -int -SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam) -{ - if (!window || !window->driverdata) { - return SDL_SetError("Invalid window"); - } - - @autoreleasepool { - SDL_WindowData *data = (__bridge SDL_WindowData *)window->driverdata; - [data.viewcontroller setAnimationCallback:interval - callback:callback - callbackParam:callbackParam]; - } - - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/uikit/keyinfotable.h b/3rdparty/SDL2/src/video/uikit/keyinfotable.h deleted file mode 100644 index 962dbd922f1..00000000000 --- a/3rdparty/SDL2/src/video/uikit/keyinfotable.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _UIKIT_KeyInfo -#define _UIKIT_KeyInfo - -#include "SDL_scancode.h" - -/* - This file is used by the keyboard code in SDL_uikitview.m to convert between characters - passed in from the iPhone's virtual keyboard, and tuples of SDL_Scancode and SDL_keymods. - For example unicharToUIKeyInfoTable['a'] would give you the scan code and keymod for lower - case a. -*/ - -typedef struct -{ - SDL_Scancode code; - Uint16 mod; -} UIKitKeyInfo; - -/* So far only ASCII characters here */ -static UIKitKeyInfo unicharToUIKeyInfoTable[] = { -/* 0 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 1 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 2 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 3 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 4 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 5 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 6 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 7 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 8 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 9 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 10 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 11 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 12 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 13 */ { SDL_SCANCODE_RETURN, 0 }, -/* 14 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 15 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 16 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 17 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 18 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 19 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 20 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 21 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 22 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 23 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 24 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 25 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 26 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 27 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 28 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 29 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 30 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 31 */ { SDL_SCANCODE_UNKNOWN, 0 }, -/* 32 */ { SDL_SCANCODE_SPACE, 0 }, -/* 33 */ { SDL_SCANCODE_1, KMOD_SHIFT }, /* plus shift modifier '!' */ -/* 34 */ { SDL_SCANCODE_APOSTROPHE, KMOD_SHIFT }, /* plus shift modifier '"' */ -/* 35 */ { SDL_SCANCODE_3, KMOD_SHIFT }, /* plus shift modifier '#' */ -/* 36 */ { SDL_SCANCODE_4, KMOD_SHIFT }, /* plus shift modifier '$' */ -/* 37 */ { SDL_SCANCODE_5, KMOD_SHIFT }, /* plus shift modifier '%' */ -/* 38 */ { SDL_SCANCODE_7, KMOD_SHIFT }, /* plus shift modifier '&' */ -/* 39 */ { SDL_SCANCODE_APOSTROPHE, 0 }, /* ''' */ -/* 40 */ { SDL_SCANCODE_9, KMOD_SHIFT }, /* plus shift modifier '(' */ -/* 41 */ { SDL_SCANCODE_0, KMOD_SHIFT }, /* plus shift modifier ')' */ -/* 42 */ { SDL_SCANCODE_8, KMOD_SHIFT }, /* '*' */ -/* 43 */ { SDL_SCANCODE_EQUALS, KMOD_SHIFT }, /* plus shift modifier '+' */ -/* 44 */ { SDL_SCANCODE_COMMA, 0 }, /* ',' */ -/* 45 */ { SDL_SCANCODE_MINUS, 0 }, /* '-' */ -/* 46 */ { SDL_SCANCODE_PERIOD, 0 }, /* '.' */ -/* 47 */ { SDL_SCANCODE_SLASH, 0 }, /* '/' */ -/* 48 */ { SDL_SCANCODE_0, 0 }, -/* 49 */ { SDL_SCANCODE_1, 0 }, -/* 50 */ { SDL_SCANCODE_2, 0 }, -/* 51 */ { SDL_SCANCODE_3, 0 }, -/* 52 */ { SDL_SCANCODE_4, 0 }, -/* 53 */ { SDL_SCANCODE_5, 0 }, -/* 54 */ { SDL_SCANCODE_6, 0 }, -/* 55 */ { SDL_SCANCODE_7, 0 }, -/* 56 */ { SDL_SCANCODE_8, 0 }, -/* 57 */ { SDL_SCANCODE_9, 0 }, -/* 58 */ { SDL_SCANCODE_SEMICOLON, KMOD_SHIFT }, /* plus shift modifier ';' */ -/* 59 */ { SDL_SCANCODE_SEMICOLON, 0 }, -/* 60 */ { SDL_SCANCODE_COMMA, KMOD_SHIFT }, /* plus shift modifier '<' */ -/* 61 */ { SDL_SCANCODE_EQUALS, 0 }, -/* 62 */ { SDL_SCANCODE_PERIOD, KMOD_SHIFT }, /* plus shift modifier '>' */ -/* 63 */ { SDL_SCANCODE_SLASH, KMOD_SHIFT }, /* plus shift modifier '?' */ -/* 64 */ { SDL_SCANCODE_2, KMOD_SHIFT }, /* plus shift modifier '@' */ -/* 65 */ { SDL_SCANCODE_A, KMOD_SHIFT }, /* all the following need shift modifiers */ -/* 66 */ { SDL_SCANCODE_B, KMOD_SHIFT }, -/* 67 */ { SDL_SCANCODE_C, KMOD_SHIFT }, -/* 68 */ { SDL_SCANCODE_D, KMOD_SHIFT }, -/* 69 */ { SDL_SCANCODE_E, KMOD_SHIFT }, -/* 70 */ { SDL_SCANCODE_F, KMOD_SHIFT }, -/* 71 */ { SDL_SCANCODE_G, KMOD_SHIFT }, -/* 72 */ { SDL_SCANCODE_H, KMOD_SHIFT }, -/* 73 */ { SDL_SCANCODE_I, KMOD_SHIFT }, -/* 74 */ { SDL_SCANCODE_J, KMOD_SHIFT }, -/* 75 */ { SDL_SCANCODE_K, KMOD_SHIFT }, -/* 76 */ { SDL_SCANCODE_L, KMOD_SHIFT }, -/* 77 */ { SDL_SCANCODE_M, KMOD_SHIFT }, -/* 78 */ { SDL_SCANCODE_N, KMOD_SHIFT }, -/* 79 */ { SDL_SCANCODE_O, KMOD_SHIFT }, -/* 80 */ { SDL_SCANCODE_P, KMOD_SHIFT }, -/* 81 */ { SDL_SCANCODE_Q, KMOD_SHIFT }, -/* 82 */ { SDL_SCANCODE_R, KMOD_SHIFT }, -/* 83 */ { SDL_SCANCODE_S, KMOD_SHIFT }, -/* 84 */ { SDL_SCANCODE_T, KMOD_SHIFT }, -/* 85 */ { SDL_SCANCODE_U, KMOD_SHIFT }, -/* 86 */ { SDL_SCANCODE_V, KMOD_SHIFT }, -/* 87 */ { SDL_SCANCODE_W, KMOD_SHIFT }, -/* 88 */ { SDL_SCANCODE_X, KMOD_SHIFT }, -/* 89 */ { SDL_SCANCODE_Y, KMOD_SHIFT }, -/* 90 */ { SDL_SCANCODE_Z, KMOD_SHIFT }, -/* 91 */ { SDL_SCANCODE_LEFTBRACKET, 0 }, -/* 92 */ { SDL_SCANCODE_BACKSLASH, 0 }, -/* 93 */ { SDL_SCANCODE_RIGHTBRACKET, 0 }, -/* 94 */ { SDL_SCANCODE_6, KMOD_SHIFT }, /* plus shift modifier '^' */ -/* 95 */ { SDL_SCANCODE_MINUS, KMOD_SHIFT }, /* plus shift modifier '_' */ -/* 96 */ { SDL_SCANCODE_GRAVE, KMOD_SHIFT }, /* '`' */ -/* 97 */ { SDL_SCANCODE_A, 0 }, -/* 98 */ { SDL_SCANCODE_B, 0 }, -/* 99 */ { SDL_SCANCODE_C, 0 }, -/* 100 */{ SDL_SCANCODE_D, 0 }, -/* 101 */{ SDL_SCANCODE_E, 0 }, -/* 102 */{ SDL_SCANCODE_F, 0 }, -/* 103 */{ SDL_SCANCODE_G, 0 }, -/* 104 */{ SDL_SCANCODE_H, 0 }, -/* 105 */{ SDL_SCANCODE_I, 0 }, -/* 106 */{ SDL_SCANCODE_J, 0 }, -/* 107 */{ SDL_SCANCODE_K, 0 }, -/* 108 */{ SDL_SCANCODE_L, 0 }, -/* 109 */{ SDL_SCANCODE_M, 0 }, -/* 110 */{ SDL_SCANCODE_N, 0 }, -/* 111 */{ SDL_SCANCODE_O, 0 }, -/* 112 */{ SDL_SCANCODE_P, 0 }, -/* 113 */{ SDL_SCANCODE_Q, 0 }, -/* 114 */{ SDL_SCANCODE_R, 0 }, -/* 115 */{ SDL_SCANCODE_S, 0 }, -/* 116 */{ SDL_SCANCODE_T, 0 }, -/* 117 */{ SDL_SCANCODE_U, 0 }, -/* 118 */{ SDL_SCANCODE_V, 0 }, -/* 119 */{ SDL_SCANCODE_W, 0 }, -/* 120 */{ SDL_SCANCODE_X, 0 }, -/* 121 */{ SDL_SCANCODE_Y, 0 }, -/* 122 */{ SDL_SCANCODE_Z, 0 }, -/* 123 */{ SDL_SCANCODE_LEFTBRACKET, KMOD_SHIFT }, /* plus shift modifier '{' */ -/* 124 */{ SDL_SCANCODE_BACKSLASH, KMOD_SHIFT }, /* plus shift modifier '|' */ -/* 125 */{ SDL_SCANCODE_RIGHTBRACKET, KMOD_SHIFT }, /* plus shift modifier '}' */ -/* 126 */{ SDL_SCANCODE_GRAVE, KMOD_SHIFT }, /* plus shift modifier '~' */ -/* 127 */{ SDL_SCANCODE_BACKSPACE, KMOD_SHIFT } -}; - -#endif /* _UIKIT_KeyInfo */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/vivante/SDL_vivanteopengles.c b/3rdparty/SDL2/src/video/vivante/SDL_vivanteopengles.c deleted file mode 100644 index 687cc6a730a..00000000000 --- a/3rdparty/SDL2/src/video/vivante/SDL_vivanteopengles.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_VIVANTE && SDL_VIDEO_OPENGL_EGL - -#include "SDL_vivanteopengles.h" -#include "SDL_vivantevideo.h" - -/* EGL implementation of SDL OpenGL support */ - -int -VIVANTE_GLES_LoadLibrary(_THIS, const char *path) -{ - SDL_DisplayData *displaydata; - - displaydata = SDL_GetDisplayDriverData(0); - - return SDL_EGL_LoadLibrary(_this, path, displaydata->native_display); -} - -SDL_EGL_CreateContext_impl(VIVANTE) -SDL_EGL_SwapWindow_impl(VIVANTE) -SDL_EGL_MakeCurrent_impl(VIVANTE) - -#endif /* SDL_VIDEO_DRIVER_VIVANTE && SDL_VIDEO_OPENGL_EGL */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/vivante/SDL_vivanteopengles.h b/3rdparty/SDL2/src/video/vivante/SDL_vivanteopengles.h deleted file mode 100644 index f47bf7797a3..00000000000 --- a/3rdparty/SDL2/src/video/vivante/SDL_vivanteopengles.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_vivanteopengles_h -#define _SDL_vivanteopengles_h - -#if SDL_VIDEO_DRIVER_VIVANTE && SDL_VIDEO_OPENGL_EGL - -#include "../SDL_sysvideo.h" -#include "../SDL_egl_c.h" - -/* OpenGLES functions */ -#define VIVANTE_GLES_GetAttribute SDL_EGL_GetAttribute -#define VIVANTE_GLES_GetProcAddress SDL_EGL_GetProcAddress -#define VIVANTE_GLES_UnloadLibrary SDL_EGL_UnloadLibrary -#define VIVANTE_GLES_SetSwapInterval SDL_EGL_SetSwapInterval -#define VIVANTE_GLES_GetSwapInterval SDL_EGL_GetSwapInterval -#define VIVANTE_GLES_DeleteContext SDL_EGL_DeleteContext - -extern int VIVANTE_GLES_LoadLibrary(_THIS, const char *path); -extern SDL_GLContext VIVANTE_GLES_CreateContext(_THIS, SDL_Window * window); -extern void VIVANTE_GLES_SwapWindow(_THIS, SDL_Window * window); -extern int VIVANTE_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); - -#endif /* SDL_VIDEO_DRIVER_VIVANTE && SDL_VIDEO_OPENGL_EGL */ - -#endif /* _SDL_vivanteopengles_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/vivante/SDL_vivanteplatform.c b/3rdparty/SDL2/src/video/vivante/SDL_vivanteplatform.c deleted file mode 100644 index 76233417ebe..00000000000 --- a/3rdparty/SDL2/src/video/vivante/SDL_vivanteplatform.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_VIVANTE - -#include "SDL_vivanteplatform.h" - -#ifdef VIVANTE_PLATFORM_GENERIC - -int -VIVANTE_SetupPlatform(_THIS) -{ - return 0; -} - -void -VIVANTE_CleanupPlatform(_THIS) -{ -} - -#endif /* VIVANTE_PLATFORM_GENERIC */ - -#endif /* SDL_VIDEO_DRIVER_VIVANTE */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/vivante/SDL_vivanteplatform.h b/3rdparty/SDL2/src/video/vivante/SDL_vivanteplatform.h deleted file mode 100644 index 6e11cce6249..00000000000 --- a/3rdparty/SDL2/src/video/vivante/SDL_vivanteplatform.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_vivanteplatform_h -#define _SDL_vivanteplatform_h - -#if SDL_VIDEO_DRIVER_VIVANTE - -#include "SDL_vivantevideo.h" - -#if defined(CAVIUM) -#define VIVANTE_PLATFORM_CAVIUM -#elif defined(MARVELL) -#define VIVANTE_PLATFORM_MARVELL -#else -#define VIVANTE_PLATFORM_GENERIC -#endif - -extern int VIVANTE_SetupPlatform(_THIS); -extern void VIVANTE_CleanupPlatform(_THIS); - -#endif /* SDL_VIDEO_DRIVER_VIVANTE */ - -#endif /* _SDL_vivanteplatform_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/vivante/SDL_vivantevideo.c b/3rdparty/SDL2/src/video/vivante/SDL_vivantevideo.c deleted file mode 100644 index 0372de5c352..00000000000 --- a/3rdparty/SDL2/src/video/vivante/SDL_vivantevideo.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_VIVANTE - -/* SDL internals */ -#include "../SDL_sysvideo.h" -#include "SDL_version.h" -#include "SDL_syswm.h" -#include "SDL_loadso.h" -#include "SDL_events.h" -#include "../../events/SDL_events_c.h" - -#ifdef SDL_INPUT_LINUXEV -#include "../../core/linux/SDL_evdev.h" -#endif - -#include "SDL_vivantevideo.h" -#include "SDL_vivanteplatform.h" -#include "SDL_vivanteopengles.h" - - -static int -VIVANTE_Available(void) -{ - return 1; -} - -static void -VIVANTE_Destroy(SDL_VideoDevice * device) -{ - if (device->driverdata != NULL) { - SDL_free(device->driverdata); - device->driverdata = NULL; - } -} - -static SDL_VideoDevice * -VIVANTE_Create() -{ - SDL_VideoDevice *device; - SDL_VideoData *data; - - /* Initialize SDL_VideoDevice structure */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (device == NULL) { - SDL_OutOfMemory(); - return NULL; - } - - /* Initialize internal data */ - data = (SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); - if (data == NULL) { - SDL_OutOfMemory(); - SDL_free(device); - return NULL; - } - - device->driverdata = data; - - /* Setup amount of available displays */ - device->num_displays = 0; - - /* Set device free function */ - device->free = VIVANTE_Destroy; - - /* Setup all functions which we can handle */ - device->VideoInit = VIVANTE_VideoInit; - device->VideoQuit = VIVANTE_VideoQuit; - device->GetDisplayModes = VIVANTE_GetDisplayModes; - device->SetDisplayMode = VIVANTE_SetDisplayMode; - device->CreateWindow = VIVANTE_CreateWindow; - device->SetWindowTitle = VIVANTE_SetWindowTitle; - device->SetWindowPosition = VIVANTE_SetWindowPosition; - device->SetWindowSize = VIVANTE_SetWindowSize; - device->ShowWindow = VIVANTE_ShowWindow; - device->HideWindow = VIVANTE_HideWindow; - device->DestroyWindow = VIVANTE_DestroyWindow; - device->GetWindowWMInfo = VIVANTE_GetWindowWMInfo; - - device->GL_LoadLibrary = VIVANTE_GLES_LoadLibrary; - device->GL_GetProcAddress = VIVANTE_GLES_GetProcAddress; - device->GL_UnloadLibrary = VIVANTE_GLES_UnloadLibrary; - device->GL_CreateContext = VIVANTE_GLES_CreateContext; - device->GL_MakeCurrent = VIVANTE_GLES_MakeCurrent; - device->GL_SetSwapInterval = VIVANTE_GLES_SetSwapInterval; - device->GL_GetSwapInterval = VIVANTE_GLES_GetSwapInterval; - device->GL_SwapWindow = VIVANTE_GLES_SwapWindow; - device->GL_DeleteContext = VIVANTE_GLES_DeleteContext; - - device->PumpEvents = VIVANTE_PumpEvents; - - return device; -} - -VideoBootStrap VIVANTE_bootstrap = { - "vivante", - "Vivante EGL Video Driver", - VIVANTE_Available, - VIVANTE_Create -}; - -/*****************************************************************************/ -/* SDL Video and Display initialization/handling functions */ -/*****************************************************************************/ - -static int -VIVANTE_AddVideoDisplays(_THIS) -{ - SDL_VideoData *videodata = _this->driverdata; - SDL_VideoDisplay display; - SDL_DisplayMode current_mode; - SDL_DisplayData *data; - int pitch = 0, bpp = 0; - unsigned long pixels = 0; - - data = (SDL_DisplayData *) SDL_calloc(1, sizeof(SDL_DisplayData)); - if (data == NULL) { - return SDL_OutOfMemory(); - } - - SDL_zero(current_mode); -#if SDL_VIDEO_DRIVER_VIVANTE_VDK - data->native_display = vdkGetDisplay(videodata->vdk_private); - - vdkGetDisplayInfo(data->native_display, ¤t_mode.w, ¤t_mode.h, &pixels, &pitch, &bpp); -#else - data->native_display = videodata->fbGetDisplayByIndex(0); - - videodata->fbGetDisplayInfo(data->native_display, ¤t_mode.w, ¤t_mode.h, &pixels, &pitch, &bpp); -#endif /* SDL_VIDEO_DRIVER_VIVANTE_VDK */ - - switch (bpp) - { - default: /* Is another format used? */ - case 16: - current_mode.format = SDL_PIXELFORMAT_RGB565; - break; - } - /* FIXME: How do we query refresh rate? */ - current_mode.refresh_rate = 60; - - SDL_zero(display); - display.desktop_mode = current_mode; - display.current_mode = current_mode; - display.driverdata = data; - SDL_AddVideoDisplay(&display); - return 0; -} - -int -VIVANTE_VideoInit(_THIS) -{ - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - -#if SDL_VIDEO_DRIVER_VIVANTE_VDK - videodata->vdk_private = vdkInitialize(); - if (!videodata->vdk_private) { - return SDL_SetError("vdkInitialize() failed"); - } -#else - videodata->egl_handle = SDL_LoadObject("libEGL.so.1"); - if (!videodata->egl_handle) { - videodata->egl_handle = SDL_LoadObject("libEGL.so"); - if (!videodata->egl_handle) { - return -1; - } - } -#define LOAD_FUNC(NAME) \ - videodata->NAME = SDL_LoadFunction(videodata->egl_handle, #NAME); \ - if (!videodata->NAME) return -1; - - LOAD_FUNC(fbGetDisplay); - LOAD_FUNC(fbGetDisplayByIndex); - LOAD_FUNC(fbGetDisplayGeometry); - LOAD_FUNC(fbGetDisplayInfo); - LOAD_FUNC(fbDestroyDisplay); - LOAD_FUNC(fbCreateWindow); - LOAD_FUNC(fbGetWindowGeometry); - LOAD_FUNC(fbGetWindowInfo); - LOAD_FUNC(fbDestroyWindow); -#endif - - if (VIVANTE_SetupPlatform(_this) < 0) { - return -1; - } - - if (VIVANTE_AddVideoDisplays(_this) < 0) { - return -1; - } - -#ifdef SDL_INPUT_LINUXEV - if (SDL_EVDEV_Init() < 0) { - return -1; - } -#endif - - return 0; -} - -void -VIVANTE_VideoQuit(_THIS) -{ - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - -#ifdef SDL_INPUT_LINUXEV - SDL_EVDEV_Quit(); -#endif - - VIVANTE_CleanupPlatform(_this); - -#if SDL_VIDEO_DRIVER_VIVANTE_VDK - if (videodata->vdk_private) { - vdkExit(videodata->vdk_private); - videodata->vdk_private = NULL; - } -#else - if (videodata->egl_handle) { - SDL_UnloadObject(videodata->egl_handle); - videodata->egl_handle = NULL; - } -#endif -} - -void -VIVANTE_GetDisplayModes(_THIS, SDL_VideoDisplay * display) -{ - /* Only one display mode available, the current one */ - SDL_AddDisplayMode(display, &display->current_mode); -} - -int -VIVANTE_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - return 0; -} - -int -VIVANTE_CreateWindow(_THIS, SDL_Window * window) -{ - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - SDL_DisplayData *displaydata; - SDL_WindowData *data; - - displaydata = SDL_GetDisplayDriverData(0); - - /* Allocate window internal data */ - data = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); - if (data == NULL) { - return SDL_OutOfMemory(); - } - - /* Setup driver data for this window */ - window->driverdata = data; - -#if SDL_VIDEO_DRIVER_VIVANTE_VDK - data->native_window = vdkCreateWindow(displaydata->native_display, window->x, window->y, window->w, window->h); -#else - data->native_window = videodata->fbCreateWindow(displaydata->native_display, window->x, window->y, window->w, window->h); -#endif - if (!data->native_window) { - return SDL_SetError("VIVANTE: Can't create native window"); - } - - if (window->flags & SDL_WINDOW_OPENGL) { - data->egl_surface = SDL_EGL_CreateSurface(_this, data->native_window); - if (data->egl_surface == EGL_NO_SURFACE) { - return SDL_SetError("VIVANTE: Can't create EGL surface"); - } - } else { - data->egl_surface = EGL_NO_SURFACE; - } - - /* Window has been successfully created */ - return 0; -} - -void -VIVANTE_DestroyWindow(_THIS, SDL_Window * window) -{ - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - SDL_WindowData *data; - - data = window->driverdata; - if (data) { - if (data->egl_surface != EGL_NO_SURFACE) { - SDL_EGL_DestroySurface(_this, data->egl_surface); - } - - if (data->native_window) { -#if SDL_VIDEO_DRIVER_VIVANTE_VDK - vdkDestroyWindow(data->native_window); -#else - videodata->fbDestroyWindow(data->native_window); -#endif - } - - SDL_free(data); - } - window->driverdata = NULL; -} - -void -VIVANTE_SetWindowTitle(_THIS, SDL_Window * window) -{ -#if SDL_VIDEO_DRIVER_VIVANTE_VDK - SDL_WindowData *data = window->driverdata; - vdkSetWindowTitle(data->native_window, window->title); -#endif -} - -void -VIVANTE_SetWindowPosition(_THIS, SDL_Window * window) -{ - /* FIXME */ -} - -void -VIVANTE_SetWindowSize(_THIS, SDL_Window * window) -{ - /* FIXME */ -} - -void -VIVANTE_ShowWindow(_THIS, SDL_Window * window) -{ -#if SDL_VIDEO_DRIVER_VIVANTE_VDK - SDL_WindowData *data = window->driverdata; - vdkShowWindow(data->native_window); -#endif - SDL_SetMouseFocus(window); - SDL_SetKeyboardFocus(window); -} - -void -VIVANTE_HideWindow(_THIS, SDL_Window * window) -{ -#if SDL_VIDEO_DRIVER_VIVANTE_VDK - SDL_WindowData *data = window->driverdata; - vdkHideWindow(data->native_window); -#endif -} - -/*****************************************************************************/ -/* SDL Window Manager function */ -/*****************************************************************************/ -SDL_bool -VIVANTE_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_DisplayData *displaydata = SDL_GetDisplayDriverData(0); - - if (info->version.major == SDL_MAJOR_VERSION && - info->version.minor == SDL_MINOR_VERSION) { - info->subsystem = SDL_SYSWM_VIVANTE; - info->info.vivante.display = displaydata->native_display; - info->info.vivante.window = data->native_window; - return SDL_TRUE; - } else { - SDL_SetError("Application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } -} - -/*****************************************************************************/ -/* SDL event functions */ -/*****************************************************************************/ -void VIVANTE_PumpEvents(_THIS) -{ -#ifdef SDL_INPUT_LINUXEV - SDL_EVDEV_Poll(); -#endif -} - -#endif /* SDL_VIDEO_DRIVER_VIVANTE */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/vivante/SDL_vivantevideo.h b/3rdparty/SDL2/src/video/vivante/SDL_vivantevideo.h deleted file mode 100644 index b99c73375b4..00000000000 --- a/3rdparty/SDL2/src/video/vivante/SDL_vivantevideo.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_vivantevideo_h -#define _SDL_vivantevideo_h - -#include "../../SDL_internal.h" -#include "../SDL_sysvideo.h" - -#include "SDL_egl.h" - -#if SDL_VIDEO_DRIVER_VIVANTE_VDK -#include <gc_vdk.h> -#else -#include <EGL/egl.h> -#endif - -typedef struct SDL_VideoData -{ -#if SDL_VIDEO_DRIVER_VIVANTE_VDK - vdkPrivate vdk_private; -#else - void *egl_handle; /* EGL shared library handle */ - EGLNativeDisplayType (EGLAPIENTRY *fbGetDisplay)(void *context); - EGLNativeDisplayType (EGLAPIENTRY *fbGetDisplayByIndex)(int DisplayIndex); - void (EGLAPIENTRY *fbGetDisplayGeometry)(EGLNativeDisplayType Display, int *Width, int *Height); - void (EGLAPIENTRY *fbGetDisplayInfo)(EGLNativeDisplayType Display, int *Width, int *Height, unsigned long *Physical, int *Stride, int *BitsPerPixel); - void (EGLAPIENTRY *fbDestroyDisplay)(EGLNativeDisplayType Display); - EGLNativeWindowType (EGLAPIENTRY *fbCreateWindow)(EGLNativeDisplayType Display, int X, int Y, int Width, int Height); - void (EGLAPIENTRY *fbGetWindowGeometry)(EGLNativeWindowType Window, int *X, int *Y, int *Width, int *Height); - void (EGLAPIENTRY *fbGetWindowInfo)(EGLNativeWindowType Window, int *X, int *Y, int *Width, int *Height, int *BitsPerPixel, unsigned int *Offset); - void (EGLAPIENTRY *fbDestroyWindow)(EGLNativeWindowType Window); -#endif -} SDL_VideoData; - -typedef struct SDL_DisplayData -{ - EGLNativeDisplayType native_display; -} SDL_DisplayData; - -typedef struct SDL_WindowData -{ - EGLNativeWindowType native_window; - EGLSurface egl_surface; -} SDL_WindowData; - -/****************************************************************************/ -/* SDL_VideoDevice functions declaration */ -/****************************************************************************/ - -/* Display and window functions */ -int VIVANTE_VideoInit(_THIS); -void VIVANTE_VideoQuit(_THIS); -void VIVANTE_GetDisplayModes(_THIS, SDL_VideoDisplay * display); -int VIVANTE_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -int VIVANTE_CreateWindow(_THIS, SDL_Window * window); -void VIVANTE_SetWindowTitle(_THIS, SDL_Window * window); -void VIVANTE_SetWindowPosition(_THIS, SDL_Window * window); -void VIVANTE_SetWindowSize(_THIS, SDL_Window * window); -void VIVANTE_ShowWindow(_THIS, SDL_Window * window); -void VIVANTE_HideWindow(_THIS, SDL_Window * window); -void VIVANTE_DestroyWindow(_THIS, SDL_Window * window); - -/* Window manager function */ -SDL_bool VIVANTE_GetWindowWMInfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo *info); - -/* Event functions */ -void VIVANTE_PumpEvents(_THIS); - -#endif /* _SDL_vivantevideo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylanddyn.c b/3rdparty/SDL2/src/video/wayland/SDL_waylanddyn.c deleted file mode 100644 index 14674fbe2f6..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylanddyn.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WAYLAND - -#define DEBUG_DYNAMIC_WAYLAND 0 - -#include "SDL_waylanddyn.h" - -#if DEBUG_DYNAMIC_WAYLAND -#include "SDL_log.h" -#endif - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC - -#include "SDL_name.h" -#include "SDL_loadso.h" - -typedef struct -{ - void *lib; - const char *libname; -} waylanddynlib; - -#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC -#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC NULL -#endif -#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL -#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL NULL -#endif -#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR -#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR NULL -#endif -#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON -#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON NULL -#endif - -static waylanddynlib waylandlibs[] = { - {NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC}, - {NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL}, - {NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR}, - {NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON} -}; - -static void * -WAYLAND_GetSym(const char *fnname, int *pHasModule) -{ - int i; - void *fn = NULL; - for (i = 0; i < SDL_TABLESIZE(waylandlibs); i++) { - if (waylandlibs[i].lib != NULL) { - fn = SDL_LoadFunction(waylandlibs[i].lib, fnname); - if (fn != NULL) - break; - } - } - -#if DEBUG_DYNAMIC_WAYLAND - if (fn != NULL) - SDL_Log("WAYLAND: Found '%s' in %s (%p)\n", fnname, waylandlibs[i].libname, fn); - else - SDL_Log("WAYLAND: Symbol '%s' NOT FOUND!\n", fnname); -#endif - - if (fn == NULL) - *pHasModule = 0; /* kill this module. */ - - return fn; -} - -#endif /* SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC */ - -/* Define all the function pointers and wrappers... */ -#define SDL_WAYLAND_MODULE(modname) int SDL_WAYLAND_HAVE_##modname = 0; -#define SDL_WAYLAND_SYM(rc,fn,params) SDL_DYNWAYLANDFN_##fn WAYLAND_##fn = NULL; -#define SDL_WAYLAND_INTERFACE(iface) const struct wl_interface *WAYLAND_##iface = NULL; -#include "SDL_waylandsym.h" - -static int wayland_load_refcount = 0; - -void -SDL_WAYLAND_UnloadSymbols(void) -{ - /* Don't actually unload if more than one module is using the libs... */ - if (wayland_load_refcount > 0) { - if (--wayland_load_refcount == 0) { -#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC - int i; -#endif - - /* set all the function pointers to NULL. */ -#define SDL_WAYLAND_MODULE(modname) SDL_WAYLAND_HAVE_##modname = 0; -#define SDL_WAYLAND_SYM(rc,fn,params) WAYLAND_##fn = NULL; -#define SDL_WAYLAND_INTERFACE(iface) WAYLAND_##iface = NULL; -#include "SDL_waylandsym.h" - - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC - for (i = 0; i < SDL_TABLESIZE(waylandlibs); i++) { - if (waylandlibs[i].lib != NULL) { - SDL_UnloadObject(waylandlibs[i].lib); - waylandlibs[i].lib = NULL; - } - } -#endif - } - } -} - -/* returns non-zero if all needed symbols were loaded. */ -int -SDL_WAYLAND_LoadSymbols(void) -{ - int rc = 1; /* always succeed if not using Dynamic WAYLAND stuff. */ - - /* deal with multiple modules (dga, wayland, etc) needing these symbols... */ - if (wayland_load_refcount++ == 0) { -#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC - int i; - int *thismod = NULL; - for (i = 0; i < SDL_TABLESIZE(waylandlibs); i++) { - if (waylandlibs[i].libname != NULL) { - waylandlibs[i].lib = SDL_LoadObject(waylandlibs[i].libname); - } - } - -#define SDL_WAYLAND_MODULE(modname) SDL_WAYLAND_HAVE_##modname = 1; /* default yes */ -#include "SDL_waylandsym.h" - -#define SDL_WAYLAND_MODULE(modname) thismod = &SDL_WAYLAND_HAVE_##modname; -#define SDL_WAYLAND_SYM(rc,fn,params) WAYLAND_##fn = (SDL_DYNWAYLANDFN_##fn) WAYLAND_GetSym(#fn,thismod); -#define SDL_WAYLAND_INTERFACE(iface) WAYLAND_##iface = (struct wl_interface *) WAYLAND_GetSym(#iface,thismod); -#include "SDL_waylandsym.h" - - if (SDL_WAYLAND_HAVE_WAYLAND_CLIENT) { - /* all required symbols loaded. */ - SDL_ClearError(); - } else { - /* in case something got loaded... */ - SDL_WAYLAND_UnloadSymbols(); - rc = 0; - } - -#else /* no dynamic WAYLAND */ - -#define SDL_WAYLAND_MODULE(modname) SDL_WAYLAND_HAVE_##modname = 1; /* default yes */ -#define SDL_WAYLAND_SYM(rc,fn,params) WAYLAND_##fn = fn; -#define SDL_WAYLAND_INTERFACE(iface) WAYLAND_##iface = &iface; -#include "SDL_waylandsym.h" - -#endif - } - - return rc; -} - -#endif /* SDL_VIDEO_DRIVER_WAYLAND */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylanddyn.h b/3rdparty/SDL2/src/video/wayland/SDL_waylanddyn.h deleted file mode 100644 index f1f65256639..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylanddyn.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_waylanddyn_h -#define _SDL_waylanddyn_h - -#include "../../SDL_internal.h" - -/* We can't include wayland-client.h here - * but we need some structs from it - */ -struct wl_interface; -struct wl_proxy; -struct wl_event_queue; -struct wl_display; -struct wl_surface; -struct wl_shm; - -#include <stdint.h> -#include "wayland-cursor.h" -#include "wayland-util.h" -#include "xkbcommon/xkbcommon.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -int SDL_WAYLAND_LoadSymbols(void); -void SDL_WAYLAND_UnloadSymbols(void); - -#define SDL_WAYLAND_MODULE(modname) extern int SDL_WAYLAND_HAVE_##modname; -#define SDL_WAYLAND_SYM(rc,fn,params) \ - typedef rc (*SDL_DYNWAYLANDFN_##fn) params; \ - extern SDL_DYNWAYLANDFN_##fn WAYLAND_##fn; -#define SDL_WAYLAND_INTERFACE(iface) extern const struct wl_interface *WAYLAND_##iface; -#include "SDL_waylandsym.h" - - -#ifdef __cplusplus -} -#endif - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC - -#ifdef _WAYLAND_CLIENT_H -#error Do not include wayland-client ahead of SDL_waylanddyn.h in dynamic loading mode -#endif - -/* wayland-client-protocol.h included from wayland-client.h - * has inline functions that require these to be defined in dynamic loading mode - */ - -#define wl_proxy_create (*WAYLAND_wl_proxy_create) -#define wl_proxy_destroy (*WAYLAND_wl_proxy_destroy) -#define wl_proxy_marshal (*WAYLAND_wl_proxy_marshal) -#define wl_proxy_set_user_data (*WAYLAND_wl_proxy_set_user_data) -#define wl_proxy_get_user_data (*WAYLAND_wl_proxy_get_user_data) -#define wl_proxy_add_listener (*WAYLAND_wl_proxy_add_listener) -#define wl_proxy_marshal_constructor (*WAYLAND_wl_proxy_marshal_constructor) -#define wl_proxy_marshal_constructor_versioned (*WAYLAND_wl_proxy_marshal_constructor_versioned) - -#define wl_seat_interface (*WAYLAND_wl_seat_interface) -#define wl_surface_interface (*WAYLAND_wl_surface_interface) -#define wl_shm_pool_interface (*WAYLAND_wl_shm_pool_interface) -#define wl_buffer_interface (*WAYLAND_wl_buffer_interface) -#define wl_registry_interface (*WAYLAND_wl_registry_interface) -#define wl_shell_surface_interface (*WAYLAND_wl_shell_surface_interface) -#define wl_region_interface (*WAYLAND_wl_region_interface) -#define wl_pointer_interface (*WAYLAND_wl_pointer_interface) -#define wl_keyboard_interface (*WAYLAND_wl_keyboard_interface) -#define wl_compositor_interface (*WAYLAND_wl_compositor_interface) -#define wl_output_interface (*WAYLAND_wl_output_interface) -#define wl_shell_interface (*WAYLAND_wl_shell_interface) -#define wl_shm_interface (*WAYLAND_wl_shm_interface) - -#endif /* SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC */ - -#include "wayland-client-core.h" -#include "wayland-client-protocol.h" -#include "wayland-egl.h" - -#endif /* !defined _SDL_waylanddyn_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandevents.c b/3rdparty/SDL2/src/video/wayland/SDL_waylandevents.c deleted file mode 100644 index 2443aef7a55..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandevents.c +++ /dev/null @@ -1,640 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WAYLAND - -#include "SDL_stdinc.h" -#include "SDL_assert.h" -#include "SDL_log.h" - -#include "../../events/SDL_sysevents.h" -#include "../../events/SDL_events_c.h" -#include "../../events/scancodes_xfree86.h" - -#include "SDL_waylandvideo.h" -#include "SDL_waylandevents_c.h" -#include "SDL_waylandwindow.h" - -#include "SDL_waylanddyn.h" - -#include "pointer-constraints-unstable-v1-client-protocol.h" -#include "relative-pointer-unstable-v1-client-protocol.h" - -#include <linux/input.h> -#include <sys/select.h> -#include <sys/mman.h> -#include <poll.h> -#include <unistd.h> -#include <xkbcommon/xkbcommon.h> - -struct SDL_WaylandInput { - SDL_VideoData *display; - struct wl_seat *seat; - struct wl_pointer *pointer; - struct wl_keyboard *keyboard; - struct zwp_relative_pointer_v1 *relative_pointer; - SDL_WindowData *pointer_focus; - SDL_WindowData *keyboard_focus; - - /* Last motion location */ - wl_fixed_t sx_w; - wl_fixed_t sy_w; - - double dx_frac; - double dy_frac; - - struct { - struct xkb_keymap *keymap; - struct xkb_state *state; - } xkb; -}; - -void -Wayland_PumpEvents(_THIS) -{ - SDL_VideoData *d = _this->driverdata; - struct pollfd pfd[1]; - - pfd[0].fd = WAYLAND_wl_display_get_fd(d->display); - pfd[0].events = POLLIN; - poll(pfd, 1, 0); - - if (pfd[0].revents & POLLIN) - WAYLAND_wl_display_dispatch(d->display); - else - WAYLAND_wl_display_dispatch_pending(d->display); -} - -static void -pointer_handle_enter(void *data, struct wl_pointer *pointer, - uint32_t serial, struct wl_surface *surface, - wl_fixed_t sx_w, wl_fixed_t sy_w) -{ - struct SDL_WaylandInput *input = data; - SDL_WindowData *window; - - if (!surface) { - /* enter event for a window we've just destroyed */ - return; - } - - /* This handler will be called twice in Wayland 1.4 - * Once for the window surface which has valid user data - * and again for the mouse cursor surface which does not have valid user data - * We ignore the later - */ - - window = (SDL_WindowData *)wl_surface_get_user_data(surface); - - if (window) { - input->pointer_focus = window; - SDL_SetMouseFocus(window->sdlwindow); - } -} - -static void -pointer_handle_leave(void *data, struct wl_pointer *pointer, - uint32_t serial, struct wl_surface *surface) -{ - struct SDL_WaylandInput *input = data; - - if (input->pointer_focus) { - SDL_SetMouseFocus(NULL); - input->pointer_focus = NULL; - } -} - -static void -pointer_handle_motion(void *data, struct wl_pointer *pointer, - uint32_t time, wl_fixed_t sx_w, wl_fixed_t sy_w) -{ - struct SDL_WaylandInput *input = data; - SDL_WindowData *window = input->pointer_focus; - input->sx_w = sx_w; - input->sy_w = sy_w; - if (input->pointer_focus) { - const int sx = wl_fixed_to_int(sx_w); - const int sy = wl_fixed_to_int(sy_w); - SDL_SendMouseMotion(window->sdlwindow, 0, 0, sx, sy); - } -} - -static SDL_bool -ProcessHitTest(struct SDL_WaylandInput *input, uint32_t serial) -{ - SDL_WindowData *window_data = input->pointer_focus; - SDL_Window *window = window_data->sdlwindow; - - if (window->hit_test) { - const SDL_Point point = { wl_fixed_to_int(input->sx_w), wl_fixed_to_int(input->sy_w) }; - const SDL_HitTestResult rc = window->hit_test(window, &point, window->hit_test_data); - static const uint32_t directions[] = { - WL_SHELL_SURFACE_RESIZE_TOP_LEFT, WL_SHELL_SURFACE_RESIZE_TOP, - WL_SHELL_SURFACE_RESIZE_TOP_RIGHT, WL_SHELL_SURFACE_RESIZE_RIGHT, - WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT, WL_SHELL_SURFACE_RESIZE_BOTTOM, - WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT, WL_SHELL_SURFACE_RESIZE_LEFT - }; - switch (rc) { - case SDL_HITTEST_DRAGGABLE: - wl_shell_surface_move(window_data->shell_surface, input->seat, serial); - return SDL_TRUE; - - case SDL_HITTEST_RESIZE_TOPLEFT: - case SDL_HITTEST_RESIZE_TOP: - case SDL_HITTEST_RESIZE_TOPRIGHT: - case SDL_HITTEST_RESIZE_RIGHT: - case SDL_HITTEST_RESIZE_BOTTOMRIGHT: - case SDL_HITTEST_RESIZE_BOTTOM: - case SDL_HITTEST_RESIZE_BOTTOMLEFT: - case SDL_HITTEST_RESIZE_LEFT: - wl_shell_surface_resize(window_data->shell_surface, input->seat, serial, directions[rc - SDL_HITTEST_RESIZE_TOPLEFT]); - return SDL_TRUE; - - default: return SDL_FALSE; - } - } - - return SDL_FALSE; -} - -static void -pointer_handle_button_common(struct SDL_WaylandInput *input, uint32_t serial, - uint32_t time, uint32_t button, uint32_t state_w) -{ - SDL_WindowData *window = input->pointer_focus; - enum wl_pointer_button_state state = state_w; - uint32_t sdl_button; - - if (input->pointer_focus) { - switch (button) { - case BTN_LEFT: - sdl_button = SDL_BUTTON_LEFT; - if (ProcessHitTest(input, serial)) { - return; /* don't pass this event on to app. */ - } - break; - case BTN_MIDDLE: - sdl_button = SDL_BUTTON_MIDDLE; - break; - case BTN_RIGHT: - sdl_button = SDL_BUTTON_RIGHT; - break; - case BTN_SIDE: - sdl_button = SDL_BUTTON_X1; - break; - case BTN_EXTRA: - sdl_button = SDL_BUTTON_X2; - break; - default: - return; - } - - SDL_SendMouseButton(window->sdlwindow, 0, - state ? SDL_PRESSED : SDL_RELEASED, sdl_button); - } -} - -static void -pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial, - uint32_t time, uint32_t button, uint32_t state_w) -{ - struct SDL_WaylandInput *input = data; - - pointer_handle_button_common(input, serial, time, button, state_w); -} - -static void -pointer_handle_axis_common(struct SDL_WaylandInput *input, - uint32_t time, uint32_t axis, wl_fixed_t value) -{ - SDL_WindowData *window = input->pointer_focus; - enum wl_pointer_axis a = axis; - int x, y; - - if (input->pointer_focus) { - switch (a) { - case WL_POINTER_AXIS_VERTICAL_SCROLL: - x = 0; - y = wl_fixed_to_int(value); - break; - case WL_POINTER_AXIS_HORIZONTAL_SCROLL: - x = wl_fixed_to_int(value); - y = 0; - break; - default: - return; - } - - SDL_SendMouseWheel(window->sdlwindow, 0, x, y, SDL_MOUSEWHEEL_NORMAL); - } -} - -static void -pointer_handle_axis(void *data, struct wl_pointer *pointer, - uint32_t time, uint32_t axis, wl_fixed_t value) -{ - struct SDL_WaylandInput *input = data; - - pointer_handle_axis_common(input, time, axis, value); -} - -static const struct wl_pointer_listener pointer_listener = { - pointer_handle_enter, - pointer_handle_leave, - pointer_handle_motion, - pointer_handle_button, - pointer_handle_axis, -}; - -static void -keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, - uint32_t format, int fd, uint32_t size) -{ - struct SDL_WaylandInput *input = data; - char *map_str; - - if (!data) { - close(fd); - return; - } - - if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { - close(fd); - return; - } - - map_str = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); - if (map_str == MAP_FAILED) { - close(fd); - return; - } - - input->xkb.keymap = WAYLAND_xkb_keymap_new_from_string(input->display->xkb_context, - map_str, - XKB_KEYMAP_FORMAT_TEXT_V1, - 0); - munmap(map_str, size); - close(fd); - - if (!input->xkb.keymap) { - fprintf(stderr, "failed to compile keymap\n"); - return; - } - - input->xkb.state = WAYLAND_xkb_state_new(input->xkb.keymap); - if (!input->xkb.state) { - fprintf(stderr, "failed to create XKB state\n"); - WAYLAND_xkb_keymap_unref(input->xkb.keymap); - input->xkb.keymap = NULL; - return; - } -} - -static void -keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, - uint32_t serial, struct wl_surface *surface, - struct wl_array *keys) -{ - struct SDL_WaylandInput *input = data; - SDL_WindowData *window; - - if (!surface) { - /* enter event for a window we've just destroyed */ - return; - } - - window = wl_surface_get_user_data(surface); - - if (window) { - input->keyboard_focus = window; - window->keyboard_device = input; - SDL_SetKeyboardFocus(window->sdlwindow); - } -} - -static void -keyboard_handle_leave(void *data, struct wl_keyboard *keyboard, - uint32_t serial, struct wl_surface *surface) -{ - SDL_SetKeyboardFocus(NULL); -} - -static void -keyboard_handle_key(void *data, struct wl_keyboard *keyboard, - uint32_t serial, uint32_t time, uint32_t key, - uint32_t state_w) -{ - struct SDL_WaylandInput *input = data; - SDL_WindowData *window = input->keyboard_focus; - enum wl_keyboard_key_state state = state_w; - const xkb_keysym_t *syms; - uint32_t scancode; - char text[8]; - int size; - - if (key < SDL_arraysize(xfree86_scancode_table2)) { - scancode = xfree86_scancode_table2[key]; - - // TODO when do we get WL_KEYBOARD_KEY_STATE_REPEAT? - if (scancode != SDL_SCANCODE_UNKNOWN) - SDL_SendKeyboardKey(state == WL_KEYBOARD_KEY_STATE_PRESSED ? - SDL_PRESSED : SDL_RELEASED, scancode); - } - - if (!window || window->keyboard_device != input || !input->xkb.state) - return; - - // TODO can this happen? - if (WAYLAND_xkb_state_key_get_syms(input->xkb.state, key + 8, &syms) != 1) - return; - - if (state) { - size = WAYLAND_xkb_keysym_to_utf8(syms[0], text, sizeof text); - - if (size > 0) { - text[size] = 0; - SDL_SendKeyboardText(text); - } - } -} - -static void -keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard, - uint32_t serial, uint32_t mods_depressed, - uint32_t mods_latched, uint32_t mods_locked, - uint32_t group) -{ - struct SDL_WaylandInput *input = data; - - WAYLAND_xkb_state_update_mask(input->xkb.state, mods_depressed, mods_latched, - mods_locked, 0, 0, group); -} - -static const struct wl_keyboard_listener keyboard_listener = { - keyboard_handle_keymap, - keyboard_handle_enter, - keyboard_handle_leave, - keyboard_handle_key, - keyboard_handle_modifiers, -}; - -static void -seat_handle_capabilities(void *data, struct wl_seat *seat, - enum wl_seat_capability caps) -{ - struct SDL_WaylandInput *input = data; - - if ((caps & WL_SEAT_CAPABILITY_POINTER) && !input->pointer) { - input->pointer = wl_seat_get_pointer(seat); - input->display->pointer = input->pointer; - wl_pointer_set_user_data(input->pointer, input); - wl_pointer_add_listener(input->pointer, &pointer_listener, - input); - } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) { - wl_pointer_destroy(input->pointer); - input->pointer = NULL; - } - - if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !input->keyboard) { - input->keyboard = wl_seat_get_keyboard(seat); - wl_keyboard_set_user_data(input->keyboard, input); - wl_keyboard_add_listener(input->keyboard, &keyboard_listener, - input); - } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input->keyboard) { - wl_keyboard_destroy(input->keyboard); - input->keyboard = NULL; - } -} - -static const struct wl_seat_listener seat_listener = { - seat_handle_capabilities, -}; - -void -Wayland_display_add_input(SDL_VideoData *d, uint32_t id) -{ - struct SDL_WaylandInput *input; - - input = SDL_calloc(1, sizeof *input); - if (input == NULL) - return; - - input->display = d; - input->seat = wl_registry_bind(d->registry, id, &wl_seat_interface, 1); - input->sx_w = wl_fixed_from_int(0); - input->sy_w = wl_fixed_from_int(0); - d->input = input; - - wl_seat_add_listener(input->seat, &seat_listener, input); - wl_seat_set_user_data(input->seat, input); - - WAYLAND_wl_display_flush(d->display); -} - -void Wayland_display_destroy_input(SDL_VideoData *d) -{ - struct SDL_WaylandInput *input = d->input; - - if (!input) - return; - - if (input->keyboard) - wl_keyboard_destroy(input->keyboard); - - if (input->pointer) - wl_pointer_destroy(input->pointer); - - if (input->seat) - wl_seat_destroy(input->seat); - - if (input->xkb.state) - WAYLAND_xkb_state_unref(input->xkb.state); - - if (input->xkb.keymap) - WAYLAND_xkb_keymap_unref(input->xkb.keymap); - - SDL_free(input); - d->input = NULL; -} - -void Wayland_display_add_relative_pointer_manager(SDL_VideoData *d, uint32_t id) -{ - d->relative_pointer_manager = - wl_registry_bind(d->registry, id, - &zwp_relative_pointer_manager_v1_interface, 1); -} - -void Wayland_display_destroy_relative_pointer_manager(SDL_VideoData *d) -{ - if (d->relative_pointer_manager) - zwp_relative_pointer_manager_v1_destroy(d->relative_pointer_manager); -} - -void Wayland_display_add_pointer_constraints(SDL_VideoData *d, uint32_t id) -{ - d->pointer_constraints = - wl_registry_bind(d->registry, id, - &zwp_pointer_constraints_v1_interface, 1); -} - -void Wayland_display_destroy_pointer_constraints(SDL_VideoData *d) -{ - if (d->pointer_constraints) - zwp_pointer_constraints_v1_destroy(d->pointer_constraints); -} - -static void -relative_pointer_handle_relative_motion(void *data, - struct zwp_relative_pointer_v1 *pointer, - uint32_t time_hi, - uint32_t time_lo, - wl_fixed_t dx_w, - wl_fixed_t dy_w, - wl_fixed_t dx_unaccel_w, - wl_fixed_t dy_unaccel_w) -{ - struct SDL_WaylandInput *input = data; - SDL_VideoData *d = input->display; - SDL_WindowData *window = input->pointer_focus; - double dx_unaccel; - double dy_unaccel; - double dx; - double dy; - - dx_unaccel = wl_fixed_to_double(dx_unaccel_w); - dy_unaccel = wl_fixed_to_double(dy_unaccel_w); - - /* Add left over fraction from last event. */ - dx_unaccel += input->dx_frac; - dy_unaccel += input->dy_frac; - - input->dx_frac = modf(dx_unaccel, &dx); - input->dy_frac = modf(dy_unaccel, &dy); - - if (input->pointer_focus && d->relative_mouse_mode) { - SDL_SendMouseMotion(window->sdlwindow, 0, 1, (int)dx, (int)dy); - } -} - -static const struct zwp_relative_pointer_v1_listener relative_pointer_listener = { - relative_pointer_handle_relative_motion, -}; - -static void -locked_pointer_locked(void *data, - struct zwp_locked_pointer_v1 *locked_pointer) -{ -} - -static void -locked_pointer_unlocked(void *data, - struct zwp_locked_pointer_v1 *locked_pointer) -{ -} - -static const struct zwp_locked_pointer_v1_listener locked_pointer_listener = { - locked_pointer_locked, - locked_pointer_unlocked, -}; - -static void -lock_pointer_to_window(SDL_Window *window, - struct SDL_WaylandInput *input) -{ - SDL_WindowData *w = window->driverdata; - SDL_VideoData *d = input->display; - struct zwp_locked_pointer_v1 *locked_pointer; - - if (w->locked_pointer) - return; - - locked_pointer = - zwp_pointer_constraints_v1_lock_pointer(d->pointer_constraints, - w->surface, - input->pointer, - NULL, - ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT); - zwp_locked_pointer_v1_add_listener(locked_pointer, - &locked_pointer_listener, - window); - - w->locked_pointer = locked_pointer; -} - -int Wayland_input_lock_pointer(struct SDL_WaylandInput *input) -{ - SDL_VideoDevice *vd = SDL_GetVideoDevice(); - SDL_VideoData *d = input->display; - SDL_Window *window; - struct zwp_relative_pointer_v1 *relative_pointer; - - if (!d->relative_pointer_manager) - return -1; - - if (!d->pointer_constraints) - return -1; - - if (!input->relative_pointer) { - relative_pointer = - zwp_relative_pointer_manager_v1_get_relative_pointer( - d->relative_pointer_manager, - input->pointer); - zwp_relative_pointer_v1_add_listener(relative_pointer, - &relative_pointer_listener, - input); - input->relative_pointer = relative_pointer; - } - - for (window = vd->windows; window; window = window->next) - lock_pointer_to_window(window, input); - - d->relative_mouse_mode = 1; - - return 0; -} - -int Wayland_input_unlock_pointer(struct SDL_WaylandInput *input) -{ - SDL_VideoDevice *vd = SDL_GetVideoDevice(); - SDL_VideoData *d = input->display; - SDL_Window *window; - SDL_WindowData *w; - - for (window = vd->windows; window; window = window->next) { - w = window->driverdata; - if (w->locked_pointer) - zwp_locked_pointer_v1_destroy(w->locked_pointer); - w->locked_pointer = NULL; - } - - zwp_relative_pointer_v1_destroy(input->relative_pointer); - input->relative_pointer = NULL; - - d->relative_mouse_mode = 0; - - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_WAYLAND */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandevents_c.h b/3rdparty/SDL2/src/video/wayland/SDL_waylandevents_c.h deleted file mode 100644 index 56d12ec278f..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandevents_c.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#ifndef _SDL_waylandevents_h -#define _SDL_waylandevents_h - -#include "SDL_waylandvideo.h" -#include "SDL_waylandwindow.h" - -extern void Wayland_PumpEvents(_THIS); - -extern void Wayland_display_add_input(SDL_VideoData *d, uint32_t id); -extern void Wayland_display_destroy_input(SDL_VideoData *d); - -extern void Wayland_display_add_pointer_constraints(SDL_VideoData *d, uint32_t id); -extern void Wayland_display_destroy_pointer_constraints(SDL_VideoData *d); - -extern int Wayland_input_lock_pointer(struct SDL_WaylandInput *input); -extern int Wayland_input_unlock_pointer(struct SDL_WaylandInput *input); - -extern void Wayland_display_add_relative_pointer_manager(SDL_VideoData *d, uint32_t id); -extern void Wayland_display_destroy_relative_pointer_manager(SDL_VideoData *d); - -#endif /* _SDL_waylandevents_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandmouse.c b/3rdparty/SDL2/src/video/wayland/SDL_waylandmouse.c deleted file mode 100644 index 8dfc9eea37a..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandmouse.c +++ /dev/null @@ -1,418 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WAYLAND - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include <sys/types.h> -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdlib.h> -#include <limits.h> - -#include "../SDL_sysvideo.h" - -#include "SDL_mouse.h" -#include "../../events/SDL_mouse_c.h" -#include "SDL_waylandvideo.h" -#include "SDL_waylandevents_c.h" - -#include "SDL_waylanddyn.h" -#include "wayland-cursor.h" - -#include "SDL_assert.h" - - -typedef struct { - struct wl_buffer *buffer; - struct wl_surface *surface; - - int hot_x, hot_y; - int w, h; - - /* Either a preloaded cursor, or one we created ourselves */ - struct wl_cursor *cursor; - void *shm_data; -} Wayland_CursorData; - -static int -wayland_create_tmp_file(off_t size) -{ - static const char template[] = "/sdl-shared-XXXXXX"; - char *xdg_path; - char tmp_path[PATH_MAX]; - int fd; - - xdg_path = SDL_getenv("XDG_RUNTIME_DIR"); - if (!xdg_path) { - return -1; - } - - SDL_strlcpy(tmp_path, xdg_path, PATH_MAX); - SDL_strlcat(tmp_path, template, PATH_MAX); - - fd = mkostemp(tmp_path, O_CLOEXEC); - if (fd < 0) - return -1; - - if (ftruncate(fd, size) < 0) { - close(fd); - return -1; - } - - return fd; -} - -static void -mouse_buffer_release(void *data, struct wl_buffer *buffer) -{ -} - -static const struct wl_buffer_listener mouse_buffer_listener = { - mouse_buffer_release -}; - -static int -create_buffer_from_shm(Wayland_CursorData *d, - int width, - int height, - uint32_t format) -{ - SDL_VideoDevice *vd = SDL_GetVideoDevice(); - SDL_VideoData *data = (SDL_VideoData *) vd->driverdata; - struct wl_shm_pool *shm_pool; - - int stride = width * 4; - int size = stride * height; - - int shm_fd; - - shm_fd = wayland_create_tmp_file(size); - if (shm_fd < 0) - { - return SDL_SetError("Creating mouse cursor buffer failed."); - } - - d->shm_data = mmap(NULL, - size, - PROT_READ | PROT_WRITE, - MAP_SHARED, - shm_fd, - 0); - if (d->shm_data == MAP_FAILED) { - d->shm_data = NULL; - close (shm_fd); - return SDL_SetError("mmap() failed."); - } - - shm_pool = wl_shm_create_pool(data->shm, shm_fd, size); - d->buffer = wl_shm_pool_create_buffer(shm_pool, - 0, - width, - height, - stride, - format); - wl_buffer_add_listener(d->buffer, - &mouse_buffer_listener, - d); - - wl_shm_pool_destroy (shm_pool); - close (shm_fd); - - return 0; -} - -static SDL_Cursor * -Wayland_CreateCursor(SDL_Surface *surface, int hot_x, int hot_y) -{ - SDL_Cursor *cursor; - - cursor = calloc(1, sizeof (*cursor)); - if (cursor) { - SDL_VideoDevice *vd = SDL_GetVideoDevice (); - SDL_VideoData *wd = (SDL_VideoData *) vd->driverdata; - Wayland_CursorData *data = calloc (1, sizeof (Wayland_CursorData)); - if (!data) { - SDL_OutOfMemory(); - free(cursor); - return NULL; - } - cursor->driverdata = (void *) data; - - /* Assume ARGB8888 */ - SDL_assert(surface->format->format == SDL_PIXELFORMAT_ARGB8888); - SDL_assert(surface->pitch == surface->w * 4); - - /* Allocate shared memory buffer for this cursor */ - if (create_buffer_from_shm (data, - surface->w, - surface->h, - WL_SHM_FORMAT_ARGB8888) < 0) - { - free (cursor->driverdata); - free (cursor); - return NULL; - } - - SDL_memcpy(data->shm_data, - surface->pixels, - surface->h * surface->pitch); - - data->surface = wl_compositor_create_surface(wd->compositor); - wl_surface_set_user_data(data->surface, NULL); - - data->hot_x = hot_x; - data->hot_y = hot_y; - data->w = surface->w; - data->h = surface->h; - } else { - SDL_OutOfMemory(); - } - - return cursor; -} - -static SDL_Cursor * -CreateCursorFromWlCursor(SDL_VideoData *d, struct wl_cursor *wlcursor) -{ - SDL_Cursor *cursor; - - cursor = calloc(1, sizeof (*cursor)); - if (cursor) { - Wayland_CursorData *data = calloc (1, sizeof (Wayland_CursorData)); - if (!data) { - SDL_OutOfMemory(); - free(cursor); - return NULL; - } - cursor->driverdata = (void *) data; - - data->buffer = WAYLAND_wl_cursor_image_get_buffer(wlcursor->images[0]); - data->surface = wl_compositor_create_surface(d->compositor); - wl_surface_set_user_data(data->surface, NULL); - data->hot_x = wlcursor->images[0]->hotspot_x; - data->hot_y = wlcursor->images[0]->hotspot_y; - data->w = wlcursor->images[0]->width; - data->h = wlcursor->images[0]->height; - data->cursor= wlcursor; - } else { - SDL_OutOfMemory (); - } - - return cursor; -} - -static SDL_Cursor * -Wayland_CreateDefaultCursor() -{ - SDL_VideoDevice *device = SDL_GetVideoDevice(); - SDL_VideoData *data = device->driverdata; - - return CreateCursorFromWlCursor (data, - WAYLAND_wl_cursor_theme_get_cursor(data->cursor_theme, - "left_ptr")); -} - -static SDL_Cursor * -Wayland_CreateSystemCursor(SDL_SystemCursor id) -{ - SDL_VideoDevice *vd = SDL_GetVideoDevice(); - SDL_VideoData *d = vd->driverdata; - - struct wl_cursor *cursor = NULL; - - switch(id) - { - default: - SDL_assert(0); - return NULL; - case SDL_SYSTEM_CURSOR_ARROW: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "left_ptr"); - break; - case SDL_SYSTEM_CURSOR_IBEAM: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "xterm"); - break; - case SDL_SYSTEM_CURSOR_WAIT: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "watch"); - break; - case SDL_SYSTEM_CURSOR_CROSSHAIR: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1"); - break; - case SDL_SYSTEM_CURSOR_WAITARROW: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "watch"); - break; - case SDL_SYSTEM_CURSOR_SIZENWSE: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1"); - break; - case SDL_SYSTEM_CURSOR_SIZENESW: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1"); - break; - case SDL_SYSTEM_CURSOR_SIZEWE: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1"); - break; - case SDL_SYSTEM_CURSOR_SIZENS: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1"); - break; - case SDL_SYSTEM_CURSOR_SIZEALL: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1"); - break; - case SDL_SYSTEM_CURSOR_NO: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "xterm"); - break; - case SDL_SYSTEM_CURSOR_HAND: - cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1"); - break; - } - - return CreateCursorFromWlCursor(d, cursor); -} - -static void -Wayland_FreeCursor(SDL_Cursor *cursor) -{ - Wayland_CursorData *d; - - if (!cursor) - return; - - d = cursor->driverdata; - - /* Probably not a cursor we own */ - if (!d) - return; - - if (d->buffer && !d->cursor) - wl_buffer_destroy(d->buffer); - - if (d->surface) - wl_surface_destroy(d->surface); - - /* Not sure what's meant to happen to shm_data */ - free (cursor->driverdata); - SDL_free(cursor); -} - -static int -Wayland_ShowCursor(SDL_Cursor *cursor) -{ - SDL_VideoDevice *vd = SDL_GetVideoDevice(); - SDL_VideoData *d = vd->driverdata; - - struct wl_pointer *pointer = d->pointer; - - if (!pointer) - return -1; - - if (cursor) - { - Wayland_CursorData *data = cursor->driverdata; - - wl_pointer_set_cursor (pointer, 0, - data->surface, - data->hot_x, - data->hot_y); - wl_surface_attach(data->surface, data->buffer, 0, 0); - wl_surface_damage(data->surface, 0, 0, data->w, data->h); - wl_surface_commit(data->surface); - } - else - { - wl_pointer_set_cursor (pointer, 0, - NULL, - 0, - 0); - } - - return 0; -} - -static void -Wayland_WarpMouse(SDL_Window *window, int x, int y) -{ - SDL_Unsupported(); -} - -static int -Wayland_WarpMouseGlobal(int x, int y) -{ - return SDL_Unsupported(); -} - -static int -Wayland_SetRelativeMouseMode(SDL_bool enabled) -{ - SDL_VideoDevice *vd = SDL_GetVideoDevice(); - SDL_VideoData *data = (SDL_VideoData *) vd->driverdata; - - if (enabled) - return Wayland_input_lock_pointer(data->input); - else - return Wayland_input_unlock_pointer(data->input); -} - -void -Wayland_InitMouse(void) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - - mouse->CreateCursor = Wayland_CreateCursor; - mouse->CreateSystemCursor = Wayland_CreateSystemCursor; - mouse->ShowCursor = Wayland_ShowCursor; - mouse->FreeCursor = Wayland_FreeCursor; - mouse->WarpMouse = Wayland_WarpMouse; - mouse->WarpMouseGlobal = Wayland_WarpMouseGlobal; - mouse->SetRelativeMouseMode = Wayland_SetRelativeMouseMode; - - SDL_SetDefaultCursor(Wayland_CreateDefaultCursor()); -} - -void -Wayland_FiniMouse(void) -{ - /* This effectively assumes that nobody else - * touches SDL_Mouse which is effectively - * a singleton */ - - SDL_Mouse *mouse = SDL_GetMouse(); - - /* Free the current cursor if not the same pointer as - * the default cursor */ - if (mouse->def_cursor != mouse->cur_cursor) - Wayland_FreeCursor (mouse->cur_cursor); - - Wayland_FreeCursor (mouse->def_cursor); - mouse->def_cursor = NULL; - mouse->cur_cursor = NULL; - - mouse->CreateCursor = NULL; - mouse->CreateSystemCursor = NULL; - mouse->ShowCursor = NULL; - mouse->FreeCursor = NULL; - mouse->WarpMouse = NULL; - mouse->SetRelativeMouseMode = NULL; -} -#endif /* SDL_VIDEO_DRIVER_WAYLAND */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandmouse.h b/3rdparty/SDL2/src/video/wayland/SDL_waylandmouse.h deleted file mode 100644 index 129990ded41..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandmouse.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" -#include "SDL_mouse.h" -#include "SDL_waylandvideo.h" - -#if SDL_VIDEO_DRIVER_WAYLAND - -extern void Wayland_InitMouse(void); -extern void Wayland_FiniMouse(void); - -#endif diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandopengles.c b/3rdparty/SDL2/src/video/wayland/SDL_waylandopengles.c deleted file mode 100644 index 6803dbe63d0..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandopengles.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL - -#include "SDL_waylandvideo.h" -#include "SDL_waylandopengles.h" -#include "SDL_waylandwindow.h" -#include "SDL_waylandevents_c.h" -#include "SDL_waylanddyn.h" - -/* EGL implementation of SDL OpenGL ES support */ - -int -Wayland_GLES_LoadLibrary(_THIS, const char *path) { - int ret; - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - ret = SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) data->display); - - Wayland_PumpEvents(_this); - WAYLAND_wl_display_flush(data->display); - - return ret; -} - - -SDL_GLContext -Wayland_GLES_CreateContext(_THIS, SDL_Window * window) -{ - SDL_GLContext context; - context = SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface); - WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display ); - - return context; -} - -void -Wayland_GLES_SwapWindow(_THIS, SDL_Window *window) -{ - SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface); - WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display ); -} - - -int -Wayland_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) -{ - int ret; - - if (window && context) { - ret = SDL_EGL_MakeCurrent(_this, ((SDL_WindowData *) window->driverdata)->egl_surface, context); - } - else { - ret = SDL_EGL_MakeCurrent(_this, NULL, NULL); - } - - WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display ); - - return ret; -} - -void -Wayland_GLES_DeleteContext(_THIS, SDL_GLContext context) -{ - SDL_EGL_DeleteContext(_this, context); - WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display ); -} - -#endif /* SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandopengles.h b/3rdparty/SDL2/src/video/wayland/SDL_waylandopengles.h deleted file mode 100644 index 6c3f1f38479..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandopengles.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_waylandopengles_h -#define _SDL_waylandopengles_h - -#include "../SDL_sysvideo.h" -#include "../SDL_egl_c.h" - -typedef struct SDL_PrivateGLESData -{ -} SDL_PrivateGLESData; - -/* OpenGLES functions */ -#define Wayland_GLES_GetAttribute SDL_EGL_GetAttribute -#define Wayland_GLES_GetProcAddress SDL_EGL_GetProcAddress -#define Wayland_GLES_UnloadLibrary SDL_EGL_UnloadLibrary -#define Wayland_GLES_SetSwapInterval SDL_EGL_SetSwapInterval -#define Wayland_GLES_GetSwapInterval SDL_EGL_GetSwapInterval - -extern int Wayland_GLES_LoadLibrary(_THIS, const char *path); -extern SDL_GLContext Wayland_GLES_CreateContext(_THIS, SDL_Window * window); -extern void Wayland_GLES_SwapWindow(_THIS, SDL_Window * window); -extern int Wayland_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); -extern void Wayland_GLES_DeleteContext(_THIS, SDL_GLContext context); - -#endif /* _SDL_waylandopengles_h */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandsym.h b/3rdparty/SDL2/src/video/wayland/SDL_waylandsym.h deleted file mode 100644 index aea3cb129e8..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandsym.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* *INDENT-OFF* */ - -#ifndef SDL_WAYLAND_MODULE -#define SDL_WAYLAND_MODULE(modname) -#endif - -#ifndef SDL_WAYLAND_SYM -#define SDL_WAYLAND_SYM(rc,fn,params) -#endif - -#ifndef SDL_WAYLAND_INTERFACE -#define SDL_WAYLAND_INTERFACE(iface) -#endif - -SDL_WAYLAND_MODULE(WAYLAND_CLIENT) -SDL_WAYLAND_SYM(void, wl_proxy_marshal, (struct wl_proxy *, uint32_t, ...)) -SDL_WAYLAND_SYM(struct wl_proxy *, wl_proxy_create, (struct wl_proxy *, const struct wl_interface *)) -SDL_WAYLAND_SYM(void, wl_proxy_destroy, (struct wl_proxy *)) -SDL_WAYLAND_SYM(int, wl_proxy_add_listener, (struct wl_proxy *, void (**)(void), void *)) -SDL_WAYLAND_SYM(void, wl_proxy_set_user_data, (struct wl_proxy *, void *)) -SDL_WAYLAND_SYM(void *, wl_proxy_get_user_data, (struct wl_proxy *)) -SDL_WAYLAND_SYM(uint32_t, wl_proxy_get_id, (struct wl_proxy *)) -SDL_WAYLAND_SYM(const char *, wl_proxy_get_class, (struct wl_proxy *)) -SDL_WAYLAND_SYM(void, wl_proxy_set_queue, (struct wl_proxy *, struct wl_event_queue *)) -SDL_WAYLAND_SYM(struct wl_display *, wl_display_connect, (const char *)) -SDL_WAYLAND_SYM(struct wl_display *, wl_display_connect_to_fd, (int)) -SDL_WAYLAND_SYM(void, wl_display_disconnect, (struct wl_display *)) -SDL_WAYLAND_SYM(int, wl_display_get_fd, (struct wl_display *)) -SDL_WAYLAND_SYM(int, wl_display_dispatch, (struct wl_display *)) -SDL_WAYLAND_SYM(int, wl_display_dispatch_queue, (struct wl_display *, struct wl_event_queue *)) -SDL_WAYLAND_SYM(int, wl_display_dispatch_queue_pending, (struct wl_display *, struct wl_event_queue *)) -SDL_WAYLAND_SYM(int, wl_display_dispatch_pending, (struct wl_display *)) -SDL_WAYLAND_SYM(int, wl_display_get_error, (struct wl_display *)) -SDL_WAYLAND_SYM(int, wl_display_flush, (struct wl_display *)) -SDL_WAYLAND_SYM(int, wl_display_roundtrip, (struct wl_display *)) -SDL_WAYLAND_SYM(struct wl_event_queue *, wl_display_create_queue, (struct wl_display *)) -SDL_WAYLAND_SYM(void, wl_log_set_handler_client, (wl_log_func_t)) -SDL_WAYLAND_SYM(void, wl_list_init, (struct wl_list *)) -SDL_WAYLAND_SYM(void, wl_list_insert, (struct wl_list *, struct wl_list *) ) -SDL_WAYLAND_SYM(void, wl_list_remove, (struct wl_list *)) -SDL_WAYLAND_SYM(int, wl_list_length, (const struct wl_list *)) -SDL_WAYLAND_SYM(int, wl_list_empty, (const struct wl_list *)) -SDL_WAYLAND_SYM(void, wl_list_insert_list, (struct wl_list *, struct wl_list *)) - -/* These functions are available in Wayland >= 1.4 */ -SDL_WAYLAND_MODULE(WAYLAND_CLIENT_1_4) -SDL_WAYLAND_SYM(struct wl_proxy *, wl_proxy_marshal_constructor, (struct wl_proxy *, uint32_t opcode, const struct wl_interface *interface, ...)) - -SDL_WAYLAND_MODULE(WAYLAND_CLIENT_1_10) -SDL_WAYLAND_SYM(struct wl_proxy *, wl_proxy_marshal_constructor_versioned, (struct wl_proxy *proxy, uint32_t opcode, const struct wl_interface *interface, uint32_t version, ...)) - -SDL_WAYLAND_INTERFACE(wl_seat_interface) -SDL_WAYLAND_INTERFACE(wl_surface_interface) -SDL_WAYLAND_INTERFACE(wl_shm_pool_interface) -SDL_WAYLAND_INTERFACE(wl_buffer_interface) -SDL_WAYLAND_INTERFACE(wl_registry_interface) -SDL_WAYLAND_INTERFACE(wl_shell_surface_interface) -SDL_WAYLAND_INTERFACE(wl_region_interface) -SDL_WAYLAND_INTERFACE(wl_pointer_interface) -SDL_WAYLAND_INTERFACE(wl_keyboard_interface) -SDL_WAYLAND_INTERFACE(wl_compositor_interface) -SDL_WAYLAND_INTERFACE(wl_output_interface) -SDL_WAYLAND_INTERFACE(wl_shell_interface) -SDL_WAYLAND_INTERFACE(wl_shm_interface) - -SDL_WAYLAND_MODULE(WAYLAND_EGL) -SDL_WAYLAND_SYM(struct wl_egl_window *, wl_egl_window_create, (struct wl_surface *, int, int)) -SDL_WAYLAND_SYM(void, wl_egl_window_destroy, (struct wl_egl_window *)) -SDL_WAYLAND_SYM(void, wl_egl_window_resize, (struct wl_egl_window *, int, int, int, int)) -SDL_WAYLAND_SYM(void, wl_egl_window_get_attached_size, (struct wl_egl_window *, int *, int *)) - -SDL_WAYLAND_MODULE(WAYLAND_CURSOR) -SDL_WAYLAND_SYM(struct wl_cursor_theme *, wl_cursor_theme_load, (const char *, int , struct wl_shm *)) -SDL_WAYLAND_SYM(void, wl_cursor_theme_destroy, (struct wl_cursor_theme *)) -SDL_WAYLAND_SYM(struct wl_cursor *, wl_cursor_theme_get_cursor, (struct wl_cursor_theme *, const char *)) -SDL_WAYLAND_SYM(struct wl_buffer *, wl_cursor_image_get_buffer, (struct wl_cursor_image *)) -SDL_WAYLAND_SYM(int, wl_cursor_frame, (struct wl_cursor *, uint32_t)) - -SDL_WAYLAND_MODULE(WAYLAND_XKB) -SDL_WAYLAND_SYM(int, xkb_state_key_get_syms, (struct xkb_state *, xkb_keycode_t, const xkb_keysym_t **)) -SDL_WAYLAND_SYM(int, xkb_keysym_to_utf8, (xkb_keysym_t, char *, size_t) ) -SDL_WAYLAND_SYM(struct xkb_keymap *, xkb_keymap_new_from_string, (struct xkb_context *, const char *, enum xkb_keymap_format, enum xkb_keymap_compile_flags)) -SDL_WAYLAND_SYM(struct xkb_state *, xkb_state_new, (struct xkb_keymap *) ) -SDL_WAYLAND_SYM(void, xkb_keymap_unref, (struct xkb_keymap *) ) -SDL_WAYLAND_SYM(void, xkb_state_unref, (struct xkb_state *) ) -SDL_WAYLAND_SYM(void, xkb_context_unref, (struct xkb_context *) ) -SDL_WAYLAND_SYM(struct xkb_context *, xkb_context_new, (enum xkb_context_flags flags) ) -SDL_WAYLAND_SYM(enum xkb_state_component, xkb_state_update_mask, (struct xkb_state *state,\ - xkb_mod_mask_t depressed_mods,\ - xkb_mod_mask_t latched_mods,\ - xkb_mod_mask_t locked_mods,\ - xkb_layout_index_t depressed_layout,\ - xkb_layout_index_t latched_layout,\ - xkb_layout_index_t locked_layout) ) - -#undef SDL_WAYLAND_MODULE -#undef SDL_WAYLAND_SYM -#undef SDL_WAYLAND_INTERFACE - -/* *INDENT-ON* */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandtouch.c b/3rdparty/SDL2/src/video/wayland/SDL_waylandtouch.c deleted file mode 100644 index 4cae4259468..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandtouch.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* Contributed by Thomas Perl <thomas.perl@jollamobile.com> */ - -#include "../../SDL_internal.h" - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - -#include "SDL_log.h" -#include "SDL_waylandtouch.h" -#include "../../events/SDL_touch_c.h" - -struct SDL_WaylandTouch { - struct qt_touch_extension *touch_extension; -}; - - -/** - * Qt TouchPointState - * adapted from qtbase/src/corelib/global/qnamespace.h - **/ -enum QtWaylandTouchPointState { - QtWaylandTouchPointPressed = 0x01, - QtWaylandTouchPointMoved = 0x02, - /* - Never sent by the server: - QtWaylandTouchPointStationary = 0x04, - */ - QtWaylandTouchPointReleased = 0x08, -}; - -static void -touch_handle_touch(void *data, - struct qt_touch_extension *qt_touch_extension, - uint32_t time, - uint32_t id, - uint32_t state, - int32_t x, - int32_t y, - int32_t normalized_x, - int32_t normalized_y, - int32_t width, - int32_t height, - uint32_t pressure, - int32_t velocity_x, - int32_t velocity_y, - uint32_t flags, - struct wl_array *rawdata) -{ - /** - * Event is assembled in QtWayland in TouchExtensionGlobal::postTouchEvent - * (src/compositor/wayland_wrapper/qwltouch.cpp) - **/ - - float FIXED_TO_FLOAT = 1. / 10000.; - float xf = FIXED_TO_FLOAT * x; - float yf = FIXED_TO_FLOAT * y; - - float PRESSURE_TO_FLOAT = 1. / 255.; - float pressuref = PRESSURE_TO_FLOAT * pressure; - - uint32_t touchState = state & 0xFFFF; - /* - Other fields that are sent by the server (qwltouch.cpp), - but not used at the moment can be decoded in this way: - - uint32_t sentPointCount = state >> 16; - uint32_t touchFlags = flags & 0xFFFF; - uint32_t capabilities = flags >> 16; - */ - - SDL_TouchID deviceId = 1; - if (SDL_AddTouch(deviceId, "qt_touch_extension") < 0) { - SDL_Log("error: can't add touch %s, %d", __FILE__, __LINE__); - } - - switch (touchState) { - case QtWaylandTouchPointPressed: - case QtWaylandTouchPointReleased: - SDL_SendTouch(deviceId, (SDL_FingerID)id, - (touchState == QtWaylandTouchPointPressed) ? SDL_TRUE : SDL_FALSE, - xf, yf, pressuref); - break; - case QtWaylandTouchPointMoved: - SDL_SendTouchMotion(deviceId, (SDL_FingerID)id, xf, yf, pressuref); - break; - default: - /* Should not happen */ - break; - } -} - -static void -touch_handle_configure(void *data, - struct qt_touch_extension *qt_touch_extension, - uint32_t flags) -{ -} - - -/* wayland-qt-touch-extension.c BEGINS */ - -static const struct qt_touch_extension_listener touch_listener = { - touch_handle_touch, - touch_handle_configure, -}; - -static const struct wl_interface *qt_touch_extension_types[] = { - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -static const struct wl_message qt_touch_extension_requests[] = { - { "dummy", "", qt_touch_extension_types + 0 }, -}; - -static const struct wl_message qt_touch_extension_events[] = { - { "touch", "uuuiiiiiiuiiua", qt_touch_extension_types + 0 }, - { "configure", "u", qt_touch_extension_types + 0 }, -}; - -WL_EXPORT const struct wl_interface qt_touch_extension_interface = { - "qt_touch_extension", 1, - 1, qt_touch_extension_requests, - 2, qt_touch_extension_events, -}; - -/* wayland-qt-touch-extension.c ENDS */ - -/* wayland-qt-windowmanager.c BEGINS */ -static const struct wl_interface *qt_windowmanager_types[] = { - NULL, - NULL, -}; - -static const struct wl_message qt_windowmanager_requests[] = { - { "open_url", "us", qt_windowmanager_types + 0 }, -}; - -static const struct wl_message qt_windowmanager_events[] = { - { "hints", "i", qt_windowmanager_types + 0 }, - { "quit", "", qt_windowmanager_types + 0 }, -}; - -WL_EXPORT const struct wl_interface qt_windowmanager_interface = { - "qt_windowmanager", 1, - 1, qt_windowmanager_requests, - 2, qt_windowmanager_events, -}; -/* wayland-qt-windowmanager.c ENDS */ - -/* wayland-qt-surface-extension.c BEGINS */ -extern const struct wl_interface qt_extended_surface_interface; -#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC -extern const struct wl_interface wl_surface_interface; -#endif - -static const struct wl_interface *qt_surface_extension_types[] = { - NULL, - NULL, - &qt_extended_surface_interface, -#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC - /* FIXME: Set this dynamically to (*WAYLAND_wl_surface_interface) ? - * The value comes from auto generated code and does - * not appear to actually be used anywhere - */ - NULL, -#else - &wl_surface_interface, -#endif -}; - -static const struct wl_message qt_surface_extension_requests[] = { - { "get_extended_surface", "no", qt_surface_extension_types + 2 }, -}; - -WL_EXPORT const struct wl_interface qt_surface_extension_interface = { - "qt_surface_extension", 1, - 1, qt_surface_extension_requests, - 0, NULL, -}; - -static const struct wl_message qt_extended_surface_requests[] = { - { "update_generic_property", "sa", qt_surface_extension_types + 0 }, - { "set_content_orientation", "i", qt_surface_extension_types + 0 }, - { "set_window_flags", "i", qt_surface_extension_types + 0 }, -}; - -static const struct wl_message qt_extended_surface_events[] = { - { "onscreen_visibility", "i", qt_surface_extension_types + 0 }, - { "set_generic_property", "sa", qt_surface_extension_types + 0 }, - { "close", "", qt_surface_extension_types + 0 }, -}; - -WL_EXPORT const struct wl_interface qt_extended_surface_interface = { - "qt_extended_surface", 1, - 3, qt_extended_surface_requests, - 3, qt_extended_surface_events, -}; - -/* wayland-qt-surface-extension.c ENDS */ - -void -Wayland_touch_create(SDL_VideoData *data, uint32_t id) -{ - struct SDL_WaylandTouch *touch; - - if (data->touch) { - Wayland_touch_destroy(data); - } - - /* !!! FIXME: check for failure, call SDL_OutOfMemory() */ - data->touch = SDL_malloc(sizeof(struct SDL_WaylandTouch)); - - touch = data->touch; - touch->touch_extension = wl_registry_bind(data->registry, id, &qt_touch_extension_interface, 1); - qt_touch_extension_add_listener(touch->touch_extension, &touch_listener, data); -} - -void -Wayland_touch_destroy(SDL_VideoData *data) -{ - if (data->touch) { - struct SDL_WaylandTouch *touch = data->touch; - if (touch->touch_extension) { - qt_touch_extension_destroy(touch->touch_extension); - } - - SDL_free(data->touch); - data->touch = NULL; - } -} - -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandtouch.h b/3rdparty/SDL2/src/video/wayland/SDL_waylandtouch.h deleted file mode 100644 index 5f2a05813b2..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandtouch.h +++ /dev/null @@ -1,352 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - -#ifndef _SDL_waylandtouch_h -#define _SDL_waylandtouch_h - -#include "SDL_waylandvideo.h" -#include <stdint.h> -#include <stddef.h> -#include "wayland-util.h" -#include "SDL_waylanddyn.h" - - -void Wayland_touch_create(SDL_VideoData *data, uint32_t id); -void Wayland_touch_destroy(SDL_VideoData *data); - -struct qt_touch_extension; - -/* Autogenerated QT headers */ - -/* - Support for Wayland with QmlCompositor as Server -================================================ - -The Wayland video driver has support for some additional features when -using QtWayland's "qmlcompositor" as Wayland server. This is needed for touch -input when running SDL applications under a qmlcompositor Wayland server. - -The files following headers have been -generated from the Wayland XML Protocol Definition in QtWayland as follows: - -Clone QtWayland from Git: - http://qt.gitorious.org/qt/qtwayland/ - -Generate headers and glue code: - for extension in touch-extension surface-extension windowmanager; do - wayland-scanner client-header < src/extensions/$extension.xml > wayland-qt-$extension.h - wayland-scanner code < src/extensions/$extension.xml > wayland-qt-$extension.c - done - -*/ - -/* wayland-qt-surface-extension.h */ - -struct wl_client; -struct wl_resource; - -struct qt_surface_extension; -struct qt_extended_surface; - -extern const struct wl_interface qt_surface_extension_interface; -extern const struct wl_interface qt_extended_surface_interface; - -#define QT_SURFACE_EXTENSION_GET_EXTENDED_SURFACE 0 - -static inline void -qt_surface_extension_set_user_data(struct qt_surface_extension *qt_surface_extension, void *user_data) -{ - wl_proxy_set_user_data((struct wl_proxy *) qt_surface_extension, user_data); -} - -static inline void * -qt_surface_extension_get_user_data(struct qt_surface_extension *qt_surface_extension) -{ - return wl_proxy_get_user_data((struct wl_proxy *) qt_surface_extension); -} - -static inline void -qt_surface_extension_destroy(struct qt_surface_extension *qt_surface_extension) -{ - WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_surface_extension); -} - -static inline struct qt_extended_surface * -qt_surface_extension_get_extended_surface(struct qt_surface_extension *qt_surface_extension, struct wl_surface *surface) -{ - struct wl_proxy *id; - - id = wl_proxy_create((struct wl_proxy *) qt_surface_extension, - &qt_extended_surface_interface); - if (!id) - return NULL; - - WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_surface_extension, - QT_SURFACE_EXTENSION_GET_EXTENDED_SURFACE, id, surface); - - return (struct qt_extended_surface *) id; -} - -#ifndef QT_EXTENDED_SURFACE_ORIENTATION_ENUM -#define QT_EXTENDED_SURFACE_ORIENTATION_ENUM -enum qt_extended_surface_orientation { - QT_EXTENDED_SURFACE_ORIENTATION_PRIMARYORIENTATION = 0, - QT_EXTENDED_SURFACE_ORIENTATION_PORTRAITORIENTATION = 1, - QT_EXTENDED_SURFACE_ORIENTATION_LANDSCAPEORIENTATION = 2, - QT_EXTENDED_SURFACE_ORIENTATION_INVERTEDPORTRAITORIENTATION = 4, - QT_EXTENDED_SURFACE_ORIENTATION_INVERTEDLANDSCAPEORIENTATION = 8, -}; -#endif /* QT_EXTENDED_SURFACE_ORIENTATION_ENUM */ - -#ifndef QT_EXTENDED_SURFACE_WINDOWFLAG_ENUM -#define QT_EXTENDED_SURFACE_WINDOWFLAG_ENUM -enum qt_extended_surface_windowflag { - QT_EXTENDED_SURFACE_WINDOWFLAG_OVERRIDESSYSTEMGESTURES = 1, - QT_EXTENDED_SURFACE_WINDOWFLAG_STAYSONTOP = 2, -}; -#endif /* QT_EXTENDED_SURFACE_WINDOWFLAG_ENUM */ - -struct qt_extended_surface_listener { - /** - * onscreen_visibility - (none) - * @visible: (none) - */ - void (*onscreen_visibility)(void *data, - struct qt_extended_surface *qt_extended_surface, - int32_t visible); - /** - * set_generic_property - (none) - * @name: (none) - * @value: (none) - */ - void (*set_generic_property)(void *data, - struct qt_extended_surface *qt_extended_surface, - const char *name, - struct wl_array *value); - /** - * close - (none) - */ - void (*close)(void *data, - struct qt_extended_surface *qt_extended_surface); -}; - -static inline int -qt_extended_surface_add_listener(struct qt_extended_surface *qt_extended_surface, - const struct qt_extended_surface_listener *listener, void *data) -{ - return wl_proxy_add_listener((struct wl_proxy *) qt_extended_surface, - (void (**)(void)) listener, data); -} - -#define QT_EXTENDED_SURFACE_UPDATE_GENERIC_PROPERTY 0 -#define QT_EXTENDED_SURFACE_SET_CONTENT_ORIENTATION 1 -#define QT_EXTENDED_SURFACE_SET_WINDOW_FLAGS 2 - -static inline void -qt_extended_surface_set_user_data(struct qt_extended_surface *qt_extended_surface, void *user_data) -{ - WAYLAND_wl_proxy_set_user_data((struct wl_proxy *) qt_extended_surface, user_data); -} - -static inline void * -qt_extended_surface_get_user_data(struct qt_extended_surface *qt_extended_surface) -{ - return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *) qt_extended_surface); -} - -static inline void -qt_extended_surface_destroy(struct qt_extended_surface *qt_extended_surface) -{ - WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_extended_surface); -} - -static inline void -qt_extended_surface_update_generic_property(struct qt_extended_surface *qt_extended_surface, const char *name, struct wl_array *value) -{ - WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_extended_surface, - QT_EXTENDED_SURFACE_UPDATE_GENERIC_PROPERTY, name, value); -} - -static inline void -qt_extended_surface_set_content_orientation(struct qt_extended_surface *qt_extended_surface, int32_t orientation) -{ - WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_extended_surface, - QT_EXTENDED_SURFACE_SET_CONTENT_ORIENTATION, orientation); -} - -static inline void -qt_extended_surface_set_window_flags(struct qt_extended_surface *qt_extended_surface, int32_t flags) -{ - WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_extended_surface, - QT_EXTENDED_SURFACE_SET_WINDOW_FLAGS, flags); -} - -/* wayland-qt-touch-extension.h */ - -extern const struct wl_interface qt_touch_extension_interface; - -#ifndef QT_TOUCH_EXTENSION_FLAGS_ENUM -#define QT_TOUCH_EXTENSION_FLAGS_ENUM -enum qt_touch_extension_flags { - QT_TOUCH_EXTENSION_FLAGS_MOUSE_FROM_TOUCH = 0x1, -}; -#endif /* QT_TOUCH_EXTENSION_FLAGS_ENUM */ - -struct qt_touch_extension_listener { - /** - * touch - (none) - * @time: (none) - * @id: (none) - * @state: (none) - * @x: (none) - * @y: (none) - * @normalized_x: (none) - * @normalized_y: (none) - * @width: (none) - * @height: (none) - * @pressure: (none) - * @velocity_x: (none) - * @velocity_y: (none) - * @flags: (none) - * @rawdata: (none) - */ - void (*touch)(void *data, - struct qt_touch_extension *qt_touch_extension, - uint32_t time, - uint32_t id, - uint32_t state, - int32_t x, - int32_t y, - int32_t normalized_x, - int32_t normalized_y, - int32_t width, - int32_t height, - uint32_t pressure, - int32_t velocity_x, - int32_t velocity_y, - uint32_t flags, - struct wl_array *rawdata); - /** - * configure - (none) - * @flags: (none) - */ - void (*configure)(void *data, - struct qt_touch_extension *qt_touch_extension, - uint32_t flags); -}; - -static inline int -qt_touch_extension_add_listener(struct qt_touch_extension *qt_touch_extension, - const struct qt_touch_extension_listener *listener, void *data) -{ - return wl_proxy_add_listener((struct wl_proxy *) qt_touch_extension, - (void (**)(void)) listener, data); -} - -#define QT_TOUCH_EXTENSION_DUMMY 0 - -static inline void -qt_touch_extension_set_user_data(struct qt_touch_extension *qt_touch_extension, void *user_data) -{ - WAYLAND_wl_proxy_set_user_data((struct wl_proxy *) qt_touch_extension, user_data); -} - -static inline void * -qt_touch_extension_get_user_data(struct qt_touch_extension *qt_touch_extension) -{ - return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *) qt_touch_extension); -} - -static inline void -qt_touch_extension_destroy(struct qt_touch_extension *qt_touch_extension) -{ - WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_touch_extension); -} - -static inline void -qt_touch_extension_dummy(struct qt_touch_extension *qt_touch_extension) -{ - WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_touch_extension, - QT_TOUCH_EXTENSION_DUMMY); -} - - -/* wayland-qt-windowmanager.h */ - -extern const struct wl_interface qt_windowmanager_interface; - -struct qt_windowmanager_listener { - /** - * hints - (none) - * @show_is_fullscreen: (none) - */ - void (*hints)(void *data, - struct qt_windowmanager *qt_windowmanager, - int32_t show_is_fullscreen); - /** - * quit - (none) - */ - void (*quit)(void *data, - struct qt_windowmanager *qt_windowmanager); -}; - -static inline int -qt_windowmanager_add_listener(struct qt_windowmanager *qt_windowmanager, - const struct qt_windowmanager_listener *listener, void *data) -{ - return wl_proxy_add_listener((struct wl_proxy *) qt_windowmanager, - (void (**)(void)) listener, data); -} - -#define QT_WINDOWMANAGER_OPEN_URL 0 - -static inline void -qt_windowmanager_set_user_data(struct qt_windowmanager *qt_windowmanager, void *user_data) -{ - WAYLAND_wl_proxy_set_user_data((struct wl_proxy *) qt_windowmanager, user_data); -} - -static inline void * -qt_windowmanager_get_user_data(struct qt_windowmanager *qt_windowmanager) -{ - return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *) qt_windowmanager); -} - -static inline void -qt_windowmanager_destroy(struct qt_windowmanager *qt_windowmanager) -{ - WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_windowmanager); -} - -static inline void -qt_windowmanager_open_url(struct qt_windowmanager *qt_windowmanager, uint32_t remaining, const char *url) -{ - WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_windowmanager, - QT_WINDOWMANAGER_OPEN_URL, remaining, url); -} - -#endif /* _SDL_waylandtouch_h */ - -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.c b/3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.c deleted file mode 100644 index 554b0ecada1..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.c +++ /dev/null @@ -1,448 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WAYLAND - -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "SDL_stdinc.h" -#include "../../events/SDL_events_c.h" - -#include "SDL_waylandvideo.h" -#include "SDL_waylandevents_c.h" -#include "SDL_waylandwindow.h" -#include "SDL_waylandopengles.h" -#include "SDL_waylandmouse.h" -#include "SDL_waylandtouch.h" - -#include <sys/types.h> -#include <unistd.h> -#include <fcntl.h> -#include <xkbcommon/xkbcommon.h> - -#include "SDL_waylanddyn.h" -#include <wayland-util.h> - -#define WAYLANDVID_DRIVER_NAME "wayland" - -/* Initialization/Query functions */ -static int -Wayland_VideoInit(_THIS); - -static void -Wayland_GetDisplayModes(_THIS, SDL_VideoDisplay *sdl_display); -static int -Wayland_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode); - -static void -Wayland_VideoQuit(_THIS); - -/* Find out what class name we should use - * Based on src/video/x11/SDL_x11video.c */ -static char * -get_classname() -{ - char *spot; -#if defined(__LINUX__) || defined(__FREEBSD__) - char procfile[1024]; - char linkfile[1024]; - int linksize; -#endif - - /* First allow environment variable override */ - spot = SDL_getenv("SDL_VIDEO_WAYLAND_WMCLASS"); - if (spot) { - return SDL_strdup(spot); - } else { - /* Fallback to the "old" envvar */ - spot = SDL_getenv("SDL_VIDEO_X11_WMCLASS"); - if (spot) { - return SDL_strdup(spot); - } - } - - /* Next look at the application's executable name */ -#if defined(__LINUX__) || defined(__FREEBSD__) -#if defined(__LINUX__) - SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/exe", getpid()); -#elif defined(__FREEBSD__) - SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/file", - getpid()); -#else -#error Where can we find the executable name? -#endif - linksize = readlink(procfile, linkfile, sizeof(linkfile) - 1); - if (linksize > 0) { - linkfile[linksize] = '\0'; - spot = SDL_strrchr(linkfile, '/'); - if (spot) { - return SDL_strdup(spot + 1); - } else { - return SDL_strdup(linkfile); - } - } -#endif /* __LINUX__ || __FREEBSD__ */ - - /* Finally use the default we've used forever */ - return SDL_strdup("SDL_App"); -} - -/* Wayland driver bootstrap functions */ -static int -Wayland_Available(void) -{ - struct wl_display *display = NULL; - if (SDL_WAYLAND_LoadSymbols()) { - display = WAYLAND_wl_display_connect(NULL); - if (display != NULL) { - WAYLAND_wl_display_disconnect(display); - } - SDL_WAYLAND_UnloadSymbols(); - } - - return (display != NULL); -} - -static void -Wayland_DeleteDevice(SDL_VideoDevice *device) -{ - SDL_free(device); - SDL_WAYLAND_UnloadSymbols(); -} - -static SDL_VideoDevice * -Wayland_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - - if (!SDL_WAYLAND_LoadSymbols()) { - return NULL; - } - - /* Initialize all variables that we clean on shutdown */ - device = SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (!device) { - SDL_WAYLAND_UnloadSymbols(); - SDL_OutOfMemory(); - return NULL; - } - - /* Set the function pointers */ - device->VideoInit = Wayland_VideoInit; - device->VideoQuit = Wayland_VideoQuit; - device->SetDisplayMode = Wayland_SetDisplayMode; - device->GetDisplayModes = Wayland_GetDisplayModes; - device->GetWindowWMInfo = Wayland_GetWindowWMInfo; - - device->PumpEvents = Wayland_PumpEvents; - - device->GL_SwapWindow = Wayland_GLES_SwapWindow; - device->GL_GetSwapInterval = Wayland_GLES_GetSwapInterval; - device->GL_SetSwapInterval = Wayland_GLES_SetSwapInterval; - device->GL_MakeCurrent = Wayland_GLES_MakeCurrent; - device->GL_CreateContext = Wayland_GLES_CreateContext; - device->GL_LoadLibrary = Wayland_GLES_LoadLibrary; - device->GL_UnloadLibrary = Wayland_GLES_UnloadLibrary; - device->GL_GetProcAddress = Wayland_GLES_GetProcAddress; - device->GL_DeleteContext = Wayland_GLES_DeleteContext; - - device->CreateWindow = Wayland_CreateWindow; - device->ShowWindow = Wayland_ShowWindow; - device->SetWindowFullscreen = Wayland_SetWindowFullscreen; - device->MaximizeWindow = Wayland_MaximizeWindow; - device->RestoreWindow = Wayland_RestoreWindow; - device->SetWindowSize = Wayland_SetWindowSize; - device->SetWindowTitle = Wayland_SetWindowTitle; - device->DestroyWindow = Wayland_DestroyWindow; - device->SetWindowHitTest = Wayland_SetWindowHitTest; - - device->free = Wayland_DeleteDevice; - - return device; -} - -VideoBootStrap Wayland_bootstrap = { - WAYLANDVID_DRIVER_NAME, "SDL Wayland video driver", - Wayland_Available, Wayland_CreateDevice -}; - -static void -display_handle_geometry(void *data, - struct wl_output *output, - int x, int y, - int physical_width, - int physical_height, - int subpixel, - const char *make, - const char *model, - int transform) - -{ - SDL_VideoDisplay *display = data; - - display->name = SDL_strdup(model); - display->driverdata = output; -} - -static void -display_handle_mode(void *data, - struct wl_output *output, - uint32_t flags, - int width, - int height, - int refresh) -{ - SDL_VideoDisplay *display = data; - SDL_DisplayMode mode; - - SDL_zero(mode); - mode.w = width; - mode.h = height; - mode.refresh_rate = refresh / 1000; // mHz to Hz - SDL_AddDisplayMode(display, &mode); - - if (flags & WL_OUTPUT_MODE_CURRENT) { - display->current_mode = mode; - display->desktop_mode = mode; - } -} - -static void -display_handle_done(void *data, - struct wl_output *output) -{ - SDL_VideoDisplay *display = data; - SDL_AddVideoDisplay(display); - SDL_free(display->name); - SDL_free(display); -} - -static void -display_handle_scale(void *data, - struct wl_output *output, - int32_t factor) -{ - // TODO: do HiDPI stuff. -} - -static const struct wl_output_listener output_listener = { - display_handle_geometry, - display_handle_mode, - display_handle_done, - display_handle_scale -}; - -static void -Wayland_add_display(SDL_VideoData *d, uint32_t id) -{ - struct wl_output *output; - SDL_VideoDisplay *display = SDL_malloc(sizeof *display); - if (!display) { - SDL_OutOfMemory(); - return; - } - SDL_zero(*display); - - output = wl_registry_bind(d->registry, id, &wl_output_interface, 2); - if (!output) { - SDL_SetError("Failed to retrieve output."); - return; - } - - wl_output_add_listener(output, &output_listener, display); -} - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH -static void -windowmanager_hints(void *data, struct qt_windowmanager *qt_windowmanager, - int32_t show_is_fullscreen) -{ -} - -static void -windowmanager_quit(void *data, struct qt_windowmanager *qt_windowmanager) -{ - SDL_SendQuit(); -} - -static const struct qt_windowmanager_listener windowmanager_listener = { - windowmanager_hints, - windowmanager_quit, -}; -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - -static void -display_handle_global(void *data, struct wl_registry *registry, uint32_t id, - const char *interface, uint32_t version) -{ - SDL_VideoData *d = data; - - if (strcmp(interface, "wl_compositor") == 0) { - d->compositor = wl_registry_bind(d->registry, id, &wl_compositor_interface, 1); - } else if (strcmp(interface, "wl_output") == 0) { - Wayland_add_display(d, id); - } else if (strcmp(interface, "wl_seat") == 0) { - Wayland_display_add_input(d, id); - } else if (strcmp(interface, "wl_shell") == 0) { - d->shell = wl_registry_bind(d->registry, id, &wl_shell_interface, 1); - } else if (strcmp(interface, "wl_shm") == 0) { - d->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1); - d->cursor_theme = WAYLAND_wl_cursor_theme_load(NULL, 32, d->shm); - } else if (strcmp(interface, "zwp_relative_pointer_manager_v1") == 0) { - Wayland_display_add_relative_pointer_manager(d, id); - } else if (strcmp(interface, "zwp_pointer_constraints_v1") == 0) { - Wayland_display_add_pointer_constraints(d, id); -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - } else if (strcmp(interface, "qt_touch_extension") == 0) { - Wayland_touch_create(d, id); - } else if (strcmp(interface, "qt_surface_extension") == 0) { - d->surface_extension = wl_registry_bind(registry, id, - &qt_surface_extension_interface, 1); - } else if (strcmp(interface, "qt_windowmanager") == 0) { - d->windowmanager = wl_registry_bind(registry, id, - &qt_windowmanager_interface, 1); - qt_windowmanager_add_listener(d->windowmanager, &windowmanager_listener, d); -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - } -} - -static const struct wl_registry_listener registry_listener = { - display_handle_global -}; - -int -Wayland_VideoInit(_THIS) -{ - SDL_VideoData *data = SDL_malloc(sizeof *data); - if (data == NULL) - return SDL_OutOfMemory(); - memset(data, 0, sizeof *data); - - _this->driverdata = data; - - data->xkb_context = WAYLAND_xkb_context_new(0); - if (!data->xkb_context) { - return SDL_SetError("Failed to create XKB context"); - } - - data->display = WAYLAND_wl_display_connect(NULL); - if (data->display == NULL) { - return SDL_SetError("Failed to connect to a Wayland display"); - } - - data->registry = wl_display_get_registry(data->display); - if (data->registry == NULL) { - return SDL_SetError("Failed to get the Wayland registry"); - } - - wl_registry_add_listener(data->registry, ®istry_listener, data); - - // First roundtrip to receive all registry objects. - WAYLAND_wl_display_roundtrip(data->display); - - // Second roundtrip to receive all output events. - WAYLAND_wl_display_roundtrip(data->display); - - Wayland_InitMouse(); - - /* Get the surface class name, usually the name of the application */ - data->classname = get_classname(); - - WAYLAND_wl_display_flush(data->display); - - return 0; -} - -static void -Wayland_GetDisplayModes(_THIS, SDL_VideoDisplay *sdl_display) -{ - // Nothing to do here, everything was already done in the wl_output - // callbacks. -} - -static int -Wayland_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode) -{ - return SDL_Unsupported(); -} - -void -Wayland_VideoQuit(_THIS) -{ - SDL_VideoData *data = _this->driverdata; - int i; - - Wayland_FiniMouse (); - - for (i = 0; i < _this->num_displays; ++i) { - SDL_VideoDisplay *display = &_this->displays[i]; - wl_output_destroy(display->driverdata); - display->driverdata = NULL; - } - - Wayland_display_destroy_input(data); - Wayland_display_destroy_pointer_constraints(data); - Wayland_display_destroy_relative_pointer_manager(data); - - if (data->xkb_context) { - WAYLAND_xkb_context_unref(data->xkb_context); - data->xkb_context = NULL; - } -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - if (data->windowmanager) - qt_windowmanager_destroy(data->windowmanager); - - if (data->surface_extension) - qt_surface_extension_destroy(data->surface_extension); - - Wayland_touch_destroy(data); -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - - if (data->shm) - wl_shm_destroy(data->shm); - - if (data->cursor_theme) - WAYLAND_wl_cursor_theme_destroy(data->cursor_theme); - - if (data->shell) - wl_shell_destroy(data->shell); - - if (data->compositor) - wl_compositor_destroy(data->compositor); - - if (data->registry) - wl_registry_destroy(data->registry); - - if (data->display) { - WAYLAND_wl_display_flush(data->display); - WAYLAND_wl_display_disconnect(data->display); - } - - SDL_free(data->classname); - free(data); - _this->driverdata = NULL; -} - -#endif /* SDL_VIDEO_DRIVER_WAYLAND */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.h b/3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.h deleted file mode 100644 index ccd7ecf92e6..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#ifndef _SDL_waylandvideo_h -#define _SDL_waylandvideo_h - -#include <EGL/egl.h> -#include "wayland-util.h" - -struct xkb_context; -struct SDL_WaylandInput; - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH -struct SDL_WaylandTouch; -struct qt_surface_extension; -struct qt_windowmanager; -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - -typedef struct { - struct wl_display *display; - struct wl_registry *registry; - struct wl_compositor *compositor; - struct wl_shm *shm; - struct wl_cursor_theme *cursor_theme; - struct wl_pointer *pointer; - struct wl_shell *shell; - struct zwp_relative_pointer_manager_v1 *relative_pointer_manager; - struct zwp_pointer_constraints_v1 *pointer_constraints; - - EGLDisplay edpy; - EGLContext context; - EGLConfig econf; - - struct xkb_context *xkb_context; - struct SDL_WaylandInput *input; - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - struct SDL_WaylandTouch *touch; - struct qt_surface_extension *surface_extension; - struct qt_windowmanager *windowmanager; -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - - char *classname; - - int relative_mouse_mode; -} SDL_VideoData; - -#endif /* _SDL_waylandvideo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandwindow.c b/3rdparty/SDL2/src/video/wayland/SDL_waylandwindow.c deleted file mode 100644 index 85fca8de67f..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandwindow.c +++ /dev/null @@ -1,326 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL - -#include "../SDL_sysvideo.h" -#include "../../events/SDL_windowevents_c.h" -#include "../SDL_egl_c.h" -#include "SDL_waylandevents_c.h" -#include "SDL_waylandwindow.h" -#include "SDL_waylandvideo.h" -#include "SDL_waylandtouch.h" -#include "SDL_waylanddyn.h" - -static void -handle_ping(void *data, struct wl_shell_surface *shell_surface, - uint32_t serial) -{ - wl_shell_surface_pong(shell_surface, serial); -} - -static void -handle_configure(void *data, struct wl_shell_surface *shell_surface, - uint32_t edges, int32_t width, int32_t height) -{ - SDL_WindowData *wind = (SDL_WindowData *)data; - SDL_Window *window = wind->sdlwindow; - struct wl_region *region; - - /* wl_shell_surface spec states that this is a suggestion. - Ignore if less than or greater than max/min size. */ - - if (width == 0 || height == 0) { - return; - } - - if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { - if ((window->flags & SDL_WINDOW_RESIZABLE)) { - if (window->max_w > 0) { - width = SDL_min(width, window->max_w); - } - width = SDL_max(width, window->min_w); - - if (window->max_h > 0) { - height = SDL_min(height, window->max_h); - } - height = SDL_max(height, window->min_h); - } else { - return; - } - } - - if (width == window->w && height == window->h) { - return; - } - - window->w = width; - window->h = height; - WAYLAND_wl_egl_window_resize(wind->egl_window, window->w, window->h, 0, 0); - - region = wl_compositor_create_region(wind->waylandData->compositor); - wl_region_add(region, 0, 0, window->w, window->h); - wl_surface_set_opaque_region(wind->surface, region); - wl_region_destroy(region); - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, window->w, window->h); -} - -static void -handle_popup_done(void *data, struct wl_shell_surface *shell_surface) -{ -} - -static const struct wl_shell_surface_listener shell_surface_listener = { - handle_ping, - handle_configure, - handle_popup_done -}; - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH -static void -handle_onscreen_visibility(void *data, - struct qt_extended_surface *qt_extended_surface, int32_t visible) -{ -} - -static void -handle_set_generic_property(void *data, - struct qt_extended_surface *qt_extended_surface, const char *name, - struct wl_array *value) -{ -} - -static void -handle_close(void *data, struct qt_extended_surface *qt_extended_surface) -{ - SDL_WindowData *window = (SDL_WindowData *)data; - SDL_SendWindowEvent(window->sdlwindow, SDL_WINDOWEVENT_CLOSE, 0, 0); -} - -static const struct qt_extended_surface_listener extended_surface_listener = { - handle_onscreen_visibility, - handle_set_generic_property, - handle_close, -}; -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - -SDL_bool -Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - - info->info.wl.display = data->waylandData->display; - info->info.wl.surface = data->surface; - info->info.wl.shell_surface = data->shell_surface; - info->subsystem = SDL_SYSWM_WAYLAND; - - return SDL_TRUE; -} - -int -Wayland_SetWindowHitTest(SDL_Window *window, SDL_bool enabled) -{ - return 0; /* just succeed, the real work is done elsewhere. */ -} - -void Wayland_ShowWindow(_THIS, SDL_Window *window) -{ - SDL_WindowData *wind = window->driverdata; - - if (window->flags & SDL_WINDOW_FULLSCREEN) - wl_shell_surface_set_fullscreen(wind->shell_surface, - WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, - 0, (struct wl_output *)window->fullscreen_mode.driverdata); - else - wl_shell_surface_set_toplevel(wind->shell_surface); - - WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display ); -} - -void -Wayland_SetWindowFullscreen(_THIS, SDL_Window * window, - SDL_VideoDisplay * _display, SDL_bool fullscreen) -{ - SDL_WindowData *wind = window->driverdata; - - if (fullscreen) - wl_shell_surface_set_fullscreen(wind->shell_surface, - WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE, - 0, (struct wl_output *)_display->driverdata); - else - wl_shell_surface_set_toplevel(wind->shell_surface); - - WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display ); -} - -void -Wayland_RestoreWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *wind = window->driverdata; - - wl_shell_surface_set_toplevel(wind->shell_surface); - - WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display ); -} - -void -Wayland_MaximizeWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *wind = window->driverdata; - - wl_shell_surface_set_maximized(wind->shell_surface, NULL); - - WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display ); -} - -int Wayland_CreateWindow(_THIS, SDL_Window *window) -{ - SDL_WindowData *data; - SDL_VideoData *c; - struct wl_region *region; - - data = calloc(1, sizeof *data); - if (data == NULL) - return SDL_OutOfMemory(); - - c = _this->driverdata; - window->driverdata = data; - - if (!(window->flags & SDL_WINDOW_OPENGL)) { - SDL_GL_LoadLibrary(NULL); - window->flags |= SDL_WINDOW_OPENGL; - } - - if (window->x == SDL_WINDOWPOS_UNDEFINED) { - window->x = 0; - } - if (window->y == SDL_WINDOWPOS_UNDEFINED) { - window->y = 0; - } - - data->waylandData = c; - data->sdlwindow = window; - - data->surface = - wl_compositor_create_surface(c->compositor); - wl_surface_set_user_data(data->surface, data); - data->shell_surface = wl_shell_get_shell_surface(c->shell, - data->surface); - wl_shell_surface_set_class (data->shell_surface, c->classname); -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - if (c->surface_extension) { - data->extended_surface = qt_surface_extension_get_extended_surface( - c->surface_extension, data->surface); - } -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - - data->egl_window = WAYLAND_wl_egl_window_create(data->surface, - window->w, window->h); - - /* Create the GLES window surface */ - data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->egl_window); - - if (data->egl_surface == EGL_NO_SURFACE) { - return SDL_SetError("failed to create a window surface"); - } - - if (data->shell_surface) { - wl_shell_surface_set_user_data(data->shell_surface, data); - wl_shell_surface_add_listener(data->shell_surface, - &shell_surface_listener, data); - } - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - if (data->extended_surface) { - qt_extended_surface_set_user_data(data->extended_surface, data); - qt_extended_surface_add_listener(data->extended_surface, - &extended_surface_listener, data); - } -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - - region = wl_compositor_create_region(c->compositor); - wl_region_add(region, 0, 0, window->w, window->h); - wl_surface_set_opaque_region(data->surface, region); - wl_region_destroy(region); - - if (c->relative_mouse_mode) { - Wayland_input_lock_pointer(c->input); - } - - WAYLAND_wl_display_flush(c->display); - - return 0; -} - -void Wayland_SetWindowSize(_THIS, SDL_Window * window) -{ - SDL_VideoData *data = _this->driverdata; - SDL_WindowData *wind = window->driverdata; - struct wl_region *region; - - WAYLAND_wl_egl_window_resize(wind->egl_window, window->w, window->h, 0, 0); - - region =wl_compositor_create_region(data->compositor); - wl_region_add(region, 0, 0, window->w, window->h); - wl_surface_set_opaque_region(wind->surface, region); - wl_region_destroy(region); -} - -void Wayland_SetWindowTitle(_THIS, SDL_Window * window) -{ - SDL_WindowData *wind = window->driverdata; - - if (window->title != NULL) { - wl_shell_surface_set_title(wind->shell_surface, window->title); - } - - WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display ); -} - -void Wayland_DestroyWindow(_THIS, SDL_Window *window) -{ - SDL_VideoData *data = _this->driverdata; - SDL_WindowData *wind = window->driverdata; - - if (data) { - SDL_EGL_DestroySurface(_this, wind->egl_surface); - WAYLAND_wl_egl_window_destroy(wind->egl_window); - - if (wind->shell_surface) - wl_shell_surface_destroy(wind->shell_surface); - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - if (wind->extended_surface) - qt_extended_surface_destroy(wind->extended_surface); -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - wl_surface_destroy(wind->surface); - - SDL_free(wind); - WAYLAND_wl_display_flush(data->display); - } - window->driverdata = NULL; -} - -#endif /* SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandwindow.h b/3rdparty/SDL2/src/video/wayland/SDL_waylandwindow.h deleted file mode 100644 index 319a573dc8a..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandwindow.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#ifndef _SDL_waylandwindow_h -#define _SDL_waylandwindow_h - -#include "../SDL_sysvideo.h" -#include "SDL_syswm.h" - -#include "SDL_waylandvideo.h" - -struct SDL_WaylandInput; - -typedef struct { - SDL_Window *sdlwindow; - SDL_VideoData *waylandData; - struct wl_surface *surface; - struct wl_shell_surface *shell_surface; - struct wl_egl_window *egl_window; - struct SDL_WaylandInput *keyboard_device; - EGLSurface egl_surface; - struct zwp_locked_pointer_v1 *locked_pointer; - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - struct qt_extended_surface *extended_surface; -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ -} SDL_WindowData; - -extern void Wayland_ShowWindow(_THIS, SDL_Window *window); -extern void Wayland_SetWindowFullscreen(_THIS, SDL_Window * window, - SDL_VideoDisplay * _display, - SDL_bool fullscreen); -extern void Wayland_MaximizeWindow(_THIS, SDL_Window * window); -extern void Wayland_RestoreWindow(_THIS, SDL_Window * window); -extern int Wayland_CreateWindow(_THIS, SDL_Window *window); -extern void Wayland_SetWindowSize(_THIS, SDL_Window * window); -extern void Wayland_SetWindowTitle(_THIS, SDL_Window * window); -extern void Wayland_DestroyWindow(_THIS, SDL_Window *window); - -extern SDL_bool -Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info); -extern int Wayland_SetWindowHitTest(SDL_Window *window, SDL_bool enabled); - -#endif /* _SDL_waylandwindow_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_msctf.h b/3rdparty/SDL2/src/video/windows/SDL_msctf.h deleted file mode 100644 index 74e22f107a9..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_msctf.h +++ /dev/null @@ -1,242 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef _SDL_msctf_h -#define _SDL_msctf_h - -#include <unknwn.h> - -#define TF_INVALID_COOKIE (0xffffffff) -#define TF_IPSINK_FLAG_ACTIVE 0x0001 -#define TF_TMAE_UIELEMENTENABLEDONLY 0x00000004 - -typedef struct ITfThreadMgr ITfThreadMgr; -typedef struct ITfDocumentMgr ITfDocumentMgr; -typedef struct ITfClientId ITfClientId; - -typedef struct IEnumTfDocumentMgrs IEnumTfDocumentMgrs; -typedef struct IEnumTfFunctionProviders IEnumTfFunctionProviders; -typedef struct ITfFunctionProvider ITfFunctionProvider; -typedef struct ITfCompartmentMgr ITfCompartmentMgr; -typedef struct ITfContext ITfContext; -typedef struct IEnumTfContexts IEnumTfContexts; -typedef struct ITfUIElementSink ITfUIElementSink; -typedef struct ITfUIElement ITfUIElement; -typedef struct ITfUIElementMgr ITfUIElementMgr; -typedef struct IEnumTfUIElements IEnumTfUIElements; -typedef struct ITfThreadMgrEx ITfThreadMgrEx; -typedef struct ITfCandidateListUIElement ITfCandidateListUIElement; -typedef struct ITfReadingInformationUIElement ITfReadingInformationUIElement; -typedef struct ITfInputProcessorProfileActivationSink ITfInputProcessorProfileActivationSink; -typedef struct ITfSource ITfSource; - -typedef DWORD TfClientId; -typedef DWORD TfEditCookie; - -typedef struct ITfThreadMgrVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfThreadMgr *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(ITfThreadMgr *); - ULONG (STDMETHODCALLTYPE *Release)(ITfThreadMgr *); - HRESULT (STDMETHODCALLTYPE *Activate)(ITfThreadMgr *, TfClientId *); - HRESULT (STDMETHODCALLTYPE *Deactivate)(ITfThreadMgr *); - HRESULT (STDMETHODCALLTYPE *CreateDocumentMgr)(ITfThreadMgr *); - HRESULT (STDMETHODCALLTYPE *EnumDocumentMgrs)(ITfThreadMgr *, IEnumTfDocumentMgrs **); - HRESULT (STDMETHODCALLTYPE *GetFocus)(ITfThreadMgr *, ITfDocumentMgr **); - HRESULT (STDMETHODCALLTYPE *SetFocus)(ITfThreadMgr *, ITfDocumentMgr *); - HRESULT (STDMETHODCALLTYPE *AssociateFocus)(ITfThreadMgr *, HWND, ITfDocumentMgr *, ITfDocumentMgr **); - HRESULT (STDMETHODCALLTYPE *IsThreadFocus)(ITfThreadMgr *, BOOL *); - HRESULT (STDMETHODCALLTYPE *GetFunctionProvider)(ITfThreadMgr *, REFCLSID, ITfFunctionProvider **); - HRESULT (STDMETHODCALLTYPE *EnumFunctionProviders)(ITfThreadMgr *, IEnumTfFunctionProviders **); - HRESULT (STDMETHODCALLTYPE *GetGlobalCompartment)(ITfThreadMgr *, ITfCompartmentMgr **); -} ITfThreadMgrVtbl; - -struct ITfThreadMgr -{ - const struct ITfThreadMgrVtbl *lpVtbl; -}; - -typedef struct ITfThreadMgrExVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfThreadMgrEx *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(ITfThreadMgrEx *); - ULONG (STDMETHODCALLTYPE *Release)(ITfThreadMgrEx *); - HRESULT (STDMETHODCALLTYPE *Activate)(ITfThreadMgrEx *, TfClientId *); - HRESULT (STDMETHODCALLTYPE *Deactivate)(ITfThreadMgrEx *); - HRESULT (STDMETHODCALLTYPE *CreateDocumentMgr)(ITfThreadMgrEx *, ITfDocumentMgr **); - HRESULT (STDMETHODCALLTYPE *EnumDocumentMgrs)(ITfThreadMgrEx *, IEnumTfDocumentMgrs **); - HRESULT (STDMETHODCALLTYPE *GetFocus)(ITfThreadMgrEx *, ITfDocumentMgr **); - HRESULT (STDMETHODCALLTYPE *SetFocus)(ITfThreadMgrEx *, ITfDocumentMgr *); - HRESULT (STDMETHODCALLTYPE *AssociateFocus)(ITfThreadMgrEx *, ITfDocumentMgr *, ITfDocumentMgr **); - HRESULT (STDMETHODCALLTYPE *IsThreadFocus)(ITfThreadMgrEx *, BOOL *); - HRESULT (STDMETHODCALLTYPE *GetFunctionProvider)(ITfThreadMgrEx *, REFCLSID, ITfFunctionProvider **); - HRESULT (STDMETHODCALLTYPE *EnumFunctionProviders)(ITfThreadMgrEx *, IEnumTfFunctionProviders **); - HRESULT (STDMETHODCALLTYPE *GetGlobalCompartment)(ITfThreadMgrEx *, ITfCompartmentMgr **); - HRESULT (STDMETHODCALLTYPE *ActivateEx)(ITfThreadMgrEx *, TfClientId *, DWORD); - HRESULT (STDMETHODCALLTYPE *GetActiveFlags)(ITfThreadMgrEx *, DWORD *); -} ITfThreadMgrExVtbl; - -struct ITfThreadMgrEx -{ - const struct ITfThreadMgrExVtbl *lpVtbl; -}; - -typedef struct ITfDocumentMgrVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfDocumentMgr *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(ITfDocumentMgr *); - ULONG (STDMETHODCALLTYPE *Release)(ITfDocumentMgr *); - HRESULT (STDMETHODCALLTYPE *CreateContext)(ITfDocumentMgr *, TfClientId, DWORD, IUnknown *, ITfContext **, TfEditCookie *); - HRESULT (STDMETHODCALLTYPE *Push)(ITfDocumentMgr *, ITfContext *); - HRESULT (STDMETHODCALLTYPE *Pop)(ITfDocumentMgr *); - HRESULT (STDMETHODCALLTYPE *GetTop)(ITfDocumentMgr *, ITfContext **); - HRESULT (STDMETHODCALLTYPE *GetBase)(ITfDocumentMgr *, ITfContext **); - HRESULT (STDMETHODCALLTYPE *EnumContexts)(ITfDocumentMgr *, IEnumTfContexts **); -} ITfDocumentMgrVtbl; - -struct ITfDocumentMgr -{ - const struct ITfDocumentMgrVtbl *lpVtbl; -}; - -typedef struct ITfUIElementSinkVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfUIElementSink *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(ITfUIElementSink *); - ULONG (STDMETHODCALLTYPE *Release)(ITfUIElementSink *); - HRESULT (STDMETHODCALLTYPE *BeginUIElement)(ITfUIElementSink *, DWORD, BOOL *); - HRESULT (STDMETHODCALLTYPE *UpdateUIElement)(ITfUIElementSink *, DWORD); - HRESULT (STDMETHODCALLTYPE *EndUIElement)(ITfUIElementSink *, DWORD); -} ITfUIElementSinkVtbl; - -struct ITfUIElementSink -{ - const struct ITfUIElementSinkVtbl *lpVtbl; -}; - -typedef struct ITfUIElementMgrVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfUIElementMgr *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(ITfUIElementMgr *); - ULONG (STDMETHODCALLTYPE *Release)(ITfUIElementMgr *); - HRESULT (STDMETHODCALLTYPE *BeginUIElement)(ITfUIElementMgr *, ITfUIElement *, BOOL *, DWORD *); - HRESULT (STDMETHODCALLTYPE *UpdateUIElement)(ITfUIElementMgr *, DWORD); - HRESULT (STDMETHODCALLTYPE *EndUIElement)(ITfUIElementMgr *, DWORD); - HRESULT (STDMETHODCALLTYPE *GetUIElement)(ITfUIElementMgr *, DWORD, ITfUIElement **); - HRESULT (STDMETHODCALLTYPE *EnumUIElements)(ITfUIElementMgr *, IEnumTfUIElements **); -} ITfUIElementMgrVtbl; - -struct ITfUIElementMgr -{ - const struct ITfUIElementMgrVtbl *lpVtbl; -}; - -typedef struct ITfCandidateListUIElementVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfCandidateListUIElement *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(ITfCandidateListUIElement *); - ULONG (STDMETHODCALLTYPE *Release)(ITfCandidateListUIElement *); - HRESULT (STDMETHODCALLTYPE *GetDescription)(ITfCandidateListUIElement *, BSTR *); - HRESULT (STDMETHODCALLTYPE *GetGUID)(ITfCandidateListUIElement *, GUID *); - HRESULT (STDMETHODCALLTYPE *Show)(ITfCandidateListUIElement *, BOOL); - HRESULT (STDMETHODCALLTYPE *IsShown)(ITfCandidateListUIElement *, BOOL *); - HRESULT (STDMETHODCALLTYPE *GetUpdatedFlags)(ITfCandidateListUIElement *, DWORD *); - HRESULT (STDMETHODCALLTYPE *GetDocumentMgr)(ITfCandidateListUIElement *, ITfDocumentMgr **); - HRESULT (STDMETHODCALLTYPE *GetCount)(ITfCandidateListUIElement *, UINT *); - HRESULT (STDMETHODCALLTYPE *GetSelection)(ITfCandidateListUIElement *, UINT *); - HRESULT (STDMETHODCALLTYPE *GetString)(ITfCandidateListUIElement *, UINT, BSTR *); - HRESULT (STDMETHODCALLTYPE *GetPageIndex)(ITfCandidateListUIElement *, UINT *, UINT, UINT *); - HRESULT (STDMETHODCALLTYPE *SetPageIndex)(ITfCandidateListUIElement *, UINT *, UINT); - HRESULT (STDMETHODCALLTYPE *GetCurrentPage)(ITfCandidateListUIElement *, UINT *); -} ITfCandidateListUIElementVtbl; - -struct ITfCandidateListUIElement -{ - const struct ITfCandidateListUIElementVtbl *lpVtbl; -}; - -typedef struct ITfReadingInformationUIElementVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfReadingInformationUIElement *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(ITfReadingInformationUIElement *); - ULONG (STDMETHODCALLTYPE *Release)(ITfReadingInformationUIElement *); - HRESULT (STDMETHODCALLTYPE *GetDescription)(ITfReadingInformationUIElement *, BSTR *); - HRESULT (STDMETHODCALLTYPE *GetGUID)(ITfReadingInformationUIElement *, GUID *); - HRESULT (STDMETHODCALLTYPE *Show)(ITfReadingInformationUIElement *, BOOL); - HRESULT (STDMETHODCALLTYPE *IsShown)(ITfReadingInformationUIElement *, BOOL *); - HRESULT (STDMETHODCALLTYPE *GetUpdatedFlags)(ITfReadingInformationUIElement *, DWORD *); - HRESULT (STDMETHODCALLTYPE *GetContext)(ITfReadingInformationUIElement *, ITfContext **); - HRESULT (STDMETHODCALLTYPE *GetString)(ITfReadingInformationUIElement *, BSTR *); - HRESULT (STDMETHODCALLTYPE *GetMaxReadingStringLength)(ITfReadingInformationUIElement *, UINT *); - HRESULT (STDMETHODCALLTYPE *GetErrorIndex)(ITfReadingInformationUIElement *, UINT *); - HRESULT (STDMETHODCALLTYPE *IsVerticalOrderPreferred)(ITfReadingInformationUIElement *, BOOL *); -} ITfReadingInformationUIElementVtbl; - -struct ITfReadingInformationUIElement -{ - const struct ITfReadingInformationUIElementVtbl *lpVtbl; -}; - -typedef struct ITfUIElementVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfUIElement *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(ITfUIElement *); - ULONG (STDMETHODCALLTYPE *Release)(ITfUIElement *); - HRESULT (STDMETHODCALLTYPE *GetDescription)(ITfUIElement *, BSTR *); - HRESULT (STDMETHODCALLTYPE *GetGUID)(ITfUIElement *, GUID *); - HRESULT (STDMETHODCALLTYPE *Show)(ITfUIElement *, BOOL); - HRESULT (STDMETHODCALLTYPE *IsShown)(ITfUIElement *, BOOL *); -} ITfUIElementVtbl; - -struct ITfUIElement -{ - const struct ITfUIElementVtbl *lpVtbl; -}; - -typedef struct ITfInputProcessorProfileActivationSinkVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfInputProcessorProfileActivationSink *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(ITfInputProcessorProfileActivationSink *); - ULONG (STDMETHODCALLTYPE *Release)(ITfInputProcessorProfileActivationSink *); - HRESULT (STDMETHODCALLTYPE *OnActivated)(ITfInputProcessorProfileActivationSink *, DWORD, LANGID, REFCLSID, REFGUID, REFGUID, HKL, DWORD); - -} ITfInputProcessorProfileActivationSinkVtbl; - -struct ITfInputProcessorProfileActivationSink -{ - const struct ITfInputProcessorProfileActivationSinkVtbl *lpVtbl; -}; - -typedef struct ITfSourceVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfSource *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(ITfSource *); - ULONG (STDMETHODCALLTYPE *Release)(ITfSource *); - HRESULT (STDMETHODCALLTYPE *AdviseSink)(ITfSource *, REFIID, IUnknown *, DWORD *); - HRESULT (STDMETHODCALLTYPE *UnadviseSink)(ITfSource *, DWORD); -} ITfSourceVtbl; - -struct ITfSource -{ - const struct ITfSourceVtbl *lpVtbl; -}; - -#endif /* _SDL_msctf_h */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_vkeys.h b/3rdparty/SDL2/src/video/windows/SDL_vkeys.h deleted file mode 100644 index fd652041926..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_vkeys.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef VK_0 -#define VK_0 '0' -#define VK_1 '1' -#define VK_2 '2' -#define VK_3 '3' -#define VK_4 '4' -#define VK_5 '5' -#define VK_6 '6' -#define VK_7 '7' -#define VK_8 '8' -#define VK_9 '9' -#define VK_A 'A' -#define VK_B 'B' -#define VK_C 'C' -#define VK_D 'D' -#define VK_E 'E' -#define VK_F 'F' -#define VK_G 'G' -#define VK_H 'H' -#define VK_I 'I' -#define VK_J 'J' -#define VK_K 'K' -#define VK_L 'L' -#define VK_M 'M' -#define VK_N 'N' -#define VK_O 'O' -#define VK_P 'P' -#define VK_Q 'Q' -#define VK_R 'R' -#define VK_S 'S' -#define VK_T 'T' -#define VK_U 'U' -#define VK_V 'V' -#define VK_W 'W' -#define VK_X 'X' -#define VK_Y 'Y' -#define VK_Z 'Z' -#endif /* VK_0 */ - -/* These keys haven't been defined, but were experimentally determined */ -#define VK_SEMICOLON 0xBA -#define VK_EQUALS 0xBB -#define VK_COMMA 0xBC -#define VK_MINUS 0xBD -#define VK_PERIOD 0xBE -#define VK_SLASH 0xBF -#define VK_GRAVE 0xC0 -#define VK_LBRACKET 0xDB -#define VK_BACKSLASH 0xDC -#define VK_RBRACKET 0xDD -#define VK_APOSTROPHE 0xDE -#define VK_BACKTICK 0xDF -#define VK_OEM_102 0xE2 - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsclipboard.c b/3rdparty/SDL2/src/video/windows/SDL_windowsclipboard.c deleted file mode 100644 index b57a66a7be2..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsclipboard.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "SDL_windowsvideo.h" -#include "SDL_windowswindow.h" -#include "../../events/SDL_clipboardevents_c.h" - - -#ifdef UNICODE -#define TEXT_FORMAT CF_UNICODETEXT -#else -#define TEXT_FORMAT CF_TEXT -#endif - - -/* Get any application owned window handle for clipboard association */ -static HWND -GetWindowHandle(_THIS) -{ - SDL_Window *window; - - window = _this->windows; - if (window) { - return ((SDL_WindowData *) window->driverdata)->hwnd; - } - return NULL; -} - -int -WIN_SetClipboardText(_THIS, const char *text) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - int result = 0; - - if (OpenClipboard(GetWindowHandle(_this))) { - HANDLE hMem; - LPTSTR tstr; - SIZE_T i, size; - - /* Convert the text from UTF-8 to Windows Unicode */ - tstr = WIN_UTF8ToString(text); - if (!tstr) { - return -1; - } - - /* Find out the size of the data */ - for (size = 0, i = 0; tstr[i]; ++i, ++size) { - if (tstr[i] == '\n' && (i == 0 || tstr[i-1] != '\r')) { - /* We're going to insert a carriage return */ - ++size; - } - } - size = (size+1)*sizeof(*tstr); - - /* Save the data to the clipboard */ - hMem = GlobalAlloc(GMEM_MOVEABLE, size); - if (hMem) { - LPTSTR dst = (LPTSTR)GlobalLock(hMem); - if (dst) { - /* Copy the text over, adding carriage returns as necessary */ - for (i = 0; tstr[i]; ++i) { - if (tstr[i] == '\n' && (i == 0 || tstr[i-1] != '\r')) { - *dst++ = '\r'; - } - *dst++ = tstr[i]; - } - *dst = 0; - GlobalUnlock(hMem); - } - - EmptyClipboard(); - if (!SetClipboardData(TEXT_FORMAT, hMem)) { - result = WIN_SetError("Couldn't set clipboard data"); - } - data->clipboard_count = GetClipboardSequenceNumber(); - } - SDL_free(tstr); - - CloseClipboard(); - } else { - result = WIN_SetError("Couldn't open clipboard"); - } - return result; -} - -char * -WIN_GetClipboardText(_THIS) -{ - char *text; - - text = NULL; - if (IsClipboardFormatAvailable(TEXT_FORMAT) && - OpenClipboard(GetWindowHandle(_this))) { - HANDLE hMem; - LPTSTR tstr; - - hMem = GetClipboardData(TEXT_FORMAT); - if (hMem) { - tstr = (LPTSTR)GlobalLock(hMem); - text = WIN_StringToUTF8(tstr); - GlobalUnlock(hMem); - } else { - WIN_SetError("Couldn't get clipboard data"); - } - CloseClipboard(); - } - if (!text) { - text = SDL_strdup(""); - } - return text; -} - -SDL_bool -WIN_HasClipboardText(_THIS) -{ - SDL_bool result = SDL_FALSE; - char *text = WIN_GetClipboardText(_this); - if (text) { - result = text[0] != '\0' ? SDL_TRUE : SDL_FALSE; - SDL_free(text); - } - return result; -} - -void -WIN_CheckClipboardUpdate(struct SDL_VideoData * data) -{ - const DWORD count = GetClipboardSequenceNumber(); - if (count != data->clipboard_count) { - if (data->clipboard_count) { - SDL_SendClipboardUpdate(); - } - data->clipboard_count = count; - } -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsclipboard.h b/3rdparty/SDL2/src/video/windows/SDL_windowsclipboard.h deleted file mode 100644 index d86cd97ec3e..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsclipboard.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_windowsclipboard_h -#define _SDL_windowsclipboard_h - -/* Forward declaration */ -struct SDL_VideoData; - -extern int WIN_SetClipboardText(_THIS, const char *text); -extern char *WIN_GetClipboardText(_THIS); -extern SDL_bool WIN_HasClipboardText(_THIS); -extern void WIN_CheckClipboardUpdate(struct SDL_VideoData * data); - -#endif /* _SDL_windowsclipboard_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsevents.c b/3rdparty/SDL2/src/video/windows/SDL_windowsevents.c deleted file mode 100644 index 02768fb6867..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsevents.c +++ /dev/null @@ -1,1121 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "SDL_windowsvideo.h" -#include "SDL_windowsshape.h" -#include "SDL_system.h" -#include "SDL_syswm.h" -#include "SDL_timer.h" -#include "SDL_vkeys.h" -#include "../../events/SDL_events_c.h" -#include "../../events/SDL_touch_c.h" -#include "../../events/scancodes_windows.h" -#include "SDL_assert.h" -#include "SDL_hints.h" - -/* Dropfile support */ -#include <shellapi.h> - -/* For GET_X_LPARAM, GET_Y_LPARAM. */ -#include <windowsx.h> - -/* #define WMMSG_DEBUG */ -#ifdef WMMSG_DEBUG -#include <stdio.h> -#include "wmmsg.h" -#endif - -/* For processing mouse WM_*BUTTON* and WM_MOUSEMOVE message-data from GetMessageExtraInfo() */ -#define MOUSEEVENTF_FROMTOUCH 0xFF515700 - -/* Masks for processing the windows KEYDOWN and KEYUP messages */ -#define REPEATED_KEYMASK (1<<30) -#define EXTENDED_KEYMASK (1<<24) - -#define VK_ENTER 10 /* Keypad Enter ... no VKEY defined? */ -#ifndef VK_OEM_NEC_EQUAL -#define VK_OEM_NEC_EQUAL 0x92 -#endif - -/* Make sure XBUTTON stuff is defined that isn't in older Platform SDKs... */ -#ifndef WM_XBUTTONDOWN -#define WM_XBUTTONDOWN 0x020B -#endif -#ifndef WM_XBUTTONUP -#define WM_XBUTTONUP 0x020C -#endif -#ifndef GET_XBUTTON_WPARAM -#define GET_XBUTTON_WPARAM(w) (HIWORD(w)) -#endif -#ifndef WM_INPUT -#define WM_INPUT 0x00ff -#endif -#ifndef WM_TOUCH -#define WM_TOUCH 0x0240 -#endif -#ifndef WM_MOUSEHWHEEL -#define WM_MOUSEHWHEEL 0x020E -#endif -#ifndef WM_UNICHAR -#define WM_UNICHAR 0x0109 -#endif - -static SDL_Scancode -WindowsScanCodeToSDLScanCode(LPARAM lParam, WPARAM wParam) -{ - SDL_Scancode code; - char bIsExtended; - int nScanCode = (lParam >> 16) & 0xFF; - - /* 0x45 here to work around both pause and numlock sharing the same scancode, so use the VK key to tell them apart */ - if (nScanCode == 0 || nScanCode == 0x45) { - switch(wParam) { - case VK_CLEAR: return SDL_SCANCODE_CLEAR; - case VK_MODECHANGE: return SDL_SCANCODE_MODE; - case VK_SELECT: return SDL_SCANCODE_SELECT; - case VK_EXECUTE: return SDL_SCANCODE_EXECUTE; - case VK_HELP: return SDL_SCANCODE_HELP; - case VK_PAUSE: return SDL_SCANCODE_PAUSE; - case VK_NUMLOCK: return SDL_SCANCODE_NUMLOCKCLEAR; - - case VK_F13: return SDL_SCANCODE_F13; - case VK_F14: return SDL_SCANCODE_F14; - case VK_F15: return SDL_SCANCODE_F15; - case VK_F16: return SDL_SCANCODE_F16; - case VK_F17: return SDL_SCANCODE_F17; - case VK_F18: return SDL_SCANCODE_F18; - case VK_F19: return SDL_SCANCODE_F19; - case VK_F20: return SDL_SCANCODE_F20; - case VK_F21: return SDL_SCANCODE_F21; - case VK_F22: return SDL_SCANCODE_F22; - case VK_F23: return SDL_SCANCODE_F23; - case VK_F24: return SDL_SCANCODE_F24; - - case VK_OEM_NEC_EQUAL: return SDL_SCANCODE_KP_EQUALS; - case VK_BROWSER_BACK: return SDL_SCANCODE_AC_BACK; - case VK_BROWSER_FORWARD: return SDL_SCANCODE_AC_FORWARD; - case VK_BROWSER_REFRESH: return SDL_SCANCODE_AC_REFRESH; - case VK_BROWSER_STOP: return SDL_SCANCODE_AC_STOP; - case VK_BROWSER_SEARCH: return SDL_SCANCODE_AC_SEARCH; - case VK_BROWSER_FAVORITES: return SDL_SCANCODE_AC_BOOKMARKS; - case VK_BROWSER_HOME: return SDL_SCANCODE_AC_HOME; - case VK_VOLUME_MUTE: return SDL_SCANCODE_AUDIOMUTE; - case VK_VOLUME_DOWN: return SDL_SCANCODE_VOLUMEDOWN; - case VK_VOLUME_UP: return SDL_SCANCODE_VOLUMEUP; - - case VK_MEDIA_NEXT_TRACK: return SDL_SCANCODE_AUDIONEXT; - case VK_MEDIA_PREV_TRACK: return SDL_SCANCODE_AUDIOPREV; - case VK_MEDIA_STOP: return SDL_SCANCODE_AUDIOSTOP; - case VK_MEDIA_PLAY_PAUSE: return SDL_SCANCODE_AUDIOPLAY; - case VK_LAUNCH_MAIL: return SDL_SCANCODE_MAIL; - case VK_LAUNCH_MEDIA_SELECT: return SDL_SCANCODE_MEDIASELECT; - - case VK_OEM_102: return SDL_SCANCODE_NONUSBACKSLASH; - - case VK_ATTN: return SDL_SCANCODE_SYSREQ; - case VK_CRSEL: return SDL_SCANCODE_CRSEL; - case VK_EXSEL: return SDL_SCANCODE_EXSEL; - case VK_OEM_CLEAR: return SDL_SCANCODE_CLEAR; - - case VK_LAUNCH_APP1: return SDL_SCANCODE_APP1; - case VK_LAUNCH_APP2: return SDL_SCANCODE_APP2; - - default: return SDL_SCANCODE_UNKNOWN; - } - } - - if (nScanCode > 127) - return SDL_SCANCODE_UNKNOWN; - - code = windows_scancode_table[nScanCode]; - - bIsExtended = (lParam & (1 << 24)) != 0; - if (!bIsExtended) { - switch (code) { - case SDL_SCANCODE_HOME: - return SDL_SCANCODE_KP_7; - case SDL_SCANCODE_UP: - return SDL_SCANCODE_KP_8; - case SDL_SCANCODE_PAGEUP: - return SDL_SCANCODE_KP_9; - case SDL_SCANCODE_LEFT: - return SDL_SCANCODE_KP_4; - case SDL_SCANCODE_RIGHT: - return SDL_SCANCODE_KP_6; - case SDL_SCANCODE_END: - return SDL_SCANCODE_KP_1; - case SDL_SCANCODE_DOWN: - return SDL_SCANCODE_KP_2; - case SDL_SCANCODE_PAGEDOWN: - return SDL_SCANCODE_KP_3; - case SDL_SCANCODE_INSERT: - return SDL_SCANCODE_KP_0; - case SDL_SCANCODE_DELETE: - return SDL_SCANCODE_KP_PERIOD; - case SDL_SCANCODE_PRINTSCREEN: - return SDL_SCANCODE_KP_MULTIPLY; - default: - break; - } - } else { - switch (code) { - case SDL_SCANCODE_RETURN: - return SDL_SCANCODE_KP_ENTER; - case SDL_SCANCODE_LALT: - return SDL_SCANCODE_RALT; - case SDL_SCANCODE_LCTRL: - return SDL_SCANCODE_RCTRL; - case SDL_SCANCODE_SLASH: - return SDL_SCANCODE_KP_DIVIDE; - case SDL_SCANCODE_CAPSLOCK: - return SDL_SCANCODE_KP_PLUS; - default: - break; - } - } - - return code; -} - -static SDL_bool -WIN_ShouldIgnoreFocusClick() -{ - return !SDL_GetHintBoolean(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, SDL_FALSE); -} - -void -WIN_CheckWParamMouseButton(SDL_bool bwParamMousePressed, SDL_bool bSDLMousePressed, SDL_WindowData *data, Uint8 button, SDL_MouseID mouseID) -{ - if (data->focus_click_pending & SDL_BUTTON(button)) { - /* Ignore the button click for activation */ - if (!bwParamMousePressed) { - data->focus_click_pending &= ~SDL_BUTTON(button); - if (!data->focus_click_pending) { - WIN_UpdateClipCursor(data->window); - } - } - if (WIN_ShouldIgnoreFocusClick()) { - return; - } - } - - if (bwParamMousePressed && !bSDLMousePressed) { - SDL_SendMouseButton(data->window, mouseID, SDL_PRESSED, button); - } else if (!bwParamMousePressed && bSDLMousePressed) { - SDL_SendMouseButton(data->window, mouseID, SDL_RELEASED, button); - } -} - -/* -* Some windows systems fail to send a WM_LBUTTONDOWN sometimes, but each mouse move contains the current button state also -* so this funciton reconciles our view of the world with the current buttons reported by windows -*/ -void -WIN_CheckWParamMouseButtons(WPARAM wParam, SDL_WindowData *data, SDL_MouseID mouseID) -{ - if (wParam != data->mouse_button_flags) { - Uint32 mouseFlags = SDL_GetMouseState(NULL, NULL); - WIN_CheckWParamMouseButton((wParam & MK_LBUTTON), (mouseFlags & SDL_BUTTON_LMASK), data, SDL_BUTTON_LEFT, mouseID); - WIN_CheckWParamMouseButton((wParam & MK_MBUTTON), (mouseFlags & SDL_BUTTON_MMASK), data, SDL_BUTTON_MIDDLE, mouseID); - WIN_CheckWParamMouseButton((wParam & MK_RBUTTON), (mouseFlags & SDL_BUTTON_RMASK), data, SDL_BUTTON_RIGHT, mouseID); - WIN_CheckWParamMouseButton((wParam & MK_XBUTTON1), (mouseFlags & SDL_BUTTON_X1MASK), data, SDL_BUTTON_X1, mouseID); - WIN_CheckWParamMouseButton((wParam & MK_XBUTTON2), (mouseFlags & SDL_BUTTON_X2MASK), data, SDL_BUTTON_X2, mouseID); - data->mouse_button_flags = wParam; - } -} - - -void -WIN_CheckRawMouseButtons(ULONG rawButtons, SDL_WindowData *data) -{ - if (rawButtons != data->mouse_button_flags) { - Uint32 mouseFlags = SDL_GetMouseState(NULL, NULL); - if ((rawButtons & RI_MOUSE_BUTTON_1_DOWN)) - WIN_CheckWParamMouseButton((rawButtons & RI_MOUSE_BUTTON_1_DOWN), (mouseFlags & SDL_BUTTON_LMASK), data, SDL_BUTTON_LEFT, 0); - if ((rawButtons & RI_MOUSE_BUTTON_1_UP)) - WIN_CheckWParamMouseButton(!(rawButtons & RI_MOUSE_BUTTON_1_UP), (mouseFlags & SDL_BUTTON_LMASK), data, SDL_BUTTON_LEFT, 0); - if ((rawButtons & RI_MOUSE_BUTTON_2_DOWN)) - WIN_CheckWParamMouseButton((rawButtons & RI_MOUSE_BUTTON_2_DOWN), (mouseFlags & SDL_BUTTON_RMASK), data, SDL_BUTTON_RIGHT, 0); - if ((rawButtons & RI_MOUSE_BUTTON_2_UP)) - WIN_CheckWParamMouseButton(!(rawButtons & RI_MOUSE_BUTTON_2_UP), (mouseFlags & SDL_BUTTON_RMASK), data, SDL_BUTTON_RIGHT, 0); - if ((rawButtons & RI_MOUSE_BUTTON_3_DOWN)) - WIN_CheckWParamMouseButton((rawButtons & RI_MOUSE_BUTTON_3_DOWN), (mouseFlags & SDL_BUTTON_MMASK), data, SDL_BUTTON_MIDDLE, 0); - if ((rawButtons & RI_MOUSE_BUTTON_3_UP)) - WIN_CheckWParamMouseButton(!(rawButtons & RI_MOUSE_BUTTON_3_UP), (mouseFlags & SDL_BUTTON_MMASK), data, SDL_BUTTON_MIDDLE, 0); - if ((rawButtons & RI_MOUSE_BUTTON_4_DOWN)) - WIN_CheckWParamMouseButton((rawButtons & RI_MOUSE_BUTTON_4_DOWN), (mouseFlags & SDL_BUTTON_X1MASK), data, SDL_BUTTON_X1, 0); - if ((rawButtons & RI_MOUSE_BUTTON_4_UP)) - WIN_CheckWParamMouseButton(!(rawButtons & RI_MOUSE_BUTTON_4_UP), (mouseFlags & SDL_BUTTON_X1MASK), data, SDL_BUTTON_X1, 0); - if ((rawButtons & RI_MOUSE_BUTTON_5_DOWN)) - WIN_CheckWParamMouseButton((rawButtons & RI_MOUSE_BUTTON_5_DOWN), (mouseFlags & SDL_BUTTON_X2MASK), data, SDL_BUTTON_X2, 0); - if ((rawButtons & RI_MOUSE_BUTTON_5_UP)) - WIN_CheckWParamMouseButton(!(rawButtons & RI_MOUSE_BUTTON_5_UP), (mouseFlags & SDL_BUTTON_X2MASK), data, SDL_BUTTON_X2, 0); - data->mouse_button_flags = rawButtons; - } -} - -void -WIN_CheckAsyncMouseRelease(SDL_WindowData *data) -{ - Uint32 mouseFlags; - SHORT keyState; - - /* mouse buttons may have changed state here, we need to resync them, - but we will get a WM_MOUSEMOVE right away which will fix things up if in non raw mode also - */ - mouseFlags = SDL_GetMouseState(NULL, NULL); - - keyState = GetAsyncKeyState(VK_LBUTTON); - if (!(keyState & 0x8000)) { - WIN_CheckWParamMouseButton(SDL_FALSE, (mouseFlags & SDL_BUTTON_LMASK), data, SDL_BUTTON_LEFT, 0); - } - keyState = GetAsyncKeyState(VK_RBUTTON); - if (!(keyState & 0x8000)) { - WIN_CheckWParamMouseButton(SDL_FALSE, (mouseFlags & SDL_BUTTON_RMASK), data, SDL_BUTTON_RIGHT, 0); - } - keyState = GetAsyncKeyState(VK_MBUTTON); - if (!(keyState & 0x8000)) { - WIN_CheckWParamMouseButton(SDL_FALSE, (mouseFlags & SDL_BUTTON_MMASK), data, SDL_BUTTON_MIDDLE, 0); - } - keyState = GetAsyncKeyState(VK_XBUTTON1); - if (!(keyState & 0x8000)) { - WIN_CheckWParamMouseButton(SDL_FALSE, (mouseFlags & SDL_BUTTON_X1MASK), data, SDL_BUTTON_X1, 0); - } - keyState = GetAsyncKeyState(VK_XBUTTON2); - if (!(keyState & 0x8000)) { - WIN_CheckWParamMouseButton(SDL_FALSE, (mouseFlags & SDL_BUTTON_X2MASK), data, SDL_BUTTON_X2, 0); - } - data->mouse_button_flags = 0; -} - -BOOL -WIN_ConvertUTF32toUTF8(UINT32 codepoint, char * text) -{ - if (codepoint <= 0x7F) { - text[0] = (char) codepoint; - text[1] = '\0'; - } else if (codepoint <= 0x7FF) { - text[0] = 0xC0 | (char) ((codepoint >> 6) & 0x1F); - text[1] = 0x80 | (char) (codepoint & 0x3F); - text[2] = '\0'; - } else if (codepoint <= 0xFFFF) { - text[0] = 0xE0 | (char) ((codepoint >> 12) & 0x0F); - text[1] = 0x80 | (char) ((codepoint >> 6) & 0x3F); - text[2] = 0x80 | (char) (codepoint & 0x3F); - text[3] = '\0'; - } else if (codepoint <= 0x10FFFF) { - text[0] = 0xF0 | (char) ((codepoint >> 18) & 0x0F); - text[1] = 0x80 | (char) ((codepoint >> 12) & 0x3F); - text[2] = 0x80 | (char) ((codepoint >> 6) & 0x3F); - text[3] = 0x80 | (char) (codepoint & 0x3F); - text[4] = '\0'; - } else { - return SDL_FALSE; - } - return SDL_TRUE; -} - -static SDL_bool -ShouldGenerateWindowCloseOnAltF4(void) -{ - return !SDL_GetHintBoolean(SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4, SDL_FALSE); -} - -LRESULT CALLBACK -WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - SDL_WindowData *data; - LRESULT returnCode = -1; - - /* Send a SDL_SYSWMEVENT if the application wants them */ - if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) { - SDL_SysWMmsg wmmsg; - - SDL_VERSION(&wmmsg.version); - wmmsg.subsystem = SDL_SYSWM_WINDOWS; - wmmsg.msg.win.hwnd = hwnd; - wmmsg.msg.win.msg = msg; - wmmsg.msg.win.wParam = wParam; - wmmsg.msg.win.lParam = lParam; - SDL_SendSysWMEvent(&wmmsg); - } - - /* Get the window data for the window */ - data = (SDL_WindowData *) GetProp(hwnd, TEXT("SDL_WindowData")); - if (!data) { - return CallWindowProc(DefWindowProc, hwnd, msg, wParam, lParam); - } - -#ifdef WMMSG_DEBUG - { - char message[1024]; - if (msg > MAX_WMMSG) { - SDL_snprintf(message, sizeof(message), "Received windows message: %p UNKNOWN (%d) -- 0x%X, 0x%X\n", hwnd, msg, wParam, lParam); - } else { - SDL_snprintf(message, sizeof(message), "Received windows message: %p %s -- 0x%X, 0x%X\n", hwnd, wmtab[msg], wParam, lParam); - } - OutputDebugStringA(message); - } -#endif /* WMMSG_DEBUG */ - - if (IME_HandleMessage(hwnd, msg, wParam, &lParam, data->videodata)) - return 0; - - switch (msg) { - - case WM_SHOWWINDOW: - { - if (wParam) { - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_SHOWN, 0, 0); - } else { - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_HIDDEN, 0, 0); - } - } - break; - - case WM_ACTIVATE: - { - POINT cursorPos; - BOOL minimized; - - minimized = HIWORD(wParam); - if (!minimized && (LOWORD(wParam) != WA_INACTIVE)) { - if (LOWORD(wParam) == WA_CLICKACTIVE) { - if (GetAsyncKeyState(VK_LBUTTON)) { - data->focus_click_pending |= SDL_BUTTON_LMASK; - } - if (GetAsyncKeyState(VK_RBUTTON)) { - data->focus_click_pending |= SDL_BUTTON_RMASK; - } - if (GetAsyncKeyState(VK_MBUTTON)) { - data->focus_click_pending |= SDL_BUTTON_MMASK; - } - if (GetAsyncKeyState(VK_XBUTTON1)) { - data->focus_click_pending |= SDL_BUTTON_X1MASK; - } - if (GetAsyncKeyState(VK_XBUTTON2)) { - data->focus_click_pending |= SDL_BUTTON_X2MASK; - } - } - - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_SHOWN, 0, 0); - if (SDL_GetKeyboardFocus() != data->window) { - SDL_SetKeyboardFocus(data->window); - } - - GetCursorPos(&cursorPos); - ScreenToClient(hwnd, &cursorPos); - SDL_SendMouseMotion(data->window, 0, 0, cursorPos.x, cursorPos.y); - - WIN_CheckAsyncMouseRelease(data); - - /* - * FIXME: Update keyboard state - */ - WIN_CheckClipboardUpdate(data->videodata); - - SDL_ToggleModState(KMOD_CAPS, (GetKeyState(VK_CAPITAL) & 0x0001) != 0); - SDL_ToggleModState(KMOD_NUM, (GetKeyState(VK_NUMLOCK) & 0x0001) != 0); - } else { - data->in_window_deactivation = SDL_TRUE; - - if (SDL_GetKeyboardFocus() == data->window) { - SDL_SetKeyboardFocus(NULL); - WIN_ResetDeadKeys(); - } - - ClipCursor(NULL); - - data->in_window_deactivation = SDL_FALSE; - } - } - returnCode = 0; - break; - - case WM_MOUSEMOVE: - { - SDL_Mouse *mouse = SDL_GetMouse(); - if (!mouse->relative_mode || mouse->relative_mode_warp) { - SDL_MouseID mouseID = (((GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) ? SDL_TOUCH_MOUSEID : 0); - SDL_SendMouseMotion(data->window, mouseID, 0, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - } - } - /* don't break here, fall through to check the wParam like the button presses */ - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - case WM_XBUTTONUP: - case WM_LBUTTONDOWN: - case WM_LBUTTONDBLCLK: - case WM_RBUTTONDOWN: - case WM_RBUTTONDBLCLK: - case WM_MBUTTONDOWN: - case WM_MBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONDBLCLK: - { - SDL_Mouse *mouse = SDL_GetMouse(); - if (!mouse->relative_mode || mouse->relative_mode_warp) { - SDL_MouseID mouseID = (((GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) ? SDL_TOUCH_MOUSEID : 0); - WIN_CheckWParamMouseButtons(wParam, data, mouseID); - } - } - break; - - case WM_INPUT: - { - SDL_Mouse *mouse = SDL_GetMouse(); - HRAWINPUT hRawInput = (HRAWINPUT)lParam; - RAWINPUT inp; - UINT size = sizeof(inp); - const SDL_bool isRelative = mouse->relative_mode || mouse->relative_mode_warp; - const SDL_bool isCapture = ((data->window->flags & SDL_WINDOW_MOUSE_CAPTURE) != 0); - - if (!isRelative || mouse->focus != data->window) { - if (!isCapture) { - break; - } - } - - GetRawInputData(hRawInput, RID_INPUT, &inp, &size, sizeof(RAWINPUTHEADER)); - - /* Mouse data */ - if (inp.header.dwType == RIM_TYPEMOUSE) { - if (isRelative) { - RAWMOUSE* rawmouse = &inp.data.mouse; - - if ((rawmouse->usFlags & 0x01) == MOUSE_MOVE_RELATIVE) { - SDL_SendMouseMotion(data->window, 0, 1, (int)rawmouse->lLastX, (int)rawmouse->lLastY); - } else { - /* synthesize relative moves from the abs position */ - static SDL_Point initialMousePoint; - if (initialMousePoint.x == 0 && initialMousePoint.y == 0) { - initialMousePoint.x = rawmouse->lLastX; - initialMousePoint.y = rawmouse->lLastY; - } - - SDL_SendMouseMotion(data->window, 0, 1, (int)(rawmouse->lLastX-initialMousePoint.x), (int)(rawmouse->lLastY-initialMousePoint.y) ); - - initialMousePoint.x = rawmouse->lLastX; - initialMousePoint.y = rawmouse->lLastY; - } - WIN_CheckRawMouseButtons(rawmouse->usButtonFlags, data); - } else if (isCapture) { - /* we check for where Windows thinks the system cursor lives in this case, so we don't really lose mouse accel, etc. */ - POINT pt; - GetCursorPos(&pt); - if (WindowFromPoint(pt) != hwnd) { /* if in the window, WM_MOUSEMOVE, etc, will cover it. */ - ScreenToClient(hwnd, &pt); - SDL_SendMouseMotion(data->window, 0, 0, (int) pt.x, (int) pt.y); - SDL_SendMouseButton(data->window, 0, GetAsyncKeyState(VK_LBUTTON) & 0x8000 ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_LEFT); - SDL_SendMouseButton(data->window, 0, GetAsyncKeyState(VK_RBUTTON) & 0x8000 ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_RIGHT); - SDL_SendMouseButton(data->window, 0, GetAsyncKeyState(VK_MBUTTON) & 0x8000 ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_MIDDLE); - SDL_SendMouseButton(data->window, 0, GetAsyncKeyState(VK_XBUTTON1) & 0x8000 ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_X1); - SDL_SendMouseButton(data->window, 0, GetAsyncKeyState(VK_XBUTTON2) & 0x8000 ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_X2); - } - } else { - SDL_assert(0 && "Shouldn't happen"); - } - } - } - break; - - case WM_MOUSEWHEEL: - { - static short s_AccumulatedMotion; - - s_AccumulatedMotion += GET_WHEEL_DELTA_WPARAM(wParam); - if (s_AccumulatedMotion > 0) { - while (s_AccumulatedMotion >= WHEEL_DELTA) { - SDL_SendMouseWheel(data->window, 0, 0, 1, SDL_MOUSEWHEEL_NORMAL); - s_AccumulatedMotion -= WHEEL_DELTA; - } - } else { - while (s_AccumulatedMotion <= -WHEEL_DELTA) { - SDL_SendMouseWheel(data->window, 0, 0, -1, SDL_MOUSEWHEEL_NORMAL); - s_AccumulatedMotion += WHEEL_DELTA; - } - } - } - break; - - case WM_MOUSEHWHEEL: - { - static short s_AccumulatedMotion; - - s_AccumulatedMotion += GET_WHEEL_DELTA_WPARAM(wParam); - if (s_AccumulatedMotion > 0) { - while (s_AccumulatedMotion >= WHEEL_DELTA) { - SDL_SendMouseWheel(data->window, 0, 1, 0, SDL_MOUSEWHEEL_NORMAL); - s_AccumulatedMotion -= WHEEL_DELTA; - } - } else { - while (s_AccumulatedMotion <= -WHEEL_DELTA) { - SDL_SendMouseWheel(data->window, 0, -1, 0, SDL_MOUSEWHEEL_NORMAL); - s_AccumulatedMotion += WHEEL_DELTA; - } - } - } - break; - -#ifdef WM_MOUSELEAVE - case WM_MOUSELEAVE: - if (SDL_GetMouseFocus() == data->window && !SDL_GetMouse()->relative_mode && !(data->window->flags & SDL_WINDOW_MOUSE_CAPTURE)) { - if (!IsIconic(hwnd)) { - POINT cursorPos; - GetCursorPos(&cursorPos); - ScreenToClient(hwnd, &cursorPos); - SDL_SendMouseMotion(data->window, 0, 0, cursorPos.x, cursorPos.y); - } - SDL_SetMouseFocus(NULL); - } - returnCode = 0; - break; -#endif /* WM_MOUSELEAVE */ - - case WM_KEYDOWN: - case WM_SYSKEYDOWN: - { - SDL_Scancode code = WindowsScanCodeToSDLScanCode(lParam, wParam); - const Uint8 *keyboardState = SDL_GetKeyboardState(NULL); - - /* Detect relevant keyboard shortcuts */ - if (keyboardState[SDL_SCANCODE_LALT] == SDL_PRESSED || keyboardState[SDL_SCANCODE_RALT] == SDL_PRESSED) { - /* ALT+F4: Close window */ - if (code == SDL_SCANCODE_F4 && ShouldGenerateWindowCloseOnAltF4()) { - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_CLOSE, 0, 0); - } - } - - if (code != SDL_SCANCODE_UNKNOWN) { - SDL_SendKeyboardKey(SDL_PRESSED, code); - } - } - - returnCode = 0; - break; - - case WM_SYSKEYUP: - case WM_KEYUP: - { - SDL_Scancode code = WindowsScanCodeToSDLScanCode(lParam, wParam); - const Uint8 *keyboardState = SDL_GetKeyboardState(NULL); - - if (code != SDL_SCANCODE_UNKNOWN) { - if (code == SDL_SCANCODE_PRINTSCREEN && - keyboardState[code] == SDL_RELEASED) { - SDL_SendKeyboardKey(SDL_PRESSED, code); - } - SDL_SendKeyboardKey(SDL_RELEASED, code); - } - } - returnCode = 0; - break; - - case WM_UNICHAR: - if ( wParam == UNICODE_NOCHAR ) { - returnCode = 1; - break; - } - /* otherwise fall through to below */ - case WM_CHAR: - { - char text[5]; - if ( WIN_ConvertUTF32toUTF8( (UINT32)wParam, text ) ) { - SDL_SendKeyboardText( text ); - } - } - returnCode = 0; - break; - -#ifdef WM_INPUTLANGCHANGE - case WM_INPUTLANGCHANGE: - { - WIN_UpdateKeymap(); - SDL_SendKeymapChangedEvent(); - } - returnCode = 1; - break; -#endif /* WM_INPUTLANGCHANGE */ - - case WM_NCLBUTTONDOWN: - { - data->in_title_click = SDL_TRUE; - } - break; - - case WM_CAPTURECHANGED: - { - data->in_title_click = SDL_FALSE; - - /* The mouse may have been released during a modal loop */ - WIN_CheckAsyncMouseRelease(data); - } - break; - -#ifdef WM_GETMINMAXINFO - case WM_GETMINMAXINFO: - { - MINMAXINFO *info; - RECT size; - int x, y; - int w, h; - int min_w, min_h; - int max_w, max_h; - int style; - BOOL menu; - BOOL constrain_max_size; - - if (SDL_IsShapedWindow(data->window)) - Win32_ResizeWindowShape(data->window); - - /* If this is an expected size change, allow it */ - if (data->expected_resize) { - break; - } - - /* Get the current position of our window */ - GetWindowRect(hwnd, &size); - x = size.left; - y = size.top; - - /* Calculate current size of our window */ - SDL_GetWindowSize(data->window, &w, &h); - SDL_GetWindowMinimumSize(data->window, &min_w, &min_h); - SDL_GetWindowMaximumSize(data->window, &max_w, &max_h); - - /* Store in min_w and min_h difference between current size and minimal - size so we don't need to call AdjustWindowRectEx twice */ - min_w -= w; - min_h -= h; - if (max_w && max_h) { - max_w -= w; - max_h -= h; - constrain_max_size = TRUE; - } else { - constrain_max_size = FALSE; - } - - size.top = 0; - size.left = 0; - size.bottom = h; - size.right = w; - - style = GetWindowLong(hwnd, GWL_STYLE); - /* DJM - according to the docs for GetMenu(), the - return value is undefined if hwnd is a child window. - Apparently it's too difficult for MS to check - inside their function, so I have to do it here. - */ - menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL); - AdjustWindowRectEx(&size, style, menu, 0); - w = size.right - size.left; - h = size.bottom - size.top; - - /* Fix our size to the current size */ - info = (MINMAXINFO *) lParam; - if (SDL_GetWindowFlags(data->window) & SDL_WINDOW_RESIZABLE) { - info->ptMinTrackSize.x = w + min_w; - info->ptMinTrackSize.y = h + min_h; - if (constrain_max_size) { - info->ptMaxTrackSize.x = w + max_w; - info->ptMaxTrackSize.y = h + max_h; - } - } else { - info->ptMaxSize.x = w; - info->ptMaxSize.y = h; - info->ptMaxPosition.x = x; - info->ptMaxPosition.y = y; - info->ptMinTrackSize.x = w; - info->ptMinTrackSize.y = h; - info->ptMaxTrackSize.x = w; - info->ptMaxTrackSize.y = h; - } - } - returnCode = 0; - break; -#endif /* WM_GETMINMAXINFO */ - - case WM_WINDOWPOSCHANGING: - - if (data->expected_resize) { - returnCode = 0; - } - break; - - case WM_WINDOWPOSCHANGED: - { - RECT rect; - int x, y; - int w, h; - - if (data->initializing || data->in_border_change) { - break; - } - - if (!GetClientRect(hwnd, &rect) || IsRectEmpty(&rect)) { - break; - } - ClientToScreen(hwnd, (LPPOINT) & rect); - ClientToScreen(hwnd, (LPPOINT) & rect + 1); - - WIN_UpdateClipCursor(data->window); - - x = rect.left; - y = rect.top; - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_MOVED, x, y); - - w = rect.right - rect.left; - h = rect.bottom - rect.top; - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_RESIZED, w, - h); - - /* Forces a WM_PAINT event */ - InvalidateRect(hwnd, NULL, FALSE); - } - break; - - case WM_SIZE: - { - switch (wParam) { - case SIZE_MAXIMIZED: - SDL_SendWindowEvent(data->window, - SDL_WINDOWEVENT_MAXIMIZED, 0, 0); - break; - case SIZE_MINIMIZED: - SDL_SendWindowEvent(data->window, - SDL_WINDOWEVENT_MINIMIZED, 0, 0); - break; - default: - SDL_SendWindowEvent(data->window, - SDL_WINDOWEVENT_RESTORED, 0, 0); - break; - } - } - break; - - case WM_SETCURSOR: - { - Uint16 hittest; - - hittest = LOWORD(lParam); - if (hittest == HTCLIENT) { - SetCursor(SDL_cursor); - returnCode = TRUE; - } else if (!g_WindowFrameUsableWhileCursorHidden && !SDL_cursor) { - SetCursor(NULL); - returnCode = TRUE; - } - } - break; - - /* We were occluded, refresh our display */ - case WM_PAINT: - { - RECT rect; - if (GetUpdateRect(hwnd, &rect, FALSE)) { - ValidateRect(hwnd, NULL); - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_EXPOSED, - 0, 0); - } - } - returnCode = 0; - break; - - /* We'll do our own drawing, prevent flicker */ - case WM_ERASEBKGND: - { - } - return (1); - - case WM_SYSCOMMAND: - { - if ((wParam & 0xFFF0) == SC_KEYMENU) { - return (0); - } - -#if defined(SC_SCREENSAVE) || defined(SC_MONITORPOWER) - /* Don't start the screensaver or blank the monitor in fullscreen apps */ - if ((wParam & 0xFFF0) == SC_SCREENSAVE || - (wParam & 0xFFF0) == SC_MONITORPOWER) { - if (SDL_GetVideoDevice()->suspend_screensaver) { - return (0); - } - } -#endif /* System has screensaver support */ - } - break; - - case WM_CLOSE: - { - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_CLOSE, 0, 0); - } - returnCode = 0; - break; - - case WM_TOUCH: - { - UINT i, num_inputs = LOWORD(wParam); - PTOUCHINPUT inputs = SDL_stack_alloc(TOUCHINPUT, num_inputs); - if (data->videodata->GetTouchInputInfo((HTOUCHINPUT)lParam, num_inputs, inputs, sizeof(TOUCHINPUT))) { - RECT rect; - float x, y; - - if (!GetClientRect(hwnd, &rect) || - (rect.right == rect.left && rect.bottom == rect.top)) { - if (inputs) { - SDL_stack_free(inputs); - } - break; - } - ClientToScreen(hwnd, (LPPOINT) & rect); - ClientToScreen(hwnd, (LPPOINT) & rect + 1); - rect.top *= 100; - rect.left *= 100; - rect.bottom *= 100; - rect.right *= 100; - - for (i = 0; i < num_inputs; ++i) { - PTOUCHINPUT input = &inputs[i]; - - const SDL_TouchID touchId = (SDL_TouchID)((size_t)input->hSource); - if (SDL_AddTouch(touchId, "") < 0) { - continue; - } - - /* Get the normalized coordinates for the window */ - x = (float)(input->x - rect.left)/(rect.right - rect.left); - y = (float)(input->y - rect.top)/(rect.bottom - rect.top); - - if (input->dwFlags & TOUCHEVENTF_DOWN) { - SDL_SendTouch(touchId, input->dwID, SDL_TRUE, x, y, 1.0f); - } - if (input->dwFlags & TOUCHEVENTF_MOVE) { - SDL_SendTouchMotion(touchId, input->dwID, x, y, 1.0f); - } - if (input->dwFlags & TOUCHEVENTF_UP) { - SDL_SendTouch(touchId, input->dwID, SDL_FALSE, x, y, 1.0f); - } - } - } - SDL_stack_free(inputs); - - data->videodata->CloseTouchInputHandle((HTOUCHINPUT)lParam); - return 0; - } - break; - - case WM_DROPFILES: - { - UINT i; - HDROP drop = (HDROP) wParam; - UINT count = DragQueryFile(drop, 0xFFFFFFFF, NULL, 0); - for (i = 0; i < count; ++i) { - UINT size = DragQueryFile(drop, i, NULL, 0) + 1; - LPTSTR buffer = SDL_stack_alloc(TCHAR, size); - if (buffer) { - if (DragQueryFile(drop, i, buffer, size)) { - char *file = WIN_StringToUTF8(buffer); - SDL_SendDropFile(data->window, file); - SDL_free(file); - } - SDL_stack_free(buffer); - } - } - SDL_SendDropComplete(data->window); - DragFinish(drop); - return 0; - } - break; - - case WM_NCHITTEST: - { - SDL_Window *window = data->window; - if (window->hit_test) { - POINT winpoint = { (int) LOWORD(lParam), (int) HIWORD(lParam) }; - if (ScreenToClient(hwnd, &winpoint)) { - const SDL_Point point = { (int) winpoint.x, (int) winpoint.y }; - const SDL_HitTestResult rc = window->hit_test(window, &point, window->hit_test_data); - switch (rc) { - #define POST_HIT_TEST(ret) { SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); return ret; } - case SDL_HITTEST_DRAGGABLE: POST_HIT_TEST(HTCAPTION); - case SDL_HITTEST_RESIZE_TOPLEFT: POST_HIT_TEST(HTTOPLEFT); - case SDL_HITTEST_RESIZE_TOP: POST_HIT_TEST(HTTOP); - case SDL_HITTEST_RESIZE_TOPRIGHT: POST_HIT_TEST(HTTOPRIGHT); - case SDL_HITTEST_RESIZE_RIGHT: POST_HIT_TEST(HTRIGHT); - case SDL_HITTEST_RESIZE_BOTTOMRIGHT: POST_HIT_TEST(HTBOTTOMRIGHT); - case SDL_HITTEST_RESIZE_BOTTOM: POST_HIT_TEST(HTBOTTOM); - case SDL_HITTEST_RESIZE_BOTTOMLEFT: POST_HIT_TEST(HTBOTTOMLEFT); - case SDL_HITTEST_RESIZE_LEFT: POST_HIT_TEST(HTLEFT); - #undef POST_HIT_TEST - case SDL_HITTEST_NORMAL: return HTCLIENT; - } - } - /* If we didn't return, this will call DefWindowProc below. */ - } - } - break; - - } - - /* If there's a window proc, assume it's going to handle messages */ - if (data->wndproc) { - return CallWindowProc(data->wndproc, hwnd, msg, wParam, lParam); - } else if (returnCode >= 0) { - return returnCode; - } else { - return CallWindowProc(DefWindowProc, hwnd, msg, wParam, lParam); - } -} - -/* A message hook called before TranslateMessage() */ -static SDL_WindowsMessageHook g_WindowsMessageHook = NULL; -static void *g_WindowsMessageHookData = NULL; - -void SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata) -{ - g_WindowsMessageHook = callback; - g_WindowsMessageHookData = userdata; -} - -void -WIN_PumpEvents(_THIS) -{ - const Uint8 *keystate; - MSG msg; - DWORD start_ticks = GetTickCount(); - - if (g_WindowsEnableMessageLoop) { - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (g_WindowsMessageHook) { - g_WindowsMessageHook(g_WindowsMessageHookData, msg.hwnd, msg.message, msg.wParam, msg.lParam); - } - - /* Always translate the message in case it's a non-SDL window (e.g. with Qt integration) */ - TranslateMessage(&msg); - DispatchMessage(&msg); - - /* Make sure we don't busy loop here forever if there are lots of events coming in */ - if (SDL_TICKS_PASSED(msg.time, start_ticks)) { - break; - } - } - } - - /* Windows loses a shift KEYUP event when you have both pressed at once and let go of one. - You won't get a KEYUP until both are released, and that keyup will only be for the second - key you released. Take heroic measures and check the keystate as of the last handled event, - and if we think a key is pressed when Windows doesn't, unstick it in SDL's state. */ - keystate = SDL_GetKeyboardState(NULL); - if ((keystate[SDL_SCANCODE_LSHIFT] == SDL_PRESSED) && !(GetKeyState(VK_LSHIFT) & 0x8000)) { - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT); - } - if ((keystate[SDL_SCANCODE_RSHIFT] == SDL_PRESSED) && !(GetKeyState(VK_RSHIFT) & 0x8000)) { - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_RSHIFT); - } -} - -static int app_registered = 0; -LPTSTR SDL_Appname = NULL; -Uint32 SDL_Appstyle = 0; -HINSTANCE SDL_Instance = NULL; - -/* Register the class for this application */ -int -SDL_RegisterApp(char *name, Uint32 style, void *hInst) -{ - WNDCLASSEX wcex; - TCHAR path[MAX_PATH]; - - /* Only do this once... */ - if (app_registered) { - ++app_registered; - return (0); - } - if (!name && !SDL_Appname) { - name = "SDL_app"; -#if defined(CS_BYTEALIGNCLIENT) || defined(CS_OWNDC) - SDL_Appstyle = (CS_BYTEALIGNCLIENT | CS_OWNDC); -#endif - SDL_Instance = hInst ? hInst : GetModuleHandle(NULL); - } - - if (name) { - SDL_Appname = WIN_UTF8ToString(name); - SDL_Appstyle = style; - SDL_Instance = hInst ? hInst : GetModuleHandle(NULL); - } - - /* Register the application class */ - wcex.cbSize = sizeof(WNDCLASSEX); - wcex.hCursor = NULL; - wcex.hIcon = NULL; - wcex.hIconSm = NULL; - wcex.lpszMenuName = NULL; - wcex.lpszClassName = SDL_Appname; - wcex.style = SDL_Appstyle; - wcex.hbrBackground = NULL; - wcex.lpfnWndProc = WIN_WindowProc; - wcex.hInstance = SDL_Instance; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - - /* Use the first icon as a default icon, like in the Explorer */ - GetModuleFileName(SDL_Instance, path, MAX_PATH); - ExtractIconEx(path, 0, &wcex.hIcon, &wcex.hIconSm, 1); - - if (!RegisterClassEx(&wcex)) { - return SDL_SetError("Couldn't register application class"); - } - - app_registered = 1; - return 0; -} - -/* Unregisters the windowclass registered in SDL_RegisterApp above. */ -void -SDL_UnregisterApp() -{ - WNDCLASSEX wcex; - - /* SDL_RegisterApp might not have been called before */ - if (!app_registered) { - return; - } - --app_registered; - if (app_registered == 0) { - /* Check for any registered window classes. */ - if (GetClassInfoEx(SDL_Instance, SDL_Appname, &wcex)) { - UnregisterClass(SDL_Appname, SDL_Instance); - if (wcex.hIcon) DestroyIcon(wcex.hIcon); - if (wcex.hIconSm) DestroyIcon(wcex.hIconSm); - } - SDL_free(SDL_Appname); - SDL_Appname = NULL; - } -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsevents.h b/3rdparty/SDL2/src/video/windows/SDL_windowsevents.h deleted file mode 100644 index dcd3118a480..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsevents.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_windowsevents_h -#define _SDL_windowsevents_h - -extern LPTSTR SDL_Appname; -extern Uint32 SDL_Appstyle; -extern HINSTANCE SDL_Instance; - -extern LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, - LPARAM lParam); -extern void WIN_PumpEvents(_THIS); - -#endif /* _SDL_windowsevents_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsframebuffer.c b/3rdparty/SDL2/src/video/windows/SDL_windowsframebuffer.c deleted file mode 100644 index 7bb07ed2eca..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsframebuffer.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "SDL_windowsvideo.h" - -int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - size_t size; - LPBITMAPINFO info; - HBITMAP hbm; - - /* Free the old framebuffer surface */ - if (data->mdc) { - DeleteDC(data->mdc); - } - if (data->hbm) { - DeleteObject(data->hbm); - } - - /* Find out the format of the screen */ - size = sizeof(BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD); - info = (LPBITMAPINFO)SDL_stack_alloc(Uint8, size); - if (!info) { - return SDL_OutOfMemory(); - } - - SDL_memset(info, 0, size); - info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - - /* The second call to GetDIBits() fills in the bitfields */ - hbm = CreateCompatibleBitmap(data->hdc, 1, 1); - GetDIBits(data->hdc, hbm, 0, 0, NULL, info, DIB_RGB_COLORS); - GetDIBits(data->hdc, hbm, 0, 0, NULL, info, DIB_RGB_COLORS); - DeleteObject(hbm); - - *format = SDL_PIXELFORMAT_UNKNOWN; - if (info->bmiHeader.biCompression == BI_BITFIELDS) { - int bpp; - Uint32 *masks; - - bpp = info->bmiHeader.biPlanes * info->bmiHeader.biBitCount; - masks = (Uint32*)((Uint8*)info + info->bmiHeader.biSize); - *format = SDL_MasksToPixelFormatEnum(bpp, masks[0], masks[1], masks[2], 0); - } - if (*format == SDL_PIXELFORMAT_UNKNOWN) - { - /* We'll use RGB format for now */ - *format = SDL_PIXELFORMAT_RGB888; - - /* Create a new one */ - SDL_memset(info, 0, size); - info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - info->bmiHeader.biPlanes = 1; - info->bmiHeader.biBitCount = 32; - info->bmiHeader.biCompression = BI_RGB; - } - - /* Fill in the size information */ - *pitch = (((window->w * SDL_BYTESPERPIXEL(*format)) + 3) & ~3); - info->bmiHeader.biWidth = window->w; - info->bmiHeader.biHeight = -window->h; /* negative for topdown bitmap */ - info->bmiHeader.biSizeImage = window->h * (*pitch); - - data->mdc = CreateCompatibleDC(data->hdc); - data->hbm = CreateDIBSection(data->hdc, info, DIB_RGB_COLORS, pixels, NULL, 0); - SDL_stack_free(info); - - if (!data->hbm) { - return WIN_SetError("Unable to create DIB"); - } - SelectObject(data->mdc, data->hbm); - - return 0; -} - -int WIN_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - - BitBlt(data->hdc, 0, 0, window->w, window->h, data->mdc, 0, 0, SRCCOPY); - return 0; -} - -void WIN_DestroyWindowFramebuffer(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - - if (!data) { - /* The window wasn't fully initialized */ - return; - } - - if (data->mdc) { - DeleteDC(data->mdc); - data->mdc = NULL; - } - if (data->hbm) { - DeleteObject(data->hbm); - data->hbm = NULL; - } -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsframebuffer.h b/3rdparty/SDL2/src/video/windows/SDL_windowsframebuffer.h deleted file mode 100644 index 0c825f9da0f..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsframebuffer.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -extern int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch); -extern int WIN_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects); -extern void WIN_DestroyWindowFramebuffer(_THIS, SDL_Window * window); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowskeyboard.c b/3rdparty/SDL2/src/video/windows/SDL_windowskeyboard.c deleted file mode 100644 index 8271b042186..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowskeyboard.c +++ /dev/null @@ -1,1584 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "SDL_windowsvideo.h" - -#include "../../events/SDL_keyboard_c.h" -#include "../../events/scancodes_windows.h" - -#include <imm.h> -#include <oleauto.h> - -#ifndef SDL_DISABLE_WINDOWS_IME -static void IME_Init(SDL_VideoData *videodata, HWND hwnd); -static void IME_Enable(SDL_VideoData *videodata, HWND hwnd); -static void IME_Disable(SDL_VideoData *videodata, HWND hwnd); -static void IME_Quit(SDL_VideoData *videodata); -#endif /* !SDL_DISABLE_WINDOWS_IME */ - -#ifndef MAPVK_VK_TO_VSC -#define MAPVK_VK_TO_VSC 0 -#endif -#ifndef MAPVK_VSC_TO_VK -#define MAPVK_VSC_TO_VK 1 -#endif -#ifndef MAPVK_VK_TO_CHAR -#define MAPVK_VK_TO_CHAR 2 -#endif - -/* Alphabetic scancodes for PC keyboards */ -void -WIN_InitKeyboard(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - data->ime_com_initialized = SDL_FALSE; - data->ime_threadmgr = 0; - data->ime_initialized = SDL_FALSE; - data->ime_enabled = SDL_FALSE; - data->ime_available = SDL_FALSE; - data->ime_hwnd_main = 0; - data->ime_hwnd_current = 0; - data->ime_himc = 0; - data->ime_composition[0] = 0; - data->ime_readingstring[0] = 0; - data->ime_cursor = 0; - - data->ime_candlist = SDL_FALSE; - SDL_memset(data->ime_candidates, 0, sizeof(data->ime_candidates)); - data->ime_candcount = 0; - data->ime_candref = 0; - data->ime_candsel = 0; - data->ime_candpgsize = 0; - data->ime_candlistindexbase = 0; - data->ime_candvertical = SDL_TRUE; - - data->ime_dirty = SDL_FALSE; - SDL_memset(&data->ime_rect, 0, sizeof(data->ime_rect)); - SDL_memset(&data->ime_candlistrect, 0, sizeof(data->ime_candlistrect)); - data->ime_winwidth = 0; - data->ime_winheight = 0; - - data->ime_hkl = 0; - data->ime_himm32 = 0; - data->GetReadingString = 0; - data->ShowReadingWindow = 0; - data->ImmLockIMC = 0; - data->ImmUnlockIMC = 0; - data->ImmLockIMCC = 0; - data->ImmUnlockIMCC = 0; - data->ime_uiless = SDL_FALSE; - data->ime_threadmgrex = 0; - data->ime_uielemsinkcookie = TF_INVALID_COOKIE; - data->ime_alpnsinkcookie = TF_INVALID_COOKIE; - data->ime_openmodesinkcookie = TF_INVALID_COOKIE; - data->ime_convmodesinkcookie = TF_INVALID_COOKIE; - data->ime_uielemsink = 0; - data->ime_ippasink = 0; - - WIN_UpdateKeymap(); - - SDL_SetScancodeName(SDL_SCANCODE_APPLICATION, "Menu"); - SDL_SetScancodeName(SDL_SCANCODE_LGUI, "Left Windows"); - SDL_SetScancodeName(SDL_SCANCODE_RGUI, "Right Windows"); - - /* Are system caps/num/scroll lock active? Set our state to match. */ - SDL_ToggleModState(KMOD_CAPS, (GetKeyState(VK_CAPITAL) & 0x0001) != 0); - SDL_ToggleModState(KMOD_NUM, (GetKeyState(VK_NUMLOCK) & 0x0001) != 0); -} - -void -WIN_UpdateKeymap() -{ - int i; - SDL_Scancode scancode; - SDL_Keycode keymap[SDL_NUM_SCANCODES]; - - SDL_GetDefaultKeymap(keymap); - - for (i = 0; i < SDL_arraysize(windows_scancode_table); i++) { - int vk; - /* Make sure this scancode is a valid character scancode */ - scancode = windows_scancode_table[i]; - if (scancode == SDL_SCANCODE_UNKNOWN ) { - continue; - } - - /* If this key is one of the non-mappable keys, ignore it */ - /* Not mapping numbers fixes the French layout, giving numeric keycodes for the number keys, which is the expected behavior */ - if ((keymap[scancode] & SDLK_SCANCODE_MASK) || - /* scancode == SDL_SCANCODE_GRAVE || */ /* Uncomment this line to re-enable the behavior of not mapping the "`"(grave) key to the users actual keyboard layout */ - (scancode >= SDL_SCANCODE_1 && scancode <= SDL_SCANCODE_0) ) { - continue; - } - - vk = MapVirtualKey(i, MAPVK_VSC_TO_VK); - if ( vk ) { - int ch = (MapVirtualKey( vk, MAPVK_VK_TO_CHAR ) & 0x7FFF); - if ( ch ) { - if ( ch >= 'A' && ch <= 'Z' ) { - keymap[scancode] = SDLK_a + ( ch - 'A' ); - } else { - keymap[scancode] = ch; - } - } - } - } - - SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); -} - -void -WIN_QuitKeyboard(_THIS) -{ -#ifndef SDL_DISABLE_WINDOWS_IME - IME_Quit((SDL_VideoData *)_this->driverdata); -#endif -} - -void -WIN_ResetDeadKeys() -{ - /* - if a deadkey has been typed, but not the next character (which the deadkey might modify), - this tries to undo the effect pressing the deadkey. - see: http://archives.miloush.net/michkap/archive/2006/09/10/748775.html - */ - BYTE keyboardState[256]; - WCHAR buffer[16]; - int keycode, scancode, result, i; - - GetKeyboardState(keyboardState); - - keycode = VK_SPACE; - scancode = MapVirtualKey(keycode, MAPVK_VK_TO_VSC); - if (scancode == 0) { - /* the keyboard doesn't have this key */ - return; - } - - for (i = 0; i < 5; i++) { - result = ToUnicode(keycode, scancode, keyboardState, (LPWSTR)buffer, 16, 0); - if (result > 0) { - /* success */ - return; - } - } -} - -void -WIN_StartTextInput(_THIS) -{ -#ifndef SDL_DISABLE_WINDOWS_IME - SDL_Window *window; -#endif - - WIN_ResetDeadKeys(); - -#ifndef SDL_DISABLE_WINDOWS_IME - window = SDL_GetKeyboardFocus(); - if (window) { - HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - SDL_GetWindowSize(window, &videodata->ime_winwidth, &videodata->ime_winheight); - IME_Init(videodata, hwnd); - IME_Enable(videodata, hwnd); - } -#endif /* !SDL_DISABLE_WINDOWS_IME */ -} - -void -WIN_StopTextInput(_THIS) -{ -#ifndef SDL_DISABLE_WINDOWS_IME - SDL_Window *window; -#endif - - WIN_ResetDeadKeys(); - -#ifndef SDL_DISABLE_WINDOWS_IME - window = SDL_GetKeyboardFocus(); - if (window) { - HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - IME_Init(videodata, hwnd); - IME_Disable(videodata, hwnd); - } -#endif /* !SDL_DISABLE_WINDOWS_IME */ -} - -void -WIN_SetTextInputRect(_THIS, SDL_Rect *rect) -{ - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - HIMC himc = 0; - - if (!rect) { - SDL_InvalidParamError("rect"); - return; - } - - videodata->ime_rect = *rect; - - himc = ImmGetContext(videodata->ime_hwnd_current); - if (himc) - { - COMPOSITIONFORM cf; - cf.ptCurrentPos.x = videodata->ime_rect.x; - cf.ptCurrentPos.y = videodata->ime_rect.y; - cf.dwStyle = CFS_FORCE_POSITION; - ImmSetCompositionWindow(himc, &cf); - ImmReleaseContext(videodata->ime_hwnd_current, himc); - } -} - -#ifdef SDL_DISABLE_WINDOWS_IME - - -SDL_bool -IME_HandleMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM *lParam, SDL_VideoData *videodata) -{ - return SDL_FALSE; -} - -void IME_Present(SDL_VideoData *videodata) -{ -} - -#else - -#ifdef _SDL_msctf_h -#define USE_INIT_GUID -#elif defined(__GNUC__) -#define USE_INIT_GUID -#endif -#ifdef USE_INIT_GUID -#undef DEFINE_GUID -#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) static const GUID n = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} -DEFINE_GUID(IID_ITfInputProcessorProfileActivationSink, 0x71C6E74E,0x0F28,0x11D8,0xA8,0x2A,0x00,0x06,0x5B,0x84,0x43,0x5C); -DEFINE_GUID(IID_ITfUIElementSink, 0xEA1EA136,0x19DF,0x11D7,0xA6,0xD2,0x00,0x06,0x5B,0x84,0x43,0x5C); -DEFINE_GUID(GUID_TFCAT_TIP_KEYBOARD, 0x34745C63,0xB2F0,0x4784,0x8B,0x67,0x5E,0x12,0xC8,0x70,0x1A,0x31); -DEFINE_GUID(IID_ITfSource, 0x4EA48A35,0x60AE,0x446F,0x8F,0xD6,0xE6,0xA8,0xD8,0x24,0x59,0xF7); -DEFINE_GUID(IID_ITfUIElementMgr, 0xEA1EA135,0x19DF,0x11D7,0xA6,0xD2,0x00,0x06,0x5B,0x84,0x43,0x5C); -DEFINE_GUID(IID_ITfCandidateListUIElement, 0xEA1EA138,0x19DF,0x11D7,0xA6,0xD2,0x00,0x06,0x5B,0x84,0x43,0x5C); -DEFINE_GUID(IID_ITfReadingInformationUIElement, 0xEA1EA139,0x19DF,0x11D7,0xA6,0xD2,0x00,0x06,0x5B,0x84,0x43,0x5C); -DEFINE_GUID(IID_ITfThreadMgr, 0xAA80E801,0x2021,0x11D2,0x93,0xE0,0x00,0x60,0xB0,0x67,0xB8,0x6E); -DEFINE_GUID(CLSID_TF_ThreadMgr, 0x529A9E6B,0x6587,0x4F23,0xAB,0x9E,0x9C,0x7D,0x68,0x3E,0x3C,0x50); -DEFINE_GUID(IID_ITfThreadMgrEx, 0x3E90ADE3,0x7594,0x4CB0,0xBB,0x58,0x69,0x62,0x8F,0x5F,0x45,0x8C); -#endif - -#define LANG_CHT MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL) -#define LANG_CHS MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED) - -#define MAKEIMEVERSION(major,minor) ((DWORD) (((BYTE)(major) << 24) | ((BYTE)(minor) << 16) )) -#define IMEID_VER(id) ((id) & 0xffff0000) -#define IMEID_LANG(id) ((id) & 0x0000ffff) - -#define CHT_HKL_DAYI ((HKL)0xE0060404) -#define CHT_HKL_NEW_PHONETIC ((HKL)0xE0080404) -#define CHT_HKL_NEW_CHANG_JIE ((HKL)0xE0090404) -#define CHT_HKL_NEW_QUICK ((HKL)0xE00A0404) -#define CHT_HKL_HK_CANTONESE ((HKL)0xE00B0404) -#define CHT_IMEFILENAME1 "TINTLGNT.IME" -#define CHT_IMEFILENAME2 "CINTLGNT.IME" -#define CHT_IMEFILENAME3 "MSTCIPHA.IME" -#define IMEID_CHT_VER42 (LANG_CHT | MAKEIMEVERSION(4, 2)) -#define IMEID_CHT_VER43 (LANG_CHT | MAKEIMEVERSION(4, 3)) -#define IMEID_CHT_VER44 (LANG_CHT | MAKEIMEVERSION(4, 4)) -#define IMEID_CHT_VER50 (LANG_CHT | MAKEIMEVERSION(5, 0)) -#define IMEID_CHT_VER51 (LANG_CHT | MAKEIMEVERSION(5, 1)) -#define IMEID_CHT_VER52 (LANG_CHT | MAKEIMEVERSION(5, 2)) -#define IMEID_CHT_VER60 (LANG_CHT | MAKEIMEVERSION(6, 0)) -#define IMEID_CHT_VER_VISTA (LANG_CHT | MAKEIMEVERSION(7, 0)) - -#define CHS_HKL ((HKL)0xE00E0804) -#define CHS_IMEFILENAME1 "PINTLGNT.IME" -#define CHS_IMEFILENAME2 "MSSCIPYA.IME" -#define IMEID_CHS_VER41 (LANG_CHS | MAKEIMEVERSION(4, 1)) -#define IMEID_CHS_VER42 (LANG_CHS | MAKEIMEVERSION(4, 2)) -#define IMEID_CHS_VER53 (LANG_CHS | MAKEIMEVERSION(5, 3)) - -#define LANG() LOWORD((videodata->ime_hkl)) -#define PRIMLANG() ((WORD)PRIMARYLANGID(LANG())) -#define SUBLANG() SUBLANGID(LANG()) - -static void IME_UpdateInputLocale(SDL_VideoData *videodata); -static void IME_ClearComposition(SDL_VideoData *videodata); -static void IME_SetWindow(SDL_VideoData* videodata, HWND hwnd); -static void IME_SetupAPI(SDL_VideoData *videodata); -static DWORD IME_GetId(SDL_VideoData *videodata, UINT uIndex); -static void IME_SendEditingEvent(SDL_VideoData *videodata); -static void IME_DestroyTextures(SDL_VideoData *videodata); - -#define SDL_IsEqualIID(riid1, riid2) SDL_IsEqualGUID(riid1, riid2) -#define SDL_IsEqualGUID(rguid1, rguid2) (!SDL_memcmp(rguid1, rguid2, sizeof(GUID))) - -static SDL_bool UILess_SetupSinks(SDL_VideoData *videodata); -static void UILess_ReleaseSinks(SDL_VideoData *videodata); -static void UILess_EnableUIUpdates(SDL_VideoData *videodata); -static void UILess_DisableUIUpdates(SDL_VideoData *videodata); - -static void -IME_Init(SDL_VideoData *videodata, HWND hwnd) -{ - if (videodata->ime_initialized) - return; - - videodata->ime_hwnd_main = hwnd; - if (SUCCEEDED(WIN_CoInitialize())) { - videodata->ime_com_initialized = SDL_TRUE; - CoCreateInstance(&CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, &IID_ITfThreadMgr, (LPVOID *)&videodata->ime_threadmgr); - } - videodata->ime_initialized = SDL_TRUE; - videodata->ime_himm32 = SDL_LoadObject("imm32.dll"); - if (!videodata->ime_himm32) { - videodata->ime_available = SDL_FALSE; - return; - } - videodata->ImmLockIMC = (LPINPUTCONTEXT2 (WINAPI *)(HIMC))SDL_LoadFunction(videodata->ime_himm32, "ImmLockIMC"); - videodata->ImmUnlockIMC = (BOOL (WINAPI *)(HIMC))SDL_LoadFunction(videodata->ime_himm32, "ImmUnlockIMC"); - videodata->ImmLockIMCC = (LPVOID (WINAPI *)(HIMCC))SDL_LoadFunction(videodata->ime_himm32, "ImmLockIMCC"); - videodata->ImmUnlockIMCC = (BOOL (WINAPI *)(HIMCC))SDL_LoadFunction(videodata->ime_himm32, "ImmUnlockIMCC"); - - IME_SetWindow(videodata, hwnd); - videodata->ime_himc = ImmGetContext(hwnd); - ImmReleaseContext(hwnd, videodata->ime_himc); - if (!videodata->ime_himc) { - videodata->ime_available = SDL_FALSE; - IME_Disable(videodata, hwnd); - return; - } - videodata->ime_available = SDL_TRUE; - IME_UpdateInputLocale(videodata); - IME_SetupAPI(videodata); - videodata->ime_uiless = UILess_SetupSinks(videodata); - IME_UpdateInputLocale(videodata); - IME_Disable(videodata, hwnd); -} - -static void -IME_Enable(SDL_VideoData *videodata, HWND hwnd) -{ - if (!videodata->ime_initialized || !videodata->ime_hwnd_current) - return; - - if (!videodata->ime_available) { - IME_Disable(videodata, hwnd); - return; - } - if (videodata->ime_hwnd_current == videodata->ime_hwnd_main) - ImmAssociateContext(videodata->ime_hwnd_current, videodata->ime_himc); - - videodata->ime_enabled = SDL_TRUE; - IME_UpdateInputLocale(videodata); - UILess_EnableUIUpdates(videodata); -} - -static void -IME_Disable(SDL_VideoData *videodata, HWND hwnd) -{ - if (!videodata->ime_initialized || !videodata->ime_hwnd_current) - return; - - IME_ClearComposition(videodata); - if (videodata->ime_hwnd_current == videodata->ime_hwnd_main) - ImmAssociateContext(videodata->ime_hwnd_current, (HIMC)0); - - videodata->ime_enabled = SDL_FALSE; - UILess_DisableUIUpdates(videodata); -} - -static void -IME_Quit(SDL_VideoData *videodata) -{ - if (!videodata->ime_initialized) - return; - - UILess_ReleaseSinks(videodata); - if (videodata->ime_hwnd_main) - ImmAssociateContext(videodata->ime_hwnd_main, videodata->ime_himc); - - videodata->ime_hwnd_main = 0; - videodata->ime_himc = 0; - if (videodata->ime_himm32) { - SDL_UnloadObject(videodata->ime_himm32); - videodata->ime_himm32 = 0; - } - if (videodata->ime_threadmgr) { - videodata->ime_threadmgr->lpVtbl->Release(videodata->ime_threadmgr); - videodata->ime_threadmgr = 0; - } - if (videodata->ime_com_initialized) { - WIN_CoUninitialize(); - videodata->ime_com_initialized = SDL_FALSE; - } - IME_DestroyTextures(videodata); - videodata->ime_initialized = SDL_FALSE; -} - -static void -IME_GetReadingString(SDL_VideoData *videodata, HWND hwnd) -{ - DWORD id = 0; - HIMC himc = 0; - WCHAR buffer[16]; - WCHAR *s = buffer; - DWORD len = 0; - INT err = 0; - BOOL vertical = FALSE; - UINT maxuilen = 0; - static OSVERSIONINFOA osversion; - - if (videodata->ime_uiless) - return; - - videodata->ime_readingstring[0] = 0; - if (!osversion.dwOSVersionInfoSize) { - osversion.dwOSVersionInfoSize = sizeof(osversion); - GetVersionExA(&osversion); - } - id = IME_GetId(videodata, 0); - if (!id) - return; - - himc = ImmGetContext(hwnd); - if (!himc) - return; - - if (videodata->GetReadingString) { - len = videodata->GetReadingString(himc, 0, 0, &err, &vertical, &maxuilen); - if (len) { - if (len > SDL_arraysize(buffer)) - len = SDL_arraysize(buffer); - - len = videodata->GetReadingString(himc, len, s, &err, &vertical, &maxuilen); - } - SDL_wcslcpy(videodata->ime_readingstring, s, len); - } - else { - LPINPUTCONTEXT2 lpimc = videodata->ImmLockIMC(himc); - LPBYTE p = 0; - s = 0; - switch (id) - { - case IMEID_CHT_VER42: - case IMEID_CHT_VER43: - case IMEID_CHT_VER44: - p = *(LPBYTE *)((LPBYTE)videodata->ImmLockIMCC(lpimc->hPrivate) + 24); - if (!p) - break; - - len = *(DWORD *)(p + 7*4 + 32*4); - s = (WCHAR *)(p + 56); - break; - case IMEID_CHT_VER51: - case IMEID_CHT_VER52: - case IMEID_CHS_VER53: - p = *(LPBYTE *)((LPBYTE)videodata->ImmLockIMCC(lpimc->hPrivate) + 4); - if (!p) - break; - - p = *(LPBYTE *)((LPBYTE)p + 1*4 + 5*4); - if (!p) - break; - - len = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16*2); - s = (WCHAR *)(p + 1*4 + (16*2+2*4) + 5*4); - break; - case IMEID_CHS_VER41: - { - int offset = (IME_GetId(videodata, 1) >= 0x00000002) ? 8 : 7; - p = *(LPBYTE *)((LPBYTE)videodata->ImmLockIMCC(lpimc->hPrivate) + offset * 4); - if (!p) - break; - - len = *(DWORD *)(p + 7*4 + 16*2*4); - s = (WCHAR *)(p + 6*4 + 16*2*1); - } - break; - case IMEID_CHS_VER42: - if (osversion.dwPlatformId != VER_PLATFORM_WIN32_NT) - break; - - p = *(LPBYTE *)((LPBYTE)videodata->ImmLockIMCC(lpimc->hPrivate) + 1*4 + 1*4 + 6*4); - if (!p) - break; - - len = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16*2); - s = (WCHAR *)(p + 1*4 + (16*2+2*4) + 5*4); - break; - } - if (s) { - size_t size = SDL_min((size_t)(len + 1), SDL_arraysize(videodata->ime_readingstring)); - SDL_wcslcpy(videodata->ime_readingstring, s, size); - } - - videodata->ImmUnlockIMCC(lpimc->hPrivate); - videodata->ImmUnlockIMC(himc); - } - ImmReleaseContext(hwnd, himc); - IME_SendEditingEvent(videodata); -} - -static void -IME_InputLangChanged(SDL_VideoData *videodata) -{ - UINT lang = PRIMLANG(); - IME_UpdateInputLocale(videodata); - if (!videodata->ime_uiless) - videodata->ime_candlistindexbase = (videodata->ime_hkl == CHT_HKL_DAYI) ? 0 : 1; - - IME_SetupAPI(videodata); - if (lang != PRIMLANG()) { - IME_ClearComposition(videodata); - } -} - -static DWORD -IME_GetId(SDL_VideoData *videodata, UINT uIndex) -{ - static HKL hklprev = 0; - static DWORD dwRet[2] = {0}; - DWORD dwVerSize = 0; - DWORD dwVerHandle = 0; - LPVOID lpVerBuffer = 0; - LPVOID lpVerData = 0; - UINT cbVerData = 0; - char szTemp[256]; - HKL hkl = 0; - DWORD dwLang = 0; - if (uIndex >= sizeof(dwRet) / sizeof(dwRet[0])) - return 0; - - hkl = videodata->ime_hkl; - if (hklprev == hkl) - return dwRet[uIndex]; - - hklprev = hkl; - dwLang = ((DWORD_PTR)hkl & 0xffff); - if (videodata->ime_uiless && LANG() == LANG_CHT) { - dwRet[0] = IMEID_CHT_VER_VISTA; - dwRet[1] = 0; - return dwRet[0]; - } - if (hkl != CHT_HKL_NEW_PHONETIC - && hkl != CHT_HKL_NEW_CHANG_JIE - && hkl != CHT_HKL_NEW_QUICK - && hkl != CHT_HKL_HK_CANTONESE - && hkl != CHS_HKL) { - dwRet[0] = dwRet[1] = 0; - return dwRet[uIndex]; - } - if (ImmGetIMEFileNameA(hkl, szTemp, sizeof(szTemp) - 1) <= 0) { - dwRet[0] = dwRet[1] = 0; - return dwRet[uIndex]; - } - if (!videodata->GetReadingString) { - #define LCID_INVARIANT MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) - if (CompareStringA(LCID_INVARIANT, NORM_IGNORECASE, szTemp, -1, CHT_IMEFILENAME1, -1) != 2 - && CompareStringA(LCID_INVARIANT, NORM_IGNORECASE, szTemp, -1, CHT_IMEFILENAME2, -1) != 2 - && CompareStringA(LCID_INVARIANT, NORM_IGNORECASE, szTemp, -1, CHT_IMEFILENAME3, -1) != 2 - && CompareStringA(LCID_INVARIANT, NORM_IGNORECASE, szTemp, -1, CHS_IMEFILENAME1, -1) != 2 - && CompareStringA(LCID_INVARIANT, NORM_IGNORECASE, szTemp, -1, CHS_IMEFILENAME2, -1) != 2) { - dwRet[0] = dwRet[1] = 0; - return dwRet[uIndex]; - } - #undef LCID_INVARIANT - dwVerSize = GetFileVersionInfoSizeA(szTemp, &dwVerHandle); - if (dwVerSize) { - lpVerBuffer = SDL_malloc(dwVerSize); - if (lpVerBuffer) { - if (GetFileVersionInfoA(szTemp, dwVerHandle, dwVerSize, lpVerBuffer)) { - if (VerQueryValueA(lpVerBuffer, "\\", &lpVerData, &cbVerData)) { - #define pVerFixedInfo ((VS_FIXEDFILEINFO FAR*)lpVerData) - DWORD dwVer = pVerFixedInfo->dwFileVersionMS; - dwVer = (dwVer & 0x00ff0000) << 8 | (dwVer & 0x000000ff) << 16; - if ((videodata->GetReadingString) || - ((dwLang == LANG_CHT) && ( - dwVer == MAKEIMEVERSION(4, 2) || - dwVer == MAKEIMEVERSION(4, 3) || - dwVer == MAKEIMEVERSION(4, 4) || - dwVer == MAKEIMEVERSION(5, 0) || - dwVer == MAKEIMEVERSION(5, 1) || - dwVer == MAKEIMEVERSION(5, 2) || - dwVer == MAKEIMEVERSION(6, 0))) - || - ((dwLang == LANG_CHS) && ( - dwVer == MAKEIMEVERSION(4, 1) || - dwVer == MAKEIMEVERSION(4, 2) || - dwVer == MAKEIMEVERSION(5, 3)))) { - dwRet[0] = dwVer | dwLang; - dwRet[1] = pVerFixedInfo->dwFileVersionLS; - SDL_free(lpVerBuffer); - return dwRet[0]; - } - #undef pVerFixedInfo - } - } - } - SDL_free(lpVerBuffer); - } - } - dwRet[0] = dwRet[1] = 0; - return dwRet[uIndex]; -} - -static void -IME_SetupAPI(SDL_VideoData *videodata) -{ - char ime_file[MAX_PATH + 1]; - void* hime = 0; - HKL hkl = 0; - videodata->GetReadingString = 0; - videodata->ShowReadingWindow = 0; - if (videodata->ime_uiless) - return; - - hkl = videodata->ime_hkl; - if (ImmGetIMEFileNameA(hkl, ime_file, sizeof(ime_file) - 1) <= 0) - return; - - hime = SDL_LoadObject(ime_file); - if (!hime) - return; - - videodata->GetReadingString = (UINT (WINAPI *)(HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT)) - SDL_LoadFunction(hime, "GetReadingString"); - videodata->ShowReadingWindow = (BOOL (WINAPI *)(HIMC, BOOL)) - SDL_LoadFunction(hime, "ShowReadingWindow"); - - if (videodata->ShowReadingWindow) { - HIMC himc = ImmGetContext(videodata->ime_hwnd_current); - if (himc) { - videodata->ShowReadingWindow(himc, FALSE); - ImmReleaseContext(videodata->ime_hwnd_current, himc); - } - } -} - -static void -IME_SetWindow(SDL_VideoData* videodata, HWND hwnd) -{ - videodata->ime_hwnd_current = hwnd; - if (videodata->ime_threadmgr) { - struct ITfDocumentMgr *document_mgr = 0; - if (SUCCEEDED(videodata->ime_threadmgr->lpVtbl->AssociateFocus(videodata->ime_threadmgr, hwnd, NULL, &document_mgr))) { - if (document_mgr) - document_mgr->lpVtbl->Release(document_mgr); - } - } -} - -static void -IME_UpdateInputLocale(SDL_VideoData *videodata) -{ - static HKL hklprev = 0; - videodata->ime_hkl = GetKeyboardLayout(0); - if (hklprev == videodata->ime_hkl) - return; - - hklprev = videodata->ime_hkl; - switch (PRIMLANG()) { - case LANG_CHINESE: - videodata->ime_candvertical = SDL_TRUE; - if (SUBLANG() == SUBLANG_CHINESE_SIMPLIFIED) - videodata->ime_candvertical = SDL_FALSE; - - break; - case LANG_JAPANESE: - videodata->ime_candvertical = SDL_TRUE; - break; - case LANG_KOREAN: - videodata->ime_candvertical = SDL_FALSE; - break; - } -} - -static void -IME_ClearComposition(SDL_VideoData *videodata) -{ - HIMC himc = 0; - if (!videodata->ime_initialized) - return; - - himc = ImmGetContext(videodata->ime_hwnd_current); - if (!himc) - return; - - ImmNotifyIME(himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0); - if (videodata->ime_uiless) - ImmSetCompositionString(himc, SCS_SETSTR, TEXT(""), sizeof(TCHAR), TEXT(""), sizeof(TCHAR)); - - ImmNotifyIME(himc, NI_CLOSECANDIDATE, 0, 0); - ImmReleaseContext(videodata->ime_hwnd_current, himc); - SDL_SendEditingText("", 0, 0); -} - -static void -IME_GetCompositionString(SDL_VideoData *videodata, HIMC himc, DWORD string) -{ - LONG length = ImmGetCompositionStringW(himc, string, videodata->ime_composition, sizeof(videodata->ime_composition) - sizeof(videodata->ime_composition[0])); - if (length < 0) - length = 0; - - length /= sizeof(videodata->ime_composition[0]); - videodata->ime_cursor = LOWORD(ImmGetCompositionStringW(himc, GCS_CURSORPOS, 0, 0)); - if (videodata->ime_cursor < SDL_arraysize(videodata->ime_composition) && videodata->ime_composition[videodata->ime_cursor] == 0x3000) { - int i; - for (i = videodata->ime_cursor + 1; i < length; ++i) - videodata->ime_composition[i - 1] = videodata->ime_composition[i]; - - --length; - } - videodata->ime_composition[length] = 0; -} - -static void -IME_SendInputEvent(SDL_VideoData *videodata) -{ - char *s = 0; - s = WIN_StringToUTF8(videodata->ime_composition); - SDL_SendKeyboardText(s); - SDL_free(s); - - videodata->ime_composition[0] = 0; - videodata->ime_readingstring[0] = 0; - videodata->ime_cursor = 0; -} - -static void -IME_SendEditingEvent(SDL_VideoData *videodata) -{ - char *s = 0; - WCHAR buffer[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; - const size_t size = SDL_arraysize(buffer); - buffer[0] = 0; - if (videodata->ime_readingstring[0]) { - size_t len = SDL_min(SDL_wcslen(videodata->ime_composition), (size_t)videodata->ime_cursor); - SDL_wcslcpy(buffer, videodata->ime_composition, len + 1); - SDL_wcslcat(buffer, videodata->ime_readingstring, size); - SDL_wcslcat(buffer, &videodata->ime_composition[len], size); - } - else { - SDL_wcslcpy(buffer, videodata->ime_composition, size); - } - s = WIN_StringToUTF8(buffer); - SDL_SendEditingText(s, videodata->ime_cursor + (int)SDL_wcslen(videodata->ime_readingstring), 0); - SDL_free(s); -} - -static void -IME_AddCandidate(SDL_VideoData *videodata, UINT i, LPCWSTR candidate) -{ - LPWSTR dst = videodata->ime_candidates[i]; - *dst++ = (WCHAR)(TEXT('0') + ((i + videodata->ime_candlistindexbase) % 10)); - if (videodata->ime_candvertical) - *dst++ = TEXT(' '); - - while (*candidate && (SDL_arraysize(videodata->ime_candidates[i]) > (dst - videodata->ime_candidates[i]))) - *dst++ = *candidate++; - - *dst = (WCHAR)'\0'; -} - -static void -IME_GetCandidateList(HIMC himc, SDL_VideoData *videodata) -{ - LPCANDIDATELIST cand_list = 0; - DWORD size = ImmGetCandidateListW(himc, 0, 0, 0); - if (size) { - cand_list = (LPCANDIDATELIST)SDL_malloc(size); - if (cand_list) { - size = ImmGetCandidateListW(himc, 0, cand_list, size); - if (size) { - UINT i, j; - UINT page_start = 0; - videodata->ime_candsel = cand_list->dwSelection; - videodata->ime_candcount = cand_list->dwCount; - - if (LANG() == LANG_CHS && IME_GetId(videodata, 0)) { - const UINT maxcandchar = 18; - size_t cchars = 0; - - for (i = 0; i < videodata->ime_candcount; ++i) { - size_t len = SDL_wcslen((LPWSTR)((DWORD_PTR)cand_list + cand_list->dwOffset[i])) + 1; - if (len + cchars > maxcandchar) { - if (i > cand_list->dwSelection) - break; - - page_start = i; - cchars = len; - } - else { - cchars += len; - } - } - videodata->ime_candpgsize = i - page_start; - } else { - videodata->ime_candpgsize = SDL_min(cand_list->dwPageSize, MAX_CANDLIST); - page_start = (cand_list->dwSelection / videodata->ime_candpgsize) * videodata->ime_candpgsize; - } - SDL_memset(&videodata->ime_candidates, 0, sizeof(videodata->ime_candidates)); - for (i = page_start, j = 0; (DWORD)i < cand_list->dwCount && j < (int)videodata->ime_candpgsize; i++, j++) { - LPCWSTR candidate = (LPCWSTR)((DWORD_PTR)cand_list + cand_list->dwOffset[i]); - IME_AddCandidate(videodata, j, candidate); - } - if (PRIMLANG() == LANG_KOREAN || (PRIMLANG() == LANG_CHT && !IME_GetId(videodata, 0))) - videodata->ime_candsel = -1; - - } - SDL_free(cand_list); - } - } -} - -static void -IME_ShowCandidateList(SDL_VideoData *videodata) -{ - videodata->ime_dirty = SDL_TRUE; - videodata->ime_candlist = SDL_TRUE; - IME_DestroyTextures(videodata); - IME_SendEditingEvent(videodata); -} - -static void -IME_HideCandidateList(SDL_VideoData *videodata) -{ - videodata->ime_dirty = SDL_FALSE; - videodata->ime_candlist = SDL_FALSE; - IME_DestroyTextures(videodata); - IME_SendEditingEvent(videodata); -} - -SDL_bool -IME_HandleMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM *lParam, SDL_VideoData *videodata) -{ - SDL_bool trap = SDL_FALSE; - HIMC himc = 0; - if (!videodata->ime_initialized || !videodata->ime_available || !videodata->ime_enabled) - return SDL_FALSE; - - switch (msg) { - case WM_INPUTLANGCHANGE: - IME_InputLangChanged(videodata); - break; - case WM_IME_SETCONTEXT: - *lParam = 0; - break; - case WM_IME_STARTCOMPOSITION: - trap = SDL_TRUE; - break; - case WM_IME_COMPOSITION: - trap = SDL_TRUE; - himc = ImmGetContext(hwnd); - if (*lParam & GCS_RESULTSTR) { - IME_GetCompositionString(videodata, himc, GCS_RESULTSTR); - IME_SendInputEvent(videodata); - } - if (*lParam & GCS_COMPSTR) { - if (!videodata->ime_uiless) - videodata->ime_readingstring[0] = 0; - - IME_GetCompositionString(videodata, himc, GCS_COMPSTR); - IME_SendEditingEvent(videodata); - } - ImmReleaseContext(hwnd, himc); - break; - case WM_IME_ENDCOMPOSITION: - videodata->ime_composition[0] = 0; - videodata->ime_readingstring[0] = 0; - videodata->ime_cursor = 0; - SDL_SendEditingText("", 0, 0); - break; - case WM_IME_NOTIFY: - switch (wParam) { - case IMN_SETCONVERSIONMODE: - case IMN_SETOPENSTATUS: - IME_UpdateInputLocale(videodata); - break; - case IMN_OPENCANDIDATE: - case IMN_CHANGECANDIDATE: - if (videodata->ime_uiless) - break; - - trap = SDL_TRUE; - IME_ShowCandidateList(videodata); - himc = ImmGetContext(hwnd); - if (!himc) - break; - - IME_GetCandidateList(himc, videodata); - ImmReleaseContext(hwnd, himc); - break; - case IMN_CLOSECANDIDATE: - trap = SDL_TRUE; - IME_HideCandidateList(videodata); - break; - case IMN_PRIVATE: - { - DWORD dwId = IME_GetId(videodata, 0); - IME_GetReadingString(videodata, hwnd); - switch (dwId) - { - case IMEID_CHT_VER42: - case IMEID_CHT_VER43: - case IMEID_CHT_VER44: - case IMEID_CHS_VER41: - case IMEID_CHS_VER42: - if (*lParam == 1 || *lParam == 2) - trap = SDL_TRUE; - - break; - case IMEID_CHT_VER50: - case IMEID_CHT_VER51: - case IMEID_CHT_VER52: - case IMEID_CHT_VER60: - case IMEID_CHS_VER53: - if (*lParam == 16 - || *lParam == 17 - || *lParam == 26 - || *lParam == 27 - || *lParam == 28) - trap = SDL_TRUE; - break; - } - } - break; - default: - trap = SDL_TRUE; - break; - } - break; - } - return trap; -} - -static void -IME_CloseCandidateList(SDL_VideoData *videodata) -{ - IME_HideCandidateList(videodata); - videodata->ime_candcount = 0; - SDL_memset(videodata->ime_candidates, 0, sizeof(videodata->ime_candidates)); -} - -static void -UILess_GetCandidateList(SDL_VideoData *videodata, ITfCandidateListUIElement *pcandlist) -{ - UINT selection = 0; - UINT count = 0; - UINT page = 0; - UINT pgcount = 0; - DWORD pgstart = 0; - DWORD pgsize = 0; - UINT i, j; - pcandlist->lpVtbl->GetSelection(pcandlist, &selection); - pcandlist->lpVtbl->GetCount(pcandlist, &count); - pcandlist->lpVtbl->GetCurrentPage(pcandlist, &page); - - videodata->ime_candsel = selection; - videodata->ime_candcount = count; - IME_ShowCandidateList(videodata); - - pcandlist->lpVtbl->GetPageIndex(pcandlist, 0, 0, &pgcount); - if (pgcount > 0) { - UINT *idxlist = SDL_malloc(sizeof(UINT) * pgcount); - if (idxlist) { - pcandlist->lpVtbl->GetPageIndex(pcandlist, idxlist, pgcount, &pgcount); - pgstart = idxlist[page]; - if (page < pgcount - 1) - pgsize = SDL_min(count, idxlist[page + 1]) - pgstart; - else - pgsize = count - pgstart; - - SDL_free(idxlist); - } - } - videodata->ime_candpgsize = SDL_min(pgsize, MAX_CANDLIST); - videodata->ime_candsel = videodata->ime_candsel - pgstart; - - SDL_memset(videodata->ime_candidates, 0, sizeof(videodata->ime_candidates)); - for (i = pgstart, j = 0; (DWORD)i < count && j < videodata->ime_candpgsize; i++, j++) { - BSTR bstr; - if (SUCCEEDED(pcandlist->lpVtbl->GetString(pcandlist, i, &bstr))) { - if (bstr) { - IME_AddCandidate(videodata, j, bstr); - SysFreeString(bstr); - } - } - } - if (PRIMLANG() == LANG_KOREAN) - videodata->ime_candsel = -1; -} - -STDMETHODIMP_(ULONG) TSFSink_AddRef(TSFSink *sink) -{ - return ++sink->refcount; -} - -STDMETHODIMP_(ULONG)TSFSink_Release(TSFSink *sink) -{ - --sink->refcount; - if (sink->refcount == 0) { - SDL_free(sink); - return 0; - } - return sink->refcount; -} - -STDMETHODIMP UIElementSink_QueryInterface(TSFSink *sink, REFIID riid, PVOID *ppv) -{ - if (!ppv) - return E_INVALIDARG; - - *ppv = 0; - if (SDL_IsEqualIID(riid, &IID_IUnknown)) - *ppv = (IUnknown *)sink; - else if (SDL_IsEqualIID(riid, &IID_ITfUIElementSink)) - *ppv = (ITfUIElementSink *)sink; - - if (*ppv) { - TSFSink_AddRef(sink); - return S_OK; - } - return E_NOINTERFACE; -} - -ITfUIElement *UILess_GetUIElement(SDL_VideoData *videodata, DWORD dwUIElementId) -{ - ITfUIElementMgr *puiem = 0; - ITfUIElement *pelem = 0; - ITfThreadMgrEx *threadmgrex = videodata->ime_threadmgrex; - - if (SUCCEEDED(threadmgrex->lpVtbl->QueryInterface(threadmgrex, &IID_ITfUIElementMgr, (LPVOID *)&puiem))) { - puiem->lpVtbl->GetUIElement(puiem, dwUIElementId, &pelem); - puiem->lpVtbl->Release(puiem); - } - return pelem; -} - -STDMETHODIMP UIElementSink_BeginUIElement(TSFSink *sink, DWORD dwUIElementId, BOOL *pbShow) -{ - ITfUIElement *element = UILess_GetUIElement((SDL_VideoData *)sink->data, dwUIElementId); - ITfReadingInformationUIElement *preading = 0; - ITfCandidateListUIElement *pcandlist = 0; - SDL_VideoData *videodata = (SDL_VideoData *)sink->data; - if (!element) - return E_INVALIDARG; - - *pbShow = FALSE; - if (SUCCEEDED(element->lpVtbl->QueryInterface(element, &IID_ITfReadingInformationUIElement, (LPVOID *)&preading))) { - BSTR bstr; - if (SUCCEEDED(preading->lpVtbl->GetString(preading, &bstr)) && bstr) { - SysFreeString(bstr); - } - preading->lpVtbl->Release(preading); - } - else if (SUCCEEDED(element->lpVtbl->QueryInterface(element, &IID_ITfCandidateListUIElement, (LPVOID *)&pcandlist))) { - videodata->ime_candref++; - UILess_GetCandidateList(videodata, pcandlist); - pcandlist->lpVtbl->Release(pcandlist); - } - return S_OK; -} - -STDMETHODIMP UIElementSink_UpdateUIElement(TSFSink *sink, DWORD dwUIElementId) -{ - ITfUIElement *element = UILess_GetUIElement((SDL_VideoData *)sink->data, dwUIElementId); - ITfReadingInformationUIElement *preading = 0; - ITfCandidateListUIElement *pcandlist = 0; - SDL_VideoData *videodata = (SDL_VideoData *)sink->data; - if (!element) - return E_INVALIDARG; - - if (SUCCEEDED(element->lpVtbl->QueryInterface(element, &IID_ITfReadingInformationUIElement, (LPVOID *)&preading))) { - BSTR bstr; - if (SUCCEEDED(preading->lpVtbl->GetString(preading, &bstr)) && bstr) { - WCHAR *s = (WCHAR *)bstr; - SDL_wcslcpy(videodata->ime_readingstring, s, SDL_arraysize(videodata->ime_readingstring)); - IME_SendEditingEvent(videodata); - SysFreeString(bstr); - } - preading->lpVtbl->Release(preading); - } - else if (SUCCEEDED(element->lpVtbl->QueryInterface(element, &IID_ITfCandidateListUIElement, (LPVOID *)&pcandlist))) { - UILess_GetCandidateList(videodata, pcandlist); - pcandlist->lpVtbl->Release(pcandlist); - } - return S_OK; -} - -STDMETHODIMP UIElementSink_EndUIElement(TSFSink *sink, DWORD dwUIElementId) -{ - ITfUIElement *element = UILess_GetUIElement((SDL_VideoData *)sink->data, dwUIElementId); - ITfReadingInformationUIElement *preading = 0; - ITfCandidateListUIElement *pcandlist = 0; - SDL_VideoData *videodata = (SDL_VideoData *)sink->data; - if (!element) - return E_INVALIDARG; - - if (SUCCEEDED(element->lpVtbl->QueryInterface(element, &IID_ITfReadingInformationUIElement, (LPVOID *)&preading))) { - videodata->ime_readingstring[0] = 0; - IME_SendEditingEvent(videodata); - preading->lpVtbl->Release(preading); - } - if (SUCCEEDED(element->lpVtbl->QueryInterface(element, &IID_ITfCandidateListUIElement, (LPVOID *)&pcandlist))) { - videodata->ime_candref--; - if (videodata->ime_candref == 0) - IME_CloseCandidateList(videodata); - - pcandlist->lpVtbl->Release(pcandlist); - } - return S_OK; -} - -STDMETHODIMP IPPASink_QueryInterface(TSFSink *sink, REFIID riid, PVOID *ppv) -{ - if (!ppv) - return E_INVALIDARG; - - *ppv = 0; - if (SDL_IsEqualIID(riid, &IID_IUnknown)) - *ppv = (IUnknown *)sink; - else if (SDL_IsEqualIID(riid, &IID_ITfInputProcessorProfileActivationSink)) - *ppv = (ITfInputProcessorProfileActivationSink *)sink; - - if (*ppv) { - TSFSink_AddRef(sink); - return S_OK; - } - return E_NOINTERFACE; -} - -STDMETHODIMP IPPASink_OnActivated(TSFSink *sink, DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID catid, REFGUID guidProfile, HKL hkl, DWORD dwFlags) -{ - static const GUID TF_PROFILE_DAYI = { 0x037B2C25, 0x480C, 0x4D7F, { 0xB0, 0x27, 0xD6, 0xCA, 0x6B, 0x69, 0x78, 0x8A } }; - SDL_VideoData *videodata = (SDL_VideoData *)sink->data; - videodata->ime_candlistindexbase = SDL_IsEqualGUID(&TF_PROFILE_DAYI, guidProfile) ? 0 : 1; - if (SDL_IsEqualIID(catid, &GUID_TFCAT_TIP_KEYBOARD) && (dwFlags & TF_IPSINK_FLAG_ACTIVE)) - IME_InputLangChanged((SDL_VideoData *)sink->data); - - IME_HideCandidateList(videodata); - return S_OK; -} - -static void *vtUIElementSink[] = { - (void *)(UIElementSink_QueryInterface), - (void *)(TSFSink_AddRef), - (void *)(TSFSink_Release), - (void *)(UIElementSink_BeginUIElement), - (void *)(UIElementSink_UpdateUIElement), - (void *)(UIElementSink_EndUIElement) -}; - -static void *vtIPPASink[] = { - (void *)(IPPASink_QueryInterface), - (void *)(TSFSink_AddRef), - (void *)(TSFSink_Release), - (void *)(IPPASink_OnActivated) -}; - -static void -UILess_EnableUIUpdates(SDL_VideoData *videodata) -{ - ITfSource *source = 0; - if (!videodata->ime_threadmgrex || videodata->ime_uielemsinkcookie != TF_INVALID_COOKIE) - return; - - if (SUCCEEDED(videodata->ime_threadmgrex->lpVtbl->QueryInterface(videodata->ime_threadmgrex, &IID_ITfSource, (LPVOID *)&source))) { - source->lpVtbl->AdviseSink(source, &IID_ITfUIElementSink, (IUnknown *)videodata->ime_uielemsink, &videodata->ime_uielemsinkcookie); - source->lpVtbl->Release(source); - } -} - -static void -UILess_DisableUIUpdates(SDL_VideoData *videodata) -{ - ITfSource *source = 0; - if (!videodata->ime_threadmgrex || videodata->ime_uielemsinkcookie == TF_INVALID_COOKIE) - return; - - if (SUCCEEDED(videodata->ime_threadmgrex->lpVtbl->QueryInterface(videodata->ime_threadmgrex, &IID_ITfSource, (LPVOID *)&source))) { - source->lpVtbl->UnadviseSink(source, videodata->ime_uielemsinkcookie); - videodata->ime_uielemsinkcookie = TF_INVALID_COOKIE; - source->lpVtbl->Release(source); - } -} - -static SDL_bool -UILess_SetupSinks(SDL_VideoData *videodata) -{ - TfClientId clientid = 0; - SDL_bool result = SDL_FALSE; - ITfSource *source = 0; - if (FAILED(CoCreateInstance(&CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, &IID_ITfThreadMgrEx, (LPVOID *)&videodata->ime_threadmgrex))) - return SDL_FALSE; - - if (FAILED(videodata->ime_threadmgrex->lpVtbl->ActivateEx(videodata->ime_threadmgrex, &clientid, TF_TMAE_UIELEMENTENABLEDONLY))) - return SDL_FALSE; - - videodata->ime_uielemsink = SDL_malloc(sizeof(TSFSink)); - videodata->ime_ippasink = SDL_malloc(sizeof(TSFSink)); - - videodata->ime_uielemsink->lpVtbl = vtUIElementSink; - videodata->ime_uielemsink->refcount = 1; - videodata->ime_uielemsink->data = videodata; - - videodata->ime_ippasink->lpVtbl = vtIPPASink; - videodata->ime_ippasink->refcount = 1; - videodata->ime_ippasink->data = videodata; - - if (SUCCEEDED(videodata->ime_threadmgrex->lpVtbl->QueryInterface(videodata->ime_threadmgrex, &IID_ITfSource, (LPVOID *)&source))) { - if (SUCCEEDED(source->lpVtbl->AdviseSink(source, &IID_ITfUIElementSink, (IUnknown *)videodata->ime_uielemsink, &videodata->ime_uielemsinkcookie))) { - if (SUCCEEDED(source->lpVtbl->AdviseSink(source, &IID_ITfInputProcessorProfileActivationSink, (IUnknown *)videodata->ime_ippasink, &videodata->ime_alpnsinkcookie))) { - result = SDL_TRUE; - } - } - source->lpVtbl->Release(source); - } - return result; -} - -#define SAFE_RELEASE(p) \ -{ \ - if (p) { \ - (p)->lpVtbl->Release((p)); \ - (p) = 0; \ - } \ -} - -static void -UILess_ReleaseSinks(SDL_VideoData *videodata) -{ - ITfSource *source = 0; - if (videodata->ime_threadmgrex && SUCCEEDED(videodata->ime_threadmgrex->lpVtbl->QueryInterface(videodata->ime_threadmgrex, &IID_ITfSource, (LPVOID *)&source))) { - source->lpVtbl->UnadviseSink(source, videodata->ime_uielemsinkcookie); - source->lpVtbl->UnadviseSink(source, videodata->ime_alpnsinkcookie); - SAFE_RELEASE(source); - videodata->ime_threadmgrex->lpVtbl->Deactivate(videodata->ime_threadmgrex); - SAFE_RELEASE(videodata->ime_threadmgrex); - TSFSink_Release(videodata->ime_uielemsink); - videodata->ime_uielemsink = 0; - TSFSink_Release(videodata->ime_ippasink); - videodata->ime_ippasink = 0; - } -} - -static void * -StartDrawToBitmap(HDC hdc, HBITMAP *hhbm, int width, int height) -{ - BITMAPINFO info; - BITMAPINFOHEADER *infoHeader = &info.bmiHeader; - BYTE *bits = NULL; - if (hhbm) { - SDL_zero(info); - infoHeader->biSize = sizeof(BITMAPINFOHEADER); - infoHeader->biWidth = width; - infoHeader->biHeight = -1 * SDL_abs(height); - infoHeader->biPlanes = 1; - infoHeader->biBitCount = 32; - infoHeader->biCompression = BI_RGB; - *hhbm = CreateDIBSection(hdc, &info, DIB_RGB_COLORS, (void **)&bits, 0, 0); - if (*hhbm) - SelectObject(hdc, *hhbm); - } - return bits; -} - -static void -StopDrawToBitmap(HDC hdc, HBITMAP *hhbm) -{ - if (hhbm && *hhbm) { - DeleteObject(*hhbm); - *hhbm = NULL; - } -} - -/* This draws only within the specified area and fills the entire region. */ -static void -DrawRect(HDC hdc, int left, int top, int right, int bottom, int pensize) -{ - /* The case of no pen (PenSize = 0) is automatically taken care of. */ - const int penadjust = (int)SDL_floor(pensize / 2.0f - 0.5f); - left += pensize / 2; - top += pensize / 2; - right -= penadjust; - bottom -= penadjust; - Rectangle(hdc, left, top, right, bottom); -} - -static void -IME_DestroyTextures(SDL_VideoData *videodata) -{ -} - -#define SDL_swap(a,b) { \ - int c = (a); \ - (a) = (b); \ - (b) = c; \ - } - -static void -IME_PositionCandidateList(SDL_VideoData *videodata, SIZE size) -{ - int left, top, right, bottom; - SDL_bool ok = SDL_FALSE; - int winw = videodata->ime_winwidth; - int winh = videodata->ime_winheight; - - /* Bottom */ - left = videodata->ime_rect.x; - top = videodata->ime_rect.y + videodata->ime_rect.h; - right = left + size.cx; - bottom = top + size.cy; - if (right >= winw) { - left -= right - winw; - right = winw; - } - if (bottom < winh) - ok = SDL_TRUE; - - /* Top */ - if (!ok) { - left = videodata->ime_rect.x; - top = videodata->ime_rect.y - size.cy; - right = left + size.cx; - bottom = videodata->ime_rect.y; - if (right >= winw) { - left -= right - winw; - right = winw; - } - if (top >= 0) - ok = SDL_TRUE; - } - - /* Right */ - if (!ok) { - left = videodata->ime_rect.x + size.cx; - top = 0; - right = left + size.cx; - bottom = size.cy; - if (right < winw) - ok = SDL_TRUE; - } - - /* Left */ - if (!ok) { - left = videodata->ime_rect.x - size.cx; - top = 0; - right = videodata->ime_rect.x; - bottom = size.cy; - if (right >= 0) - ok = SDL_TRUE; - } - - /* Window too small, show at (0,0) */ - if (!ok) { - left = 0; - top = 0; - right = size.cx; - bottom = size.cy; - } - - videodata->ime_candlistrect.x = left; - videodata->ime_candlistrect.y = top; - videodata->ime_candlistrect.w = right - left; - videodata->ime_candlistrect.h = bottom - top; -} - -static void -IME_RenderCandidateList(SDL_VideoData *videodata, HDC hdc) -{ - int i, j; - SIZE size = {0}; - SIZE candsizes[MAX_CANDLIST]; - SIZE maxcandsize = {0}; - HBITMAP hbm = NULL; - const int candcount = SDL_min(SDL_min(MAX_CANDLIST, videodata->ime_candcount), videodata->ime_candpgsize); - SDL_bool vertical = videodata->ime_candvertical; - - const int listborder = 1; - const int listpadding = 0; - const int listbordercolor = RGB(0xB4, 0xC7, 0xAA); - const int listfillcolor = RGB(255, 255, 255); - - const int candborder = 1; - const int candpadding = 0; - const int candmargin = 1; - const COLORREF candbordercolor = RGB(255, 255, 255); - const COLORREF candfillcolor = RGB(255, 255, 255); - const COLORREF candtextcolor = RGB(0, 0, 0); - const COLORREF selbordercolor = RGB(0x84, 0xAC, 0xDD); - const COLORREF selfillcolor = RGB(0xD2, 0xE6, 0xFF); - const COLORREF seltextcolor = RGB(0, 0, 0); - const int horzcandspacing = 5; - - HPEN listpen = listborder != 0 ? CreatePen(PS_SOLID, listborder, listbordercolor) : (HPEN)GetStockObject(NULL_PEN); - HBRUSH listbrush = CreateSolidBrush(listfillcolor); - HPEN candpen = candborder != 0 ? CreatePen(PS_SOLID, candborder, candbordercolor) : (HPEN)GetStockObject(NULL_PEN); - HBRUSH candbrush = CreateSolidBrush(candfillcolor); - HPEN selpen = candborder != 0 ? CreatePen(PS_DOT, candborder, selbordercolor) : (HPEN)GetStockObject(NULL_PEN); - HBRUSH selbrush = CreateSolidBrush(selfillcolor); - HFONT font = CreateFont((int)(1 + videodata->ime_rect.h * 0.75f), 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH | FF_SWISS, TEXT("Microsoft Sans Serif")); - - SetBkMode(hdc, TRANSPARENT); - SelectObject(hdc, font); - - for (i = 0; i < candcount; ++i) { - const WCHAR *s = videodata->ime_candidates[i]; - if (!*s) - break; - - GetTextExtentPoint32W(hdc, s, (int)SDL_wcslen(s), &candsizes[i]); - maxcandsize.cx = SDL_max(maxcandsize.cx, candsizes[i].cx); - maxcandsize.cy = SDL_max(maxcandsize.cy, candsizes[i].cy); - - } - if (vertical) { - size.cx = - (listborder * 2) + - (listpadding * 2) + - (candmargin * 2) + - (candborder * 2) + - (candpadding * 2) + - (maxcandsize.cx) - ; - size.cy = - (listborder * 2) + - (listpadding * 2) + - ((candcount + 1) * candmargin) + - (candcount * candborder * 2) + - (candcount * candpadding * 2) + - (candcount * maxcandsize.cy) - ; - } - else { - size.cx = - (listborder * 2) + - (listpadding * 2) + - ((candcount + 1) * candmargin) + - (candcount * candborder * 2) + - (candcount * candpadding * 2) + - ((candcount - 1) * horzcandspacing); - ; - - for (i = 0; i < candcount; ++i) - size.cx += candsizes[i].cx; - - size.cy = - (listborder * 2) + - (listpadding * 2) + - (candmargin * 2) + - (candborder * 2) + - (candpadding * 2) + - (maxcandsize.cy) - ; - } - - StartDrawToBitmap(hdc, &hbm, size.cx, size.cy); - - SelectObject(hdc, listpen); - SelectObject(hdc, listbrush); - DrawRect(hdc, 0, 0, size.cx, size.cy, listborder); - - SelectObject(hdc, candpen); - SelectObject(hdc, candbrush); - SetTextColor(hdc, candtextcolor); - SetBkMode(hdc, TRANSPARENT); - - for (i = 0; i < candcount; ++i) { - const WCHAR *s = videodata->ime_candidates[i]; - int left, top, right, bottom; - if (!*s) - break; - - if (vertical) { - left = listborder + listpadding + candmargin; - top = listborder + listpadding + (i * candborder * 2) + (i * candpadding * 2) + ((i + 1) * candmargin) + (i * maxcandsize.cy); - right = size.cx - listborder - listpadding - candmargin; - bottom = top + maxcandsize.cy + (candpadding * 2) + (candborder * 2); - } - else { - left = listborder + listpadding + (i * candborder * 2) + (i * candpadding * 2) + ((i + 1) * candmargin) + (i * horzcandspacing); - - for (j = 0; j < i; ++j) - left += candsizes[j].cx; - - top = listborder + listpadding + candmargin; - right = left + candsizes[i].cx + (candpadding * 2) + (candborder * 2); - bottom = size.cy - listborder - listpadding - candmargin; - } - - if (i == videodata->ime_candsel) { - SelectObject(hdc, selpen); - SelectObject(hdc, selbrush); - SetTextColor(hdc, seltextcolor); - } - else { - SelectObject(hdc, candpen); - SelectObject(hdc, candbrush); - SetTextColor(hdc, candtextcolor); - } - - DrawRect(hdc, left, top, right, bottom, candborder); - ExtTextOutW(hdc, left + candborder + candpadding, top + candborder + candpadding, 0, NULL, s, (int)SDL_wcslen(s), NULL); - } - StopDrawToBitmap(hdc, &hbm); - - DeleteObject(listpen); - DeleteObject(listbrush); - DeleteObject(candpen); - DeleteObject(candbrush); - DeleteObject(selpen); - DeleteObject(selbrush); - DeleteObject(font); - - IME_PositionCandidateList(videodata, size); -} - -static void -IME_Render(SDL_VideoData *videodata) -{ - HDC hdc = CreateCompatibleDC(NULL); - - if (videodata->ime_candlist) - IME_RenderCandidateList(videodata, hdc); - - DeleteDC(hdc); - - videodata->ime_dirty = SDL_FALSE; -} - -void IME_Present(SDL_VideoData *videodata) -{ - if (videodata->ime_dirty) - IME_Render(videodata); - - /* FIXME: Need to show the IME bitmap */ -} - -#endif /* SDL_DISABLE_WINDOWS_IME */ - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowskeyboard.h b/3rdparty/SDL2/src/video/windows/SDL_windowskeyboard.h deleted file mode 100644 index 84654d7b886..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowskeyboard.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_windowskeyboard_h -#define _SDL_windowskeyboard_h - -extern void WIN_InitKeyboard(_THIS); -extern void WIN_UpdateKeymap(void); -extern void WIN_QuitKeyboard(_THIS); - -extern void WIN_ResetDeadKeys(void); - -extern void WIN_StartTextInput(_THIS); -extern void WIN_StopTextInput(_THIS); -extern void WIN_SetTextInputRect(_THIS, SDL_Rect *rect); - -extern SDL_bool IME_HandleMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM *lParam, struct SDL_VideoData *videodata); - -#endif /* _SDL_windowskeyboard_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.c b/3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.c deleted file mode 100644 index 689e5bbc386..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.c +++ /dev/null @@ -1,482 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "../../core/windows/SDL_windows.h" - -#include "SDL_assert.h" -#include "SDL_windowsvideo.h" - - -#ifndef SS_EDITCONTROL -#define SS_EDITCONTROL 0x2000 -#endif - -/* Display a Windows message box */ - -#pragma pack(push, 1) - -typedef struct -{ - WORD dlgVer; - WORD signature; - DWORD helpID; - DWORD exStyle; - DWORD style; - WORD cDlgItems; - short x; - short y; - short cx; - short cy; -} DLGTEMPLATEEX; - -typedef struct -{ - DWORD helpID; - DWORD exStyle; - DWORD style; - short x; - short y; - short cx; - short cy; - DWORD id; -} DLGITEMTEMPLATEEX; - -#pragma pack(pop) - -typedef struct -{ - DLGTEMPLATEEX* lpDialog; - Uint8 *data; - size_t size; - size_t used; -} WIN_DialogData; - - -static INT_PTR MessageBoxDialogProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) -{ - switch ( iMessage ) { - case WM_COMMAND: - /* Return the ID of the button that was pushed */ - EndDialog(hDlg, LOWORD(wParam)); - return TRUE; - - default: - break; - } - return FALSE; -} - -static SDL_bool ExpandDialogSpace(WIN_DialogData *dialog, size_t space) -{ - size_t size = dialog->size; - - if (size == 0) { - size = space; - } else { - while ((dialog->used + space) > size) { - size *= 2; - } - } - if (size > dialog->size) { - void *data = SDL_realloc(dialog->data, size); - if (!data) { - SDL_OutOfMemory(); - return SDL_FALSE; - } - dialog->data = data; - dialog->size = size; - dialog->lpDialog = (DLGTEMPLATEEX*)dialog->data; - } - return SDL_TRUE; -} - -static SDL_bool AlignDialogData(WIN_DialogData *dialog, size_t size) -{ - size_t padding = (dialog->used % size); - - if (!ExpandDialogSpace(dialog, padding)) { - return SDL_FALSE; - } - - dialog->used += padding; - - return SDL_TRUE; -} - -static SDL_bool AddDialogData(WIN_DialogData *dialog, const void *data, size_t size) -{ - if (!ExpandDialogSpace(dialog, size)) { - return SDL_FALSE; - } - - SDL_memcpy(dialog->data+dialog->used, data, size); - dialog->used += size; - - return SDL_TRUE; -} - -static SDL_bool AddDialogString(WIN_DialogData *dialog, const char *string) -{ - WCHAR *wstring; - WCHAR *p; - size_t count; - SDL_bool status; - - if (!string) { - string = ""; - } - - wstring = WIN_UTF8ToString(string); - if (!wstring) { - return SDL_FALSE; - } - - /* Find out how many characters we have, including null terminator */ - count = 0; - for (p = wstring; *p; ++p) { - ++count; - } - ++count; - - status = AddDialogData(dialog, wstring, count*sizeof(WCHAR)); - SDL_free(wstring); - return status; -} - -static int s_BaseUnitsX; -static int s_BaseUnitsY; -static void Vec2ToDLU(short *x, short *y) -{ - SDL_assert(s_BaseUnitsX != 0); /* we init in WIN_ShowMessageBox(), which is the only public function... */ - - *x = MulDiv(*x, 4, s_BaseUnitsX); - *y = MulDiv(*y, 8, s_BaseUnitsY); -} - - -static SDL_bool AddDialogControl(WIN_DialogData *dialog, WORD type, DWORD style, DWORD exStyle, int x, int y, int w, int h, int id, const char *caption) -{ - DLGITEMTEMPLATEEX item; - WORD marker = 0xFFFF; - WORD extraData = 0; - - SDL_zero(item); - item.style = style; - item.exStyle = exStyle; - item.x = x; - item.y = y; - item.cx = w; - item.cy = h; - item.id = id; - - Vec2ToDLU(&item.x, &item.y); - Vec2ToDLU(&item.cx, &item.cy); - - if (!AlignDialogData(dialog, sizeof(DWORD))) { - return SDL_FALSE; - } - if (!AddDialogData(dialog, &item, sizeof(item))) { - return SDL_FALSE; - } - if (!AddDialogData(dialog, &marker, sizeof(marker))) { - return SDL_FALSE; - } - if (!AddDialogData(dialog, &type, sizeof(type))) { - return SDL_FALSE; - } - if (!AddDialogString(dialog, caption)) { - return SDL_FALSE; - } - if (!AddDialogData(dialog, &extraData, sizeof(extraData))) { - return SDL_FALSE; - } - ++dialog->lpDialog->cDlgItems; - - return SDL_TRUE; -} - -static SDL_bool AddDialogStatic(WIN_DialogData *dialog, int x, int y, int w, int h, const char *text) -{ - DWORD style = WS_VISIBLE | WS_CHILD | SS_LEFT | SS_NOPREFIX | SS_EDITCONTROL; - return AddDialogControl(dialog, 0x0082, style, 0, x, y, w, h, -1, text); -} - -static SDL_bool AddDialogButton(WIN_DialogData *dialog, int x, int y, int w, int h, const char *text, int id, SDL_bool isDefault) -{ - DWORD style = WS_VISIBLE | WS_CHILD; - if (isDefault) { - style |= BS_DEFPUSHBUTTON; - } else { - style |= BS_PUSHBUTTON; - } - return AddDialogControl(dialog, 0x0080, style, 0, x, y, w, h, id, text); -} - -static void FreeDialogData(WIN_DialogData *dialog) -{ - SDL_free(dialog->data); - SDL_free(dialog); -} - -static WIN_DialogData *CreateDialogData(int w, int h, const char *caption) -{ - WIN_DialogData *dialog; - DLGTEMPLATEEX dialogTemplate; - WORD WordToPass; - - SDL_zero(dialogTemplate); - dialogTemplate.dlgVer = 1; - dialogTemplate.signature = 0xffff; - dialogTemplate.style = (WS_CAPTION | DS_CENTER | DS_SHELLFONT); - dialogTemplate.x = 0; - dialogTemplate.y = 0; - dialogTemplate.cx = w; - dialogTemplate.cy = h; - Vec2ToDLU(&dialogTemplate.cx, &dialogTemplate.cy); - - dialog = (WIN_DialogData *)SDL_calloc(1, sizeof(*dialog)); - if (!dialog) { - return NULL; - } - - if (!AddDialogData(dialog, &dialogTemplate, sizeof(dialogTemplate))) { - FreeDialogData(dialog); - return NULL; - } - - /* No menu */ - WordToPass = 0; - if (!AddDialogData(dialog, &WordToPass, 2)) { - FreeDialogData(dialog); - return NULL; - } - - /* No custom class */ - if (!AddDialogData(dialog, &WordToPass, 2)) { - FreeDialogData(dialog); - return NULL; - } - - /* title */ - if (!AddDialogString(dialog, caption)) { - FreeDialogData(dialog); - return NULL; - } - - /* Font stuff */ - { - /* - * We want to use the system messagebox font. - */ - BYTE ToPass; - - NONCLIENTMETRICSA NCM; - NCM.cbSize = sizeof(NCM); - SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &NCM, 0); - - /* Font size - convert to logical font size for dialog parameter. */ - { - HDC ScreenDC = GetDC(NULL); - int LogicalPixelsY = GetDeviceCaps(ScreenDC, LOGPIXELSY); - if (!LogicalPixelsY) /* This can happen if the application runs out of GDI handles */ - LogicalPixelsY = 72; - WordToPass = (WORD)(-72 * NCM.lfMessageFont.lfHeight / LogicalPixelsY); - ReleaseDC(NULL, ScreenDC); - } - - if (!AddDialogData(dialog, &WordToPass, 2)) { - FreeDialogData(dialog); - return NULL; - } - - /* Font weight */ - WordToPass = (WORD)NCM.lfMessageFont.lfWeight; - if (!AddDialogData(dialog, &WordToPass, 2)) { - FreeDialogData(dialog); - return NULL; - } - - /* italic? */ - ToPass = NCM.lfMessageFont.lfItalic; - if (!AddDialogData(dialog, &ToPass, 1)) { - FreeDialogData(dialog); - return NULL; - } - - /* charset? */ - ToPass = NCM.lfMessageFont.lfCharSet; - if (!AddDialogData(dialog, &ToPass, 1)) { - FreeDialogData(dialog); - return NULL; - } - - /* font typeface. */ - if (!AddDialogString(dialog, NCM.lfMessageFont.lfFaceName)) { - FreeDialogData(dialog); - return NULL; - } - } - - return dialog; -} - -int -WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ - WIN_DialogData *dialog; - int i, x, y; - UINT_PTR which; - const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons; - HFONT DialogFont; - SIZE Size; - RECT TextSize; - wchar_t* wmessage; - TEXTMETRIC TM; - - - const int ButtonWidth = 88; - const int ButtonHeight = 26; - const int TextMargin = 16; - const int ButtonMargin = 12; - - - /* Jan 25th, 2013 - dant@fleetsa.com - * - * - * I've tried to make this more reasonable, but I've run in to a lot - * of nonsense. - * - * The original issue is the code was written in pixels and not - * dialog units (DLUs). All DialogBox functions use DLUs, which - * vary based on the selected font (yay). - * - * According to MSDN, the most reliable way to convert is via - * MapDialogUnits, which requires an HWND, which we don't have - * at time of template creation. - * - * We do however have: - * The system font (DLU width 8 for me) - * The font we select for the dialog (DLU width 6 for me) - * - * Based on experimentation, *neither* of these return the value - * actually used. Stepping in to MapDialogUnits(), the conversion - * is fairly clear, and uses 7 for me. - * - * As a result, some of this is hacky to ensure the sizing is - * somewhat correct. - * - * Honestly, a long term solution is to use CreateWindow, not CreateDialog. - * - - * - * In order to get text dimensions we need to have a DC with the desired font. - * I'm assuming a dialog box in SDL is rare enough we can to the create. - */ - HDC FontDC = CreateCompatibleDC(0); - - { - /* Create a duplicate of the font used in system message boxes. */ - LOGFONT lf; - NONCLIENTMETRICS NCM; - NCM.cbSize = sizeof(NCM); - SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &NCM, 0); - lf = NCM.lfMessageFont; - DialogFont = CreateFontIndirect(&lf); - } - - /* Select the font in to our DC */ - SelectObject(FontDC, DialogFont); - - { - /* Get the metrics to try and figure our DLU conversion. */ - GetTextMetrics(FontDC, &TM); - s_BaseUnitsX = TM.tmAveCharWidth + 1; - s_BaseUnitsY = TM.tmHeight; - } - - /* Measure the *pixel* size of the string. */ - wmessage = WIN_UTF8ToString(messageboxdata->message); - SDL_zero(TextSize); - Size.cx = DrawText(FontDC, wmessage, -1, &TextSize, DT_CALCRECT); - - /* Add some padding for hangs, etc. */ - TextSize.right += 2; - TextSize.bottom += 2; - - /* Done with the DC, and the string */ - DeleteDC(FontDC); - SDL_free(wmessage); - - /* Increase the size of the dialog by some border spacing around the text. */ - Size.cx = TextSize.right - TextSize.left; - Size.cy = TextSize.bottom - TextSize.top; - Size.cx += TextMargin * 2; - Size.cy += TextMargin * 2; - - /* Ensure the size is wide enough for all of the buttons. */ - if (Size.cx < messageboxdata->numbuttons * (ButtonWidth + ButtonMargin) + ButtonMargin) - Size.cx = messageboxdata->numbuttons * (ButtonWidth + ButtonMargin) + ButtonMargin; - - /* Add vertical space for the buttons and border. */ - Size.cy += ButtonHeight + TextMargin; - - dialog = CreateDialogData(Size.cx, Size.cy, messageboxdata->title); - if (!dialog) { - return -1; - } - - if (!AddDialogStatic(dialog, TextMargin, TextMargin, TextSize.right - TextSize.left, TextSize.bottom - TextSize.top, messageboxdata->message)) { - FreeDialogData(dialog); - return -1; - } - - /* Align the buttons to the right/bottom. */ - x = Size.cx - (ButtonWidth + ButtonMargin) * messageboxdata->numbuttons; - y = Size.cy - ButtonHeight - ButtonMargin; - for (i = messageboxdata->numbuttons - 1; i >= 0; --i) { - SDL_bool isDefault; - - if (buttons[i].flags & SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT) { - isDefault = SDL_TRUE; - } else { - isDefault = SDL_FALSE; - } - if (!AddDialogButton(dialog, x, y, ButtonWidth, ButtonHeight, buttons[i].text, i, isDefault)) { - FreeDialogData(dialog); - return -1; - } - x += ButtonWidth + ButtonMargin; - } - - /* FIXME: If we have a parent window, get the Instance and HWND for them */ - which = DialogBoxIndirect(NULL, (DLGTEMPLATE*)dialog->lpDialog, NULL, (DLGPROC)MessageBoxDialogProc); - *buttonid = buttons[which].buttonid; - - FreeDialogData(dialog); - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.h b/3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.h deleted file mode 100644 index e9c692546e9..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -extern int WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsmodes.c b/3rdparty/SDL2/src/video/windows/SDL_windowsmodes.c deleted file mode 100644 index f172f9a3d68..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsmodes.c +++ /dev/null @@ -1,454 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "SDL_windowsvideo.h" -#include "../../../include/SDL_assert.h" - -/* Windows CE compatibility */ -#ifndef CDS_FULLSCREEN -#define CDS_FULLSCREEN 0 -#endif - -typedef struct _WIN_GetMonitorDPIData { - SDL_VideoData *vid_data; - SDL_DisplayMode *mode; - SDL_DisplayModeData *mode_data; -} WIN_GetMonitorDPIData; - -static BOOL CALLBACK -WIN_GetMonitorDPI(HMONITOR hMonitor, - HDC hdcMonitor, - LPRECT lprcMonitor, - LPARAM dwData) -{ - WIN_GetMonitorDPIData *data = (WIN_GetMonitorDPIData*) dwData; - UINT hdpi, vdpi; - - if (data->vid_data->GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &hdpi, &vdpi) == S_OK && - hdpi > 0 && - vdpi > 0) { - float hsize, vsize; - - data->mode_data->HorzDPI = (float)hdpi; - data->mode_data->VertDPI = (float)vdpi; - - // Figure out the monitor size and compute the diagonal DPI. - hsize = data->mode->w / data->mode_data->HorzDPI; - vsize = data->mode->h / data->mode_data->VertDPI; - - data->mode_data->DiagDPI = SDL_ComputeDiagonalDPI( data->mode->w, - data->mode->h, - hsize, - vsize ); - - // We can only handle one DPI per display mode so end the enumeration. - return FALSE; - } - - // We didn't get DPI information so keep going. - return TRUE; -} - -static void -WIN_UpdateDisplayMode(_THIS, LPCTSTR deviceName, DWORD index, SDL_DisplayMode * mode) -{ - SDL_VideoData *vid_data = (SDL_VideoData *) _this->driverdata; - SDL_DisplayModeData *data = (SDL_DisplayModeData *) mode->driverdata; - HDC hdc; - - data->DeviceMode.dmFields = - (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY | - DM_DISPLAYFLAGS); - - if (index == ENUM_CURRENT_SETTINGS - && (hdc = CreateDC(deviceName, NULL, NULL, NULL)) != NULL) { - char bmi_data[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)]; - LPBITMAPINFO bmi; - HBITMAP hbm; - int logical_width = GetDeviceCaps( hdc, HORZRES ); - int logical_height = GetDeviceCaps( hdc, VERTRES ); - - data->ScaleX = (float)logical_width / data->DeviceMode.dmPelsWidth; - data->ScaleY = (float)logical_height / data->DeviceMode.dmPelsHeight; - mode->w = logical_width; - mode->h = logical_height; - - // WIN_GetMonitorDPI needs mode->w and mode->h - // so only call after those are set. - if (vid_data->GetDpiForMonitor) { - WIN_GetMonitorDPIData dpi_data; - RECT monitor_rect; - - dpi_data.vid_data = vid_data; - dpi_data.mode = mode; - dpi_data.mode_data = data; - monitor_rect.left = data->DeviceMode.dmPosition.x; - monitor_rect.top = data->DeviceMode.dmPosition.y; - monitor_rect.right = monitor_rect.left + 1; - monitor_rect.bottom = monitor_rect.top + 1; - EnumDisplayMonitors(NULL, &monitor_rect, WIN_GetMonitorDPI, (LPARAM)&dpi_data); - } else { - // We don't have the Windows 8.1 routine so just - // get system DPI. - data->HorzDPI = (float)GetDeviceCaps( hdc, LOGPIXELSX ); - data->VertDPI = (float)GetDeviceCaps( hdc, LOGPIXELSY ); - if (data->HorzDPI == data->VertDPI) { - data->DiagDPI = data->HorzDPI; - } else { - data->DiagDPI = SDL_ComputeDiagonalDPI( mode->w, - mode->h, - (float)GetDeviceCaps( hdc, HORZSIZE ) / 25.4f, - (float)GetDeviceCaps( hdc, VERTSIZE ) / 25.4f ); - } - } - - SDL_zero(bmi_data); - bmi = (LPBITMAPINFO) bmi_data; - bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - - hbm = CreateCompatibleBitmap(hdc, 1, 1); - GetDIBits(hdc, hbm, 0, 1, NULL, bmi, DIB_RGB_COLORS); - GetDIBits(hdc, hbm, 0, 1, NULL, bmi, DIB_RGB_COLORS); - DeleteObject(hbm); - DeleteDC(hdc); - if (bmi->bmiHeader.biCompression == BI_BITFIELDS) { - switch (*(Uint32 *) bmi->bmiColors) { - case 0x00FF0000: - mode->format = SDL_PIXELFORMAT_RGB888; - break; - case 0x000000FF: - mode->format = SDL_PIXELFORMAT_BGR888; - break; - case 0xF800: - mode->format = SDL_PIXELFORMAT_RGB565; - break; - case 0x7C00: - mode->format = SDL_PIXELFORMAT_RGB555; - break; - } - } else if (bmi->bmiHeader.biBitCount == 8) { - mode->format = SDL_PIXELFORMAT_INDEX8; - } else if (bmi->bmiHeader.biBitCount == 4) { - mode->format = SDL_PIXELFORMAT_INDEX4LSB; - } - } else if (mode->format == SDL_PIXELFORMAT_UNKNOWN) { - /* FIXME: Can we tell what this will be? */ - if ((data->DeviceMode.dmFields & DM_BITSPERPEL) == DM_BITSPERPEL) { - switch (data->DeviceMode.dmBitsPerPel) { - case 32: - mode->format = SDL_PIXELFORMAT_RGB888; - break; - case 24: - mode->format = SDL_PIXELFORMAT_RGB24; - break; - case 16: - mode->format = SDL_PIXELFORMAT_RGB565; - break; - case 15: - mode->format = SDL_PIXELFORMAT_RGB555; - break; - case 8: - mode->format = SDL_PIXELFORMAT_INDEX8; - break; - case 4: - mode->format = SDL_PIXELFORMAT_INDEX4LSB; - break; - } - } - } -} - -static SDL_bool -WIN_GetDisplayMode(_THIS, LPCTSTR deviceName, DWORD index, SDL_DisplayMode * mode) -{ - SDL_DisplayModeData *data; - DEVMODE devmode; - - devmode.dmSize = sizeof(devmode); - devmode.dmDriverExtra = 0; - if (!EnumDisplaySettings(deviceName, index, &devmode)) { - return SDL_FALSE; - } - - data = (SDL_DisplayModeData *) SDL_malloc(sizeof(*data)); - if (!data) { - return SDL_FALSE; - } - - mode->driverdata = data; - data->DeviceMode = devmode; - - /* Default basic information */ - data->ScaleX = 1.0f; - data->ScaleY = 1.0f; - data->DiagDPI = 0.0f; - data->HorzDPI = 0.0f; - data->VertDPI = 0.0f; - - mode->format = SDL_PIXELFORMAT_UNKNOWN; - mode->w = data->DeviceMode.dmPelsWidth; - mode->h = data->DeviceMode.dmPelsHeight; - mode->refresh_rate = data->DeviceMode.dmDisplayFrequency; - - /* Fill in the mode information */ - WIN_UpdateDisplayMode(_this, deviceName, index, mode); - return SDL_TRUE; -} - -static SDL_bool -WIN_AddDisplay(_THIS, LPTSTR DeviceName) -{ - SDL_VideoDisplay display; - SDL_DisplayData *displaydata; - SDL_DisplayMode mode; - DISPLAY_DEVICE device; - -#ifdef DEBUG_MODES - printf("Display: %s\n", WIN_StringToUTF8(DeviceName)); -#endif - if (!WIN_GetDisplayMode(_this, DeviceName, ENUM_CURRENT_SETTINGS, &mode)) { - return SDL_FALSE; - } - - displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata)); - if (!displaydata) { - return SDL_FALSE; - } - SDL_memcpy(displaydata->DeviceName, DeviceName, - sizeof(displaydata->DeviceName)); - - SDL_zero(display); - device.cb = sizeof(device); - if (EnumDisplayDevices(DeviceName, 0, &device, 0)) { - display.name = WIN_StringToUTF8(device.DeviceString); - } - display.desktop_mode = mode; - display.current_mode = mode; - display.driverdata = displaydata; - SDL_AddVideoDisplay(&display); - SDL_free(display.name); - return SDL_TRUE; -} - -int -WIN_InitModes(_THIS) -{ - int pass; - DWORD i, j, count; - DISPLAY_DEVICE device; - - device.cb = sizeof(device); - - /* Get the primary display in the first pass */ - for (pass = 0; pass < 2; ++pass) { - for (i = 0; ; ++i) { - TCHAR DeviceName[32]; - - if (!EnumDisplayDevices(NULL, i, &device, 0)) { - break; - } - if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) { - continue; - } - if (pass == 0) { - if (!(device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)) { - continue; - } - } else { - if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) { - continue; - } - } - SDL_memcpy(DeviceName, device.DeviceName, sizeof(DeviceName)); -#ifdef DEBUG_MODES - printf("Device: %s\n", WIN_StringToUTF8(DeviceName)); -#endif - count = 0; - for (j = 0; ; ++j) { - if (!EnumDisplayDevices(DeviceName, j, &device, 0)) { - break; - } - if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) { - continue; - } - if (pass == 0) { - if (!(device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)) { - continue; - } - } else { - if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) { - continue; - } - } - count += WIN_AddDisplay(_this, device.DeviceName); - } - if (count == 0) { - WIN_AddDisplay(_this, DeviceName); - } - } - } - if (_this->num_displays == 0) { - return SDL_SetError("No displays available"); - } - return 0; -} - -int -WIN_GetDisplayBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect) -{ - SDL_DisplayModeData *data = (SDL_DisplayModeData *) display->current_mode.driverdata; - - rect->x = (int)SDL_ceil(data->DeviceMode.dmPosition.x * data->ScaleX); - rect->y = (int)SDL_ceil(data->DeviceMode.dmPosition.y * data->ScaleY); - rect->w = (int)SDL_ceil(data->DeviceMode.dmPelsWidth * data->ScaleX); - rect->h = (int)SDL_ceil(data->DeviceMode.dmPelsHeight * data->ScaleY); - - return 0; -} - -int -WIN_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi) -{ - SDL_DisplayModeData *data = (SDL_DisplayModeData *) display->current_mode.driverdata; - - if (ddpi) { - *ddpi = data->DiagDPI; - } - if (hdpi) { - *hdpi = data->HorzDPI; - } - if (vdpi) { - *vdpi = data->VertDPI; - } - - return data->DiagDPI != 0.0f ? 0 : SDL_SetError("Couldn't get DPI"); -} - -int -WIN_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect) -{ - const SDL_DisplayModeData *data = (const SDL_DisplayModeData *) display->current_mode.driverdata; - const DEVMODE *pDevMode = &data->DeviceMode; - POINT pt = { - /* !!! FIXME: no scale, right? */ - (LONG) (pDevMode->dmPosition.x + (pDevMode->dmPelsWidth / 2)), - (LONG) (pDevMode->dmPosition.y + (pDevMode->dmPelsHeight / 2)) - }; - HMONITOR hmon = MonitorFromPoint(pt, MONITOR_DEFAULTTONULL); - MONITORINFO minfo; - const RECT *work; - BOOL rc = FALSE; - - SDL_assert(hmon != NULL); - - if (hmon != NULL) { - SDL_zero(minfo); - minfo.cbSize = sizeof (MONITORINFO); - rc = GetMonitorInfo(hmon, &minfo); - SDL_assert(rc); - } - - if (!rc) { - return SDL_SetError("Couldn't find monitor data"); - } - - work = &minfo.rcWork; - rect->x = (int)SDL_ceil(work->left * data->ScaleX); - rect->y = (int)SDL_ceil(work->top * data->ScaleY); - rect->w = (int)SDL_ceil((work->right - work->left) * data->ScaleX); - rect->h = (int)SDL_ceil((work->bottom - work->top) * data->ScaleY); - - return 0; -} - -void -WIN_GetDisplayModes(_THIS, SDL_VideoDisplay * display) -{ - SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata; - DWORD i; - SDL_DisplayMode mode; - - for (i = 0;; ++i) { - if (!WIN_GetDisplayMode(_this, data->DeviceName, i, &mode)) { - break; - } - if (SDL_ISPIXELFORMAT_INDEXED(mode.format)) { - /* We don't support palettized modes now */ - SDL_free(mode.driverdata); - continue; - } - if (mode.format != SDL_PIXELFORMAT_UNKNOWN) { - if (!SDL_AddDisplayMode(display, &mode)) { - SDL_free(mode.driverdata); - } - } else { - SDL_free(mode.driverdata); - } - } -} - -int -WIN_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata; - SDL_DisplayModeData *data = (SDL_DisplayModeData *) mode->driverdata; - LONG status; - - if (mode->driverdata == display->desktop_mode.driverdata) { - status = ChangeDisplaySettingsEx(displaydata->DeviceName, NULL, NULL, CDS_FULLSCREEN, NULL); - } else { - status = ChangeDisplaySettingsEx(displaydata->DeviceName, &data->DeviceMode, NULL, CDS_FULLSCREEN, NULL); - } - if (status != DISP_CHANGE_SUCCESSFUL) { - const char *reason = "Unknown reason"; - switch (status) { - case DISP_CHANGE_BADFLAGS: - reason = "DISP_CHANGE_BADFLAGS"; - break; - case DISP_CHANGE_BADMODE: - reason = "DISP_CHANGE_BADMODE"; - break; - case DISP_CHANGE_BADPARAM: - reason = "DISP_CHANGE_BADPARAM"; - break; - case DISP_CHANGE_FAILED: - reason = "DISP_CHANGE_FAILED"; - break; - } - return SDL_SetError("ChangeDisplaySettingsEx() failed: %s", reason); - } - EnumDisplaySettings(displaydata->DeviceName, ENUM_CURRENT_SETTINGS, &data->DeviceMode); - WIN_UpdateDisplayMode(_this, displaydata->DeviceName, ENUM_CURRENT_SETTINGS, mode); - return 0; -} - -void -WIN_QuitModes(_THIS) -{ - /* All fullscreen windows should have restored modes by now */ -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsmodes.h b/3rdparty/SDL2/src/video/windows/SDL_windowsmodes.h deleted file mode 100644 index 6aa293d218d..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsmodes.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_windowsmodes_h -#define _SDL_windowsmodes_h - -typedef struct -{ - TCHAR DeviceName[32]; -} SDL_DisplayData; - -typedef struct -{ - DEVMODE DeviceMode; - float ScaleX; - float ScaleY; - float DiagDPI; - float HorzDPI; - float VertDPI; -} SDL_DisplayModeData; - -extern int WIN_InitModes(_THIS); -extern int WIN_GetDisplayBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect); -extern int WIN_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect); -extern int WIN_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi); -extern void WIN_GetDisplayModes(_THIS, SDL_VideoDisplay * display); -extern int WIN_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -extern void WIN_QuitModes(_THIS); - -#endif /* _SDL_windowsmodes_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsmouse.c b/3rdparty/SDL2/src/video/windows/SDL_windowsmouse.c deleted file mode 100644 index 72d7892d478..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsmouse.c +++ /dev/null @@ -1,329 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "SDL_assert.h" -#include "SDL_windowsvideo.h" - -#include "../../events/SDL_mouse_c.h" - - -HCURSOR SDL_cursor = NULL; - -static int rawInputEnableCount = 0; - -static int -ToggleRawInput(SDL_bool enabled) -{ - RAWINPUTDEVICE rawMouse = { 0x01, 0x02, 0, NULL }; /* Mouse: UsagePage = 1, Usage = 2 */ - - if (enabled) { - rawInputEnableCount++; - if (rawInputEnableCount > 1) { - return 0; /* already done. */ - } - } else { - if (rawInputEnableCount == 0) { - return 0; /* already done. */ - } - rawInputEnableCount--; - if (rawInputEnableCount > 0) { - return 0; /* not time to disable yet */ - } - } - - if (!enabled) { - rawMouse.dwFlags |= RIDEV_REMOVE; - } - - /* (Un)register raw input for mice */ - if (RegisterRawInputDevices(&rawMouse, 1, sizeof(RAWINPUTDEVICE)) == FALSE) { - - /* Only return an error when registering. If we unregister and fail, - then it's probably that we unregistered twice. That's OK. */ - if (enabled) { - return SDL_Unsupported(); - } - } - return 0; -} - - -static SDL_Cursor * -WIN_CreateDefaultCursor() -{ - SDL_Cursor *cursor; - - cursor = SDL_calloc(1, sizeof(*cursor)); - if (cursor) { - cursor->driverdata = LoadCursor(NULL, IDC_ARROW); - } else { - SDL_OutOfMemory(); - } - - return cursor; -} - -static SDL_Cursor * -WIN_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y) -{ - /* msdn says cursor mask has to be padded out to word alignment. Not sure - if that means machine word or WORD, but this handles either case. */ - const size_t pad = (sizeof (size_t) * 8); /* 32 or 64, or whatever. */ - SDL_Cursor *cursor; - HICON hicon; - HDC hdc; - BITMAPV4HEADER bmh; - LPVOID pixels; - LPVOID maskbits; - size_t maskbitslen; - ICONINFO ii; - - SDL_zero(bmh); - bmh.bV4Size = sizeof(bmh); - bmh.bV4Width = surface->w; - bmh.bV4Height = -surface->h; /* Invert the image */ - bmh.bV4Planes = 1; - bmh.bV4BitCount = 32; - bmh.bV4V4Compression = BI_BITFIELDS; - bmh.bV4AlphaMask = 0xFF000000; - bmh.bV4RedMask = 0x00FF0000; - bmh.bV4GreenMask = 0x0000FF00; - bmh.bV4BlueMask = 0x000000FF; - - maskbitslen = ((surface->w + (pad - (surface->w % pad))) / 8) * surface->h; - maskbits = SDL_stack_alloc(Uint8,maskbitslen); - if (maskbits == NULL) { - SDL_OutOfMemory(); - return NULL; - } - - /* AND the cursor against full bits: no change. We already have alpha. */ - SDL_memset(maskbits, 0xFF, maskbitslen); - - hdc = GetDC(NULL); - SDL_zero(ii); - ii.fIcon = FALSE; - ii.xHotspot = (DWORD)hot_x; - ii.yHotspot = (DWORD)hot_y; - ii.hbmColor = CreateDIBSection(hdc, (BITMAPINFO*)&bmh, DIB_RGB_COLORS, &pixels, NULL, 0); - ii.hbmMask = CreateBitmap(surface->w, surface->h, 1, 1, maskbits); - ReleaseDC(NULL, hdc); - SDL_stack_free(maskbits); - - SDL_assert(surface->format->format == SDL_PIXELFORMAT_ARGB8888); - SDL_assert(surface->pitch == surface->w * 4); - SDL_memcpy(pixels, surface->pixels, surface->h * surface->pitch); - - hicon = CreateIconIndirect(&ii); - - DeleteObject(ii.hbmColor); - DeleteObject(ii.hbmMask); - - if (!hicon) { - WIN_SetError("CreateIconIndirect()"); - return NULL; - } - - cursor = SDL_calloc(1, sizeof(*cursor)); - if (cursor) { - cursor->driverdata = hicon; - } else { - DestroyIcon(hicon); - SDL_OutOfMemory(); - } - - return cursor; -} - -static SDL_Cursor * -WIN_CreateSystemCursor(SDL_SystemCursor id) -{ - SDL_Cursor *cursor; - LPCTSTR name; - - switch(id) - { - default: - SDL_assert(0); - return NULL; - case SDL_SYSTEM_CURSOR_ARROW: name = IDC_ARROW; break; - case SDL_SYSTEM_CURSOR_IBEAM: name = IDC_IBEAM; break; - case SDL_SYSTEM_CURSOR_WAIT: name = IDC_WAIT; break; - case SDL_SYSTEM_CURSOR_CROSSHAIR: name = IDC_CROSS; break; - case SDL_SYSTEM_CURSOR_WAITARROW: name = IDC_WAIT; break; - case SDL_SYSTEM_CURSOR_SIZENWSE: name = IDC_SIZENWSE; break; - case SDL_SYSTEM_CURSOR_SIZENESW: name = IDC_SIZENESW; break; - case SDL_SYSTEM_CURSOR_SIZEWE: name = IDC_SIZEWE; break; - case SDL_SYSTEM_CURSOR_SIZENS: name = IDC_SIZENS; break; - case SDL_SYSTEM_CURSOR_SIZEALL: name = IDC_SIZEALL; break; - case SDL_SYSTEM_CURSOR_NO: name = IDC_NO; break; - case SDL_SYSTEM_CURSOR_HAND: name = IDC_HAND; break; - } - - cursor = SDL_calloc(1, sizeof(*cursor)); - if (cursor) { - HICON hicon; - - hicon = LoadCursor(NULL, name); - - cursor->driverdata = hicon; - } else { - SDL_OutOfMemory(); - } - - return cursor; -} - -static void -WIN_FreeCursor(SDL_Cursor * cursor) -{ - HICON hicon = (HICON)cursor->driverdata; - - DestroyIcon(hicon); - SDL_free(cursor); -} - -static int -WIN_ShowCursor(SDL_Cursor * cursor) -{ - if (cursor) { - SDL_cursor = (HCURSOR)cursor->driverdata; - } else { - SDL_cursor = NULL; - } - if (SDL_GetMouseFocus() != NULL) { - SetCursor(SDL_cursor); - } - return 0; -} - -static void -WIN_WarpMouse(SDL_Window * window, int x, int y) -{ - SDL_WindowData *data = (SDL_WindowData *)window->driverdata; - HWND hwnd = data->hwnd; - POINT pt; - - /* Don't warp the mouse while we're doing a modal interaction */ - if (data->in_title_click || data->focus_click_pending) { - return; - } - - pt.x = x; - pt.y = y; - ClientToScreen(hwnd, &pt); - SetCursorPos(pt.x, pt.y); -} - -static int -WIN_WarpMouseGlobal(int x, int y) -{ - POINT pt; - - pt.x = x; - pt.y = y; - SetCursorPos(pt.x, pt.y); - return 0; -} - -static int -WIN_SetRelativeMouseMode(SDL_bool enabled) -{ - return ToggleRawInput(enabled); -} - -static int -WIN_CaptureMouse(SDL_Window *window) -{ - if (!window) { - SDL_Window *focusWin = SDL_GetKeyboardFocus(); - if (focusWin) { - WIN_OnWindowEnter(SDL_GetVideoDevice(), focusWin); /* make sure WM_MOUSELEAVE messages are (re)enabled. */ - } - } - - /* While we were thinking of SetCapture() when designing this API in SDL, - we didn't count on the fact that SetCapture() only tracks while the - left mouse button is held down! Instead, we listen for raw mouse input - and manually query the mouse when it leaves the window. :/ */ - return ToggleRawInput(window != NULL); -} - -static Uint32 -WIN_GetGlobalMouseState(int *x, int *y) -{ - Uint32 retval = 0; - POINT pt = { 0, 0 }; - GetCursorPos(&pt); - *x = (int) pt.x; - *y = (int) pt.y; - - retval |= GetAsyncKeyState(VK_LBUTTON) & 0x8000 ? SDL_BUTTON_LMASK : 0; - retval |= GetAsyncKeyState(VK_RBUTTON) & 0x8000 ? SDL_BUTTON_RMASK : 0; - retval |= GetAsyncKeyState(VK_MBUTTON) & 0x8000 ? SDL_BUTTON_MMASK : 0; - retval |= GetAsyncKeyState(VK_XBUTTON1) & 0x8000 ? SDL_BUTTON_X1MASK : 0; - retval |= GetAsyncKeyState(VK_XBUTTON2) & 0x8000 ? SDL_BUTTON_X2MASK : 0; - - return retval; -} - -void -WIN_InitMouse(_THIS) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - - mouse->CreateCursor = WIN_CreateCursor; - mouse->CreateSystemCursor = WIN_CreateSystemCursor; - mouse->ShowCursor = WIN_ShowCursor; - mouse->FreeCursor = WIN_FreeCursor; - mouse->WarpMouse = WIN_WarpMouse; - mouse->WarpMouseGlobal = WIN_WarpMouseGlobal; - mouse->SetRelativeMouseMode = WIN_SetRelativeMouseMode; - mouse->CaptureMouse = WIN_CaptureMouse; - mouse->GetGlobalMouseState = WIN_GetGlobalMouseState; - - SDL_SetDefaultCursor(WIN_CreateDefaultCursor()); - - SDL_SetDoubleClickTime(GetDoubleClickTime()); -} - -void -WIN_QuitMouse(_THIS) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - if ( mouse->def_cursor ) { - SDL_free(mouse->def_cursor); - mouse->def_cursor = NULL; - mouse->cur_cursor = NULL; - } - - if (rawInputEnableCount) { /* force RAWINPUT off here. */ - rawInputEnableCount = 1; - ToggleRawInput(SDL_FALSE); - } -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsmouse.h b/3rdparty/SDL2/src/video/windows/SDL_windowsmouse.h deleted file mode 100644 index 60672e6bb9a..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsmouse.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_windowsmouse_h -#define _SDL_windowsmouse_h - -extern HCURSOR SDL_cursor; - -extern void WIN_InitMouse(_THIS); -extern void WIN_QuitMouse(_THIS); - -#endif /* _SDL_windowsmouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsopengl.c b/3rdparty/SDL2/src/video/windows/SDL_windowsopengl.c deleted file mode 100644 index d30d838fdcc..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsopengl.c +++ /dev/null @@ -1,810 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "SDL_assert.h" -#include "SDL_loadso.h" -#include "SDL_windowsvideo.h" -#include "SDL_windowsopengles.h" - -/* WGL implementation of SDL OpenGL support */ - -#if SDL_VIDEO_OPENGL_WGL -#include "SDL_opengl.h" - -#define DEFAULT_OPENGL "OPENGL32.DLL" - -#ifndef WGL_ARB_create_context -#define WGL_ARB_create_context -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 -#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 - -#ifndef WGL_ARB_create_context_profile -#define WGL_ARB_create_context_profile -#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 -#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#endif - -#ifndef WGL_ARB_create_context_robustness -#define WGL_ARB_create_context_robustness -#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 -#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#endif -#endif - -#ifndef WGL_EXT_create_context_es2_profile -#define WGL_EXT_create_context_es2_profile -#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 -#endif - -#ifndef WGL_EXT_create_context_es_profile -#define WGL_EXT_create_context_es_profile -#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 -#endif - -#ifndef WGL_ARB_framebuffer_sRGB -#define WGL_ARB_framebuffer_sRGB -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 -#endif - -#ifndef WGL_ARB_context_flush_control -#define WGL_ARB_context_flush_control -#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 -#define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0x0000 -#define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 -#endif - -typedef HGLRC(APIENTRYP PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, - HGLRC - hShareContext, - const int - *attribList); - -int -WIN_GL_LoadLibrary(_THIS, const char *path) -{ - void *handle; - - if (path == NULL) { - path = SDL_getenv("SDL_OPENGL_LIBRARY"); - } - if (path == NULL) { - path = DEFAULT_OPENGL; - } - _this->gl_config.dll_handle = SDL_LoadObject(path); - if (!_this->gl_config.dll_handle) { - return -1; - } - SDL_strlcpy(_this->gl_config.driver_path, path, - SDL_arraysize(_this->gl_config.driver_path)); - - /* Allocate OpenGL memory */ - _this->gl_data = (struct SDL_GLDriverData *) SDL_calloc(1, sizeof(struct SDL_GLDriverData)); - if (!_this->gl_data) { - return SDL_OutOfMemory(); - } - - /* Load function pointers */ - handle = _this->gl_config.dll_handle; - _this->gl_data->wglGetProcAddress = (void *(WINAPI *) (const char *)) - SDL_LoadFunction(handle, "wglGetProcAddress"); - _this->gl_data->wglCreateContext = (HGLRC(WINAPI *) (HDC)) - SDL_LoadFunction(handle, "wglCreateContext"); - _this->gl_data->wglDeleteContext = (BOOL(WINAPI *) (HGLRC)) - SDL_LoadFunction(handle, "wglDeleteContext"); - _this->gl_data->wglMakeCurrent = (BOOL(WINAPI *) (HDC, HGLRC)) - SDL_LoadFunction(handle, "wglMakeCurrent"); - _this->gl_data->wglShareLists = (BOOL(WINAPI *) (HGLRC, HGLRC)) - SDL_LoadFunction(handle, "wglShareLists"); - - if (!_this->gl_data->wglGetProcAddress || - !_this->gl_data->wglCreateContext || - !_this->gl_data->wglDeleteContext || - !_this->gl_data->wglMakeCurrent) { - return SDL_SetError("Could not retrieve OpenGL functions"); - } - - return 0; -} - -void * -WIN_GL_GetProcAddress(_THIS, const char *proc) -{ - void *func; - - /* This is to pick up extensions */ - func = _this->gl_data->wglGetProcAddress(proc); - if (!func) { - /* This is probably a normal GL function */ - func = GetProcAddress(_this->gl_config.dll_handle, proc); - } - return func; -} - -void -WIN_GL_UnloadLibrary(_THIS) -{ - SDL_UnloadObject(_this->gl_config.dll_handle); - _this->gl_config.dll_handle = NULL; - - /* Free OpenGL memory */ - SDL_free(_this->gl_data); - _this->gl_data = NULL; -} - -static void -WIN_GL_SetupPixelFormat(_THIS, PIXELFORMATDESCRIPTOR * pfd) -{ - SDL_zerop(pfd); - pfd->nSize = sizeof(*pfd); - pfd->nVersion = 1; - pfd->dwFlags = (PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL); - if (_this->gl_config.double_buffer) { - pfd->dwFlags |= PFD_DOUBLEBUFFER; - } - if (_this->gl_config.stereo) { - pfd->dwFlags |= PFD_STEREO; - } - pfd->iLayerType = PFD_MAIN_PLANE; - pfd->iPixelType = PFD_TYPE_RGBA; - pfd->cRedBits = _this->gl_config.red_size; - pfd->cGreenBits = _this->gl_config.green_size; - pfd->cBlueBits = _this->gl_config.blue_size; - pfd->cAlphaBits = _this->gl_config.alpha_size; - if (_this->gl_config.buffer_size) { - pfd->cColorBits = - _this->gl_config.buffer_size - _this->gl_config.alpha_size; - } else { - pfd->cColorBits = (pfd->cRedBits + pfd->cGreenBits + pfd->cBlueBits); - } - pfd->cAccumRedBits = _this->gl_config.accum_red_size; - pfd->cAccumGreenBits = _this->gl_config.accum_green_size; - pfd->cAccumBlueBits = _this->gl_config.accum_blue_size; - pfd->cAccumAlphaBits = _this->gl_config.accum_alpha_size; - pfd->cAccumBits = - (pfd->cAccumRedBits + pfd->cAccumGreenBits + pfd->cAccumBlueBits + - pfd->cAccumAlphaBits); - pfd->cDepthBits = _this->gl_config.depth_size; - pfd->cStencilBits = _this->gl_config.stencil_size; -} - -/* Choose the closest pixel format that meets or exceeds the target. - FIXME: Should we weight any particular attribute over any other? -*/ -static int -WIN_GL_ChoosePixelFormat(HDC hdc, PIXELFORMATDESCRIPTOR * target) -{ - PIXELFORMATDESCRIPTOR pfd; - int count, index, best = 0; - unsigned int dist, best_dist = ~0U; - - count = DescribePixelFormat(hdc, 1, sizeof(pfd), NULL); - - for (index = 1; index <= count; index++) { - - if (!DescribePixelFormat(hdc, index, sizeof(pfd), &pfd)) { - continue; - } - - if ((pfd.dwFlags & target->dwFlags) != target->dwFlags) { - continue; - } - - if (pfd.iLayerType != target->iLayerType) { - continue; - } - if (pfd.iPixelType != target->iPixelType) { - continue; - } - - dist = 0; - - if (pfd.cColorBits < target->cColorBits) { - continue; - } else { - dist += (pfd.cColorBits - target->cColorBits); - } - if (pfd.cRedBits < target->cRedBits) { - continue; - } else { - dist += (pfd.cRedBits - target->cRedBits); - } - if (pfd.cGreenBits < target->cGreenBits) { - continue; - } else { - dist += (pfd.cGreenBits - target->cGreenBits); - } - if (pfd.cBlueBits < target->cBlueBits) { - continue; - } else { - dist += (pfd.cBlueBits - target->cBlueBits); - } - if (pfd.cAlphaBits < target->cAlphaBits) { - continue; - } else { - dist += (pfd.cAlphaBits - target->cAlphaBits); - } - if (pfd.cAccumBits < target->cAccumBits) { - continue; - } else { - dist += (pfd.cAccumBits - target->cAccumBits); - } - if (pfd.cAccumRedBits < target->cAccumRedBits) { - continue; - } else { - dist += (pfd.cAccumRedBits - target->cAccumRedBits); - } - if (pfd.cAccumGreenBits < target->cAccumGreenBits) { - continue; - } else { - dist += (pfd.cAccumGreenBits - target->cAccumGreenBits); - } - if (pfd.cAccumBlueBits < target->cAccumBlueBits) { - continue; - } else { - dist += (pfd.cAccumBlueBits - target->cAccumBlueBits); - } - if (pfd.cAccumAlphaBits < target->cAccumAlphaBits) { - continue; - } else { - dist += (pfd.cAccumAlphaBits - target->cAccumAlphaBits); - } - if (pfd.cDepthBits < target->cDepthBits) { - continue; - } else { - dist += (pfd.cDepthBits - target->cDepthBits); - } - if (pfd.cStencilBits < target->cStencilBits) { - continue; - } else { - dist += (pfd.cStencilBits - target->cStencilBits); - } - - if (dist < best_dist) { - best = index; - best_dist = dist; - } - } - - return best; -} - -static SDL_bool -HasExtension(const char *extension, const char *extensions) -{ - const char *start; - const char *where, *terminator; - - /* Extension names should not have spaces. */ - where = SDL_strchr(extension, ' '); - if (where || *extension == '\0') - return SDL_FALSE; - - if (!extensions) - return SDL_FALSE; - - /* It takes a bit of care to be fool-proof about parsing the - * OpenGL extensions string. Don't be fooled by sub-strings, - * etc. */ - - start = extensions; - - for (;;) { - where = SDL_strstr(start, extension); - if (!where) - break; - - terminator = where + SDL_strlen(extension); - if (where == start || *(where - 1) == ' ') - if (*terminator == ' ' || *terminator == '\0') - return SDL_TRUE; - - start = terminator; - } - return SDL_FALSE; -} - -void -WIN_GL_InitExtensions(_THIS) -{ - const char *(WINAPI * wglGetExtensionsStringARB) (HDC) = 0; - const char *extensions; - HWND hwnd; - HDC hdc; - HGLRC hglrc; - PIXELFORMATDESCRIPTOR pfd; - - if (!_this->gl_data) { - return; - } - - hwnd = - CreateWindow(SDL_Appname, SDL_Appname, (WS_POPUP | WS_DISABLED), 0, 0, - 10, 10, NULL, NULL, SDL_Instance, NULL); - if (!hwnd) { - return; - } - WIN_PumpEvents(_this); - - hdc = GetDC(hwnd); - - WIN_GL_SetupPixelFormat(_this, &pfd); - - SetPixelFormat(hdc, ChoosePixelFormat(hdc, &pfd), &pfd); - - hglrc = _this->gl_data->wglCreateContext(hdc); - if (!hglrc) { - return; - } - _this->gl_data->wglMakeCurrent(hdc, hglrc); - - wglGetExtensionsStringARB = (const char *(WINAPI *) (HDC)) - _this->gl_data->wglGetProcAddress("wglGetExtensionsStringARB"); - if (wglGetExtensionsStringARB) { - extensions = wglGetExtensionsStringARB(hdc); - } else { - extensions = NULL; - } - - /* Check for WGL_ARB_pixel_format */ - _this->gl_data->HAS_WGL_ARB_pixel_format = SDL_FALSE; - if (HasExtension("WGL_ARB_pixel_format", extensions)) { - _this->gl_data->wglChoosePixelFormatARB = (BOOL(WINAPI *) - (HDC, const int *, - const FLOAT *, UINT, - int *, UINT *)) - WIN_GL_GetProcAddress(_this, "wglChoosePixelFormatARB"); - _this->gl_data->wglGetPixelFormatAttribivARB = - (BOOL(WINAPI *) (HDC, int, int, UINT, const int *, int *)) - WIN_GL_GetProcAddress(_this, "wglGetPixelFormatAttribivARB"); - - if ((_this->gl_data->wglChoosePixelFormatARB != NULL) && - (_this->gl_data->wglGetPixelFormatAttribivARB != NULL)) { - _this->gl_data->HAS_WGL_ARB_pixel_format = SDL_TRUE; - } - } - - /* Check for WGL_EXT_swap_control */ - _this->gl_data->HAS_WGL_EXT_swap_control_tear = SDL_FALSE; - if (HasExtension("WGL_EXT_swap_control", extensions)) { - _this->gl_data->wglSwapIntervalEXT = - WIN_GL_GetProcAddress(_this, "wglSwapIntervalEXT"); - _this->gl_data->wglGetSwapIntervalEXT = - WIN_GL_GetProcAddress(_this, "wglGetSwapIntervalEXT"); - if (HasExtension("WGL_EXT_swap_control_tear", extensions)) { - _this->gl_data->HAS_WGL_EXT_swap_control_tear = SDL_TRUE; - } - } else { - _this->gl_data->wglSwapIntervalEXT = NULL; - _this->gl_data->wglGetSwapIntervalEXT = NULL; - } - - /* Check for WGL_EXT_create_context_es2_profile */ - _this->gl_data->HAS_WGL_EXT_create_context_es2_profile = SDL_FALSE; - if (HasExtension("WGL_EXT_create_context_es2_profile", extensions)) { - _this->gl_data->HAS_WGL_EXT_create_context_es2_profile = SDL_TRUE; - } - - /* Check for GLX_ARB_context_flush_control */ - if (HasExtension("WGL_ARB_context_flush_control", extensions)) { - _this->gl_data->HAS_WGL_ARB_context_flush_control = SDL_TRUE; - } - - _this->gl_data->wglMakeCurrent(hdc, NULL); - _this->gl_data->wglDeleteContext(hglrc); - ReleaseDC(hwnd, hdc); - DestroyWindow(hwnd); - WIN_PumpEvents(_this); -} - -static int -WIN_GL_ChoosePixelFormatARB(_THIS, int *iAttribs, float *fAttribs) -{ - HWND hwnd; - HDC hdc; - PIXELFORMATDESCRIPTOR pfd; - HGLRC hglrc; - int pixel_format = 0; - unsigned int matching; - - hwnd = - CreateWindow(SDL_Appname, SDL_Appname, (WS_POPUP | WS_DISABLED), 0, 0, - 10, 10, NULL, NULL, SDL_Instance, NULL); - WIN_PumpEvents(_this); - - hdc = GetDC(hwnd); - - WIN_GL_SetupPixelFormat(_this, &pfd); - - SetPixelFormat(hdc, ChoosePixelFormat(hdc, &pfd), &pfd); - - hglrc = _this->gl_data->wglCreateContext(hdc); - if (hglrc) { - _this->gl_data->wglMakeCurrent(hdc, hglrc); - - if (_this->gl_data->HAS_WGL_ARB_pixel_format) { - _this->gl_data->wglChoosePixelFormatARB(hdc, iAttribs, fAttribs, - 1, &pixel_format, - &matching); - } - - _this->gl_data->wglMakeCurrent(hdc, NULL); - _this->gl_data->wglDeleteContext(hglrc); - } - ReleaseDC(hwnd, hdc); - DestroyWindow(hwnd); - WIN_PumpEvents(_this); - - return pixel_format; -} - -/* actual work of WIN_GL_SetupWindow() happens here. */ -static int -WIN_GL_SetupWindowInternal(_THIS, SDL_Window * window) -{ - HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc; - PIXELFORMATDESCRIPTOR pfd; - int pixel_format = 0; - int iAttribs[64]; - int *iAttr; - int *iAccelAttr; - float fAttribs[1] = { 0 }; - - WIN_GL_SetupPixelFormat(_this, &pfd); - - /* setup WGL_ARB_pixel_format attribs */ - iAttr = &iAttribs[0]; - - *iAttr++ = WGL_DRAW_TO_WINDOW_ARB; - *iAttr++ = GL_TRUE; - *iAttr++ = WGL_RED_BITS_ARB; - *iAttr++ = _this->gl_config.red_size; - *iAttr++ = WGL_GREEN_BITS_ARB; - *iAttr++ = _this->gl_config.green_size; - *iAttr++ = WGL_BLUE_BITS_ARB; - *iAttr++ = _this->gl_config.blue_size; - - if (_this->gl_config.alpha_size) { - *iAttr++ = WGL_ALPHA_BITS_ARB; - *iAttr++ = _this->gl_config.alpha_size; - } - - *iAttr++ = WGL_DOUBLE_BUFFER_ARB; - *iAttr++ = _this->gl_config.double_buffer; - - *iAttr++ = WGL_DEPTH_BITS_ARB; - *iAttr++ = _this->gl_config.depth_size; - - if (_this->gl_config.stencil_size) { - *iAttr++ = WGL_STENCIL_BITS_ARB; - *iAttr++ = _this->gl_config.stencil_size; - } - - if (_this->gl_config.accum_red_size) { - *iAttr++ = WGL_ACCUM_RED_BITS_ARB; - *iAttr++ = _this->gl_config.accum_red_size; - } - - if (_this->gl_config.accum_green_size) { - *iAttr++ = WGL_ACCUM_GREEN_BITS_ARB; - *iAttr++ = _this->gl_config.accum_green_size; - } - - if (_this->gl_config.accum_blue_size) { - *iAttr++ = WGL_ACCUM_BLUE_BITS_ARB; - *iAttr++ = _this->gl_config.accum_blue_size; - } - - if (_this->gl_config.accum_alpha_size) { - *iAttr++ = WGL_ACCUM_ALPHA_BITS_ARB; - *iAttr++ = _this->gl_config.accum_alpha_size; - } - - if (_this->gl_config.stereo) { - *iAttr++ = WGL_STEREO_ARB; - *iAttr++ = GL_TRUE; - } - - if (_this->gl_config.multisamplebuffers) { - *iAttr++ = WGL_SAMPLE_BUFFERS_ARB; - *iAttr++ = _this->gl_config.multisamplebuffers; - } - - if (_this->gl_config.multisamplesamples) { - *iAttr++ = WGL_SAMPLES_ARB; - *iAttr++ = _this->gl_config.multisamplesamples; - } - - if (_this->gl_config.framebuffer_srgb_capable) { - *iAttr++ = WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB; - *iAttr++ = _this->gl_config.framebuffer_srgb_capable; - } - - /* We always choose either FULL or NO accel on Windows, because of flaky - drivers. If the app didn't specify, we use FULL, because that's - probably what they wanted (and if you didn't care and got FULL, that's - a perfectly valid result in any case). */ - *iAttr++ = WGL_ACCELERATION_ARB; - iAccelAttr = iAttr; - if (_this->gl_config.accelerated) { - *iAttr++ = WGL_FULL_ACCELERATION_ARB; - } else { - *iAttr++ = WGL_NO_ACCELERATION_ARB; - } - - *iAttr = 0; - - /* Choose and set the closest available pixel format */ - pixel_format = WIN_GL_ChoosePixelFormatARB(_this, iAttribs, fAttribs); - - /* App said "don't care about accel" and FULL accel failed. Try NO. */ - if ( ( !pixel_format ) && ( _this->gl_config.accelerated < 0 ) ) { - *iAccelAttr = WGL_NO_ACCELERATION_ARB; - pixel_format = WIN_GL_ChoosePixelFormatARB(_this, iAttribs, fAttribs); - *iAccelAttr = WGL_FULL_ACCELERATION_ARB; /* if we try again. */ - } - if (!pixel_format) { - pixel_format = WIN_GL_ChoosePixelFormat(hdc, &pfd); - } - if (!pixel_format) { - return SDL_SetError("No matching GL pixel format available"); - } - if (!SetPixelFormat(hdc, pixel_format, &pfd)) { - return WIN_SetError("SetPixelFormat()"); - } - return 0; -} - -int -WIN_GL_SetupWindow(_THIS, SDL_Window * window) -{ - /* The current context is lost in here; save it and reset it. */ - SDL_Window *current_win = SDL_GL_GetCurrentWindow(); - SDL_GLContext current_ctx = SDL_GL_GetCurrentContext(); - const int retval = WIN_GL_SetupWindowInternal(_this, window); - WIN_GL_MakeCurrent(_this, current_win, current_ctx); - return retval; -} - -SDL_GLContext -WIN_GL_CreateContext(_THIS, SDL_Window * window) -{ - HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc; - HGLRC context, share_context; - - if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES && - !_this->gl_data->HAS_WGL_EXT_create_context_es2_profile) { -#if SDL_VIDEO_OPENGL_EGL - /* Switch to EGL based functions */ - WIN_GL_UnloadLibrary(_this); - _this->GL_LoadLibrary = WIN_GLES_LoadLibrary; - _this->GL_GetProcAddress = WIN_GLES_GetProcAddress; - _this->GL_UnloadLibrary = WIN_GLES_UnloadLibrary; - _this->GL_CreateContext = WIN_GLES_CreateContext; - _this->GL_MakeCurrent = WIN_GLES_MakeCurrent; - _this->GL_SetSwapInterval = WIN_GLES_SetSwapInterval; - _this->GL_GetSwapInterval = WIN_GLES_GetSwapInterval; - _this->GL_SwapWindow = WIN_GLES_SwapWindow; - _this->GL_DeleteContext = WIN_GLES_DeleteContext; - - if (WIN_GLES_LoadLibrary(_this, NULL) != 0) { - return NULL; - } - - return WIN_GLES_CreateContext(_this, window); -#else - SDL_SetError("SDL not configured with EGL support"); - return NULL; -#endif - } - - if (_this->gl_config.share_with_current_context) { - share_context = (HGLRC)SDL_GL_GetCurrentContext(); - } else { - share_context = 0; - } - - if (_this->gl_config.major_version < 3 && - _this->gl_config.profile_mask == 0 && - _this->gl_config.flags == 0) { - /* Create legacy context */ - context = _this->gl_data->wglCreateContext(hdc); - if( share_context != 0 ) { - _this->gl_data->wglShareLists(share_context, context); - } - } else { - PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; - HGLRC temp_context = _this->gl_data->wglCreateContext(hdc); - if (!temp_context) { - SDL_SetError("Could not create GL context"); - return NULL; - } - - /* Make the context current */ - if (WIN_GL_MakeCurrent(_this, window, temp_context) < 0) { - WIN_GL_DeleteContext(_this, temp_context); - return NULL; - } - - wglCreateContextAttribsARB = - (PFNWGLCREATECONTEXTATTRIBSARBPROC) _this->gl_data-> - wglGetProcAddress("wglCreateContextAttribsARB"); - if (!wglCreateContextAttribsARB) { - SDL_SetError("GL 3.x is not supported"); - context = temp_context; - } else { - /* max 10 attributes plus terminator */ - int attribs[11] = { - WGL_CONTEXT_MAJOR_VERSION_ARB, _this->gl_config.major_version, - WGL_CONTEXT_MINOR_VERSION_ARB, _this->gl_config.minor_version, - 0 - }; - int iattr = 4; - - /* SDL profile bits match WGL profile bits */ - if (_this->gl_config.profile_mask != 0) { - attribs[iattr++] = WGL_CONTEXT_PROFILE_MASK_ARB; - attribs[iattr++] = _this->gl_config.profile_mask; - } - - /* SDL flags match WGL flags */ - if (_this->gl_config.flags != 0) { - attribs[iattr++] = WGL_CONTEXT_FLAGS_ARB; - attribs[iattr++] = _this->gl_config.flags; - } - - /* only set if wgl extension is available */ - if (_this->gl_data->HAS_WGL_ARB_context_flush_control) { - attribs[iattr++] = WGL_CONTEXT_RELEASE_BEHAVIOR_ARB; - attribs[iattr++] = _this->gl_config.release_behavior ? - WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB : - WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB; - } - - attribs[iattr++] = 0; - - /* Create the GL 3.x context */ - context = wglCreateContextAttribsARB(hdc, share_context, attribs); - /* Delete the GL 2.x context */ - _this->gl_data->wglDeleteContext(temp_context); - } - } - - if (!context) { - WIN_SetError("Could not create GL context"); - return NULL; - } - - if (WIN_GL_MakeCurrent(_this, window, context) < 0) { - WIN_GL_DeleteContext(_this, context); - return NULL; - } - - return context; -} - -int -WIN_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) -{ - HDC hdc; - - if (!_this->gl_data) { - return SDL_SetError("OpenGL not initialized"); - } - - /* sanity check that higher level handled this. */ - SDL_assert(window || (!window && !context)); - - /* Some Windows drivers freak out if hdc is NULL, even when context is - NULL, against spec. Since hdc is _supposed_ to be ignored if context - is NULL, we either use the current GL window, or do nothing if we - already have no current context. */ - if (!window) { - window = SDL_GL_GetCurrentWindow(); - if (!window) { - SDL_assert(SDL_GL_GetCurrentContext() == NULL); - return 0; /* already done. */ - } - } - - hdc = ((SDL_WindowData *) window->driverdata)->hdc; - if (!_this->gl_data->wglMakeCurrent(hdc, (HGLRC) context)) { - return WIN_SetError("wglMakeCurrent()"); - } - return 0; -} - -int -WIN_GL_SetSwapInterval(_THIS, int interval) -{ - if ((interval < 0) && (!_this->gl_data->HAS_WGL_EXT_swap_control_tear)) { - return SDL_SetError("Negative swap interval unsupported in this GL"); - } else if (_this->gl_data->wglSwapIntervalEXT) { - if (_this->gl_data->wglSwapIntervalEXT(interval) != TRUE) { - return WIN_SetError("wglSwapIntervalEXT()"); - } - } else { - return SDL_Unsupported(); - } - return 0; -} - -int -WIN_GL_GetSwapInterval(_THIS) -{ - int retval = 0; - if (_this->gl_data->wglGetSwapIntervalEXT) { - retval = _this->gl_data->wglGetSwapIntervalEXT(); - } - return retval; -} - -void -WIN_GL_SwapWindow(_THIS, SDL_Window * window) -{ - HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc; - - SwapBuffers(hdc); -} - -void -WIN_GL_DeleteContext(_THIS, SDL_GLContext context) -{ - if (!_this->gl_data) { - return; - } - _this->gl_data->wglDeleteContext((HGLRC) context); -} - - -SDL_bool -WIN_GL_SetPixelFormatFrom(_THIS, SDL_Window * fromWindow, SDL_Window * toWindow) -{ - HDC hfromdc = ((SDL_WindowData *) fromWindow->driverdata)->hdc; - HDC htodc = ((SDL_WindowData *) toWindow->driverdata)->hdc; - BOOL result; - - /* get the pixel format of the fromWindow */ - int pixel_format = GetPixelFormat(hfromdc); - PIXELFORMATDESCRIPTOR pfd; - SDL_memset(&pfd, 0, sizeof(pfd)); - DescribePixelFormat(hfromdc, pixel_format, sizeof(pfd), &pfd); - - /* set the pixel format of the toWindow */ - result = SetPixelFormat(htodc, pixel_format, &pfd); - - return result ? SDL_TRUE : SDL_FALSE; -} - -#endif /* SDL_VIDEO_OPENGL_WGL */ - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsopengl.h b/3rdparty/SDL2/src/video/windows/SDL_windowsopengl.h deleted file mode 100644 index 7b95cc8d928..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsopengl.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_windowsopengl_h -#define _SDL_windowsopengl_h - -#if SDL_VIDEO_OPENGL_WGL - -struct SDL_GLDriverData -{ - SDL_bool HAS_WGL_ARB_pixel_format; - SDL_bool HAS_WGL_EXT_swap_control_tear; - SDL_bool HAS_WGL_EXT_create_context_es2_profile; - SDL_bool HAS_WGL_ARB_context_flush_control; - - void *(WINAPI * wglGetProcAddress) (const char *proc); - HGLRC(WINAPI * wglCreateContext) (HDC hdc); - BOOL(WINAPI * wglDeleteContext) (HGLRC hglrc); - BOOL(WINAPI * wglMakeCurrent) (HDC hdc, HGLRC hglrc); - BOOL(WINAPI * wglShareLists) (HGLRC hglrc1, HGLRC hglrc2); - BOOL(WINAPI * wglChoosePixelFormatARB) (HDC hdc, - const int *piAttribIList, - const FLOAT * pfAttribFList, - UINT nMaxFormats, - int *piFormats, - UINT * nNumFormats); - BOOL(WINAPI * wglGetPixelFormatAttribivARB) (HDC hdc, int iPixelFormat, - int iLayerPlane, - UINT nAttributes, - const int *piAttributes, - int *piValues); - BOOL (WINAPI * wglSwapIntervalEXT) (int interval); - int (WINAPI * wglGetSwapIntervalEXT) (void); -}; - -/* OpenGL functions */ -extern int WIN_GL_LoadLibrary(_THIS, const char *path); -extern void *WIN_GL_GetProcAddress(_THIS, const char *proc); -extern void WIN_GL_UnloadLibrary(_THIS); -extern int WIN_GL_SetupWindow(_THIS, SDL_Window * window); -extern SDL_GLContext WIN_GL_CreateContext(_THIS, SDL_Window * window); -extern int WIN_GL_MakeCurrent(_THIS, SDL_Window * window, - SDL_GLContext context); -extern int WIN_GL_SetSwapInterval(_THIS, int interval); -extern int WIN_GL_GetSwapInterval(_THIS); -extern void WIN_GL_SwapWindow(_THIS, SDL_Window * window); -extern void WIN_GL_DeleteContext(_THIS, SDL_GLContext context); -extern void WIN_GL_InitExtensions(_THIS); -extern SDL_bool WIN_GL_SetPixelFormatFrom(_THIS, SDL_Window * fromWindow, SDL_Window * toWindow); - -#ifndef WGL_ARB_pixel_format -#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_DRAW_TO_BITMAP_ARB 0x2002 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_NEED_PALETTE_ARB 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 -#define WGL_SWAP_METHOD_ARB 0x2007 -#define WGL_NUMBER_OVERLAYS_ARB 0x2008 -#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 -#define WGL_TRANSPARENT_ARB 0x200A -#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 -#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 -#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 -#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A -#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B -#define WGL_SHARE_DEPTH_ARB 0x200C -#define WGL_SHARE_STENCIL_ARB 0x200D -#define WGL_SHARE_ACCUM_ARB 0x200E -#define WGL_SUPPORT_GDI_ARB 0x200F -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_PIXEL_TYPE_ARB 0x2013 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_RED_SHIFT_ARB 0x2016 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_GREEN_SHIFT_ARB 0x2018 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_BLUE_SHIFT_ARB 0x201A -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_ALPHA_SHIFT_ARB 0x201C -#define WGL_ACCUM_BITS_ARB 0x201D -#define WGL_ACCUM_RED_BITS_ARB 0x201E -#define WGL_ACCUM_GREEN_BITS_ARB 0x201F -#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 -#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_AUX_BUFFERS_ARB 0x2024 -#define WGL_NO_ACCELERATION_ARB 0x2025 -#define WGL_GENERIC_ACCELERATION_ARB 0x2026 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_SWAP_EXCHANGE_ARB 0x2028 -#define WGL_SWAP_COPY_ARB 0x2029 -#define WGL_SWAP_UNDEFINED_ARB 0x202A -#define WGL_TYPE_RGBA_ARB 0x202B -#define WGL_TYPE_COLORINDEX_ARB 0x202C -#endif - -#ifndef WGL_ARB_multisample -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 -#endif - -#endif /* SDL_VIDEO_OPENGL_WGL */ - -#endif /* _SDL_windowsopengl_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsopengles.c b/3rdparty/SDL2/src/video/windows/SDL_windowsopengles.c deleted file mode 100644 index f66cc088a58..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsopengles.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS && SDL_VIDEO_OPENGL_EGL - -#include "SDL_windowsvideo.h" -#include "SDL_windowsopengles.h" -#include "SDL_windowsopengl.h" -#include "SDL_log.h" - -/* EGL implementation of SDL OpenGL support */ - -int -WIN_GLES_LoadLibrary(_THIS, const char *path) { - - /* If the profile requested is not GL ES, switch over to WIN_GL functions */ - if (_this->gl_config.profile_mask != SDL_GL_CONTEXT_PROFILE_ES) { -#if SDL_VIDEO_OPENGL_WGL - WIN_GLES_UnloadLibrary(_this); - _this->GL_LoadLibrary = WIN_GL_LoadLibrary; - _this->GL_GetProcAddress = WIN_GL_GetProcAddress; - _this->GL_UnloadLibrary = WIN_GL_UnloadLibrary; - _this->GL_CreateContext = WIN_GL_CreateContext; - _this->GL_MakeCurrent = WIN_GL_MakeCurrent; - _this->GL_SetSwapInterval = WIN_GL_SetSwapInterval; - _this->GL_GetSwapInterval = WIN_GL_GetSwapInterval; - _this->GL_SwapWindow = WIN_GL_SwapWindow; - _this->GL_DeleteContext = WIN_GL_DeleteContext; - return WIN_GL_LoadLibrary(_this, path); -#else - return SDL_SetError("SDL not configured with OpenGL/WGL support"); -#endif - } - - if (_this->egl_data == NULL) { - return SDL_EGL_LoadLibrary(_this, NULL, EGL_DEFAULT_DISPLAY); - } - - return 0; -} - -SDL_GLContext -WIN_GLES_CreateContext(_THIS, SDL_Window * window) -{ - SDL_GLContext context; - SDL_WindowData *data = (SDL_WindowData *)window->driverdata; - -#if SDL_VIDEO_OPENGL_WGL - if (_this->gl_config.profile_mask != SDL_GL_CONTEXT_PROFILE_ES) { - /* Switch to WGL based functions */ - WIN_GLES_UnloadLibrary(_this); - _this->GL_LoadLibrary = WIN_GL_LoadLibrary; - _this->GL_GetProcAddress = WIN_GL_GetProcAddress; - _this->GL_UnloadLibrary = WIN_GL_UnloadLibrary; - _this->GL_CreateContext = WIN_GL_CreateContext; - _this->GL_MakeCurrent = WIN_GL_MakeCurrent; - _this->GL_SetSwapInterval = WIN_GL_SetSwapInterval; - _this->GL_GetSwapInterval = WIN_GL_GetSwapInterval; - _this->GL_SwapWindow = WIN_GL_SwapWindow; - _this->GL_DeleteContext = WIN_GL_DeleteContext; - - if (WIN_GL_LoadLibrary(_this, NULL) != 0) { - return NULL; - } - - return WIN_GL_CreateContext(_this, window); - } -#endif - - context = SDL_EGL_CreateContext(_this, data->egl_surface); - return context; -} - -void -WIN_GLES_DeleteContext(_THIS, SDL_GLContext context) -{ - SDL_EGL_DeleteContext(_this, context); - WIN_GLES_UnloadLibrary(_this); -} - -SDL_EGL_SwapWindow_impl(WIN) -SDL_EGL_MakeCurrent_impl(WIN) - -int -WIN_GLES_SetupWindow(_THIS, SDL_Window * window) -{ - /* The current context is lost in here; save it and reset it. */ - SDL_WindowData *windowdata = (SDL_WindowData *) window->driverdata; - SDL_Window *current_win = SDL_GL_GetCurrentWindow(); - SDL_GLContext current_ctx = SDL_GL_GetCurrentContext(); - - - if (_this->egl_data == NULL) { - if (SDL_EGL_LoadLibrary(_this, NULL, EGL_DEFAULT_DISPLAY) < 0) { - SDL_EGL_UnloadLibrary(_this); - return -1; - } - } - - /* Create the GLES window surface */ - windowdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType)windowdata->hwnd); - - if (windowdata->egl_surface == EGL_NO_SURFACE) { - return SDL_SetError("Could not create GLES window surface"); - } - - return WIN_GLES_MakeCurrent(_this, current_win, current_ctx); -} - -int -WIN_GLES_SetSwapInterval(_THIS, int interval) -{ - /* FIXME: This should call SDL_EGL_SetSwapInterval, but ANGLE has a bug that prevents this - * from working if we do (the window contents freeze and don't swap properly). So, we ignore - * the request for now. - */ - SDL_Log("WARNING: Ignoring SDL_GL_SetSwapInterval call due to ANGLE bug"); - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS && SDL_VIDEO_OPENGL_EGL */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsopengles.h b/3rdparty/SDL2/src/video/windows/SDL_windowsopengles.h deleted file mode 100644 index dbdf5f6a17b..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsopengles.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_winopengles_h -#define _SDL_winopengles_h - -#if SDL_VIDEO_OPENGL_EGL - -#include "../SDL_sysvideo.h" -#include "../SDL_egl_c.h" - -/* OpenGLES functions */ -#define WIN_GLES_GetAttribute SDL_EGL_GetAttribute -#define WIN_GLES_GetProcAddress SDL_EGL_GetProcAddress -#define WIN_GLES_UnloadLibrary SDL_EGL_UnloadLibrary -#define WIN_GLES_GetSwapInterval SDL_EGL_GetSwapInterval -/* See the WIN_GLES_GetSwapInterval implementation to see why this is commented out */ -/*#define WIN_GLES_SetSwapInterval SDL_EGL_SetSwapInterval*/ -extern int WIN_GLES_SetSwapInterval(_THIS, int interval); - -extern int WIN_GLES_LoadLibrary(_THIS, const char *path); -extern SDL_GLContext WIN_GLES_CreateContext(_THIS, SDL_Window * window); -extern void WIN_GLES_SwapWindow(_THIS, SDL_Window * window); -extern int WIN_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); -extern void WIN_GLES_DeleteContext(_THIS, SDL_GLContext context); -extern int WIN_GLES_SetupWindow(_THIS, SDL_Window * window); - -#endif /* SDL_VIDEO_OPENGL_EGL */ - -#endif /* _SDL_winopengles_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsshape.c b/3rdparty/SDL2/src/video/windows/SDL_windowsshape.c deleted file mode 100644 index 0a50985a25d..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsshape.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "SDL_assert.h" -#include "SDL_windowsshape.h" -#include "SDL_windowsvideo.h" - -SDL_WindowShaper* -Win32_CreateShaper(SDL_Window * window) { - int resized_properly; - SDL_WindowShaper* result = (SDL_WindowShaper *)SDL_malloc(sizeof(SDL_WindowShaper)); - result->window = window; - result->mode.mode = ShapeModeDefault; - result->mode.parameters.binarizationCutoff = 1; - result->userx = result->usery = 0; - result->driverdata = (SDL_ShapeData*)SDL_malloc(sizeof(SDL_ShapeData)); - ((SDL_ShapeData*)result->driverdata)->mask_tree = NULL; - /* Put some driver-data here. */ - window->shaper = result; - resized_properly = Win32_ResizeWindowShape(window); - if (resized_properly != 0) - return NULL; - - return result; -} - -void -CombineRectRegions(SDL_ShapeTree* node,void* closure) { - HRGN mask_region = *((HRGN*)closure),temp_region = NULL; - if(node->kind == OpaqueShape) { - /* Win32 API regions exclude their outline, so we widen the region by one pixel in each direction to include the real outline. */ - temp_region = CreateRectRgn(node->data.shape.x,node->data.shape.y,node->data.shape.x + node->data.shape.w + 1,node->data.shape.y + node->data.shape.h + 1); - if(mask_region != NULL) { - CombineRgn(mask_region,mask_region,temp_region,RGN_OR); - DeleteObject(temp_region); - } - else - *((HRGN*)closure) = temp_region; - } -} - -int -Win32_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode) { - SDL_ShapeData *data; - HRGN mask_region = NULL; - - if( (shaper == NULL) || - (shape == NULL) || - ((shape->format->Amask == 0) && (shape_mode->mode != ShapeModeColorKey)) || - (shape->w != shaper->window->w) || - (shape->h != shaper->window->h) ) { - return SDL_INVALID_SHAPE_ARGUMENT; - } - - data = (SDL_ShapeData*)shaper->driverdata; - if(data->mask_tree != NULL) - SDL_FreeShapeTree(&data->mask_tree); - data->mask_tree = SDL_CalculateShapeTree(*shape_mode,shape); - - SDL_TraverseShapeTree(data->mask_tree,&CombineRectRegions,&mask_region); - SDL_assert(mask_region != NULL); - - SetWindowRgn(((SDL_WindowData *)(shaper->window->driverdata))->hwnd, mask_region, TRUE); - - return 0; -} - -int -Win32_ResizeWindowShape(SDL_Window *window) { - SDL_ShapeData* data; - - if (window == NULL) - return -1; - data = (SDL_ShapeData *)window->shaper->driverdata; - if (data == NULL) - return -1; - - if(data->mask_tree != NULL) - SDL_FreeShapeTree(&data->mask_tree); - if(window->shaper->hasshape == SDL_TRUE) { - window->shaper->userx = window->x; - window->shaper->usery = window->y; - SDL_SetWindowPosition(window,-1000,-1000); - } - - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsshape.h b/3rdparty/SDL2/src/video/windows/SDL_windowsshape.h deleted file mode 100644 index ddd8f49ba81..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsshape.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#ifndef _SDL_windowsshape_h -#define _SDL_windowsshape_h - -#include "SDL_video.h" -#include "SDL_shape.h" -#include "../SDL_sysvideo.h" -#include "../SDL_shape_internals.h" - -typedef struct { - SDL_ShapeTree *mask_tree; -} SDL_ShapeData; - -extern SDL_WindowShaper* Win32_CreateShaper(SDL_Window * window); -extern int Win32_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode); -extern int Win32_ResizeWindowShape(SDL_Window *window); - -#endif /* _SDL_windowsshape_h */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsvideo.c b/3rdparty/SDL2/src/video/windows/SDL_windowsvideo.c deleted file mode 100644 index 21f63a018fc..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsvideo.c +++ /dev/null @@ -1,427 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "SDL_main.h" -#include "SDL_video.h" -#include "SDL_hints.h" -#include "SDL_mouse.h" -#include "SDL_system.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" - -#include "SDL_windowsvideo.h" -#include "SDL_windowsframebuffer.h" -#include "SDL_windowsshape.h" - -/* Initialization/Query functions */ -static int WIN_VideoInit(_THIS); -static void WIN_VideoQuit(_THIS); - -/* Hints */ -SDL_bool g_WindowsEnableMessageLoop = SDL_TRUE; -SDL_bool g_WindowFrameUsableWhileCursorHidden = SDL_TRUE; - -static void UpdateWindowsEnableMessageLoop(void *userdata, const char *name, const char *oldValue, const char *newValue) -{ - if (newValue && *newValue == '0') { - g_WindowsEnableMessageLoop = SDL_FALSE; - } else { - g_WindowsEnableMessageLoop = SDL_TRUE; - } -} - -static void UpdateWindowFrameUsableWhileCursorHidden(void *userdata, const char *name, const char *oldValue, const char *newValue) -{ - if (newValue && *newValue == '0') { - g_WindowFrameUsableWhileCursorHidden = SDL_FALSE; - } else { - g_WindowFrameUsableWhileCursorHidden = SDL_TRUE; - } -} - - -/* Windows driver bootstrap functions */ - -static int -WIN_Available(void) -{ - return (1); -} - -static void -WIN_DeleteDevice(SDL_VideoDevice * device) -{ - SDL_VideoData *data = (SDL_VideoData *) device->driverdata; - - SDL_UnregisterApp(); - if (data->userDLL) { - SDL_UnloadObject(data->userDLL); - } - if (data->shcoreDLL) { - SDL_UnloadObject(data->shcoreDLL); - } - - SDL_free(device->driverdata); - SDL_free(device); -} - -static SDL_VideoDevice * -WIN_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - SDL_VideoData *data; - - SDL_RegisterApp(NULL, 0, NULL); - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (device) { - data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); - } else { - data = NULL; - } - if (!data) { - SDL_free(device); - SDL_OutOfMemory(); - return NULL; - } - device->driverdata = data; - - data->userDLL = SDL_LoadObject("USER32.DLL"); - if (data->userDLL) { - data->CloseTouchInputHandle = (BOOL (WINAPI *)(HTOUCHINPUT)) SDL_LoadFunction(data->userDLL, "CloseTouchInputHandle"); - data->GetTouchInputInfo = (BOOL (WINAPI *)(HTOUCHINPUT, UINT, PTOUCHINPUT, int)) SDL_LoadFunction(data->userDLL, "GetTouchInputInfo"); - data->RegisterTouchWindow = (BOOL (WINAPI *)(HWND, ULONG)) SDL_LoadFunction(data->userDLL, "RegisterTouchWindow"); - } - - data->shcoreDLL = SDL_LoadObject("SHCORE.DLL"); - if (data->shcoreDLL) { - data->GetDpiForMonitor = (HRESULT (WINAPI *)(HMONITOR, MONITOR_DPI_TYPE, UINT *, UINT *)) SDL_LoadFunction(data->shcoreDLL, "GetDpiForMonitor"); - } - - /* Set the function pointers */ - device->VideoInit = WIN_VideoInit; - device->VideoQuit = WIN_VideoQuit; - device->GetDisplayBounds = WIN_GetDisplayBounds; - device->GetDisplayUsableBounds = WIN_GetDisplayUsableBounds; - device->GetDisplayDPI = WIN_GetDisplayDPI; - device->GetDisplayModes = WIN_GetDisplayModes; - device->SetDisplayMode = WIN_SetDisplayMode; - device->PumpEvents = WIN_PumpEvents; - -#undef CreateWindow - device->CreateWindow = WIN_CreateWindow; - device->CreateWindowFrom = WIN_CreateWindowFrom; - device->SetWindowTitle = WIN_SetWindowTitle; - device->SetWindowIcon = WIN_SetWindowIcon; - device->SetWindowPosition = WIN_SetWindowPosition; - device->SetWindowSize = WIN_SetWindowSize; - device->SetWindowOpacity = WIN_SetWindowOpacity; - device->ShowWindow = WIN_ShowWindow; - device->HideWindow = WIN_HideWindow; - device->RaiseWindow = WIN_RaiseWindow; - device->MaximizeWindow = WIN_MaximizeWindow; - device->MinimizeWindow = WIN_MinimizeWindow; - device->RestoreWindow = WIN_RestoreWindow; - device->SetWindowBordered = WIN_SetWindowBordered; - device->SetWindowResizable = WIN_SetWindowResizable; - device->SetWindowFullscreen = WIN_SetWindowFullscreen; - device->SetWindowGammaRamp = WIN_SetWindowGammaRamp; - device->GetWindowGammaRamp = WIN_GetWindowGammaRamp; - device->SetWindowGrab = WIN_SetWindowGrab; - device->DestroyWindow = WIN_DestroyWindow; - device->GetWindowWMInfo = WIN_GetWindowWMInfo; - device->CreateWindowFramebuffer = WIN_CreateWindowFramebuffer; - device->UpdateWindowFramebuffer = WIN_UpdateWindowFramebuffer; - device->DestroyWindowFramebuffer = WIN_DestroyWindowFramebuffer; - device->OnWindowEnter = WIN_OnWindowEnter; - device->SetWindowHitTest = WIN_SetWindowHitTest; - - device->shape_driver.CreateShaper = Win32_CreateShaper; - device->shape_driver.SetWindowShape = Win32_SetWindowShape; - device->shape_driver.ResizeWindowShape = Win32_ResizeWindowShape; - -#if SDL_VIDEO_OPENGL_WGL - device->GL_LoadLibrary = WIN_GL_LoadLibrary; - device->GL_GetProcAddress = WIN_GL_GetProcAddress; - device->GL_UnloadLibrary = WIN_GL_UnloadLibrary; - device->GL_CreateContext = WIN_GL_CreateContext; - device->GL_MakeCurrent = WIN_GL_MakeCurrent; - device->GL_SetSwapInterval = WIN_GL_SetSwapInterval; - device->GL_GetSwapInterval = WIN_GL_GetSwapInterval; - device->GL_SwapWindow = WIN_GL_SwapWindow; - device->GL_DeleteContext = WIN_GL_DeleteContext; -#elif SDL_VIDEO_OPENGL_EGL - /* Use EGL based functions */ - device->GL_LoadLibrary = WIN_GLES_LoadLibrary; - device->GL_GetProcAddress = WIN_GLES_GetProcAddress; - device->GL_UnloadLibrary = WIN_GLES_UnloadLibrary; - device->GL_CreateContext = WIN_GLES_CreateContext; - device->GL_MakeCurrent = WIN_GLES_MakeCurrent; - device->GL_SetSwapInterval = WIN_GLES_SetSwapInterval; - device->GL_GetSwapInterval = WIN_GLES_GetSwapInterval; - device->GL_SwapWindow = WIN_GLES_SwapWindow; - device->GL_DeleteContext = WIN_GLES_DeleteContext; -#endif - device->StartTextInput = WIN_StartTextInput; - device->StopTextInput = WIN_StopTextInput; - device->SetTextInputRect = WIN_SetTextInputRect; - - device->SetClipboardText = WIN_SetClipboardText; - device->GetClipboardText = WIN_GetClipboardText; - device->HasClipboardText = WIN_HasClipboardText; - - device->free = WIN_DeleteDevice; - - return device; -} - - -VideoBootStrap WINDOWS_bootstrap = { - "windows", "SDL Windows video driver", WIN_Available, WIN_CreateDevice -}; - -int -WIN_VideoInit(_THIS) -{ - if (WIN_InitModes(_this) < 0) { - return -1; - } - - WIN_InitKeyboard(_this); - WIN_InitMouse(_this); - - SDL_AddHintCallback(SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP, UpdateWindowsEnableMessageLoop, NULL); - SDL_AddHintCallback(SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN, UpdateWindowFrameUsableWhileCursorHidden, NULL); - - return 0; -} - -void -WIN_VideoQuit(_THIS) -{ - WIN_QuitModes(_this); - WIN_QuitKeyboard(_this); - WIN_QuitMouse(_this); -} - - -#define D3D_DEBUG_INFO -#include <d3d9.h> - -SDL_bool -D3D_LoadDLL(void **pD3DDLL, IDirect3D9 **pDirect3D9Interface) -{ - *pD3DDLL = SDL_LoadObject("D3D9.DLL"); - if (*pD3DDLL) { - typedef IDirect3D9 *(WINAPI *Direct3DCreate9_t) (UINT SDKVersion); - Direct3DCreate9_t Direct3DCreate9Func; - -#ifdef USE_D3D9EX - typedef HRESULT (WINAPI *Direct3DCreate9Ex_t)(UINT SDKVersion, IDirect3D9Ex **ppD3D); - Direct3DCreate9Ex_t Direct3DCreate9ExFunc; - - Direct3DCreate9ExFunc = (Direct3DCreate9Ex_t)SDL_LoadFunction(*pD3DDLL, "Direct3DCreate9Ex"); - if (Direct3DCreate9ExFunc) { - IDirect3D9Ex *pDirect3D9ExInterface; - HRESULT hr = Direct3DCreate9ExFunc(D3D_SDK_VERSION, &pDirect3D9ExInterface); - if (SUCCEEDED(hr)) { - const GUID IDirect3D9_GUID = { 0x81bdcbca, 0x64d4, 0x426d, { 0xae, 0x8d, 0xad, 0x1, 0x47, 0xf4, 0x27, 0x5c } }; - hr = IDirect3D9Ex_QueryInterface(pDirect3D9ExInterface, &IDirect3D9_GUID, (void**)pDirect3D9Interface); - IDirect3D9Ex_Release(pDirect3D9ExInterface); - if (SUCCEEDED(hr)) { - return SDL_TRUE; - } - } - } -#endif /* USE_D3D9EX */ - - Direct3DCreate9Func = (Direct3DCreate9_t)SDL_LoadFunction(*pD3DDLL, "Direct3DCreate9"); - if (Direct3DCreate9Func) { - *pDirect3D9Interface = Direct3DCreate9Func(D3D_SDK_VERSION); - if (*pDirect3D9Interface) { - return SDL_TRUE; - } - } - - SDL_UnloadObject(*pD3DDLL); - *pD3DDLL = NULL; - } - *pDirect3D9Interface = NULL; - return SDL_FALSE; -} - - -int -SDL_Direct3D9GetAdapterIndex(int displayIndex) -{ - void *pD3DDLL; - IDirect3D9 *pD3D; - if (!D3D_LoadDLL(&pD3DDLL, &pD3D)) { - SDL_SetError("Unable to create Direct3D interface"); - return D3DADAPTER_DEFAULT; - } else { - SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex); - int adapterIndex = D3DADAPTER_DEFAULT; - - if (!pData) { - SDL_SetError("Invalid display index"); - adapterIndex = -1; /* make sure we return something invalid */ - } else { - char *displayName = WIN_StringToUTF8(pData->DeviceName); - unsigned int count = IDirect3D9_GetAdapterCount(pD3D); - unsigned int i; - for (i=0; i<count; i++) { - D3DADAPTER_IDENTIFIER9 id; - IDirect3D9_GetAdapterIdentifier(pD3D, i, 0, &id); - - if (SDL_strcmp(id.DeviceName, displayName) == 0) { - adapterIndex = i; - break; - } - } - SDL_free(displayName); - } - - /* free up the D3D stuff we inited */ - IDirect3D9_Release(pD3D); - SDL_UnloadObject(pD3DDLL); - - return adapterIndex; - } -} - -#if HAVE_DXGI_H -#define CINTERFACE -#define COBJMACROS -#include <dxgi.h> - -static SDL_bool -DXGI_LoadDLL(void **pDXGIDLL, IDXGIFactory **pDXGIFactory) -{ - *pDXGIDLL = SDL_LoadObject("DXGI.DLL"); - if (*pDXGIDLL) { - HRESULT (WINAPI *CreateDXGI)(REFIID riid, void **ppFactory); - - CreateDXGI = - (HRESULT (WINAPI *) (REFIID, void**)) SDL_LoadFunction(*pDXGIDLL, - "CreateDXGIFactory"); - if (CreateDXGI) { - GUID dxgiGUID = {0x7b7166ec,0x21c7,0x44ae,{0xb2,0x1a,0xc9,0xae,0x32,0x1a,0xe3,0x69}}; - if (!SUCCEEDED(CreateDXGI(&dxgiGUID, (void**)pDXGIFactory))) { - *pDXGIFactory = NULL; - } - } - if (!*pDXGIFactory) { - SDL_UnloadObject(*pDXGIDLL); - *pDXGIDLL = NULL; - return SDL_FALSE; - } - - return SDL_TRUE; - } else { - *pDXGIFactory = NULL; - return SDL_FALSE; - } -} -#endif - - -SDL_bool -SDL_DXGIGetOutputInfo(int displayIndex, int *adapterIndex, int *outputIndex) -{ -#if !HAVE_DXGI_H - if (adapterIndex) *adapterIndex = -1; - if (outputIndex) *outputIndex = -1; - SDL_SetError("SDL was compiled without DXGI support due to missing dxgi.h header"); - return SDL_FALSE; -#else - SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex); - void *pDXGIDLL; - char *displayName; - int nAdapter, nOutput; - IDXGIFactory *pDXGIFactory; - IDXGIAdapter *pDXGIAdapter; - IDXGIOutput* pDXGIOutput; - - if (!adapterIndex) { - SDL_InvalidParamError("adapterIndex"); - return SDL_FALSE; - } - - if (!outputIndex) { - SDL_InvalidParamError("outputIndex"); - return SDL_FALSE; - } - - *adapterIndex = -1; - *outputIndex = -1; - - if (!pData) { - SDL_SetError("Invalid display index"); - return SDL_FALSE; - } - - if (!DXGI_LoadDLL(&pDXGIDLL, &pDXGIFactory)) { - SDL_SetError("Unable to create DXGI interface"); - return SDL_FALSE; - } - - displayName = WIN_StringToUTF8(pData->DeviceName); - nAdapter = 0; - while (*adapterIndex == -1 && SUCCEEDED(IDXGIFactory_EnumAdapters(pDXGIFactory, nAdapter, &pDXGIAdapter))) { - nOutput = 0; - while (*adapterIndex == -1 && SUCCEEDED(IDXGIAdapter_EnumOutputs(pDXGIAdapter, nOutput, &pDXGIOutput))) { - DXGI_OUTPUT_DESC outputDesc; - if (SUCCEEDED(IDXGIOutput_GetDesc(pDXGIOutput, &outputDesc))) { - char *outputName = WIN_StringToUTF8(outputDesc.DeviceName); - if (SDL_strcmp(outputName, displayName) == 0) { - *adapterIndex = nAdapter; - *outputIndex = nOutput; - } - SDL_free(outputName); - } - IDXGIOutput_Release(pDXGIOutput); - nOutput++; - } - IDXGIAdapter_Release(pDXGIAdapter); - nAdapter++; - } - SDL_free(displayName); - - /* free up the DXGI factory */ - IDXGIFactory_Release(pDXGIFactory); - SDL_UnloadObject(pDXGIDLL); - - if (*adapterIndex == -1) { - return SDL_FALSE; - } else { - return SDL_TRUE; - } -#endif -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vim: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsvideo.h b/3rdparty/SDL2/src/video/windows/SDL_windowsvideo.h deleted file mode 100644 index 912d8763df1..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsvideo.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_windowsvideo_h -#define _SDL_windowsvideo_h - -#include "../../core/windows/SDL_windows.h" - -#include "../SDL_sysvideo.h" - -#if defined(_MSC_VER) && (_MSC_VER >= 1500) -#include <msctf.h> -#else -#include "SDL_msctf.h" -#endif - -#include <imm.h> - -#define MAX_CANDLIST 10 -#define MAX_CANDLENGTH 256 - -#include "SDL_windowsclipboard.h" -#include "SDL_windowsevents.h" -#include "SDL_windowskeyboard.h" -#include "SDL_windowsmodes.h" -#include "SDL_windowsmouse.h" -#include "SDL_windowsopengl.h" -#include "SDL_windowsopengles.h" -#include "SDL_windowswindow.h" -#include "SDL_events.h" -#include "SDL_loadso.h" - - -#if WINVER < 0x0601 -/* Touch input definitions */ -#define TWF_FINETOUCH 1 -#define TWF_WANTPALM 2 - -#define TOUCHEVENTF_MOVE 0x0001 -#define TOUCHEVENTF_DOWN 0x0002 -#define TOUCHEVENTF_UP 0x0004 - -DECLARE_HANDLE(HTOUCHINPUT); - -typedef struct _TOUCHINPUT { - LONG x; - LONG y; - HANDLE hSource; - DWORD dwID; - DWORD dwFlags; - DWORD dwMask; - DWORD dwTime; - ULONG_PTR dwExtraInfo; - DWORD cxContact; - DWORD cyContact; -} TOUCHINPUT, *PTOUCHINPUT; - -#endif /* WINVER < 0x0601 */ - -#if WINVER < 0x0603 - -typedef enum MONITOR_DPI_TYPE { - MDT_EFFECTIVE_DPI = 0, - MDT_ANGULAR_DPI = 1, - MDT_RAW_DPI = 2, - MDT_DEFAULT = MDT_EFFECTIVE_DPI -} MONITOR_DPI_TYPE; - -#endif /* WINVER < 0x0603 */ - -typedef BOOL (*PFNSHFullScreen)(HWND, DWORD); -typedef void (*PFCoordTransform)(SDL_Window*, POINT*); - -typedef struct -{ - void **lpVtbl; - int refcount; - void *data; -} TSFSink; - -/* Definition from Win98DDK version of IMM.H */ -typedef struct tagINPUTCONTEXT2 { - HWND hWnd; - BOOL fOpen; - POINT ptStatusWndPos; - POINT ptSoftKbdPos; - DWORD fdwConversion; - DWORD fdwSentence; - union { - LOGFONTA A; - LOGFONTW W; - } lfFont; - COMPOSITIONFORM cfCompForm; - CANDIDATEFORM cfCandForm[4]; - HIMCC hCompStr; - HIMCC hCandInfo; - HIMCC hGuideLine; - HIMCC hPrivate; - DWORD dwNumMsgBuf; - HIMCC hMsgBuf; - DWORD fdwInit; - DWORD dwReserve[3]; -} INPUTCONTEXT2, *PINPUTCONTEXT2, NEAR *NPINPUTCONTEXT2, FAR *LPINPUTCONTEXT2; - -/* Private display data */ - -typedef struct SDL_VideoData -{ - int render; - - DWORD clipboard_count; - - /* Touch input functions */ - void* userDLL; - BOOL (WINAPI *CloseTouchInputHandle)( HTOUCHINPUT ); - BOOL (WINAPI *GetTouchInputInfo)( HTOUCHINPUT, UINT, PTOUCHINPUT, int ); - BOOL (WINAPI *RegisterTouchWindow)( HWND, ULONG ); - - void* shcoreDLL; - HRESULT (WINAPI *GetDpiForMonitor)( HMONITOR hmonitor, - MONITOR_DPI_TYPE dpiType, - UINT *dpiX, - UINT *dpiY ); - - SDL_bool ime_com_initialized; - struct ITfThreadMgr *ime_threadmgr; - SDL_bool ime_initialized; - SDL_bool ime_enabled; - SDL_bool ime_available; - HWND ime_hwnd_main; - HWND ime_hwnd_current; - HIMC ime_himc; - - WCHAR ime_composition[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; - WCHAR ime_readingstring[16]; - int ime_cursor; - - SDL_bool ime_candlist; - WCHAR ime_candidates[MAX_CANDLIST][MAX_CANDLENGTH]; - DWORD ime_candcount; - DWORD ime_candref; - DWORD ime_candsel; - UINT ime_candpgsize; - int ime_candlistindexbase; - SDL_bool ime_candvertical; - - SDL_bool ime_dirty; - SDL_Rect ime_rect; - SDL_Rect ime_candlistrect; - int ime_winwidth; - int ime_winheight; - - HKL ime_hkl; - void* ime_himm32; - UINT (WINAPI *GetReadingString)(HIMC himc, UINT uReadingBufLen, LPWSTR lpwReadingBuf, PINT pnErrorIndex, BOOL *pfIsVertical, PUINT puMaxReadingLen); - BOOL (WINAPI *ShowReadingWindow)(HIMC himc, BOOL bShow); - LPINPUTCONTEXT2 (WINAPI *ImmLockIMC)(HIMC himc); - BOOL (WINAPI *ImmUnlockIMC)(HIMC himc); - LPVOID (WINAPI *ImmLockIMCC)(HIMCC himcc); - BOOL (WINAPI *ImmUnlockIMCC)(HIMCC himcc); - - SDL_bool ime_uiless; - struct ITfThreadMgrEx *ime_threadmgrex; - DWORD ime_uielemsinkcookie; - DWORD ime_alpnsinkcookie; - DWORD ime_openmodesinkcookie; - DWORD ime_convmodesinkcookie; - TSFSink *ime_uielemsink; - TSFSink *ime_ippasink; -} SDL_VideoData; - -extern SDL_bool g_WindowsEnableMessageLoop; -extern SDL_bool g_WindowFrameUsableWhileCursorHidden; - -typedef struct IDirect3D9 IDirect3D9; -extern SDL_bool D3D_LoadDLL( void **pD3DDLL, IDirect3D9 **pDirect3D9Interface ); - -#endif /* _SDL_windowsvideo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowswindow.c b/3rdparty/SDL2/src/video/windows/SDL_windowswindow.c deleted file mode 100644 index 5ce40e6ba7a..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowswindow.c +++ /dev/null @@ -1,881 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "../../core/windows/SDL_windows.h" - -#include "SDL_assert.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../../events/SDL_keyboard_c.h" -#include "../../events/SDL_mouse_c.h" - -#include "SDL_windowsvideo.h" -#include "SDL_windowswindow.h" -#include "SDL_hints.h" - -/* Dropfile support */ -#include <shellapi.h> - -/* This is included after SDL_windowsvideo.h, which includes windows.h */ -#include "SDL_syswm.h" - -/* Windows CE compatibility */ -#ifndef SWP_NOCOPYBITS -#define SWP_NOCOPYBITS 0 -#endif - -/* Fake window to help with DirectInput events. */ -HWND SDL_HelperWindow = NULL; -static WCHAR *SDL_HelperWindowClassName = TEXT("SDLHelperWindowInputCatcher"); -static WCHAR *SDL_HelperWindowName = TEXT("SDLHelperWindowInputMsgWindow"); -static ATOM SDL_HelperWindowClass = 0; - -#define STYLE_BASIC (WS_CLIPSIBLINGS | WS_CLIPCHILDREN) -#define STYLE_FULLSCREEN (WS_POPUP) -#define STYLE_BORDERLESS (WS_POPUP) -#define STYLE_NORMAL (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX) -#define STYLE_RESIZABLE (WS_THICKFRAME | WS_MAXIMIZEBOX) -#define STYLE_MASK (STYLE_FULLSCREEN | STYLE_BORDERLESS | STYLE_NORMAL | STYLE_RESIZABLE) - -static DWORD -GetWindowStyle(SDL_Window * window) -{ - DWORD style = 0; - - if (window->flags & SDL_WINDOW_FULLSCREEN) { - style |= STYLE_FULLSCREEN; - } else { - if (window->flags & SDL_WINDOW_BORDERLESS) { - style |= STYLE_BORDERLESS; - } else { - style |= STYLE_NORMAL; - } - if (window->flags & SDL_WINDOW_RESIZABLE) { - style |= STYLE_RESIZABLE; - } - } - return style; -} - -static void -WIN_SetWindowPositionInternal(_THIS, SDL_Window * window, UINT flags) -{ - SDL_WindowData *data = (SDL_WindowData *)window->driverdata; - HWND hwnd = data->hwnd; - RECT rect; - DWORD style; - HWND top; - BOOL menu; - int x, y; - int w, h; - - /* Figure out what the window area will be */ - if (SDL_ShouldAllowTopmost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) { - top = HWND_TOPMOST; - } else { - top = HWND_NOTOPMOST; - } - style = GetWindowLong(hwnd, GWL_STYLE); - rect.left = 0; - rect.top = 0; - rect.right = window->w; - rect.bottom = window->h; - menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL); - AdjustWindowRectEx(&rect, style, menu, 0); - w = (rect.right - rect.left); - h = (rect.bottom - rect.top); - x = window->x + rect.left; - y = window->y + rect.top; - - data->expected_resize = SDL_TRUE; - SetWindowPos(hwnd, top, x, y, w, h, flags); - data->expected_resize = SDL_FALSE; -} - -static int -SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, SDL_bool created) -{ - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - SDL_WindowData *data; - - /* Allocate the window data */ - data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data)); - if (!data) { - return SDL_OutOfMemory(); - } - data->window = window; - data->hwnd = hwnd; - data->hdc = GetDC(hwnd); - data->created = created; - data->mouse_button_flags = 0; - data->videodata = videodata; - data->initializing = SDL_TRUE; - - window->driverdata = data; - - /* Associate the data with the window */ - if (!SetProp(hwnd, TEXT("SDL_WindowData"), data)) { - ReleaseDC(hwnd, data->hdc); - SDL_free(data); - return WIN_SetError("SetProp() failed"); - } - - /* Set up the window proc function */ -#ifdef GWLP_WNDPROC - data->wndproc = (WNDPROC) GetWindowLongPtr(hwnd, GWLP_WNDPROC); - if (data->wndproc == WIN_WindowProc) { - data->wndproc = NULL; - } else { - SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) WIN_WindowProc); - } -#else - data->wndproc = (WNDPROC) GetWindowLong(hwnd, GWL_WNDPROC); - if (data->wndproc == WIN_WindowProc) { - data->wndproc = NULL; - } else { - SetWindowLong(hwnd, GWL_WNDPROC, (LONG_PTR) WIN_WindowProc); - } -#endif - - /* Fill in the SDL window with the window data */ - { - RECT rect; - if (GetClientRect(hwnd, &rect)) { - int w = rect.right; - int h = rect.bottom; - if ((window->w && window->w != w) || (window->h && window->h != h)) { - /* We tried to create a window larger than the desktop and Windows didn't allow it. Override! */ - RECT rect; - DWORD style; - BOOL menu; - int x, y; - int w, h; - - /* Figure out what the window area will be */ - style = GetWindowLong(hwnd, GWL_STYLE); - rect.left = 0; - rect.top = 0; - rect.right = window->w; - rect.bottom = window->h; - menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL); - AdjustWindowRectEx(&rect, style, menu, 0); - w = (rect.right - rect.left); - h = (rect.bottom - rect.top); - x = window->x + rect.left; - y = window->y + rect.top; - - SetWindowPos(hwnd, HWND_NOTOPMOST, x, y, w, h, SWP_NOCOPYBITS | SWP_NOZORDER | SWP_NOACTIVATE); - } else { - window->w = w; - window->h = h; - } - } - } - { - POINT point; - point.x = 0; - point.y = 0; - if (ClientToScreen(hwnd, &point)) { - window->x = point.x; - window->y = point.y; - } - } - { - DWORD style = GetWindowLong(hwnd, GWL_STYLE); - if (style & WS_VISIBLE) { - window->flags |= SDL_WINDOW_SHOWN; - } else { - window->flags &= ~SDL_WINDOW_SHOWN; - } - if (style & (WS_BORDER | WS_THICKFRAME)) { - window->flags &= ~SDL_WINDOW_BORDERLESS; - } else { - window->flags |= SDL_WINDOW_BORDERLESS; - } - if (style & WS_THICKFRAME) { - window->flags |= SDL_WINDOW_RESIZABLE; - } else { - window->flags &= ~SDL_WINDOW_RESIZABLE; - } -#ifdef WS_MAXIMIZE - if (style & WS_MAXIMIZE) { - window->flags |= SDL_WINDOW_MAXIMIZED; - } else -#endif - { - window->flags &= ~SDL_WINDOW_MAXIMIZED; - } -#ifdef WS_MINIMIZE - if (style & WS_MINIMIZE) { - window->flags |= SDL_WINDOW_MINIMIZED; - } else -#endif - { - window->flags &= ~SDL_WINDOW_MINIMIZED; - } - } - if (GetFocus() == hwnd) { - window->flags |= SDL_WINDOW_INPUT_FOCUS; - SDL_SetKeyboardFocus(data->window); - - if (window->flags & SDL_WINDOW_INPUT_GRABBED) { - RECT rect; - GetClientRect(hwnd, &rect); - ClientToScreen(hwnd, (LPPOINT) & rect); - ClientToScreen(hwnd, (LPPOINT) & rect + 1); - ClipCursor(&rect); - } - } - - /* Enable multi-touch */ - if (videodata->RegisterTouchWindow) { - videodata->RegisterTouchWindow(hwnd, (TWF_FINETOUCH|TWF_WANTPALM)); - } - - /* Enable dropping files */ - DragAcceptFiles(hwnd, TRUE); - - data->initializing = SDL_FALSE; - - /* All done! */ - return 0; -} - -int -WIN_CreateWindow(_THIS, SDL_Window * window) -{ - HWND hwnd; - RECT rect; - DWORD style = STYLE_BASIC; - int x, y; - int w, h; - - style |= GetWindowStyle(window); - - /* Figure out what the window area will be */ - rect.left = window->x; - rect.top = window->y; - rect.right = window->x + window->w; - rect.bottom = window->y + window->h; - AdjustWindowRectEx(&rect, style, FALSE, 0); - x = rect.left; - y = rect.top; - w = (rect.right - rect.left); - h = (rect.bottom - rect.top); - - hwnd = - CreateWindow(SDL_Appname, TEXT(""), style, x, y, w, h, NULL, NULL, - SDL_Instance, NULL); - if (!hwnd) { - return WIN_SetError("Couldn't create window"); - } - - WIN_PumpEvents(_this); - - if (SetupWindowData(_this, window, hwnd, SDL_TRUE) < 0) { - DestroyWindow(hwnd); - return -1; - } - -#if SDL_VIDEO_OPENGL_WGL - /* We need to initialize the extensions before deciding how to create ES profiles */ - if (window->flags & SDL_WINDOW_OPENGL) { - WIN_GL_InitExtensions(_this); - } -#endif - -#if SDL_VIDEO_OPENGL_ES2 - if ((window->flags & SDL_WINDOW_OPENGL) && - _this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES -#if SDL_VIDEO_OPENGL_WGL - && (!_this->gl_data || !_this->gl_data->HAS_WGL_EXT_create_context_es2_profile) -#endif - ) { -#if SDL_VIDEO_OPENGL_EGL - if (WIN_GLES_SetupWindow(_this, window) < 0) { - WIN_DestroyWindow(_this, window); - return -1; - } -#else - return SDL_SetError("Could not create GLES window surface (no EGL support available)"); -#endif /* SDL_VIDEO_OPENGL_EGL */ - } else -#endif /* SDL_VIDEO_OPENGL_ES2 */ - -#if SDL_VIDEO_OPENGL_WGL - if (window->flags & SDL_WINDOW_OPENGL) { - if (WIN_GL_SetupWindow(_this, window) < 0) { - WIN_DestroyWindow(_this, window); - return -1; - } - } -#endif - - return 0; -} - -int -WIN_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) -{ - HWND hwnd = (HWND) data; - LPTSTR title; - int titleLen; - - /* Query the title from the existing window */ - titleLen = GetWindowTextLength(hwnd); - title = SDL_stack_alloc(TCHAR, titleLen + 1); - if (title) { - titleLen = GetWindowText(hwnd, title, titleLen); - } else { - titleLen = 0; - } - if (titleLen > 0) { - window->title = WIN_StringToUTF8(title); - } - if (title) { - SDL_stack_free(title); - } - - if (SetupWindowData(_this, window, hwnd, SDL_FALSE) < 0) { - return -1; - } - -#if SDL_VIDEO_OPENGL_WGL - { - const char *hint = SDL_GetHint(SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT); - if (hint) { - /* This hint is a pointer (in string form) of the address of - the window to share a pixel format with - */ - SDL_Window *otherWindow = NULL; - SDL_sscanf(hint, "%p", (void**)&otherWindow); - - /* Do some error checking on the pointer */ - if (otherWindow != NULL && otherWindow->magic == &_this->window_magic) - { - /* If the otherWindow has SDL_WINDOW_OPENGL set, set it for the new window as well */ - if (otherWindow->flags & SDL_WINDOW_OPENGL) - { - window->flags |= SDL_WINDOW_OPENGL; - if(!WIN_GL_SetPixelFormatFrom(_this, otherWindow, window)) { - return -1; - } - } - } - } - } -#endif - return 0; -} - -void -WIN_SetWindowTitle(_THIS, SDL_Window * window) -{ - HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; - LPTSTR title = WIN_UTF8ToString(window->title); - SetWindowText(hwnd, title); - SDL_free(title); -} - -void -WIN_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) -{ - HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; - HICON hicon = NULL; - BYTE *icon_bmp; - int icon_len, y; - SDL_RWops *dst; - - /* Create temporary bitmap buffer */ - icon_len = 40 + icon->h * icon->w * 4; - icon_bmp = SDL_stack_alloc(BYTE, icon_len); - dst = SDL_RWFromMem(icon_bmp, icon_len); - if (!dst) { - SDL_stack_free(icon_bmp); - return; - } - - /* Write the BITMAPINFO header */ - SDL_WriteLE32(dst, 40); - SDL_WriteLE32(dst, icon->w); - SDL_WriteLE32(dst, icon->h * 2); - SDL_WriteLE16(dst, 1); - SDL_WriteLE16(dst, 32); - SDL_WriteLE32(dst, BI_RGB); - SDL_WriteLE32(dst, icon->h * icon->w * 4); - SDL_WriteLE32(dst, 0); - SDL_WriteLE32(dst, 0); - SDL_WriteLE32(dst, 0); - SDL_WriteLE32(dst, 0); - - /* Write the pixels upside down into the bitmap buffer */ - SDL_assert(icon->format->format == SDL_PIXELFORMAT_ARGB8888); - y = icon->h; - while (y--) { - Uint8 *src = (Uint8 *) icon->pixels + y * icon->pitch; - SDL_RWwrite(dst, src, icon->pitch, 1); - } - - hicon = CreateIconFromResource(icon_bmp, icon_len, TRUE, 0x00030000); - - SDL_RWclose(dst); - SDL_stack_free(icon_bmp); - - /* Set the icon for the window */ - SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM) hicon); - - /* Set the icon in the task manager (should we do this?) */ - SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM) hicon); -} - -void -WIN_SetWindowPosition(_THIS, SDL_Window * window) -{ - WIN_SetWindowPositionInternal(_this, window, SWP_NOCOPYBITS | SWP_NOSIZE | SWP_NOACTIVATE); -} - -void -WIN_SetWindowSize(_THIS, SDL_Window * window) -{ - WIN_SetWindowPositionInternal(_this, window, SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOACTIVATE); -} - -void -WIN_ShowWindow(_THIS, SDL_Window * window) -{ - HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; - ShowWindow(hwnd, SW_SHOW); -} - -void -WIN_HideWindow(_THIS, SDL_Window * window) -{ - HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; - ShowWindow(hwnd, SW_HIDE); -} - -void -WIN_RaiseWindow(_THIS, SDL_Window * window) -{ - HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; - SetForegroundWindow(hwnd); -} - -void -WIN_MaximizeWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *)window->driverdata; - HWND hwnd = data->hwnd; - data->expected_resize = SDL_TRUE; - ShowWindow(hwnd, SW_MAXIMIZE); - data->expected_resize = SDL_FALSE; -} - -void -WIN_MinimizeWindow(_THIS, SDL_Window * window) -{ - HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; - ShowWindow(hwnd, SW_MINIMIZE); -} - -void -WIN_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) -{ - SDL_WindowData *data = (SDL_WindowData *)window->driverdata; - HWND hwnd = data->hwnd; - DWORD style = GetWindowLong(hwnd, GWL_STYLE); - - if (bordered) { - style &= ~STYLE_BORDERLESS; - style |= STYLE_NORMAL; - } else { - style &= ~STYLE_NORMAL; - style |= STYLE_BORDERLESS; - } - - data->in_border_change = SDL_TRUE; - SetWindowLong(hwnd, GWL_STYLE, style); - WIN_SetWindowPositionInternal(_this, window, SWP_NOCOPYBITS | SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOACTIVATE); - data->in_border_change = SDL_FALSE; -} - -void -WIN_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable) -{ - SDL_WindowData *data = (SDL_WindowData *)window->driverdata; - HWND hwnd = data->hwnd; - DWORD style = GetWindowLong(hwnd, GWL_STYLE); - - if (resizable) { - style |= STYLE_RESIZABLE; - } else { - style &= ~STYLE_RESIZABLE; - } - - SetWindowLong(hwnd, GWL_STYLE, style); -} - -void -WIN_RestoreWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *)window->driverdata; - HWND hwnd = data->hwnd; - data->expected_resize = SDL_TRUE; - ShowWindow(hwnd, SW_RESTORE); - data->expected_resize = SDL_FALSE; -} - -void -WIN_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - HWND hwnd = data->hwnd; - RECT rect; - SDL_Rect bounds; - DWORD style; - HWND top; - BOOL menu; - int x, y; - int w, h; - - if (SDL_ShouldAllowTopmost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) { - top = HWND_TOPMOST; - } else { - top = HWND_NOTOPMOST; - } - - style = GetWindowLong(hwnd, GWL_STYLE); - style &= ~STYLE_MASK; - style |= GetWindowStyle(window); - - WIN_GetDisplayBounds(_this, display, &bounds); - - if (fullscreen) { - x = bounds.x; - y = bounds.y; - w = bounds.w; - h = bounds.h; - - /* Unset the maximized flag. This fixes - https://bugzilla.libsdl.org/show_bug.cgi?id=3215 - */ - if (style & WS_MAXIMIZE) { - data->windowed_mode_was_maximized = SDL_TRUE; - style &= ~WS_MAXIMIZE; - } - } else { - /* Restore window-maximization state, as applicable. - Special care is taken to *not* do this if and when we're - alt-tab'ing away (to some other window; as indicated by - in_window_deactivation), otherwise - https://bugzilla.libsdl.org/show_bug.cgi?id=3215 can reproduce! - */ - if (data->windowed_mode_was_maximized && !data->in_window_deactivation) { - style |= WS_MAXIMIZE; - data->windowed_mode_was_maximized = SDL_FALSE; - } - rect.left = 0; - rect.top = 0; - rect.right = window->windowed.w; - rect.bottom = window->windowed.h; - menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL); - AdjustWindowRectEx(&rect, style, menu, 0); - w = (rect.right - rect.left); - h = (rect.bottom - rect.top); - x = window->windowed.x + rect.left; - y = window->windowed.y + rect.top; - } - SetWindowLong(hwnd, GWL_STYLE, style); - data->expected_resize = SDL_TRUE; - SetWindowPos(hwnd, top, x, y, w, h, SWP_NOCOPYBITS | SWP_NOACTIVATE); - data->expected_resize = SDL_FALSE; -} - -int -WIN_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp) -{ - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata; - HDC hdc; - BOOL succeeded = FALSE; - - hdc = CreateDC(data->DeviceName, NULL, NULL, NULL); - if (hdc) { - succeeded = SetDeviceGammaRamp(hdc, (LPVOID)ramp); - if (!succeeded) { - WIN_SetError("SetDeviceGammaRamp()"); - } - DeleteDC(hdc); - } - return succeeded ? 0 : -1; -} - -int -WIN_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp) -{ - SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); - SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata; - HDC hdc; - BOOL succeeded = FALSE; - - hdc = CreateDC(data->DeviceName, NULL, NULL, NULL); - if (hdc) { - succeeded = GetDeviceGammaRamp(hdc, (LPVOID)ramp); - if (!succeeded) { - WIN_SetError("GetDeviceGammaRamp()"); - } - DeleteDC(hdc); - } - return succeeded ? 0 : -1; -} - -void -WIN_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) -{ - WIN_UpdateClipCursor(window); - - if (window->flags & SDL_WINDOW_FULLSCREEN) { - UINT flags = SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOSIZE; - - if (!(window->flags & SDL_WINDOW_SHOWN)) { - flags |= SWP_NOACTIVATE; - } - WIN_SetWindowPositionInternal(_this, window, flags); - } -} - -void -WIN_DestroyWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - - if (data) { - ReleaseDC(data->hwnd, data->hdc); - RemoveProp(data->hwnd, TEXT("SDL_WindowData")); - if (data->created) { - DestroyWindow(data->hwnd); - } else { - /* Restore any original event handler... */ - if (data->wndproc != NULL) { -#ifdef GWLP_WNDPROC - SetWindowLongPtr(data->hwnd, GWLP_WNDPROC, - (LONG_PTR) data->wndproc); -#else - SetWindowLong(data->hwnd, GWL_WNDPROC, - (LONG_PTR) data->wndproc); -#endif - } - } - SDL_free(data); - } - window->driverdata = NULL; -} - -SDL_bool -WIN_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) -{ - const SDL_WindowData *data = (const SDL_WindowData *) window->driverdata; - if (info->version.major <= SDL_MAJOR_VERSION) { - info->subsystem = SDL_SYSWM_WINDOWS; - info->info.win.window = data->hwnd; - info->info.win.hdc = data->hdc; - return SDL_TRUE; - } else { - SDL_SetError("Application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } -} - - -/* - * Creates a HelperWindow used for DirectInput events. - */ -int -SDL_HelperWindowCreate(void) -{ - HINSTANCE hInstance = GetModuleHandle(NULL); - WNDCLASS wce; - - /* Make sure window isn't created twice. */ - if (SDL_HelperWindow != NULL) { - return 0; - } - - /* Create the class. */ - SDL_zero(wce); - wce.lpfnWndProc = DefWindowProc; - wce.lpszClassName = (LPCWSTR) SDL_HelperWindowClassName; - wce.hInstance = hInstance; - - /* Register the class. */ - SDL_HelperWindowClass = RegisterClass(&wce); - if (SDL_HelperWindowClass == 0 && GetLastError() != ERROR_CLASS_ALREADY_EXISTS) { - return WIN_SetError("Unable to create Helper Window Class"); - } - - /* Create the window. */ - SDL_HelperWindow = CreateWindowEx(0, SDL_HelperWindowClassName, - SDL_HelperWindowName, - WS_OVERLAPPED, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, HWND_MESSAGE, NULL, - hInstance, NULL); - if (SDL_HelperWindow == NULL) { - UnregisterClass(SDL_HelperWindowClassName, hInstance); - return WIN_SetError("Unable to create Helper Window"); - } - - return 0; -} - - -/* - * Destroys the HelperWindow previously created with SDL_HelperWindowCreate. - */ -void -SDL_HelperWindowDestroy(void) -{ - HINSTANCE hInstance = GetModuleHandle(NULL); - - /* Destroy the window. */ - if (SDL_HelperWindow != NULL) { - if (DestroyWindow(SDL_HelperWindow) == 0) { - WIN_SetError("Unable to destroy Helper Window"); - return; - } - SDL_HelperWindow = NULL; - } - - /* Unregister the class. */ - if (SDL_HelperWindowClass != 0) { - if ((UnregisterClass(SDL_HelperWindowClassName, hInstance)) == 0) { - WIN_SetError("Unable to destroy Helper Window Class"); - return; - } - SDL_HelperWindowClass = 0; - } -} - -void WIN_OnWindowEnter(_THIS, SDL_Window * window) -{ -#ifdef WM_MOUSELEAVE - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - TRACKMOUSEEVENT trackMouseEvent; - - if (!data || !data->hwnd) { - /* The window wasn't fully initialized */ - return; - } - - trackMouseEvent.cbSize = sizeof(TRACKMOUSEEVENT); - trackMouseEvent.dwFlags = TME_LEAVE; - trackMouseEvent.hwndTrack = data->hwnd; - - TrackMouseEvent(&trackMouseEvent); -#endif /* WM_MOUSELEAVE */ -} - -void -WIN_UpdateClipCursor(SDL_Window *window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_Mouse *mouse = SDL_GetMouse(); - - if (data->focus_click_pending) { - return; - } - - if ((mouse->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) && - (window->flags & SDL_WINDOW_INPUT_FOCUS)) { - if (mouse->relative_mode && !mouse->relative_mode_warp) { - LONG cx, cy; - RECT rect; - GetWindowRect(data->hwnd, &rect); - - cx = (rect.left + rect.right) / 2; - cy = (rect.top + rect.bottom) / 2; - - /* Make an absurdly small clip rect */ - rect.left = cx - 1; - rect.right = cx + 1; - rect.top = cy - 1; - rect.bottom = cy + 1; - - ClipCursor(&rect); - } else { - RECT rect; - if (GetClientRect(data->hwnd, &rect) && !IsRectEmpty(&rect)) { - ClientToScreen(data->hwnd, (LPPOINT) & rect); - ClientToScreen(data->hwnd, (LPPOINT) & rect + 1); - ClipCursor(&rect); - } - } - } else { - ClipCursor(NULL); - } -} - -int -WIN_SetWindowHitTest(SDL_Window *window, SDL_bool enabled) -{ - return 0; /* just succeed, the real work is done elsewhere. */ -} - -int -WIN_SetWindowOpacity(_THIS, SDL_Window * window, float opacity) -{ - const SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - const HWND hwnd = data->hwnd; - const LONG style = GetWindowLong(hwnd, GWL_EXSTYLE); - - SDL_assert(style != 0); - - if (opacity == 1.0f) { - /* want it fully opaque, just mark it unlayered if necessary. */ - if (style & WS_EX_LAYERED) { - if (SetWindowLong(hwnd, GWL_EXSTYLE, style & ~WS_EX_LAYERED) == 0) { - return WIN_SetError("SetWindowLong()"); - } - } - } else { - const BYTE alpha = (BYTE) ((int) (opacity * 255.0f)); - /* want it transparent, mark it layered if necessary. */ - if ((style & WS_EX_LAYERED) == 0) { - if (SetWindowLong(hwnd, GWL_EXSTYLE, style | WS_EX_LAYERED) == 0) { - return WIN_SetError("SetWindowLong()"); - } - } - - if (SetLayeredWindowAttributes(hwnd, 0, alpha, LWA_ALPHA) == 0) { - return WIN_SetError("SetLayeredWindowAttributes()"); - } - } - - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowswindow.h b/3rdparty/SDL2/src/video/windows/SDL_windowswindow.h deleted file mode 100644 index 7d50ba66e8b..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowswindow.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_windowswindow_h -#define _SDL_windowswindow_h - -#if SDL_VIDEO_OPENGL_EGL -#include "../SDL_egl_c.h" -#endif - -typedef struct -{ - SDL_Window *window; - HWND hwnd; - HDC hdc; - HDC mdc; - HBITMAP hbm; - WNDPROC wndproc; - SDL_bool created; - WPARAM mouse_button_flags; - SDL_bool initializing; - SDL_bool expected_resize; - SDL_bool in_border_change; - SDL_bool in_title_click; - Uint8 focus_click_pending; - SDL_bool windowed_mode_was_maximized; - SDL_bool in_window_deactivation; - struct SDL_VideoData *videodata; -#if SDL_VIDEO_OPENGL_EGL - EGLSurface egl_surface; -#endif -} SDL_WindowData; - -extern int WIN_CreateWindow(_THIS, SDL_Window * window); -extern int WIN_CreateWindowFrom(_THIS, SDL_Window * window, const void *data); -extern void WIN_SetWindowTitle(_THIS, SDL_Window * window); -extern void WIN_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon); -extern void WIN_SetWindowPosition(_THIS, SDL_Window * window); -extern void WIN_SetWindowSize(_THIS, SDL_Window * window); -extern int WIN_SetWindowOpacity(_THIS, SDL_Window * window, float opacity); -extern void WIN_ShowWindow(_THIS, SDL_Window * window); -extern void WIN_HideWindow(_THIS, SDL_Window * window); -extern void WIN_RaiseWindow(_THIS, SDL_Window * window); -extern void WIN_MaximizeWindow(_THIS, SDL_Window * window); -extern void WIN_MinimizeWindow(_THIS, SDL_Window * window); -extern void WIN_RestoreWindow(_THIS, SDL_Window * window); -extern void WIN_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered); -extern void WIN_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable); -extern void WIN_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen); -extern int WIN_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp); -extern int WIN_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp); -extern void WIN_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed); -extern void WIN_DestroyWindow(_THIS, SDL_Window * window); -extern SDL_bool WIN_GetWindowWMInfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo *info); -extern void WIN_OnWindowEnter(_THIS, SDL_Window * window); -extern void WIN_UpdateClipCursor(SDL_Window *window); -extern int WIN_SetWindowHitTest(SDL_Window *window, SDL_bool enabled); - -#endif /* _SDL_windowswindow_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/windows/wmmsg.h b/3rdparty/SDL2/src/video/windows/wmmsg.h deleted file mode 100644 index 8c1351fe925..00000000000 --- a/3rdparty/SDL2/src/video/windows/wmmsg.h +++ /dev/null @@ -1,1052 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#define MAX_WMMSG (sizeof(wmtab)/sizeof(wmtab[0])) - -char *wmtab[] = { - "WM_NULL", - "WM_CREATE", - "WM_DESTROY", - "WM_MOVE", - "UNKNOWN (4)", - "WM_SIZE", - "WM_ACTIVATE", - "WM_SETFOCUS", - "WM_KILLFOCUS", - "UNKNOWN (9)", - "WM_ENABLE", - "WM_SETREDRAW", - "WM_SETTEXT", - "WM_GETTEXT", - "WM_GETTEXTLENGTH", - "WM_PAINT", - "WM_CLOSE", - "WM_QUERYENDSESSION", - "WM_QUIT", - "WM_QUERYOPEN", - "WM_ERASEBKGND", - "WM_SYSCOLORCHANGE", - "WM_ENDSESSION", - "UNKNOWN (23)", - "WM_SHOWWINDOW", - "UNKNOWN (25)", - "WM_SETTINGCHANGE", - "WM_DEVMODECHANGE", - "WM_ACTIVATEAPP", - "WM_FONTCHANGE", - "WM_TIMECHANGE", - "WM_CANCELMODE", - "WM_SETCURSOR", - "WM_MOUSEACTIVATE", - "WM_CHILDACTIVATE", - "WM_QUEUESYNC", - "WM_GETMINMAXINFO", - "UNKNOWN (37)", - "WM_PAINTICON", - "WM_ICONERASEBKGND", - "WM_NEXTDLGCTL", - "UNKNOWN (41)", - "WM_SPOOLERSTATUS", - "WM_DRAWITEM", - "WM_MEASUREITEM", - "WM_DELETEITEM", - "WM_VKEYTOITEM", - "WM_CHARTOITEM", - "WM_SETFONT", - "WM_GETFONT", - "WM_SETHOTKEY", - "WM_GETHOTKEY", - "UNKNOWN (52)", - "UNKNOWN (53)", - "UNKNOWN (54)", - "WM_QUERYDRAGICON", - "UNKNOWN (56)", - "WM_COMPAREITEM", - "UNKNOWN (58)", - "UNKNOWN (59)", - "UNKNOWN (60)", - "WM_GETOBJECT", - "UNKNOWN (62)", - "UNKNOWN (63)", - "UNKNOWN (64)", - "WM_COMPACTING", - "UNKNOWN (66)", - "UNKNOWN (67)", - "WM_COMMNOTIFY", - "UNKNOWN (69)", - "WM_WINDOWPOSCHANGING", - "WM_WINDOWPOSCHANGED", - "WM_POWER", - "UNKNOWN (73)", - "WM_COPYDATA", - "WM_CANCELJOURNAL", - "UNKNOWN (76)", - "UNKNOWN (77)", - "WM_NOTIFY", - "UNKNOWN (79)", - "WM_INPUTLANGCHANGEREQUEST", - "WM_INPUTLANGCHANGE", - "WM_TCARD", - "WM_HELP", - "WM_USERCHANGED", - "WM_NOTIFYFORMAT", - "UNKNOWN (86)", - "UNKNOWN (87)", - "UNKNOWN (88)", - "UNKNOWN (89)", - "UNKNOWN (90)", - "UNKNOWN (91)", - "UNKNOWN (92)", - "UNKNOWN (93)", - "UNKNOWN (94)", - "UNKNOWN (95)", - "UNKNOWN (96)", - "UNKNOWN (97)", - "UNKNOWN (98)", - "UNKNOWN (99)", - "UNKNOWN (100)", - "UNKNOWN (101)", - "UNKNOWN (102)", - "UNKNOWN (103)", - "UNKNOWN (104)", - "UNKNOWN (105)", - "UNKNOWN (106)", - "UNKNOWN (107)", - "UNKNOWN (108)", - "UNKNOWN (109)", - "UNKNOWN (110)", - "UNKNOWN (111)", - "UNKNOWN (112)", - "UNKNOWN (113)", - "UNKNOWN (114)", - "UNKNOWN (115)", - "UNKNOWN (116)", - "UNKNOWN (117)", - "UNKNOWN (118)", - "UNKNOWN (119)", - "UNKNOWN (120)", - "UNKNOWN (121)", - "UNKNOWN (122)", - "WM_CONTEXTMENU", - "WM_STYLECHANGING", - "WM_STYLECHANGED", - "WM_DISPLAYCHANGE", - "WM_GETICON", - "WM_SETICON", - "WM_NCCREATE", - "WM_NCDESTROY", - "WM_NCCALCSIZE", - "WM_NCHITTEST", - "WM_NCPAINT", - "WM_NCACTIVATE", - "WM_GETDLGCODE", - "WM_SYNCPAINT", - "UNKNOWN (137)", - "UNKNOWN (138)", - "UNKNOWN (139)", - "UNKNOWN (140)", - "UNKNOWN (141)", - "UNKNOWN (142)", - "UNKNOWN (143)", - "UNKNOWN (144)", - "UNKNOWN (145)", - "UNKNOWN (146)", - "UNKNOWN (147)", - "UNKNOWN (148)", - "UNKNOWN (149)", - "UNKNOWN (150)", - "UNKNOWN (151)", - "UNKNOWN (152)", - "UNKNOWN (153)", - "UNKNOWN (154)", - "UNKNOWN (155)", - "UNKNOWN (156)", - "UNKNOWN (157)", - "UNKNOWN (158)", - "UNKNOWN (159)", - "WM_NCMOUSEMOVE", - "WM_NCLBUTTONDOWN", - "WM_NCLBUTTONUP", - "WM_NCLBUTTONDBLCLK", - "WM_NCRBUTTONDOWN", - "WM_NCRBUTTONUP", - "WM_NCRBUTTONDBLCLK", - "WM_NCMBUTTONDOWN", - "WM_NCMBUTTONUP", - "WM_NCMBUTTONDBLCLK", - "UNKNOWN (170)", - "WM_NCXBUTTONDOWN", - "WM_NCXBUTTONUP", - "WM_NCXBUTTONDBLCLK", - "WM_NCUAHDRAWCAPTION", - "WM_NCUAHDRAWFRAME", - "UNKNOWN (176)", - "UNKNOWN (177)", - "UNKNOWN (178)", - "UNKNOWN (179)", - "UNKNOWN (180)", - "UNKNOWN (181)", - "UNKNOWN (182)", - "UNKNOWN (183)", - "UNKNOWN (184)", - "UNKNOWN (185)", - "UNKNOWN (186)", - "UNKNOWN (187)", - "UNKNOWN (188)", - "UNKNOWN (189)", - "UNKNOWN (190)", - "UNKNOWN (191)", - "UNKNOWN (192)", - "UNKNOWN (193)", - "UNKNOWN (194)", - "UNKNOWN (195)", - "UNKNOWN (196)", - "UNKNOWN (197)", - "UNKNOWN (198)", - "UNKNOWN (199)", - "UNKNOWN (200)", - "UNKNOWN (201)", - "UNKNOWN (202)", - "UNKNOWN (203)", - "UNKNOWN (204)", - "UNKNOWN (205)", - "UNKNOWN (206)", - "UNKNOWN (207)", - "UNKNOWN (208)", - "UNKNOWN (209)", - "UNKNOWN (210)", - "UNKNOWN (211)", - "UNKNOWN (212)", - "UNKNOWN (213)", - "UNKNOWN (214)", - "UNKNOWN (215)", - "UNKNOWN (216)", - "UNKNOWN (217)", - "UNKNOWN (218)", - "UNKNOWN (219)", - "UNKNOWN (220)", - "UNKNOWN (221)", - "UNKNOWN (222)", - "UNKNOWN (223)", - "UNKNOWN (224)", - "UNKNOWN (225)", - "UNKNOWN (226)", - "UNKNOWN (227)", - "UNKNOWN (228)", - "UNKNOWN (229)", - "UNKNOWN (230)", - "UNKNOWN (231)", - "UNKNOWN (232)", - "UNKNOWN (233)", - "UNKNOWN (234)", - "UNKNOWN (235)", - "UNKNOWN (236)", - "UNKNOWN (237)", - "UNKNOWN (238)", - "UNKNOWN (239)", - "UNKNOWN (240)", - "UNKNOWN (241)", - "UNKNOWN (242)", - "UNKNOWN (243)", - "UNKNOWN (244)", - "UNKNOWN (245)", - "UNKNOWN (246)", - "UNKNOWN (247)", - "UNKNOWN (248)", - "UNKNOWN (249)", - "UNKNOWN (250)", - "UNKNOWN (251)", - "UNKNOWN (252)", - "UNKNOWN (253)", - "UNKNOWN (254)", - "WM_INPUT", - "WM_KEYDOWN", - "WM_KEYUP", - "WM_CHAR", - "WM_DEADCHAR", - "WM_SYSKEYDOWN", - "WM_SYSKEYUP", - "WM_SYSCHAR", - "WM_SYSDEADCHAR", - "WM_KEYLAST", - "UNKNOWN (265)", - "UNKNOWN (266)", - "UNKNOWN (267)", - "UNKNOWN (268)", - "UNKNOWN (269)", - "UNKNOWN (270)", - "UNKNOWN (271)", - "WM_INITDIALOG", - "WM_COMMAND", - "WM_SYSCOMMAND", - "WM_TIMER", - "WM_HSCROLL", - "WM_VSCROLL", - "WM_INITMENU", - "WM_INITMENUPOPUP", - "UNKNOWN (280)", - "WM_GESTURE", - "UNKNOWN (282)", - "UNKNOWN (283)", - "UNKNOWN (284)", - "UNKNOWN (285)", - "UNKNOWN (286)", - "WM_MENUSELECT", - "WM_MENUCHAR", - "WM_ENTERIDLE", - "WM_MENURBUTTONUP", - "WM_MENUDRAG", - "WM_MENUGETOBJECT", - "WM_UNINITMENUPOPUP", - "WM_MENUCOMMAND", - "UNKNOWN (295)", - "UNKNOWN (296)", - "UNKNOWN (297)", - "UNKNOWN (298)", - "UNKNOWN (299)", - "UNKNOWN (300)", - "UNKNOWN (301)", - "UNKNOWN (302)", - "UNKNOWN (303)", - "UNKNOWN (304)", - "UNKNOWN (305)", - "WM_CTLCOLORMSGBOX", - "WM_CTLCOLOREDIT", - "WM_CTLCOLORLISTBOX", - "WM_CTLCOLORBTN", - "WM_CTLCOLORDLG", - "WM_CTLCOLORSCROLLBAR", - "WM_CTLCOLORSTATIC", - "UNKNOWN (313)", - "UNKNOWN (314)", - "UNKNOWN (315)", - "UNKNOWN (316)", - "UNKNOWN (317)", - "UNKNOWN (318)", - "UNKNOWN (319)", - "UNKNOWN (320)", - "UNKNOWN (321)", - "UNKNOWN (322)", - "UNKNOWN (323)", - "UNKNOWN (324)", - "UNKNOWN (325)", - "UNKNOWN (326)", - "UNKNOWN (327)", - "UNKNOWN (328)", - "UNKNOWN (329)", - "UNKNOWN (330)", - "UNKNOWN (331)", - "UNKNOWN (332)", - "UNKNOWN (333)", - "UNKNOWN (334)", - "UNKNOWN (335)", - "UNKNOWN (336)", - "UNKNOWN (337)", - "UNKNOWN (338)", - "UNKNOWN (339)", - "UNKNOWN (340)", - "UNKNOWN (341)", - "UNKNOWN (342)", - "UNKNOWN (343)", - "UNKNOWN (344)", - "UNKNOWN (345)", - "UNKNOWN (346)", - "UNKNOWN (347)", - "UNKNOWN (348)", - "UNKNOWN (349)", - "UNKNOWN (350)", - "UNKNOWN (351)", - "UNKNOWN (352)", - "UNKNOWN (353)", - "UNKNOWN (354)", - "UNKNOWN (355)", - "UNKNOWN (356)", - "UNKNOWN (357)", - "UNKNOWN (358)", - "UNKNOWN (359)", - "UNKNOWN (360)", - "UNKNOWN (361)", - "UNKNOWN (362)", - "UNKNOWN (363)", - "UNKNOWN (364)", - "UNKNOWN (365)", - "UNKNOWN (366)", - "UNKNOWN (367)", - "UNKNOWN (368)", - "UNKNOWN (369)", - "UNKNOWN (370)", - "UNKNOWN (371)", - "UNKNOWN (372)", - "UNKNOWN (373)", - "UNKNOWN (374)", - "UNKNOWN (375)", - "UNKNOWN (376)", - "UNKNOWN (377)", - "UNKNOWN (378)", - "UNKNOWN (379)", - "UNKNOWN (380)", - "UNKNOWN (381)", - "UNKNOWN (382)", - "UNKNOWN (383)", - "UNKNOWN (384)", - "UNKNOWN (385)", - "UNKNOWN (386)", - "UNKNOWN (387)", - "UNKNOWN (388)", - "UNKNOWN (389)", - "UNKNOWN (390)", - "UNKNOWN (391)", - "UNKNOWN (392)", - "UNKNOWN (393)", - "UNKNOWN (394)", - "UNKNOWN (395)", - "UNKNOWN (396)", - "UNKNOWN (397)", - "UNKNOWN (398)", - "UNKNOWN (399)", - "UNKNOWN (400)", - "UNKNOWN (401)", - "UNKNOWN (402)", - "UNKNOWN (403)", - "UNKNOWN (404)", - "UNKNOWN (405)", - "UNKNOWN (406)", - "UNKNOWN (407)", - "UNKNOWN (408)", - "UNKNOWN (409)", - "UNKNOWN (410)", - "UNKNOWN (411)", - "UNKNOWN (412)", - "UNKNOWN (413)", - "UNKNOWN (414)", - "UNKNOWN (415)", - "UNKNOWN (416)", - "UNKNOWN (417)", - "UNKNOWN (418)", - "UNKNOWN (419)", - "UNKNOWN (420)", - "UNKNOWN (421)", - "UNKNOWN (422)", - "UNKNOWN (423)", - "UNKNOWN (424)", - "UNKNOWN (425)", - "UNKNOWN (426)", - "UNKNOWN (427)", - "UNKNOWN (428)", - "UNKNOWN (429)", - "UNKNOWN (430)", - "UNKNOWN (431)", - "UNKNOWN (432)", - "UNKNOWN (433)", - "UNKNOWN (434)", - "UNKNOWN (435)", - "UNKNOWN (436)", - "UNKNOWN (437)", - "UNKNOWN (438)", - "UNKNOWN (439)", - "UNKNOWN (440)", - "UNKNOWN (441)", - "UNKNOWN (442)", - "UNKNOWN (443)", - "UNKNOWN (444)", - "UNKNOWN (445)", - "UNKNOWN (446)", - "UNKNOWN (447)", - "UNKNOWN (448)", - "UNKNOWN (449)", - "UNKNOWN (450)", - "UNKNOWN (451)", - "UNKNOWN (452)", - "UNKNOWN (453)", - "UNKNOWN (454)", - "UNKNOWN (455)", - "UNKNOWN (456)", - "UNKNOWN (457)", - "UNKNOWN (458)", - "UNKNOWN (459)", - "UNKNOWN (460)", - "UNKNOWN (461)", - "UNKNOWN (462)", - "UNKNOWN (463)", - "UNKNOWN (464)", - "UNKNOWN (465)", - "UNKNOWN (466)", - "UNKNOWN (467)", - "UNKNOWN (468)", - "UNKNOWN (469)", - "UNKNOWN (470)", - "UNKNOWN (471)", - "UNKNOWN (472)", - "UNKNOWN (473)", - "UNKNOWN (474)", - "UNKNOWN (475)", - "UNKNOWN (476)", - "UNKNOWN (477)", - "UNKNOWN (478)", - "UNKNOWN (479)", - "UNKNOWN (480)", - "UNKNOWN (481)", - "UNKNOWN (482)", - "UNKNOWN (483)", - "UNKNOWN (484)", - "UNKNOWN (485)", - "UNKNOWN (486)", - "UNKNOWN (487)", - "UNKNOWN (488)", - "UNKNOWN (489)", - "UNKNOWN (490)", - "UNKNOWN (491)", - "UNKNOWN (492)", - "UNKNOWN (493)", - "UNKNOWN (494)", - "UNKNOWN (495)", - "UNKNOWN (496)", - "UNKNOWN (497)", - "UNKNOWN (498)", - "UNKNOWN (499)", - "UNKNOWN (500)", - "UNKNOWN (501)", - "UNKNOWN (502)", - "UNKNOWN (503)", - "UNKNOWN (504)", - "UNKNOWN (505)", - "UNKNOWN (506)", - "UNKNOWN (507)", - "UNKNOWN (508)", - "UNKNOWN (509)", - "UNKNOWN (510)", - "UNKNOWN (511)", - "WM_MOUSEMOVE", - "WM_LBUTTONDOWN", - "WM_LBUTTONUP", - "WM_LBUTTONDBLCLK", - "WM_RBUTTONDOWN", - "WM_RBUTTONUP", - "WM_RBUTTONDBLCLK", - "WM_MBUTTONDOWN", - "WM_MBUTTONUP", - "WM_MOUSELAST", - "WM_MOUSEWHEEL", - "WM_XBUTTONDOWN", - "WM_XBUTTONUP", - "UNKNOWN (525)", - "UNKNOWN (526)", - "UNKNOWN (527)", - "WM_PARENTNOTIFY", - "WM_ENTERMENULOOP", - "WM_EXITMENULOOP", - "WM_NEXTMENU", - "WM_SIZING", - "WM_CAPTURECHANGED", - "WM_MOVING", - "UNKNOWN (535)", - "WM_POWERBROADCAST", - "WM_DEVICECHANGE", - "UNKNOWN (538)", - "UNKNOWN (539)", - "UNKNOWN (540)", - "UNKNOWN (541)", - "UNKNOWN (542)", - "UNKNOWN (543)", - "WM_MDICREATE", - "WM_MDIDESTROY", - "WM_MDIACTIVATE", - "WM_MDIRESTORE", - "WM_MDINEXT", - "WM_MDIMAXIMIZE", - "WM_MDITILE", - "WM_MDICASCADE", - "WM_MDIICONARRANGE", - "WM_MDIGETACTIVE", - "UNKNOWN (554)", - "UNKNOWN (555)", - "UNKNOWN (556)", - "UNKNOWN (557)", - "UNKNOWN (558)", - "UNKNOWN (559)", - "WM_MDISETMENU", - "WM_ENTERSIZEMOVE", - "WM_EXITSIZEMOVE", - "WM_DROPFILES", - "WM_MDIREFRESHMENU", - "UNKNOWN (565)", - "UNKNOWN (566)", - "UNKNOWN (567)", - "WM_POINTERDEVICECHANGE", - "WM_POINTERDEVICEINRANGE", - "WM_POINTERDEVICEOUTOFRANGE", - "UNKNOWN (571)", - "UNKNOWN (572)", - "UNKNOWN (573)", - "UNKNOWN (574)", - "UNKNOWN (575)", - "WM_TOUCH", - "WM_NCPOINTERUPDATE", - "WM_NCPOINTERDOWN", - "WM_NCPOINTERUP", - "UNKNOWN (580)", - "WM_POINTERUPDATE", - "WM_POINTERDOWN", - "WM_POINTERUP", - "WM_POINTERENTER", - "WM_POINTERLEAVE", - "WM_POINTERACTIVATE", - "WM_POINTERCAPTURECHANGED", - "WM_TOUCHHITTESTING", - "WM_POINTERWHEEL", - "WM_POINTERHWHEEL", - "DM_POINTERHITTEST", - "UNKNOWN (592)", - "UNKNOWN (593)", - "UNKNOWN (594)", - "UNKNOWN (595)", - "UNKNOWN (596)", - "UNKNOWN (597)", - "UNKNOWN (598)", - "UNKNOWN (599)", - "UNKNOWN (600)", - "UNKNOWN (601)", - "UNKNOWN (602)", - "UNKNOWN (603)", - "UNKNOWN (604)", - "UNKNOWN (605)", - "UNKNOWN (606)", - "UNKNOWN (607)", - "UNKNOWN (608)", - "UNKNOWN (609)", - "UNKNOWN (610)", - "UNKNOWN (611)", - "UNKNOWN (612)", - "UNKNOWN (613)", - "UNKNOWN (614)", - "UNKNOWN (615)", - "UNKNOWN (616)", - "UNKNOWN (617)", - "UNKNOWN (618)", - "UNKNOWN (619)", - "UNKNOWN (620)", - "UNKNOWN (621)", - "UNKNOWN (622)", - "UNKNOWN (623)", - "UNKNOWN (624)", - "UNKNOWN (625)", - "UNKNOWN (626)", - "UNKNOWN (627)", - "UNKNOWN (628)", - "UNKNOWN (629)", - "UNKNOWN (630)", - "UNKNOWN (631)", - "UNKNOWN (632)", - "UNKNOWN (633)", - "UNKNOWN (634)", - "UNKNOWN (635)", - "UNKNOWN (636)", - "UNKNOWN (637)", - "UNKNOWN (638)", - "UNKNOWN (639)", - "UNKNOWN (640)", - "WM_IME_SETCONTEXT", - "WM_IME_NOTIFY", - "WM_IME_CONTROL", - "WM_IME_COMPOSITIONFULL", - "WM_IME_SELECT", - "WM_IME_CHAR", - "UNKNOWN (647)", - "WM_IME_REQUEST", - "UNKNOWN (649)", - "UNKNOWN (650)", - "UNKNOWN (651)", - "UNKNOWN (652)", - "UNKNOWN (653)", - "UNKNOWN (654)", - "UNKNOWN (655)", - "WM_IME_KEYDOWN", - "WM_IME_KEYUP", - "UNKNOWN (658)", - "UNKNOWN (659)", - "UNKNOWN (660)", - "UNKNOWN (661)", - "UNKNOWN (662)", - "UNKNOWN (663)", - "UNKNOWN (664)", - "UNKNOWN (665)", - "UNKNOWN (666)", - "UNKNOWN (667)", - "UNKNOWN (668)", - "UNKNOWN (669)", - "UNKNOWN (670)", - "UNKNOWN (671)", - "WM_NCMOUSEHOVER", - "WM_MOUSEHOVER", - "WM_NCMOUSELEAVE", - "WM_MOUSELEAVE", - "UNKNOWN (676)", - "UNKNOWN (677)", - "UNKNOWN (678)", - "UNKNOWN (679)", - "UNKNOWN (680)", - "UNKNOWN (681)", - "UNKNOWN (682)", - "UNKNOWN (683)", - "UNKNOWN (684)", - "UNKNOWN (685)", - "UNKNOWN (686)", - "UNKNOWN (687)", - "UNKNOWN (688)", - "WM_WTSSESSION_CHANGE", - "UNKNOWN (690)", - "UNKNOWN (691)", - "UNKNOWN (692)", - "UNKNOWN (693)", - "UNKNOWN (694)", - "UNKNOWN (695)", - "UNKNOWN (696)", - "UNKNOWN (697)", - "UNKNOWN (698)", - "UNKNOWN (699)", - "UNKNOWN (700)", - "UNKNOWN (701)", - "UNKNOWN (702)", - "UNKNOWN (703)", - "UNKNOWN (704)", - "UNKNOWN (705)", - "UNKNOWN (706)", - "UNKNOWN (707)", - "UNKNOWN (708)", - "UNKNOWN (709)", - "UNKNOWN (710)", - "UNKNOWN (711)", - "UNKNOWN (712)", - "UNKNOWN (713)", - "UNKNOWN (714)", - "UNKNOWN (715)", - "UNKNOWN (716)", - "UNKNOWN (717)", - "UNKNOWN (718)", - "UNKNOWN (719)", - "UNKNOWN (720)", - "UNKNOWN (721)", - "UNKNOWN (722)", - "UNKNOWN (723)", - "UNKNOWN (724)", - "UNKNOWN (725)", - "UNKNOWN (726)", - "UNKNOWN (727)", - "UNKNOWN (728)", - "UNKNOWN (729)", - "UNKNOWN (730)", - "UNKNOWN (731)", - "UNKNOWN (732)", - "UNKNOWN (733)", - "UNKNOWN (734)", - "UNKNOWN (735)", - "WM_DPICHANGED", - "UNKNOWN (737)", - "UNKNOWN (738)", - "UNKNOWN (739)", - "UNKNOWN (740)", - "UNKNOWN (741)", - "UNKNOWN (742)", - "UNKNOWN (743)", - "UNKNOWN (744)", - "UNKNOWN (745)", - "UNKNOWN (746)", - "UNKNOWN (747)", - "UNKNOWN (748)", - "UNKNOWN (749)", - "UNKNOWN (750)", - "UNKNOWN (751)", - "UNKNOWN (752)", - "UNKNOWN (753)", - "UNKNOWN (754)", - "UNKNOWN (755)", - "UNKNOWN (756)", - "UNKNOWN (757)", - "UNKNOWN (758)", - "UNKNOWN (759)", - "UNKNOWN (760)", - "UNKNOWN (761)", - "UNKNOWN (762)", - "UNKNOWN (763)", - "UNKNOWN (764)", - "UNKNOWN (765)", - "UNKNOWN (766)", - "UNKNOWN (767)", - "WM_CUT", - "WM_COPY", - "WM_PASTE", - "WM_CLEAR", - "WM_UNDO", - "WM_RENDERFORMAT", - "WM_RENDERALLFORMATS", - "WM_DESTROYCLIPBOARD", - "WM_DRAWCLIPBOARD", - "WM_PAINTCLIPBOARD", - "WM_VSCROLLCLIPBOARD", - "WM_SIZECLIPBOARD", - "WM_ASKCBFORMATNAME", - "WM_CHANGECBCHAIN", - "WM_HSCROLLCLIPBOARD", - "WM_QUERYNEWPALETTE", - "WM_PALETTEISCHANGING", - "WM_PALETTECHANGED", - "WM_HOTKEY", - "UNKNOWN (787)", - "UNKNOWN (788)", - "UNKNOWN (789)", - "UNKNOWN (790)", - "WM_PRINT", - "WM_PRINTCLIENT", - "WM_APPCOMMAND", - "WM_THEMECHANGED", - "UNKNOWN (795)", - "UNKNOWN (796)", - "WM_CLIPBOARDUPDATE", - "WM_DWMCOMPOSITIONCHANGED", - "WM_DWMNCRENDERINGCHANGED", - "WM_DWMCOLORIZATIONCOLORCHANGED", - "WM_DWMWINDOWMAXIMIZEDCHANGE", - "UNKNOWN (802)", - "WM_DWMSENDICONICTHUMBNAIL", - "UNKNOWN (804)", - "UNKNOWN (805)", - "WM_DWMSENDICONICLIVEPREVIEWBITMAP", - "UNKNOWN (807)", - "UNKNOWN (808)", - "UNKNOWN (809)", - "UNKNOWN (810)", - "UNKNOWN (811)", - "UNKNOWN (812)", - "UNKNOWN (813)", - "UNKNOWN (814)", - "UNKNOWN (815)", - "UNKNOWN (816)", - "UNKNOWN (817)", - "UNKNOWN (818)", - "UNKNOWN (819)", - "UNKNOWN (820)", - "UNKNOWN (821)", - "UNKNOWN (822)", - "UNKNOWN (823)", - "UNKNOWN (824)", - "UNKNOWN (825)", - "UNKNOWN (826)", - "UNKNOWN (827)", - "UNKNOWN (828)", - "UNKNOWN (829)", - "UNKNOWN (830)", - "WM_GETTITLEBARINFOEX", - "UNKNOWN (832)", - "UNKNOWN (833)", - "UNKNOWN (834)", - "UNKNOWN (835)", - "UNKNOWN (836)", - "UNKNOWN (837)", - "UNKNOWN (838)", - "UNKNOWN (839)", - "UNKNOWN (840)", - "UNKNOWN (841)", - "UNKNOWN (842)", - "UNKNOWN (843)", - "UNKNOWN (844)", - "UNKNOWN (845)", - "UNKNOWN (846)", - "UNKNOWN (847)", - "UNKNOWN (848)", - "UNKNOWN (849)", - "UNKNOWN (850)", - "UNKNOWN (851)", - "UNKNOWN (852)", - "UNKNOWN (853)", - "UNKNOWN (854)", - "UNKNOWN (855)", - "WM_HANDHELDFIRST", - "UNKNOWN (857)", - "UNKNOWN (858)", - "UNKNOWN (859)", - "UNKNOWN (860)", - "UNKNOWN (861)", - "UNKNOWN (862)", - "WM_HANDHELDLAST", - "WM_AFXFIRST", - "UNKNOWN (865)", - "UNKNOWN (866)", - "UNKNOWN (867)", - "UNKNOWN (868)", - "UNKNOWN (869)", - "UNKNOWN (870)", - "UNKNOWN (871)", - "UNKNOWN (872)", - "UNKNOWN (873)", - "UNKNOWN (874)", - "UNKNOWN (875)", - "UNKNOWN (876)", - "UNKNOWN (877)", - "UNKNOWN (878)", - "UNKNOWN (879)", - "UNKNOWN (880)", - "UNKNOWN (881)", - "UNKNOWN (882)", - "UNKNOWN (883)", - "UNKNOWN (884)", - "UNKNOWN (885)", - "UNKNOWN (886)", - "UNKNOWN (887)", - "UNKNOWN (888)", - "UNKNOWN (889)", - "UNKNOWN (890)", - "UNKNOWN (891)", - "UNKNOWN (892)", - "UNKNOWN (893)", - "UNKNOWN (894)", - "WM_AFXLAST", - "WM_PENWINFIRST", - "UNKNOWN (897)", - "UNKNOWN (898)", - "UNKNOWN (899)", - "UNKNOWN (900)", - "UNKNOWN (901)", - "UNKNOWN (902)", - "UNKNOWN (903)", - "UNKNOWN (904)", - "UNKNOWN (905)", - "UNKNOWN (906)", - "UNKNOWN (907)", - "UNKNOWN (908)", - "UNKNOWN (909)", - "UNKNOWN (910)", - "WM_PENWINLAST", - "UNKNOWN (912)", - "UNKNOWN (913)", - "UNKNOWN (914)", - "UNKNOWN (915)", - "UNKNOWN (916)", - "UNKNOWN (917)", - "UNKNOWN (918)", - "UNKNOWN (919)", - "UNKNOWN (920)", - "UNKNOWN (921)", - "UNKNOWN (922)", - "UNKNOWN (923)", - "UNKNOWN (924)", - "UNKNOWN (925)", - "UNKNOWN (926)", - "UNKNOWN (927)", - "UNKNOWN (928)", - "UNKNOWN (929)", - "UNKNOWN (930)", - "UNKNOWN (931)", - "UNKNOWN (932)", - "UNKNOWN (933)", - "UNKNOWN (934)", - "UNKNOWN (935)", - "UNKNOWN (936)", - "UNKNOWN (937)", - "UNKNOWN (938)", - "UNKNOWN (939)", - "UNKNOWN (940)", - "UNKNOWN (941)", - "UNKNOWN (942)", - "UNKNOWN (943)", - "UNKNOWN (944)", - "UNKNOWN (945)", - "UNKNOWN (946)", - "UNKNOWN (947)", - "UNKNOWN (948)", - "UNKNOWN (949)", - "UNKNOWN (950)", - "UNKNOWN (951)", - "UNKNOWN (952)", - "UNKNOWN (953)", - "UNKNOWN (954)", - "UNKNOWN (955)", - "UNKNOWN (956)", - "UNKNOWN (957)", - "UNKNOWN (958)", - "UNKNOWN (959)", - "UNKNOWN (960)", - "UNKNOWN (961)", - "UNKNOWN (962)", - "UNKNOWN (963)", - "UNKNOWN (964)", - "UNKNOWN (965)", - "UNKNOWN (966)", - "UNKNOWN (967)", - "UNKNOWN (968)", - "UNKNOWN (969)", - "UNKNOWN (970)", - "UNKNOWN (971)", - "UNKNOWN (972)", - "UNKNOWN (973)", - "UNKNOWN (974)", - "UNKNOWN (975)", - "UNKNOWN (976)", - "UNKNOWN (977)", - "UNKNOWN (978)", - "UNKNOWN (979)", - "UNKNOWN (980)", - "UNKNOWN (981)", - "UNKNOWN (982)", - "UNKNOWN (983)", - "UNKNOWN (984)", - "UNKNOWN (985)", - "UNKNOWN (986)", - "UNKNOWN (987)", - "UNKNOWN (988)", - "UNKNOWN (989)", - "UNKNOWN (990)", - "UNKNOWN (991)", - "UNKNOWN (992)", - "UNKNOWN (993)", - "UNKNOWN (994)", - "UNKNOWN (995)", - "UNKNOWN (996)", - "UNKNOWN (997)", - "UNKNOWN (998)", - "UNKNOWN (999)", - "UNKNOWN (1000)", - "UNKNOWN (1001)", - "UNKNOWN (1002)", - "UNKNOWN (1003)", - "UNKNOWN (1004)", - "UNKNOWN (1005)", - "UNKNOWN (1006)", - "UNKNOWN (1007)", - "UNKNOWN (1008)", - "UNKNOWN (1009)", - "UNKNOWN (1010)", - "UNKNOWN (1011)", - "UNKNOWN (1012)", - "UNKNOWN (1013)", - "UNKNOWN (1014)", - "UNKNOWN (1015)", - "UNKNOWN (1016)", - "UNKNOWN (1017)", - "UNKNOWN (1018)", - "UNKNOWN (1019)", - "UNKNOWN (1020)", - "UNKNOWN (1021)", - "UNKNOWN (1022)", - "UNKNOWN (1023)", - "WM_USER" -}; - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtevents.cpp b/3rdparty/SDL2/src/video/winrt/SDL_winrtevents.cpp deleted file mode 100644 index 30cf01633d9..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtevents.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINRT - -/* - * Windows includes: - */ -#include <Windows.h> -using namespace Windows::UI::Core; -using Windows::UI::Core::CoreCursor; - -/* - * SDL includes: - */ -#include "SDL_winrtevents_c.h" -#include "../../core/winrt/SDL_winrtapp_common.h" -#include "../../core/winrt/SDL_winrtapp_direct3d.h" -#include "../../core/winrt/SDL_winrtapp_xaml.h" -#include "SDL_assert.h" -#include "SDL_system.h" - -extern "C" { -#include "../../thread/SDL_systhread.h" -#include "../SDL_sysvideo.h" -#include "../../events/SDL_events_c.h" -} - - -/* Forward declarations */ -static void WINRT_YieldXAMLThread(); - - -/* Global event management */ - -void -WINRT_PumpEvents(_THIS) -{ - if (SDL_WinRTGlobalApp) { - SDL_WinRTGlobalApp->PumpEvents(); - } else if (WINRT_XAMLWasEnabled) { - WINRT_YieldXAMLThread(); - } -} - - -/* XAML Thread management */ - -enum SDL_XAMLAppThreadState -{ - ThreadState_NotLaunched = 0, - ThreadState_Running, - ThreadState_Yielding -}; - -static SDL_XAMLAppThreadState _threadState = ThreadState_NotLaunched; -static SDL_Thread * _XAMLThread = nullptr; -static SDL_mutex * _mutex = nullptr; -static SDL_cond * _cond = nullptr; - -static void -WINRT_YieldXAMLThread() -{ - SDL_LockMutex(_mutex); - SDL_assert(_threadState == ThreadState_Running); - _threadState = ThreadState_Yielding; - SDL_UnlockMutex(_mutex); - - SDL_CondSignal(_cond); - - SDL_LockMutex(_mutex); - while (_threadState != ThreadState_Running) { - SDL_CondWait(_cond, _mutex); - } - SDL_UnlockMutex(_mutex); -} - -static int -WINRT_XAMLThreadMain(void * userdata) -{ - // TODO, WinRT: pass the C-style main() a reasonably realistic - // representation of command line arguments. - int argc = 0; - char **argv = NULL; - return WINRT_SDLAppEntryPoint(argc, argv); -} - -void -WINRT_CycleXAMLThread() -{ - switch (_threadState) { - case ThreadState_NotLaunched: - { - _cond = SDL_CreateCond(); - - _mutex = SDL_CreateMutex(); - _threadState = ThreadState_Running; - _XAMLThread = SDL_CreateThreadInternal(WINRT_XAMLThreadMain, "SDL/XAML App Thread", 0, nullptr); - - SDL_LockMutex(_mutex); - while (_threadState != ThreadState_Yielding) { - SDL_CondWait(_cond, _mutex); - } - SDL_UnlockMutex(_mutex); - - break; - } - - case ThreadState_Running: - { - SDL_assert(false); - break; - } - - case ThreadState_Yielding: - { - SDL_LockMutex(_mutex); - SDL_assert(_threadState == ThreadState_Yielding); - _threadState = ThreadState_Running; - SDL_UnlockMutex(_mutex); - - SDL_CondSignal(_cond); - - SDL_LockMutex(_mutex); - while (_threadState != ThreadState_Yielding) { - SDL_CondWait(_cond, _mutex); - } - SDL_UnlockMutex(_mutex); - } - } -} - -#endif /* SDL_VIDEO_DRIVER_WINRT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtevents_c.h b/3rdparty/SDL2/src/video/winrt/SDL_winrtevents_c.h deleted file mode 100644 index 05a90a3bfe0..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtevents_c.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "SDL_config.h" - -extern "C" { -#include "../SDL_sysvideo.h" -} - -/* - * Internal-use, C-style functions: - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern void WINRT_InitTouch(_THIS); -extern void WINRT_PumpEvents(_THIS); - -#ifdef __cplusplus -} -#endif - - -/* - * Internal-use, C++/CX functions: - */ -#ifdef __cplusplus_winrt - -/* Pointers (Mice, Touch, etc.) */ -typedef enum { - NormalizeZeroToOne, - TransformToSDLWindowSize -} WINRT_CursorNormalizationType; -extern Windows::Foundation::Point WINRT_TransformCursorPosition(SDL_Window * window, - Windows::Foundation::Point rawPosition, - WINRT_CursorNormalizationType normalization); -extern Uint8 WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt); -extern void WINRT_ProcessPointerPressedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint); -extern void WINRT_ProcessPointerMovedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint); -extern void WINRT_ProcessPointerReleasedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint); -extern void WINRT_ProcessPointerEnteredEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint); -extern void WINRT_ProcessPointerExitedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint); -extern void WINRT_ProcessPointerWheelChangedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint); -extern void WINRT_ProcessMouseMovedEvent(SDL_Window * window, Windows::Devices::Input::MouseEventArgs ^args); - -/* Keyboard */ -extern void WINRT_ProcessKeyDownEvent(Windows::UI::Core::KeyEventArgs ^args); -extern void WINRT_ProcessKeyUpEvent(Windows::UI::Core::KeyEventArgs ^args); -extern void WINRT_ProcessCharacterReceivedEvent(Windows::UI::Core::CharacterReceivedEventArgs ^args); - -#if NTDDI_VERSION >= NTDDI_WIN10 -extern SDL_bool WINRT_HasScreenKeyboardSupport(_THIS); -extern void WINRT_ShowScreenKeyboard(_THIS, SDL_Window *window); -extern void WINRT_HideScreenKeyboard(_THIS, SDL_Window *window); -extern SDL_bool WINRT_IsScreenKeyboardShown(_THIS, SDL_Window *window); -#endif // NTDDI_VERSION >= ... - -/* XAML Thread Management */ -extern void WINRT_CycleXAMLThread(); - -#endif // ifdef __cplusplus_winrt - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtgamebar.cpp b/3rdparty/SDL2/src/video/winrt/SDL_winrtgamebar.cpp deleted file mode 100644 index 215dfcc8354..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtgamebar.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINRT - -/* Windows includes */ -#include <roapi.h> -#include <windows.foundation.h> -#include <EventToken.h> - - -/* SDL includes */ -extern "C" { -#include "SDL_mouse.h" -#include "../SDL_sysvideo.h" -} -#include "SDL_winrtvideo_cpp.h" - - -/* Game Bar events can come in off the main thread. Use the following - WinRT CoreDispatcher to deal with them on SDL's thread. -*/ -static Platform::WeakReference WINRT_MainThreadDispatcher; - - -/* Win10's initial SDK (the 10.0.10240.0 release) does not include references - to Game Bar APIs, as the Game Bar was released via Win10 10.0.10586.0. - - Declare its WinRT/COM interface here, to allow compilation with earlier - Windows SDKs. -*/ -MIDL_INTERFACE("1DB9A292-CC78-4173-BE45-B61E67283EA7") -IGameBarStatics_ : public IInspectable -{ -public: - virtual HRESULT STDMETHODCALLTYPE add_VisibilityChanged( - __FIEventHandler_1_IInspectable *handler, - Windows::Foundation::EventRegistrationToken *token) = 0; - - virtual HRESULT STDMETHODCALLTYPE remove_VisibilityChanged( - Windows::Foundation::EventRegistrationToken token) = 0; - - virtual HRESULT STDMETHODCALLTYPE add_IsInputRedirectedChanged( - __FIEventHandler_1_IInspectable *handler, - Windows::Foundation::EventRegistrationToken *token) = 0; - - virtual HRESULT STDMETHODCALLTYPE remove_IsInputRedirectedChanged( - Windows::Foundation::EventRegistrationToken token) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Visible( - boolean *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_IsInputRedirected( - boolean *value) = 0; -}; - -/* Declare the game bar's COM GUID */ -static GUID IID_IGameBarStatics_ = { MAKELONG(0xA292, 0x1DB9), 0xCC78, 0x4173, { 0xBE, 0x45, 0xB6, 0x1E, 0x67, 0x28, 0x3E, 0xA7 } }; - -/* Retrieves a pointer to the game bar, or NULL if it is not available. - If a pointer is returned, it's ->Release() method must be called - after the caller has finished using it. -*/ -static IGameBarStatics_ * -WINRT_GetGameBar() -{ - wchar_t *wClassName = L"Windows.Gaming.UI.GameBar"; - HSTRING hClassName; - IActivationFactory *pActivationFactory = NULL; - IGameBarStatics_ *pGameBar = NULL; - HRESULT hr; - - hr = ::WindowsCreateString(wClassName, (UINT32)wcslen(wClassName), &hClassName); - if (FAILED(hr)) { - goto done; - } - - hr = Windows::Foundation::GetActivationFactory(hClassName, &pActivationFactory); - if (FAILED(hr)) { - goto done; - } - - pActivationFactory->QueryInterface(IID_IGameBarStatics_, (void **) &pGameBar); - -done: - if (pActivationFactory) { - pActivationFactory->Release(); - } - if (hClassName) { - ::WindowsDeleteString(hClassName); - } - return pGameBar; -} - -static void -WINRT_HandleGameBarIsInputRedirected_MainThread() -{ - IGameBarStatics_ *gameBar; - boolean isInputRedirected = 0; - if (!WINRT_MainThreadDispatcher) { - /* The game bar event handler has been deregistered! */ - return; - } - gameBar = WINRT_GetGameBar(); - if (!gameBar) { - /* Shouldn't happen, but just in case... */ - return; - } - if (SUCCEEDED(gameBar->get_IsInputRedirected(&isInputRedirected))) { - if ( ! isInputRedirected) { - /* Input-control is now back to the SDL app. Restore the cursor, - in case Windows does not (it does not in either Win10 - 10.0.10240.0 or 10.0.10586.0, maybe later version(s) too. - */ - SDL_Cursor *cursor = SDL_GetCursor(); - SDL_SetCursor(cursor); - } - } - gameBar->Release(); -} - -static void -WINRT_HandleGameBarIsInputRedirected_NonMainThread(Platform::Object ^ o1, Platform::Object ^o2) -{ - Windows::UI::Core::CoreDispatcher ^dispatcher = WINRT_MainThreadDispatcher.Resolve<Windows::UI::Core::CoreDispatcher>(); - if (dispatcher) { - dispatcher->RunAsync( - Windows::UI::Core::CoreDispatcherPriority::Normal, - ref new Windows::UI::Core::DispatchedHandler(&WINRT_HandleGameBarIsInputRedirected_MainThread)); - } -} - -void -WINRT_InitGameBar(_THIS) -{ - SDL_VideoData *driverdata = (SDL_VideoData *)_this->driverdata; - IGameBarStatics_ *gameBar = WINRT_GetGameBar(); - if (gameBar) { - /* GameBar.IsInputRedirected events can come in via something other than - the main/SDL thread. - - Get a WinRT 'CoreDispatcher' that can be used to call back into the - SDL thread. - */ - WINRT_MainThreadDispatcher = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher; - Windows::Foundation::EventHandler<Platform::Object ^> ^handler = \ - ref new Windows::Foundation::EventHandler<Platform::Object ^>(&WINRT_HandleGameBarIsInputRedirected_NonMainThread); - __FIEventHandler_1_IInspectable * pHandler = reinterpret_cast<__FIEventHandler_1_IInspectable *>(handler); - gameBar->add_IsInputRedirectedChanged(pHandler, &driverdata->gameBarIsInputRedirectedToken); - gameBar->Release(); - } -} - -void -WINRT_QuitGameBar(_THIS) -{ - SDL_VideoData *driverdata; - IGameBarStatics_ *gameBar; - if (!_this || !_this->driverdata) { - return; - } - gameBar = WINRT_GetGameBar(); - if (!gameBar) { - return; - } - driverdata = (SDL_VideoData *)_this->driverdata; - if (driverdata->gameBarIsInputRedirectedToken.Value) { - gameBar->remove_IsInputRedirectedChanged(driverdata->gameBarIsInputRedirectedToken); - driverdata->gameBarIsInputRedirectedToken.Value = 0; - } - WINRT_MainThreadDispatcher = nullptr; - gameBar->Release(); -} - -#endif /* SDL_VIDEO_DRIVER_WINRT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtgamebar_cpp.h b/3rdparty/SDL2/src/video/winrt/SDL_winrtgamebar_cpp.h deleted file mode 100644 index afcef37b28d..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtgamebar_cpp.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "SDL_config.h" - -#ifndef _SDL_winrtgamebar_h -#define _SDL_winrtgamebar_h - -#ifdef __cplusplus -/* These are exported as C++ functions, rather than C, to fix a compilation - bug with MSVC 2013, for Windows 8.x builds. */ -extern void WINRT_InitGameBar(_THIS); -extern void WINRT_QuitGameBar(_THIS); -#endif - -#endif /* _SDL_winrtmouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtkeyboard.cpp b/3rdparty/SDL2/src/video/winrt/SDL_winrtkeyboard.cpp deleted file mode 100644 index affcae62b05..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtkeyboard.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINRT - -/* Windows-specific includes */ -#include <Windows.h> -#include <agile.h> - - -/* SDL-specific includes */ -#include <SDL.h> -#include "SDL_winrtevents_c.h" - -extern "C" { -#include "../../events/scancodes_windows.h" -#include "../../events/SDL_keyboard_c.h" -} - - -static SDL_Scancode WinRT_Official_Keycodes[] = { - SDL_SCANCODE_UNKNOWN, /* VirtualKey.None -- 0 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.LeftButton -- 1 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.RightButton -- 2 */ - SDL_SCANCODE_CANCEL, /* VirtualKey.Cancel -- 3 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.MiddleButton -- 4 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.XButton1 -- 5 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.XButton2 -- 6 */ - SDL_SCANCODE_UNKNOWN, /* -- 7 */ - SDL_SCANCODE_BACKSPACE, /* VirtualKey.Back -- 8 */ - SDL_SCANCODE_TAB, /* VirtualKey.Tab -- 9 */ - SDL_SCANCODE_UNKNOWN, /* -- 10 */ - SDL_SCANCODE_UNKNOWN, /* -- 11 */ - SDL_SCANCODE_CLEAR, /* VirtualKey.Clear -- 12 */ - SDL_SCANCODE_RETURN, /* VirtualKey.Enter -- 13 */ - SDL_SCANCODE_UNKNOWN, /* -- 14 */ - SDL_SCANCODE_UNKNOWN, /* -- 15 */ - SDL_SCANCODE_LSHIFT, /* VirtualKey.Shift -- 16 */ - SDL_SCANCODE_LCTRL, /* VirtualKey.Control -- 17 */ - SDL_SCANCODE_MENU, /* VirtualKey.Menu -- 18 */ - SDL_SCANCODE_PAUSE, /* VirtualKey.Pause -- 19 */ - SDL_SCANCODE_CAPSLOCK, /* VirtualKey.CapitalLock -- 20 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.Kana or VirtualKey.Hangul -- 21 */ - SDL_SCANCODE_UNKNOWN, /* -- 22 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.Junja -- 23 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.Final -- 24 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.Hanja or VirtualKey.Kanji -- 25 */ - SDL_SCANCODE_UNKNOWN, /* -- 26 */ - SDL_SCANCODE_ESCAPE, /* VirtualKey.Escape -- 27 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.Convert -- 28 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.NonConvert -- 29 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.Accept -- 30 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.ModeChange -- 31 (maybe SDL_SCANCODE_MODE ?) */ - SDL_SCANCODE_SPACE, /* VirtualKey.Space -- 32 */ - SDL_SCANCODE_PAGEUP, /* VirtualKey.PageUp -- 33 */ - SDL_SCANCODE_PAGEDOWN, /* VirtualKey.PageDown -- 34 */ - SDL_SCANCODE_END, /* VirtualKey.End -- 35 */ - SDL_SCANCODE_HOME, /* VirtualKey.Home -- 36 */ - SDL_SCANCODE_LEFT, /* VirtualKey.Left -- 37 */ - SDL_SCANCODE_UP, /* VirtualKey.Up -- 38 */ - SDL_SCANCODE_RIGHT, /* VirtualKey.Right -- 39 */ - SDL_SCANCODE_DOWN, /* VirtualKey.Down -- 40 */ - SDL_SCANCODE_SELECT, /* VirtualKey.Select -- 41 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.Print -- 42 (maybe SDL_SCANCODE_PRINTSCREEN ?) */ - SDL_SCANCODE_EXECUTE, /* VirtualKey.Execute -- 43 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.Snapshot -- 44 */ - SDL_SCANCODE_INSERT, /* VirtualKey.Insert -- 45 */ - SDL_SCANCODE_DELETE, /* VirtualKey.Delete -- 46 */ - SDL_SCANCODE_HELP, /* VirtualKey.Help -- 47 */ - SDL_SCANCODE_0, /* VirtualKey.Number0 -- 48 */ - SDL_SCANCODE_1, /* VirtualKey.Number1 -- 49 */ - SDL_SCANCODE_2, /* VirtualKey.Number2 -- 50 */ - SDL_SCANCODE_3, /* VirtualKey.Number3 -- 51 */ - SDL_SCANCODE_4, /* VirtualKey.Number4 -- 52 */ - SDL_SCANCODE_5, /* VirtualKey.Number5 -- 53 */ - SDL_SCANCODE_6, /* VirtualKey.Number6 -- 54 */ - SDL_SCANCODE_7, /* VirtualKey.Number7 -- 55 */ - SDL_SCANCODE_8, /* VirtualKey.Number8 -- 56 */ - SDL_SCANCODE_9, /* VirtualKey.Number9 -- 57 */ - SDL_SCANCODE_UNKNOWN, /* -- 58 */ - SDL_SCANCODE_UNKNOWN, /* -- 59 */ - SDL_SCANCODE_UNKNOWN, /* -- 60 */ - SDL_SCANCODE_UNKNOWN, /* -- 61 */ - SDL_SCANCODE_UNKNOWN, /* -- 62 */ - SDL_SCANCODE_UNKNOWN, /* -- 63 */ - SDL_SCANCODE_UNKNOWN, /* -- 64 */ - SDL_SCANCODE_A, /* VirtualKey.A -- 65 */ - SDL_SCANCODE_B, /* VirtualKey.B -- 66 */ - SDL_SCANCODE_C, /* VirtualKey.C -- 67 */ - SDL_SCANCODE_D, /* VirtualKey.D -- 68 */ - SDL_SCANCODE_E, /* VirtualKey.E -- 69 */ - SDL_SCANCODE_F, /* VirtualKey.F -- 70 */ - SDL_SCANCODE_G, /* VirtualKey.G -- 71 */ - SDL_SCANCODE_H, /* VirtualKey.H -- 72 */ - SDL_SCANCODE_I, /* VirtualKey.I -- 73 */ - SDL_SCANCODE_J, /* VirtualKey.J -- 74 */ - SDL_SCANCODE_K, /* VirtualKey.K -- 75 */ - SDL_SCANCODE_L, /* VirtualKey.L -- 76 */ - SDL_SCANCODE_M, /* VirtualKey.M -- 77 */ - SDL_SCANCODE_N, /* VirtualKey.N -- 78 */ - SDL_SCANCODE_O, /* VirtualKey.O -- 79 */ - SDL_SCANCODE_P, /* VirtualKey.P -- 80 */ - SDL_SCANCODE_Q, /* VirtualKey.Q -- 81 */ - SDL_SCANCODE_R, /* VirtualKey.R -- 82 */ - SDL_SCANCODE_S, /* VirtualKey.S -- 83 */ - SDL_SCANCODE_T, /* VirtualKey.T -- 84 */ - SDL_SCANCODE_U, /* VirtualKey.U -- 85 */ - SDL_SCANCODE_V, /* VirtualKey.V -- 86 */ - SDL_SCANCODE_W, /* VirtualKey.W -- 87 */ - SDL_SCANCODE_X, /* VirtualKey.X -- 88 */ - SDL_SCANCODE_Y, /* VirtualKey.Y -- 89 */ - SDL_SCANCODE_Z, /* VirtualKey.Z -- 90 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.LeftWindows -- 91 (maybe SDL_SCANCODE_APPLICATION or SDL_SCANCODE_LGUI ?) */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.RightWindows -- 92 (maybe SDL_SCANCODE_APPLICATION or SDL_SCANCODE_RGUI ?) */ - SDL_SCANCODE_APPLICATION, /* VirtualKey.Application -- 93 */ - SDL_SCANCODE_UNKNOWN, /* -- 94 */ - SDL_SCANCODE_SLEEP, /* VirtualKey.Sleep -- 95 */ - SDL_SCANCODE_KP_0, /* VirtualKey.NumberPad0 -- 96 */ - SDL_SCANCODE_KP_1, /* VirtualKey.NumberPad1 -- 97 */ - SDL_SCANCODE_KP_2, /* VirtualKey.NumberPad2 -- 98 */ - SDL_SCANCODE_KP_3, /* VirtualKey.NumberPad3 -- 99 */ - SDL_SCANCODE_KP_4, /* VirtualKey.NumberPad4 -- 100 */ - SDL_SCANCODE_KP_5, /* VirtualKey.NumberPad5 -- 101 */ - SDL_SCANCODE_KP_6, /* VirtualKey.NumberPad6 -- 102 */ - SDL_SCANCODE_KP_7, /* VirtualKey.NumberPad7 -- 103 */ - SDL_SCANCODE_KP_8, /* VirtualKey.NumberPad8 -- 104 */ - SDL_SCANCODE_KP_9, /* VirtualKey.NumberPad9 -- 105 */ - SDL_SCANCODE_KP_MULTIPLY, /* VirtualKey.Multiply -- 106 */ - SDL_SCANCODE_KP_PLUS, /* VirtualKey.Add -- 107 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.Separator -- 108 */ - SDL_SCANCODE_KP_MINUS, /* VirtualKey.Subtract -- 109 */ - SDL_SCANCODE_UNKNOWN, /* VirtualKey.Decimal -- 110 (maybe SDL_SCANCODE_DECIMALSEPARATOR, SDL_SCANCODE_KP_DECIMAL, or SDL_SCANCODE_KP_PERIOD ?) */ - SDL_SCANCODE_KP_DIVIDE, /* VirtualKey.Divide -- 111 */ - SDL_SCANCODE_F1, /* VirtualKey.F1 -- 112 */ - SDL_SCANCODE_F2, /* VirtualKey.F2 -- 113 */ - SDL_SCANCODE_F3, /* VirtualKey.F3 -- 114 */ - SDL_SCANCODE_F4, /* VirtualKey.F4 -- 115 */ - SDL_SCANCODE_F5, /* VirtualKey.F5 -- 116 */ - SDL_SCANCODE_F6, /* VirtualKey.F6 -- 117 */ - SDL_SCANCODE_F7, /* VirtualKey.F7 -- 118 */ - SDL_SCANCODE_F8, /* VirtualKey.F8 -- 119 */ - SDL_SCANCODE_F9, /* VirtualKey.F9 -- 120 */ - SDL_SCANCODE_F10, /* VirtualKey.F10 -- 121 */ - SDL_SCANCODE_F11, /* VirtualKey.F11 -- 122 */ - SDL_SCANCODE_F12, /* VirtualKey.F12 -- 123 */ - SDL_SCANCODE_F13, /* VirtualKey.F13 -- 124 */ - SDL_SCANCODE_F14, /* VirtualKey.F14 -- 125 */ - SDL_SCANCODE_F15, /* VirtualKey.F15 -- 126 */ - SDL_SCANCODE_F16, /* VirtualKey.F16 -- 127 */ - SDL_SCANCODE_F17, /* VirtualKey.F17 -- 128 */ - SDL_SCANCODE_F18, /* VirtualKey.F18 -- 129 */ - SDL_SCANCODE_F19, /* VirtualKey.F19 -- 130 */ - SDL_SCANCODE_F20, /* VirtualKey.F20 -- 131 */ - SDL_SCANCODE_F21, /* VirtualKey.F21 -- 132 */ - SDL_SCANCODE_F22, /* VirtualKey.F22 -- 133 */ - SDL_SCANCODE_F23, /* VirtualKey.F23 -- 134 */ - SDL_SCANCODE_F24, /* VirtualKey.F24 -- 135 */ - SDL_SCANCODE_UNKNOWN, /* -- 136 */ - SDL_SCANCODE_UNKNOWN, /* -- 137 */ - SDL_SCANCODE_UNKNOWN, /* -- 138 */ - SDL_SCANCODE_UNKNOWN, /* -- 139 */ - SDL_SCANCODE_UNKNOWN, /* -- 140 */ - SDL_SCANCODE_UNKNOWN, /* -- 141 */ - SDL_SCANCODE_UNKNOWN, /* -- 142 */ - SDL_SCANCODE_UNKNOWN, /* -- 143 */ - SDL_SCANCODE_NUMLOCKCLEAR, /* VirtualKey.NumberKeyLock -- 144 */ - SDL_SCANCODE_SCROLLLOCK, /* VirtualKey.Scroll -- 145 */ - SDL_SCANCODE_UNKNOWN, /* -- 146 */ - SDL_SCANCODE_UNKNOWN, /* -- 147 */ - SDL_SCANCODE_UNKNOWN, /* -- 148 */ - SDL_SCANCODE_UNKNOWN, /* -- 149 */ - SDL_SCANCODE_UNKNOWN, /* -- 150 */ - SDL_SCANCODE_UNKNOWN, /* -- 151 */ - SDL_SCANCODE_UNKNOWN, /* -- 152 */ - SDL_SCANCODE_UNKNOWN, /* -- 153 */ - SDL_SCANCODE_UNKNOWN, /* -- 154 */ - SDL_SCANCODE_UNKNOWN, /* -- 155 */ - SDL_SCANCODE_UNKNOWN, /* -- 156 */ - SDL_SCANCODE_UNKNOWN, /* -- 157 */ - SDL_SCANCODE_UNKNOWN, /* -- 158 */ - SDL_SCANCODE_UNKNOWN, /* -- 159 */ - SDL_SCANCODE_LSHIFT, /* VirtualKey.LeftShift -- 160 */ - SDL_SCANCODE_RSHIFT, /* VirtualKey.RightShift -- 161 */ - SDL_SCANCODE_LCTRL, /* VirtualKey.LeftControl -- 162 */ - SDL_SCANCODE_RCTRL, /* VirtualKey.RightControl -- 163 */ - SDL_SCANCODE_MENU, /* VirtualKey.LeftMenu -- 164 */ - SDL_SCANCODE_MENU, /* VirtualKey.RightMenu -- 165 */ - SDL_SCANCODE_AC_BACK, /* VirtualKey.GoBack -- 166 : The go back key. */ - SDL_SCANCODE_AC_FORWARD, /* VirtualKey.GoForward -- 167 : The go forward key. */ - SDL_SCANCODE_AC_REFRESH, /* VirtualKey.Refresh -- 168 : The refresh key. */ - SDL_SCANCODE_AC_STOP, /* VirtualKey.Stop -- 169 : The stop key. */ - SDL_SCANCODE_AC_SEARCH, /* VirtualKey.Search -- 170 : The search key. */ - SDL_SCANCODE_AC_BOOKMARKS, /* VirtualKey.Favorites -- 171 : The favorites key. */ - SDL_SCANCODE_AC_HOME /* VirtualKey.GoHome -- 172 : The go home key. */ -}; - -/* Attempt to translate a keycode that isn't listed in WinRT's VirtualKey enum. - */ -static SDL_Scancode -WINRT_TranslateUnofficialKeycode(int keycode) -{ - switch (keycode) { - case 173: return SDL_SCANCODE_MUTE; /* VK_VOLUME_MUTE */ - case 174: return SDL_SCANCODE_VOLUMEDOWN; /* VK_VOLUME_DOWN */ - case 175: return SDL_SCANCODE_VOLUMEUP; /* VK_VOLUME_UP */ - case 176: return SDL_SCANCODE_AUDIONEXT; /* VK_MEDIA_NEXT_TRACK */ - case 177: return SDL_SCANCODE_AUDIOPREV; /* VK_MEDIA_PREV_TRACK */ - // case 178: return ; /* VK_MEDIA_STOP */ - case 179: return SDL_SCANCODE_AUDIOPLAY; /* VK_MEDIA_PLAY_PAUSE */ - case 180: return SDL_SCANCODE_MAIL; /* VK_LAUNCH_MAIL */ - case 181: return SDL_SCANCODE_MEDIASELECT; /* VK_LAUNCH_MEDIA_SELECT */ - // case 182: return ; /* VK_LAUNCH_APP1 */ - case 183: return SDL_SCANCODE_CALCULATOR; /* VK_LAUNCH_APP2 */ - // case 184: return ; /* ... reserved ... */ - // case 185: return ; /* ... reserved ... */ - case 186: return SDL_SCANCODE_SEMICOLON; /* VK_OEM_1, ';:' key on US standard keyboards */ - case 187: return SDL_SCANCODE_EQUALS; /* VK_OEM_PLUS */ - case 188: return SDL_SCANCODE_COMMA; /* VK_OEM_COMMA */ - case 189: return SDL_SCANCODE_MINUS; /* VK_OEM_MINUS */ - case 190: return SDL_SCANCODE_PERIOD; /* VK_OEM_PERIOD */ - case 191: return SDL_SCANCODE_SLASH; /* VK_OEM_2, '/?' key on US standard keyboards */ - case 192: return SDL_SCANCODE_GRAVE; /* VK_OEM_3, '`~' key on US standard keyboards */ - // ? - // ... reserved or unassigned ... - // ? - case 219: return SDL_SCANCODE_LEFTBRACKET; /* VK_OEM_4, '[{' key on US standard keyboards */ - case 220: return SDL_SCANCODE_BACKSLASH; /* VK_OEM_5, '\|' key on US standard keyboards */ - case 221: return SDL_SCANCODE_RIGHTBRACKET; /* VK_OEM_6, ']}' key on US standard keyboards */ - case 222: return SDL_SCANCODE_APOSTROPHE; /* VK_OEM_7, 'single/double quote' on US standard keyboards */ - default: break; - } - return SDL_SCANCODE_UNKNOWN; -} - -static SDL_Scancode -WINRT_TranslateKeycode(int keycode, unsigned int nativeScancode) -{ - // TODO, WinRT: try filling out the WinRT keycode table as much as possible, using the Win32 table for interpretation hints - - SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN; - - /* HACK ALERT: At least one VirtualKey constant (Shift) with a left/right - * designation might not get reported with its correct handedness, however - * its hardware scan code can fill in the gaps. If this is detected, - * use the hardware scan code to try telling if the left, or the right - * side's key was used. - * - * If Microsoft ever allows MapVirtualKey or MapVirtualKeyEx to be used - * in WinRT apps, or something similar to these (it doesn't appear to be, - * at least not for Windows [Phone] 8/8.1, as of Oct 24, 2014), then this - * hack might become deprecated, or obsolete. - */ - if (nativeScancode < SDL_arraysize(windows_scancode_table)) { - switch (keycode) { - case 16: // VirtualKey.Shift - switch (windows_scancode_table[nativeScancode]) { - case SDL_SCANCODE_LSHIFT: - case SDL_SCANCODE_RSHIFT: - return windows_scancode_table[nativeScancode]; - } - break; - - // Add others, as necessary. - // - // Unfortunately, this hack doesn't seem to work in determining - // handedness with Control keys. - - default: - break; - } - } - - /* Try to get a documented, WinRT, 'VirtualKey' next (as documented at - http://msdn.microsoft.com/en-us/library/windows/apps/windows.system.virtualkey.aspx ). - If that fails, fall back to a Win32 virtual key. - If that fails, attempt to fall back to a scancode-derived key. - */ - if (keycode < SDL_arraysize(WinRT_Official_Keycodes)) { - scancode = WinRT_Official_Keycodes[keycode]; - } - if (scancode == SDL_SCANCODE_UNKNOWN) { - scancode = WINRT_TranslateUnofficialKeycode(keycode); - } - if (scancode == SDL_SCANCODE_UNKNOWN) { - if (nativeScancode < SDL_arraysize(windows_scancode_table)) { - scancode = windows_scancode_table[nativeScancode]; - } - } - /* - if (scancode == SDL_SCANCODE_UNKNOWN) { - SDL_Log("WinRT TranslateKeycode, unknown keycode=%d\n", (int)keycode); - } - */ - return scancode; -} - -void -WINRT_ProcessKeyDownEvent(Windows::UI::Core::KeyEventArgs ^args) -{ - SDL_Scancode sdlScancode = WINRT_TranslateKeycode((int)args->VirtualKey, args->KeyStatus.ScanCode); -#if 0 - SDL_Keycode keycode = SDL_GetKeyFromScancode(sdlScancode); - SDL_Log("key down, handled=%s, ext?=%s, released?=%s, menu key down?=%s, " - "repeat count=%d, native scan code=0x%x, was down?=%s, vkey=%d, " - "sdl scan code=%d (%s), sdl key code=%d (%s)\n", - (args->Handled ? "1" : "0"), - (args->KeyStatus.IsExtendedKey ? "1" : "0"), - (args->KeyStatus.IsKeyReleased ? "1" : "0"), - (args->KeyStatus.IsMenuKeyDown ? "1" : "0"), - args->KeyStatus.RepeatCount, - args->KeyStatus.ScanCode, - (args->KeyStatus.WasKeyDown ? "1" : "0"), - args->VirtualKey, - sdlScancode, - SDL_GetScancodeName(sdlScancode), - keycode, - SDL_GetKeyName(keycode)); - //args->Handled = true; -#endif - SDL_SendKeyboardKey(SDL_PRESSED, sdlScancode); -} - -void -WINRT_ProcessKeyUpEvent(Windows::UI::Core::KeyEventArgs ^args) -{ - SDL_Scancode sdlScancode = WINRT_TranslateKeycode((int)args->VirtualKey, args->KeyStatus.ScanCode); -#if 0 - SDL_Keycode keycode = SDL_GetKeyFromScancode(sdlScancode); - SDL_Log("key up, handled=%s, ext?=%s, released?=%s, menu key down?=%s, " - "repeat count=%d, native scan code=0x%x, was down?=%s, vkey=%d, " - "sdl scan code=%d (%s), sdl key code=%d (%s)\n", - (args->Handled ? "1" : "0"), - (args->KeyStatus.IsExtendedKey ? "1" : "0"), - (args->KeyStatus.IsKeyReleased ? "1" : "0"), - (args->KeyStatus.IsMenuKeyDown ? "1" : "0"), - args->KeyStatus.RepeatCount, - args->KeyStatus.ScanCode, - (args->KeyStatus.WasKeyDown ? "1" : "0"), - args->VirtualKey, - sdlScancode, - SDL_GetScancodeName(sdlScancode), - keycode, - SDL_GetKeyName(keycode)); - //args->Handled = true; -#endif - SDL_SendKeyboardKey(SDL_RELEASED, sdlScancode); -} - -void -WINRT_ProcessCharacterReceivedEvent(Windows::UI::Core::CharacterReceivedEventArgs ^args) -{ - wchar_t src_ucs2[2]; - char dest_utf8[16]; - int result; - - /* Setup src */ - src_ucs2[0] = args->KeyCode; - src_ucs2[1] = L'\0'; - - /* Convert the text, then send an SDL_TEXTINPUT event. */ - result = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)&src_ucs2, -1, (LPSTR)dest_utf8, sizeof(dest_utf8), NULL, NULL); - if (result > 0) { - SDL_SendKeyboardText(dest_utf8); - } -} - - -#if NTDDI_VERSION >= NTDDI_WIN10 - -SDL_bool WINRT_HasScreenKeyboardSupport(_THIS) -{ - return SDL_TRUE; -} - -void WINRT_ShowScreenKeyboard(_THIS, SDL_Window *window) -{ - using namespace Windows::UI::ViewManagement; - InputPane ^ inputPane = InputPane::GetForCurrentView(); - if (inputPane) { - inputPane->TryShow(); - } -} - -void WINRT_HideScreenKeyboard(_THIS, SDL_Window *window) -{ - using namespace Windows::UI::ViewManagement; - InputPane ^ inputPane = InputPane::GetForCurrentView(); - if (inputPane) { - inputPane->TryHide(); - } -} - -SDL_bool WINRT_IsScreenKeyboardShown(_THIS, SDL_Window *window) -{ - using namespace Windows::UI::ViewManagement; - InputPane ^ inputPane = InputPane::GetForCurrentView(); - if (inputPane) { - // dludwig@pobox.com: checking inputPane->Visible doesn't seem to detect visibility, - // at least not on the Windows Phone 10.0.10240.0 emulator. Checking - // the size of inputPane->OccludedRect, however, does seem to work. - Windows::Foundation::Rect rect = inputPane->OccludedRect; - if (rect.Width > 0 && rect.Height > 0) { - return SDL_TRUE; - } - } - return SDL_FALSE; -} - -#endif // NTDDI_VERSION >= ... - -#endif // SDL_VIDEO_DRIVER_WINRT diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtmessagebox.cpp b/3rdparty/SDL2/src/video/winrt/SDL_winrtmessagebox.cpp deleted file mode 100644 index ca958107c94..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtmessagebox.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINRT - -extern "C" { -#include "SDL_messagebox.h" -#include "../../core/windows/SDL_windows.h" -} - -#include "SDL_winrtevents_c.h" - -#include <windows.ui.popups.h> -using namespace Platform; -using namespace Windows::Foundation; -using namespace Windows::UI::Popups; - -static String ^ -WINRT_UTF8ToPlatformString(const char * str) -{ - wchar_t * wstr = WIN_UTF8ToString(str); - String ^ rtstr = ref new String(wstr); - SDL_free(wstr); - return rtstr; -} - -extern "C" int -WINRT_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ -#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) && (NTDDI_VERSION == NTDDI_WIN8) - /* Sadly, Windows Phone 8 doesn't include the MessageDialog class that - * Windows 8.x/RT does, even though MSDN's reference documentation for - * Windows Phone 8 mentions it. - * - * The .NET runtime on Windows Phone 8 does, however, include a - * MessageBox class. Perhaps this could be called, somehow? - */ - return SDL_SetError("SDL_messagebox support is not available for Windows Phone 8.0"); -#else - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - -#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - const int maxbuttons = 2; - const char * platform = "Windows Phone 8.1+"; -#else - const int maxbuttons = 3; - const char * platform = "Windows 8.x"; -#endif - - if (messageboxdata->numbuttons > maxbuttons) { - return SDL_SetError("WinRT's MessageDialog only supports %d buttons, at most, on %s. %d were requested.", - maxbuttons, platform, messageboxdata->numbuttons); - } - - /* Build a MessageDialog object and its buttons */ - MessageDialog ^ dialog = ref new MessageDialog(WINRT_UTF8ToPlatformString(messageboxdata->message)); - dialog->Title = WINRT_UTF8ToPlatformString(messageboxdata->title); - for (int i = 0; i < messageboxdata->numbuttons; ++i) { - UICommand ^ button = ref new UICommand(WINRT_UTF8ToPlatformString(messageboxdata->buttons[i].text)); - button->Id = safe_cast<IntPtr>(i); - dialog->Commands->Append(button); - if (messageboxdata->buttons[i].flags & SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT) { - dialog->CancelCommandIndex = i; - } - if (messageboxdata->buttons[i].flags & SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT) { - dialog->DefaultCommandIndex = i; - } - } - - /* Display the MessageDialog, then wait for it to be closed */ - /* TODO, WinRT: Find a way to redraw MessageDialog instances if a GPU device-reset occurs during the following event-loop */ - auto operation = dialog->ShowAsync(); - while (operation->Status == Windows::Foundation::AsyncStatus::Started) { - WINRT_PumpEvents(_this); - } - - /* Retrieve results from the MessageDialog and process them accordingly */ - if (operation->Status != Windows::Foundation::AsyncStatus::Completed) { - return SDL_SetError("An unknown error occurred in displaying the WinRT MessageDialog"); - } - if (buttonid) { - IntPtr results = safe_cast<IntPtr>(operation->GetResults()->Id); - int clicked_index = results.ToInt32(); - *buttonid = messageboxdata->buttons[clicked_index].buttonid; - } - return 0; -#endif /* if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP / else */ -} - -#endif /* SDL_VIDEO_DRIVER_WINRT */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtmessagebox.h b/3rdparty/SDL2/src/video/winrt/SDL_winrtmessagebox.h deleted file mode 100644 index 4184aa5ee69..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtmessagebox.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINRT - -extern int WINRT_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); - -#endif /* SDL_VIDEO_DRIVER_WINRT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtmouse.cpp b/3rdparty/SDL2/src/video/winrt/SDL_winrtmouse.cpp deleted file mode 100644 index 9997d6ea43d..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtmouse.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINRT - -/* - * Windows includes: - */ -#include <Windows.h> -#include <windows.ui.core.h> -using namespace Windows::UI::Core; -using Windows::UI::Core::CoreCursor; - -/* - * SDL includes: - */ -extern "C" { -#include "SDL_assert.h" -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_touch_c.h" -#include "../SDL_sysvideo.h" -#include "SDL_events.h" -#include "SDL_log.h" -} - -#include "../../core/winrt/SDL_winrtapp_direct3d.h" -#include "SDL_winrtvideo_cpp.h" -#include "SDL_winrtmouse_c.h" - - -extern "C" SDL_bool WINRT_UsingRelativeMouseMode = SDL_FALSE; - - -static SDL_Cursor * -WINRT_CreateSystemCursor(SDL_SystemCursor id) -{ - SDL_Cursor *cursor; - CoreCursorType cursorType = CoreCursorType::Arrow; - - switch(id) - { - default: - SDL_assert(0); - return NULL; - case SDL_SYSTEM_CURSOR_ARROW: cursorType = CoreCursorType::Arrow; break; - case SDL_SYSTEM_CURSOR_IBEAM: cursorType = CoreCursorType::IBeam; break; - case SDL_SYSTEM_CURSOR_WAIT: cursorType = CoreCursorType::Wait; break; - case SDL_SYSTEM_CURSOR_CROSSHAIR: cursorType = CoreCursorType::Cross; break; - case SDL_SYSTEM_CURSOR_WAITARROW: cursorType = CoreCursorType::Wait; break; - case SDL_SYSTEM_CURSOR_SIZENWSE: cursorType = CoreCursorType::SizeNorthwestSoutheast; break; - case SDL_SYSTEM_CURSOR_SIZENESW: cursorType = CoreCursorType::SizeNortheastSouthwest; break; - case SDL_SYSTEM_CURSOR_SIZEWE: cursorType = CoreCursorType::SizeWestEast; break; - case SDL_SYSTEM_CURSOR_SIZENS: cursorType = CoreCursorType::SizeNorthSouth; break; - case SDL_SYSTEM_CURSOR_SIZEALL: cursorType = CoreCursorType::SizeAll; break; - case SDL_SYSTEM_CURSOR_NO: cursorType = CoreCursorType::UniversalNo; break; - case SDL_SYSTEM_CURSOR_HAND: cursorType = CoreCursorType::Hand; break; - } - - cursor = (SDL_Cursor *) SDL_calloc(1, sizeof(*cursor)); - if (cursor) { - /* Create a pointer to a COM reference to a cursor. The extra - pointer is used (on top of the COM reference) to allow the cursor - to be referenced by the SDL_cursor's driverdata field, which is - a void pointer. - */ - CoreCursor ^* theCursor = new CoreCursor^(nullptr); - *theCursor = ref new CoreCursor(cursorType, 0); - cursor->driverdata = (void *) theCursor; - } else { - SDL_OutOfMemory(); - } - - return cursor; -} - -static SDL_Cursor * -WINRT_CreateDefaultCursor() -{ - return WINRT_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW); -} - -static void -WINRT_FreeCursor(SDL_Cursor * cursor) -{ - if (cursor->driverdata) { - CoreCursor ^* theCursor = (CoreCursor ^*) cursor->driverdata; - *theCursor = nullptr; // Release the COM reference to the CoreCursor - delete theCursor; // Delete the pointer to the COM reference - } - SDL_free(cursor); -} - -static int -WINRT_ShowCursor(SDL_Cursor * cursor) -{ - // TODO, WinRT, XAML: make WINRT_ShowCursor work when XAML support is enabled. - if ( ! CoreWindow::GetForCurrentThread()) { - return 0; - } - - CoreWindow ^ coreWindow = CoreWindow::GetForCurrentThread(); - if (cursor) { - CoreCursor ^* theCursor = (CoreCursor ^*) cursor->driverdata; - coreWindow->PointerCursor = *theCursor; - } else { - // HACK ALERT: TL;DR - Hiding the cursor in WinRT/UWP apps is weird, and - // a Win32-style cursor resource file must be directly included in apps, - // otherwise hiding the cursor will cause mouse-motion data to never be - // received. - // - // Here's the lengthy explanation: - // - // There are two ways to hide a cursor in WinRT/UWP apps. - // Both involve setting the WinRT CoreWindow's (which is somewhat analogous - // to a Win32 HWND) 'PointerCursor' property. - // - // The first way to hide a cursor sets PointerCursor to nullptr. This - // is, arguably, the easiest to implement for an app. It does have an - // unfortunate side-effect: it'll prevent mouse-motion events from being - // sent to the app (via CoreWindow). - // - // The second way to hide a cursor sets PointerCursor to a transparent - // cursor. This allows mouse-motion events to be sent to the app, but is - // more difficult to set up, as: - // 1. WinRT/UWP, while providing a few stock cursors, does not provide - // a completely transparent cursor. - // 2. WinRT/UWP allows apps to provide custom-built cursors, but *ONLY* - // if they are linked directly inside the app, via Win32-style - // cursor resource files. APIs to create cursors at runtime are - // not provided to apps, and attempting to link-to or use Win32 - // cursor-creation APIs could cause an app to fail Windows Store - // certification. - // - // SDL can use either means of hiding the cursor. It provides a Win32-style - // set of cursor resource files in its source distribution, inside - // src/main/winrt/. If those files are linked to an SDL-for-WinRT/UWP app - // (by including them in a MSVC project, for example), SDL will attempt to - // use those, if and when the cursor is hidden via SDL APIs. If those - // files are not linked in, SDL will attempt to hide the cursor via the - // 'set PointerCursor to nullptr' means (which, if you recall, causes - // mouse-motion data to NOT be sent to the app!). - // - // Tech notes: - // - SDL's blank cursor resource uses a resource ID of 5000. - // - SDL's cursor resources consist of the following two files: - // - src/main/winrt/SDL2-WinRTResource_BlankCursor.cur -- cursor pixel data - // - src/main/winrt/SDL2-WinRTResources.rc -- declares the cursor resource, and its ID (of 5000) - // - - const unsigned int win32CursorResourceID = 5000; - CoreCursor ^ blankCursor = ref new CoreCursor(CoreCursorType::Custom, win32CursorResourceID); - - // Set 'PointerCursor' to 'blankCursor' in a way that shouldn't throw - // an exception if the app hasn't loaded that resource. - ABI::Windows::UI::Core::ICoreCursor * iblankCursor = reinterpret_cast<ABI::Windows::UI::Core::ICoreCursor *>(blankCursor); - ABI::Windows::UI::Core::ICoreWindow * icoreWindow = reinterpret_cast<ABI::Windows::UI::Core::ICoreWindow *>(coreWindow); - HRESULT hr = icoreWindow->put_PointerCursor(iblankCursor); - if (FAILED(hr)) { - // The app doesn't contain the cursor resource, or some other error - // occurred. Just use the other, but mouse-motion-preventing, means of - // hiding the cursor. - coreWindow->PointerCursor = nullptr; - } - } - return 0; -} - -static int -WINRT_SetRelativeMouseMode(SDL_bool enabled) -{ - WINRT_UsingRelativeMouseMode = enabled; - return 0; -} - -void -WINRT_InitMouse(_THIS) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - - /* DLudwig, Dec 3, 2012: WinRT does not currently provide APIs for - the following features, AFAIK: - - custom cursors (multiple system cursors are, however, available) - - programmatically moveable cursors - */ - -#if WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP - //mouse->CreateCursor = WINRT_CreateCursor; - mouse->CreateSystemCursor = WINRT_CreateSystemCursor; - mouse->ShowCursor = WINRT_ShowCursor; - mouse->FreeCursor = WINRT_FreeCursor; - //mouse->WarpMouse = WINRT_WarpMouse; - mouse->SetRelativeMouseMode = WINRT_SetRelativeMouseMode; - - SDL_SetDefaultCursor(WINRT_CreateDefaultCursor()); -#endif -} - -void -WINRT_QuitMouse(_THIS) -{ -} - -#endif /* SDL_VIDEO_DRIVER_WINRT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtmouse_c.h b/3rdparty/SDL2/src/video/winrt/SDL_winrtmouse_c.h deleted file mode 100644 index 464ba4d475b..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtmouse_c.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "SDL_config.h" - -#ifndef _SDL_winrtmouse_h -#define _SDL_winrtmouse_h - -#ifdef __cplusplus -extern "C" { -#endif - -extern void WINRT_InitMouse(_THIS); -extern void WINRT_QuitMouse(_THIS); -extern SDL_bool WINRT_UsingRelativeMouseMode; - -#ifdef __cplusplus -} -#endif - -#endif /* _SDL_winrtmouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtopengles.cpp b/3rdparty/SDL2/src/video/winrt/SDL_winrtopengles.cpp deleted file mode 100644 index cca07fa1bc0..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtopengles.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINRT && SDL_VIDEO_OPENGL_EGL - -/* EGL implementation of SDL OpenGL support */ - -#include "SDL_winrtvideo_cpp.h" -extern "C" { -#include "SDL_winrtopengles.h" -#include "SDL_loadso.h" -} - -/* Windows includes */ -#include <wrl/client.h> -using namespace Windows::UI::Core; - -/* ANGLE/WinRT constants */ -static const int ANGLE_D3D_FEATURE_LEVEL_ANY = 0; -#define EGL_PLATFORM_ANGLE_ANGLE 0x3202 -#define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3203 -#define EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE 0x3204 -#define EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE 0x3205 -#define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208 -#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE 0x3209 -#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE 0x320B -#define EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE 0x320F - -#define EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER 0x320B - - -/* - * SDL/EGL top-level implementation - */ - -extern "C" int -WINRT_GLES_LoadLibrary(_THIS, const char *path) -{ - SDL_VideoData *video_data = (SDL_VideoData *)_this->driverdata; - - if (SDL_EGL_LoadLibrary(_this, path, EGL_DEFAULT_DISPLAY) != 0) { - return -1; - } - - /* Load ANGLE/WinRT-specific functions */ - CreateWinrtEglWindow_Old_Function CreateWinrtEglWindow = (CreateWinrtEglWindow_Old_Function) SDL_LoadFunction(_this->egl_data->egl_dll_handle, "CreateWinrtEglWindow"); - if (CreateWinrtEglWindow) { - /* 'CreateWinrtEglWindow' was found, which means that an an older - * version of ANGLE/WinRT is being used. Continue setting up EGL, - * as appropriate to this version of ANGLE. - */ - - /* Create an ANGLE/WinRT EGL-window */ - /* TODO, WinRT: check for XAML usage before accessing the CoreWindow, as not doing so could lead to a crash */ - CoreWindow ^ native_win = CoreWindow::GetForCurrentThread(); - Microsoft::WRL::ComPtr<IUnknown> cpp_win = reinterpret_cast<IUnknown *>(native_win); - HRESULT result = CreateWinrtEglWindow(cpp_win, ANGLE_D3D_FEATURE_LEVEL_ANY, &(video_data->winrtEglWindow)); - if (FAILED(result)) { - return -1; - } - - /* Call eglGetDisplay and eglInitialize as appropriate. On other - * platforms, this would probably get done by SDL_EGL_LoadLibrary, - * however ANGLE/WinRT's current implementation (as of Mar 22, 2014) of - * eglGetDisplay requires that a C++ object be passed into it, so the - * call will be made in this file, a C++ file, instead. - */ - Microsoft::WRL::ComPtr<IUnknown> cpp_display = video_data->winrtEglWindow; - _this->egl_data->egl_display = ((eglGetDisplay_Old_Function)_this->egl_data->eglGetDisplay)(cpp_display); - if (!_this->egl_data->egl_display) { - return SDL_SetError("Could not get Windows 8.0 EGL display"); - } - - if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) { - return SDL_SetError("Could not initialize Windows 8.0 EGL"); - } - } else { - /* Declare some ANGLE/EGL initialization property-sets, as suggested by - * MSOpenTech's ANGLE-for-WinRT template apps: - */ - const EGLint defaultDisplayAttributes[] = - { - EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, - EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER, EGL_TRUE, - EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, - EGL_NONE, - }; - - const EGLint fl9_3DisplayAttributes[] = - { - EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, - EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, 9, - EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, 3, - EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER, EGL_TRUE, - EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, - EGL_NONE, - }; - - const EGLint warpDisplayAttributes[] = - { - EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, - EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE, - EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER, EGL_TRUE, - EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, - EGL_NONE, - }; - - /* 'CreateWinrtEglWindow' was NOT found, which either means that a - * newer version of ANGLE/WinRT is being used, or that we don't have - * a valid copy of ANGLE. - * - * Try loading ANGLE as if it were the newer version. - */ - eglGetPlatformDisplayEXT_Function eglGetPlatformDisplayEXT = (eglGetPlatformDisplayEXT_Function)_this->egl_data->eglGetProcAddress("eglGetPlatformDisplayEXT"); - if (!eglGetPlatformDisplayEXT) { - return SDL_SetError("Could not retrieve ANGLE/WinRT display function(s)"); - } - -#if (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) - /* Try initializing EGL at D3D11 Feature Level 10_0+ (which is not - * supported on WinPhone 8.x. - */ - _this->egl_data->egl_display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, defaultDisplayAttributes); - if (!_this->egl_data->egl_display) { - return SDL_SetError("Could not get 10_0+ EGL display"); - } - - if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) -#endif - { - /* Try initializing EGL at D3D11 Feature Level 9_3, in case the - * 10_0 init fails, or we're on Windows Phone (which only supports - * 9_3). - */ - _this->egl_data->egl_display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, fl9_3DisplayAttributes); - if (!_this->egl_data->egl_display) { - return SDL_SetError("Could not get 9_3 EGL display"); - } - - if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) { - /* Try initializing EGL at D3D11 Feature Level 11_0 on WARP - * (a Windows-provided, software rasterizer) if all else fails. - */ - _this->egl_data->egl_display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, warpDisplayAttributes); - if (!_this->egl_data->egl_display) { - return SDL_SetError("Could not get WARP EGL display"); - } - - if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) { - return SDL_SetError("Could not initialize WinRT 8.x+ EGL"); - } - } - } - } - - return 0; -} - -extern "C" void -WINRT_GLES_UnloadLibrary(_THIS) -{ - SDL_VideoData *video_data = (SDL_VideoData *)_this->driverdata; - - /* Release SDL's own COM reference to the ANGLE/WinRT IWinrtEglWindow */ - if (video_data->winrtEglWindow) { - video_data->winrtEglWindow->Release(); - video_data->winrtEglWindow = nullptr; - } - - /* Perform the bulk of the unloading */ - SDL_EGL_UnloadLibrary(_this); -} - -extern "C" { -SDL_EGL_CreateContext_impl(WINRT) -SDL_EGL_SwapWindow_impl(WINRT) -SDL_EGL_MakeCurrent_impl(WINRT) -} - -#endif /* SDL_VIDEO_DRIVER_WINRT && SDL_VIDEO_OPENGL_EGL */ - -/* vi: set ts=4 sw=4 expandtab: */ - diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtopengles.h b/3rdparty/SDL2/src/video/winrt/SDL_winrtopengles.h deleted file mode 100644 index 1da757b6cf3..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtopengles.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "SDL_config.h" - -#ifndef _SDL_winrtopengles_h -#define _SDL_winrtopengles_h - -#if SDL_VIDEO_DRIVER_WINRT && SDL_VIDEO_OPENGL_EGL - -#include "../SDL_sysvideo.h" -#include "../SDL_egl_c.h" - -/* OpenGLES functions */ -#define WINRT_GLES_GetAttribute SDL_EGL_GetAttribute -#define WINRT_GLES_GetProcAddress SDL_EGL_GetProcAddress -#define WINRT_GLES_SetSwapInterval SDL_EGL_SetSwapInterval -#define WINRT_GLES_GetSwapInterval SDL_EGL_GetSwapInterval -#define WINRT_GLES_DeleteContext SDL_EGL_DeleteContext - -extern int WINRT_GLES_LoadLibrary(_THIS, const char *path); -extern void WINRT_GLES_UnloadLibrary(_THIS); -extern SDL_GLContext WINRT_GLES_CreateContext(_THIS, SDL_Window * window); -extern void WINRT_GLES_SwapWindow(_THIS, SDL_Window * window); -extern int WINRT_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); - - -#ifdef __cplusplus - -/* Typedefs for ANGLE/WinRT's C++-based native-display and native-window types, - * which are used when calling eglGetDisplay and eglCreateWindowSurface. - */ -typedef Microsoft::WRL::ComPtr<IUnknown> WINRT_EGLNativeWindowType_Old; - -/* Function pointer typedefs for 'old' ANGLE/WinRT's functions, which may - * require that C++ objects be passed in: - */ -typedef EGLDisplay (EGLAPIENTRY *eglGetDisplay_Old_Function)(WINRT_EGLNativeWindowType_Old); -typedef EGLSurface (EGLAPIENTRY *eglCreateWindowSurface_Old_Function)(EGLDisplay, EGLConfig, WINRT_EGLNativeWindowType_Old, const EGLint *); -typedef HRESULT (EGLAPIENTRY *CreateWinrtEglWindow_Old_Function)(Microsoft::WRL::ComPtr<IUnknown>, int, IUnknown ** result); - -#endif /* __cplusplus */ - -/* Function pointer typedefs for 'new' ANGLE/WinRT functions, which, unlike - * the old functions, do not require C++ support and work with plain C. - */ -typedef EGLDisplay (EGLAPIENTRY *eglGetPlatformDisplayEXT_Function)(EGLenum, void *, const EGLint *); - -#endif /* SDL_VIDEO_DRIVER_WINRT && SDL_VIDEO_OPENGL_EGL */ - -#endif /* _SDL_winrtopengles_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtpointerinput.cpp b/3rdparty/SDL2/src/video/winrt/SDL_winrtpointerinput.cpp deleted file mode 100644 index 1d648f966fa..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtpointerinput.cpp +++ /dev/null @@ -1,416 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINRT - -/* SDL includes */ -#include "SDL_winrtevents_c.h" -#include "SDL_winrtmouse_c.h" -#include "SDL_winrtvideo_cpp.h" -#include "SDL_assert.h" -#include "SDL_system.h" - -extern "C" { -#include "../SDL_sysvideo.h" -#include "../../events/SDL_events_c.h" -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_touch_c.h" -} - -/* File-specific globals: */ -static SDL_TouchID WINRT_TouchID = 1; -static unsigned int WINRT_LeftFingerDown = 0; - - -void -WINRT_InitTouch(_THIS) -{ - SDL_AddTouch(WINRT_TouchID, ""); -} - - -// -// Applies necessary geometric transformations to raw cursor positions: -// -Windows::Foundation::Point -WINRT_TransformCursorPosition(SDL_Window * window, - Windows::Foundation::Point rawPosition, - WINRT_CursorNormalizationType normalization) -{ - using namespace Windows::UI::Core; - using namespace Windows::Graphics::Display; - - if (!window) { - return rawPosition; - } - - SDL_WindowData * windowData = (SDL_WindowData *) window->driverdata; - if (windowData->coreWindow == nullptr) { - // For some reason, the window isn't associated with a CoreWindow. - // This might end up being the case as XAML support is extended. - // For now, if there's no CoreWindow attached to the SDL_Window, - // don't do any transforms. - - // TODO, WinRT: make sure touch input coordinate ranges are correct when using XAML support - return rawPosition; - } - - // The CoreWindow can only be accessed on certain thread(s). - SDL_assert(CoreWindow::GetForCurrentThread() != nullptr); - - CoreWindow ^ nativeWindow = windowData->coreWindow.Get(); - Windows::Foundation::Point outputPosition; - - // Compute coordinates normalized from 0..1. - // If the coordinates need to be sized to the SDL window, - // we'll do that after. -#if (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) || (NTDDI_VERSION > NTDDI_WIN8) - outputPosition.X = rawPosition.X / nativeWindow->Bounds.Width; - outputPosition.Y = rawPosition.Y / nativeWindow->Bounds.Height; -#else - switch (WINRT_DISPLAY_PROPERTY(CurrentOrientation)) - { - case DisplayOrientations::Portrait: - outputPosition.X = rawPosition.X / nativeWindow->Bounds.Width; - outputPosition.Y = rawPosition.Y / nativeWindow->Bounds.Height; - break; - case DisplayOrientations::PortraitFlipped: - outputPosition.X = 1.0f - (rawPosition.X / nativeWindow->Bounds.Width); - outputPosition.Y = 1.0f - (rawPosition.Y / nativeWindow->Bounds.Height); - break; - case DisplayOrientations::Landscape: - outputPosition.X = rawPosition.Y / nativeWindow->Bounds.Height; - outputPosition.Y = 1.0f - (rawPosition.X / nativeWindow->Bounds.Width); - break; - case DisplayOrientations::LandscapeFlipped: - outputPosition.X = 1.0f - (rawPosition.Y / nativeWindow->Bounds.Height); - outputPosition.Y = rawPosition.X / nativeWindow->Bounds.Width; - break; - default: - break; - } -#endif - - if (normalization == TransformToSDLWindowSize) { - outputPosition.X *= ((float32) window->w); - outputPosition.Y *= ((float32) window->h); - } - - return outputPosition; -} - -static inline int -_lround(float arg) -{ - if (arg >= 0.0f) { - return (int)floor(arg + 0.5f); - } else { - return (int)ceil(arg - 0.5f); - } -} - -Uint8 -WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt) -{ - using namespace Windows::UI::Input; - -#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - return SDL_BUTTON_LEFT; -#else - switch (pt->Properties->PointerUpdateKind) - { - case PointerUpdateKind::LeftButtonPressed: - case PointerUpdateKind::LeftButtonReleased: - return SDL_BUTTON_LEFT; - - case PointerUpdateKind::RightButtonPressed: - case PointerUpdateKind::RightButtonReleased: - return SDL_BUTTON_RIGHT; - - case PointerUpdateKind::MiddleButtonPressed: - case PointerUpdateKind::MiddleButtonReleased: - return SDL_BUTTON_MIDDLE; - - case PointerUpdateKind::XButton1Pressed: - case PointerUpdateKind::XButton1Released: - return SDL_BUTTON_X1; - - case PointerUpdateKind::XButton2Pressed: - case PointerUpdateKind::XButton2Released: - return SDL_BUTTON_X2; - - default: - break; - } -#endif - - return 0; -} - -//const char * -//WINRT_ConvertPointerUpdateKindToString(Windows::UI::Input::PointerUpdateKind kind) -//{ -// using namespace Windows::UI::Input; -// -// switch (kind) -// { -// case PointerUpdateKind::Other: -// return "Other"; -// case PointerUpdateKind::LeftButtonPressed: -// return "LeftButtonPressed"; -// case PointerUpdateKind::LeftButtonReleased: -// return "LeftButtonReleased"; -// case PointerUpdateKind::RightButtonPressed: -// return "RightButtonPressed"; -// case PointerUpdateKind::RightButtonReleased: -// return "RightButtonReleased"; -// case PointerUpdateKind::MiddleButtonPressed: -// return "MiddleButtonPressed"; -// case PointerUpdateKind::MiddleButtonReleased: -// return "MiddleButtonReleased"; -// case PointerUpdateKind::XButton1Pressed: -// return "XButton1Pressed"; -// case PointerUpdateKind::XButton1Released: -// return "XButton1Released"; -// case PointerUpdateKind::XButton2Pressed: -// return "XButton2Pressed"; -// case PointerUpdateKind::XButton2Released: -// return "XButton2Released"; -// } -// -// return ""; -//} - -static bool -WINRT_IsTouchEvent(Windows::UI::Input::PointerPoint ^pointerPoint) -{ -#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - return true; -#else - using namespace Windows::Devices::Input; - switch (pointerPoint->PointerDevice->PointerDeviceType) { - case PointerDeviceType::Touch: - case PointerDeviceType::Pen: - return true; - default: - return false; - } -#endif -} - -void WINRT_ProcessPointerPressedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint) -{ - if (!window) { - return; - } - - Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint); - - if ( ! WINRT_IsTouchEvent(pointerPoint)) { - SDL_SendMouseButton(window, 0, SDL_PRESSED, button); - } else { - Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, NormalizeZeroToOne); - Windows::Foundation::Point windowPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, TransformToSDLWindowSize); - - if (!WINRT_LeftFingerDown) { - if (button) { - SDL_SendMouseMotion(window, SDL_TOUCH_MOUSEID, 0, (int)windowPoint.X, (int)windowPoint.Y); - SDL_SendMouseButton(window, SDL_TOUCH_MOUSEID, SDL_PRESSED, button); - } - - WINRT_LeftFingerDown = pointerPoint->PointerId; - } - - SDL_SendTouch( - WINRT_TouchID, - (SDL_FingerID) pointerPoint->PointerId, - SDL_TRUE, - normalizedPoint.X, - normalizedPoint.Y, - pointerPoint->Properties->Pressure); - } -} - -void -WINRT_ProcessPointerMovedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint) -{ - if (!window || WINRT_UsingRelativeMouseMode) { - return; - } - - Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, NormalizeZeroToOne); - Windows::Foundation::Point windowPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, TransformToSDLWindowSize); - - if ( ! WINRT_IsTouchEvent(pointerPoint)) { - SDL_SendMouseMotion(window, 0, 0, (int)windowPoint.X, (int)windowPoint.Y); - } else { - if (pointerPoint->PointerId == WINRT_LeftFingerDown) { - SDL_SendMouseMotion(window, SDL_TOUCH_MOUSEID, 0, (int)windowPoint.X, (int)windowPoint.Y); - } - - SDL_SendTouchMotion( - WINRT_TouchID, - (SDL_FingerID) pointerPoint->PointerId, - normalizedPoint.X, - normalizedPoint.Y, - pointerPoint->Properties->Pressure); - } -} - -void WINRT_ProcessPointerReleasedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint) -{ - if (!window) { - return; - } - - Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint); - - if (!WINRT_IsTouchEvent(pointerPoint)) { - SDL_SendMouseButton(window, 0, SDL_RELEASED, button); - } else { - Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, NormalizeZeroToOne); - - if (WINRT_LeftFingerDown == pointerPoint->PointerId) { - if (button) { - SDL_SendMouseButton(window, SDL_TOUCH_MOUSEID, SDL_RELEASED, button); - } - WINRT_LeftFingerDown = 0; - } - - SDL_SendTouch( - WINRT_TouchID, - (SDL_FingerID) pointerPoint->PointerId, - SDL_FALSE, - normalizedPoint.X, - normalizedPoint.Y, - pointerPoint->Properties->Pressure); - } -} - -void WINRT_ProcessPointerEnteredEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint) -{ - if (!window) { - return; - } - - if (!WINRT_IsTouchEvent(pointerPoint)) { - SDL_SetMouseFocus(window); - } -} - -void WINRT_ProcessPointerExitedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint) -{ - if (!window) { - return; - } - - if (!WINRT_IsTouchEvent(pointerPoint)) { - SDL_SetMouseFocus(NULL); - } -} - -void -WINRT_ProcessPointerWheelChangedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint) -{ - if (!window) { - return; - } - - // FIXME: This may need to accumulate deltas up to WHEEL_DELTA - short motion = pointerPoint->Properties->MouseWheelDelta / WHEEL_DELTA; - SDL_SendMouseWheel(window, 0, 0, motion, SDL_MOUSEWHEEL_NORMAL); -} - -void -WINRT_ProcessMouseMovedEvent(SDL_Window * window, Windows::Devices::Input::MouseEventArgs ^args) -{ - if (!window || !WINRT_UsingRelativeMouseMode) { - return; - } - - // DLudwig, 2012-12-28: On some systems, namely Visual Studio's Windows - // Simulator, as well as Windows 8 in a Parallels 8 VM, MouseEventArgs' - // MouseDelta field often reports very large values. More information - // on this can be found at the following pages on MSDN: - // - http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/a3c789fa-f1c5-49c4-9c0a-7db88d0f90f8 - // - https://connect.microsoft.com/VisualStudio/Feedback/details/756515 - // - // The values do not appear to be as large when running on some systems, - // most notably a Surface RT. Furthermore, the values returned by - // CoreWindow's PointerMoved event, and sent to this class' OnPointerMoved - // method, do not ever appear to be large, even when MouseEventArgs' - // MouseDelta is reporting to the contrary. - // - // On systems with the large-values behavior, it appears that the values - // get reported as if the screen's size is 65536 units in both the X and Y - // dimensions. This can be viewed by using Windows' now-private, "Raw Input" - // APIs. (GetRawInputData, RegisterRawInputDevices, WM_INPUT, etc.) - // - // MSDN's documentation on MouseEventArgs' MouseDelta field (at - // http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.input.mouseeventargs.mousedelta ), - // does not seem to indicate (to me) that its values should be so large. It - // says that its values should be a "change in screen location". I could - // be misinterpreting this, however a post on MSDN from a Microsoft engineer (see: - // http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/09a9868e-95bb-4858-ba1a-cb4d2c298d62 ), - // indicates that these values are in DIPs, which is the same unit used - // by CoreWindow's PointerMoved events (via the Position field in its CurrentPoint - // property. See http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.input.pointerpoint.position.aspx - // for details.) - // - // To note, PointerMoved events are sent a 'RawPosition' value (via the - // CurrentPoint property in MouseEventArgs), however these do not seem - // to exhibit the same large-value behavior. - // - // The values passed via PointerMoved events can't always be used for relative - // mouse motion, unfortunately. Its values are bound to the cursor's position, - // which stops when it hits one of the screen's edges. This can be a problem in - // first person shooters, whereby it is normal for mouse motion to travel far - // along any one axis for a period of time. MouseMoved events do not have the - // screen-bounding limitation, and can be used regardless of where the system's - // cursor is. - // - // One possible workaround would be to programmatically set the cursor's - // position to the screen's center (when SDL's relative mouse mode is enabled), - // however WinRT does not yet seem to have the ability to set the cursor's - // position via a public API. Win32 did this via an API call, SetCursorPos, - // however WinRT makes this function be private. Apps that use it won't get - // approved for distribution in the Windows Store. I've yet to be able to find - // a suitable, store-friendly counterpart for WinRT. - // - // There may be some room for a workaround whereby OnPointerMoved's values - // are compared to the values from OnMouseMoved in order to detect - // when this bug is active. A suitable transformation could then be made to - // OnMouseMoved's values. For now, however, the system-reported values are sent - // to SDL with minimal transformation: from native screen coordinates (in DIPs) - // to SDL window coordinates. - // - const Windows::Foundation::Point mouseDeltaInDIPs((float)args->MouseDelta.X, (float)args->MouseDelta.Y); - const Windows::Foundation::Point mouseDeltaInSDLWindowCoords = WINRT_TransformCursorPosition(window, mouseDeltaInDIPs, TransformToSDLWindowSize); - SDL_SendMouseMotion( - window, - 0, - 1, - _lround(mouseDeltaInSDLWindowCoords.X), - _lround(mouseDeltaInSDLWindowCoords.Y)); -} - -#endif // SDL_VIDEO_DRIVER_WINRT diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtvideo.cpp b/3rdparty/SDL2/src/video/winrt/SDL_winrtvideo.cpp deleted file mode 100644 index 9a26705ad4b..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtvideo.cpp +++ /dev/null @@ -1,842 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINRT - -/* WinRT SDL video driver implementation - - Initial work on this was done by David Ludwig (dludwig@pobox.com), and - was based off of SDL's "dummy" video driver. - */ - -/* Windows includes */ -#include <agile.h> -#include <windows.graphics.display.h> -#include <windows.system.display.h> -#include <dxgi.h> -#include <dxgi1_2.h> -using namespace Windows::ApplicationModel::Core; -using namespace Windows::Foundation; -using namespace Windows::Graphics::Display; -using namespace Windows::UI::Core; -using namespace Windows::UI::ViewManagement; - - -/* [re]declare Windows GUIDs locally, to limit the amount of external lib(s) SDL has to link to */ -static const GUID IID_IDisplayRequest = { 0xe5732044, 0xf49f, 0x4b60, { 0x8d, 0xd4, 0x5e, 0x7e, 0x3a, 0x63, 0x2a, 0xc0 } }; -static const GUID IID_IDXGIFactory2 = { 0x50c83a1c, 0xe072, 0x4c48, { 0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0 } }; - - -/* SDL includes */ -extern "C" { -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../../events/SDL_events_c.h" -#include "../../render/SDL_sysrender.h" -#include "SDL_syswm.h" -#include "SDL_winrtopengles.h" -#include "../../core/windows/SDL_windows.h" -} - -#include "../../core/winrt/SDL_winrtapp_direct3d.h" -#include "../../core/winrt/SDL_winrtapp_xaml.h" -#include "SDL_winrtvideo_cpp.h" -#include "SDL_winrtevents_c.h" -#include "SDL_winrtgamebar_cpp.h" -#include "SDL_winrtmouse_c.h" -#include "SDL_main.h" -#include "SDL_system.h" -//#include "SDL_log.h" - - -/* Initialization/Query functions */ -static int WINRT_VideoInit(_THIS); -static int WINRT_InitModes(_THIS); -static int WINRT_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -static void WINRT_VideoQuit(_THIS); - - -/* Window functions */ -static int WINRT_CreateWindow(_THIS, SDL_Window * window); -static void WINRT_SetWindowSize(_THIS, SDL_Window * window); -static void WINRT_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen); -static void WINRT_DestroyWindow(_THIS, SDL_Window * window); -static SDL_bool WINRT_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info); - - -/* Misc functions */ -static ABI::Windows::System::Display::IDisplayRequest * WINRT_CreateDisplayRequest(_THIS); -extern void WINRT_SuspendScreenSaver(_THIS); - - -/* SDL-internal globals: */ -SDL_Window * WINRT_GlobalSDLWindow = NULL; - - -/* WinRT driver bootstrap functions */ - -static int -WINRT_Available(void) -{ - return (1); -} - -static void -WINRT_DeleteDevice(SDL_VideoDevice * device) -{ - if (device->driverdata) { - SDL_VideoData * video_data = (SDL_VideoData *)device->driverdata; - if (video_data->winrtEglWindow) { - video_data->winrtEglWindow->Release(); - } - SDL_free(video_data); - } - - SDL_free(device); -} - -static SDL_VideoDevice * -WINRT_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - SDL_VideoData *data; - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (!device) { - SDL_OutOfMemory(); - return (0); - } - - data = (SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); - if (!data) { - SDL_OutOfMemory(); - SDL_free(device); - return (0); - } - device->driverdata = data; - - /* Set the function pointers */ - device->VideoInit = WINRT_VideoInit; - device->VideoQuit = WINRT_VideoQuit; - device->CreateWindow = WINRT_CreateWindow; - device->SetWindowSize = WINRT_SetWindowSize; - device->SetWindowFullscreen = WINRT_SetWindowFullscreen; - device->DestroyWindow = WINRT_DestroyWindow; - device->SetDisplayMode = WINRT_SetDisplayMode; - device->PumpEvents = WINRT_PumpEvents; - device->GetWindowWMInfo = WINRT_GetWindowWMInfo; - device->SuspendScreenSaver = WINRT_SuspendScreenSaver; - -#if NTDDI_VERSION >= NTDDI_WIN10 - device->HasScreenKeyboardSupport = WINRT_HasScreenKeyboardSupport; - device->ShowScreenKeyboard = WINRT_ShowScreenKeyboard; - device->HideScreenKeyboard = WINRT_HideScreenKeyboard; - device->IsScreenKeyboardShown = WINRT_IsScreenKeyboardShown; -#endif - -#ifdef SDL_VIDEO_OPENGL_EGL - device->GL_LoadLibrary = WINRT_GLES_LoadLibrary; - device->GL_GetProcAddress = WINRT_GLES_GetProcAddress; - device->GL_UnloadLibrary = WINRT_GLES_UnloadLibrary; - device->GL_CreateContext = WINRT_GLES_CreateContext; - device->GL_MakeCurrent = WINRT_GLES_MakeCurrent; - device->GL_SetSwapInterval = WINRT_GLES_SetSwapInterval; - device->GL_GetSwapInterval = WINRT_GLES_GetSwapInterval; - device->GL_SwapWindow = WINRT_GLES_SwapWindow; - device->GL_DeleteContext = WINRT_GLES_DeleteContext; -#endif - device->free = WINRT_DeleteDevice; - - return device; -} - -#define WINRTVID_DRIVER_NAME "winrt" -VideoBootStrap WINRT_bootstrap = { - WINRTVID_DRIVER_NAME, "SDL WinRT video driver", - WINRT_Available, WINRT_CreateDevice -}; - -int -WINRT_VideoInit(_THIS) -{ - SDL_VideoData * driverdata = (SDL_VideoData *) _this->driverdata; - if (WINRT_InitModes(_this) < 0) { - return -1; - } - WINRT_InitMouse(_this); - WINRT_InitTouch(_this); - WINRT_InitGameBar(_this); - if (driverdata) { - /* Initialize screensaver-disabling support */ - driverdata->displayRequest = WINRT_CreateDisplayRequest(_this); - } - return 0; -} - -extern "C" -Uint32 D3D11_DXGIFormatToSDLPixelFormat(DXGI_FORMAT dxgiFormat); - -static void -WINRT_DXGIModeToSDLDisplayMode(const DXGI_MODE_DESC * dxgiMode, SDL_DisplayMode * sdlMode) -{ - SDL_zerop(sdlMode); - sdlMode->w = dxgiMode->Width; - sdlMode->h = dxgiMode->Height; - sdlMode->refresh_rate = dxgiMode->RefreshRate.Numerator / dxgiMode->RefreshRate.Denominator; - sdlMode->format = D3D11_DXGIFormatToSDLPixelFormat(dxgiMode->Format); -} - -static int -WINRT_AddDisplaysForOutput (_THIS, IDXGIAdapter1 * dxgiAdapter1, int outputIndex) -{ - HRESULT hr; - IDXGIOutput * dxgiOutput = NULL; - DXGI_OUTPUT_DESC dxgiOutputDesc; - SDL_VideoDisplay display; - char * displayName = NULL; - UINT numModes; - DXGI_MODE_DESC * dxgiModes = NULL; - int functionResult = -1; /* -1 for failure, 0 for success */ - DXGI_MODE_DESC modeToMatch, closestMatch; - - SDL_zero(display); - - hr = dxgiAdapter1->EnumOutputs(outputIndex, &dxgiOutput); - if (FAILED(hr)) { - if (hr != DXGI_ERROR_NOT_FOUND) { - WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGIAdapter1::EnumOutputs failed", hr); - } - goto done; - } - - hr = dxgiOutput->GetDesc(&dxgiOutputDesc); - if (FAILED(hr)) { - WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGIOutput::GetDesc failed", hr); - goto done; - } - - SDL_zero(modeToMatch); - modeToMatch.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - modeToMatch.Width = (dxgiOutputDesc.DesktopCoordinates.right - dxgiOutputDesc.DesktopCoordinates.left); - modeToMatch.Height = (dxgiOutputDesc.DesktopCoordinates.bottom - dxgiOutputDesc.DesktopCoordinates.top); - hr = dxgiOutput->FindClosestMatchingMode(&modeToMatch, &closestMatch, NULL); - if (hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE) { - /* DXGI_ERROR_NOT_CURRENTLY_AVAILABLE gets returned by IDXGIOutput::FindClosestMatchingMode - when running under the Windows Simulator, which uses Remote Desktop (formerly known as Terminal - Services) under the hood. According to the MSDN docs for the similar function, - IDXGIOutput::GetDisplayModeList, DXGI_ERROR_NOT_CURRENTLY_AVAILABLE is returned if and - when an app is run under a Terminal Services session, hence the assumption. - - In this case, just add an SDL display mode, with approximated values. - */ - SDL_DisplayMode mode; - SDL_zero(mode); - display.name = "Windows Simulator / Terminal Services Display"; - mode.w = (dxgiOutputDesc.DesktopCoordinates.right - dxgiOutputDesc.DesktopCoordinates.left); - mode.h = (dxgiOutputDesc.DesktopCoordinates.bottom - dxgiOutputDesc.DesktopCoordinates.top); - mode.format = DXGI_FORMAT_B8G8R8A8_UNORM; - mode.refresh_rate = 0; /* Display mode is unknown, so just fill in zero, as specified by SDL's header files */ - display.desktop_mode = mode; - display.current_mode = mode; - if ( ! SDL_AddDisplayMode(&display, &mode)) { - goto done; - } - } else if (FAILED(hr)) { - WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGIOutput::FindClosestMatchingMode failed", hr); - goto done; - } else { - displayName = WIN_StringToUTF8(dxgiOutputDesc.DeviceName); - display.name = displayName; - WINRT_DXGIModeToSDLDisplayMode(&closestMatch, &display.desktop_mode); - display.current_mode = display.desktop_mode; - - hr = dxgiOutput->GetDisplayModeList(DXGI_FORMAT_B8G8R8A8_UNORM, 0, &numModes, NULL); - if (FAILED(hr)) { - if (hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE) { - // TODO, WinRT: make sure display mode(s) are added when using Terminal Services / Windows Simulator - } - WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGIOutput::GetDisplayModeList [get mode list size] failed", hr); - goto done; - } - - dxgiModes = (DXGI_MODE_DESC *)SDL_calloc(numModes, sizeof(DXGI_MODE_DESC)); - if ( ! dxgiModes) { - SDL_OutOfMemory(); - goto done; - } - - hr = dxgiOutput->GetDisplayModeList(DXGI_FORMAT_B8G8R8A8_UNORM, 0, &numModes, dxgiModes); - if (FAILED(hr)) { - WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGIOutput::GetDisplayModeList [get mode contents] failed", hr); - goto done; - } - - for (UINT i = 0; i < numModes; ++i) { - SDL_DisplayMode sdlMode; - WINRT_DXGIModeToSDLDisplayMode(&dxgiModes[i], &sdlMode); - SDL_AddDisplayMode(&display, &sdlMode); - } - } - - if (SDL_AddVideoDisplay(&display) < 0) { - goto done; - } - - functionResult = 0; /* 0 for Success! */ -done: - if (dxgiModes) { - SDL_free(dxgiModes); - } - if (dxgiOutput) { - dxgiOutput->Release(); - } - if (displayName) { - SDL_free(displayName); - } - return functionResult; -} - -static int -WINRT_AddDisplaysForAdapter (_THIS, IDXGIFactory2 * dxgiFactory2, int adapterIndex) -{ - HRESULT hr; - IDXGIAdapter1 * dxgiAdapter1; - - hr = dxgiFactory2->EnumAdapters1(adapterIndex, &dxgiAdapter1); - if (FAILED(hr)) { - if (hr != DXGI_ERROR_NOT_FOUND) { - WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGIFactory1::EnumAdapters1() failed", hr); - } - return -1; - } - - for (int outputIndex = 0; ; ++outputIndex) { - if (WINRT_AddDisplaysForOutput(_this, dxgiAdapter1, outputIndex) < 0) { - /* HACK: The Windows App Certification Kit 10.0 can fail, when - running the Store Apps' test, "Direct3D Feature Test". The - certification kit's error is: - - "Application App was not running at the end of the test. It likely crashed or was terminated for having become unresponsive." - - This was caused by SDL/WinRT's DXGI failing to report any - outputs. Attempts to get the 1st display-output from the - 1st display-adapter can fail, with IDXGIAdapter::EnumOutputs - returning DXGI_ERROR_NOT_FOUND. This could be a bug in Windows, - the Windows App Certification Kit, or possibly in SDL/WinRT's - display detection code. Either way, try to detect when this - happens, and use a hackish means to create a reasonable-as-possible - 'display mode'. -- DavidL - */ - if (adapterIndex == 0 && outputIndex == 0) { - SDL_VideoDisplay display; - SDL_DisplayMode mode; -#if SDL_WINRT_USE_APPLICATIONVIEW - ApplicationView ^ appView = ApplicationView::GetForCurrentView(); -#endif - CoreWindow ^ coreWin = CoreWindow::GetForCurrentThread(); - SDL_zero(display); - SDL_zero(mode); - display.name = "DXGI Display-detection Workaround"; - - /* HACK: ApplicationView's VisibleBounds property, appeared, via testing, to - give a better approximation of display-size, than did CoreWindow's - Bounds property, insofar that ApplicationView::VisibleBounds seems like - it will, at least some of the time, give the full display size (during the - failing test), whereas CoreWindow might not. -- DavidL - */ - -#if (NTDDI_VERSION >= NTDDI_WIN10) || (SDL_WINRT_USE_APPLICATIONVIEW && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) - mode.w = WINRT_DIPS_TO_PHYSICAL_PIXELS(appView->VisibleBounds.Width); - mode.h = WINRT_DIPS_TO_PHYSICAL_PIXELS(appView->VisibleBounds.Height); -#else - /* On platform(s) that do not support VisibleBounds, such as Windows 8.1, - fall back to CoreWindow's Bounds property. - */ - mode.w = WINRT_DIPS_TO_PHYSICAL_PIXELS(coreWin->Bounds.Width); - mode.h = WINRT_DIPS_TO_PHYSICAL_PIXELS(coreWin->Bounds.Height); -#endif - - mode.format = DXGI_FORMAT_B8G8R8A8_UNORM; - mode.refresh_rate = 0; /* Display mode is unknown, so just fill in zero, as specified by SDL's header files */ - display.desktop_mode = mode; - display.current_mode = mode; - if ((SDL_AddDisplayMode(&display, &mode) < 0) || - (SDL_AddVideoDisplay(&display) < 0)) - { - return SDL_SetError("Failed to apply DXGI Display-detection workaround"); - } - } - - break; - } - } - - dxgiAdapter1->Release(); - return 0; -} - -int -WINRT_InitModes(_THIS) -{ - /* HACK: Initialize a single display, for whatever screen the app's - CoreApplicationView is on. - TODO, WinRT: Try initializing multiple displays, one for each monitor. - Appropriate WinRT APIs for this seem elusive, though. -- DavidL - */ - - HRESULT hr; - IDXGIFactory2 * dxgiFactory2 = NULL; - - hr = CreateDXGIFactory1(IID_IDXGIFactory2, (void **)&dxgiFactory2); - if (FAILED(hr)) { - WIN_SetErrorFromHRESULT(__FUNCTION__ ", CreateDXGIFactory1() failed", hr); - return -1; - } - - for (int adapterIndex = 0; ; ++adapterIndex) { - if (WINRT_AddDisplaysForAdapter(_this, dxgiFactory2, adapterIndex) < 0) { - break; - } - } - - return 0; -} - -static int -WINRT_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) -{ - return 0; -} - -void -WINRT_VideoQuit(_THIS) -{ - SDL_VideoData * driverdata = (SDL_VideoData *) _this->driverdata; - if (driverdata && driverdata->displayRequest) { - driverdata->displayRequest->Release(); - driverdata->displayRequest = NULL; - } - WINRT_QuitGameBar(_this); - WINRT_QuitMouse(_this); -} - -static const Uint32 WINRT_DetectableFlags = - SDL_WINDOW_MAXIMIZED | - SDL_WINDOW_FULLSCREEN_DESKTOP | - SDL_WINDOW_SHOWN | - SDL_WINDOW_HIDDEN | - SDL_WINDOW_MOUSE_FOCUS; - -extern "C" Uint32 -WINRT_DetectWindowFlags(SDL_Window * window) -{ - Uint32 latestFlags = 0; - SDL_WindowData * data = (SDL_WindowData *) window->driverdata; - bool is_fullscreen = false; - -#if SDL_WINRT_USE_APPLICATIONVIEW - if (data->appView) { - is_fullscreen = data->appView->IsFullScreen; - } -#elif (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) || (NTDDI_VERSION == NTDDI_WIN8) - is_fullscreen = true; -#endif - - if (data->coreWindow.Get()) { - if (is_fullscreen) { - SDL_VideoDisplay * display = SDL_GetDisplayForWindow(window); - int w = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Width); - int h = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Height); - -#if (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) || (NTDDI_VERSION > NTDDI_WIN8) - // On all WinRT platforms, except for WinPhone 8.0, rotate the - // window size. This is needed to properly calculate - // fullscreen vs. maximized. - const DisplayOrientations currentOrientation = WINRT_DISPLAY_PROPERTY(CurrentOrientation); - switch (currentOrientation) { -#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) - case DisplayOrientations::Landscape: - case DisplayOrientations::LandscapeFlipped: -#else - case DisplayOrientations::Portrait: - case DisplayOrientations::PortraitFlipped: -#endif - { - int tmp = w; - w = h; - h = tmp; - } break; - } -#endif - - if (display->desktop_mode.w != w || display->desktop_mode.h != h) { - latestFlags |= SDL_WINDOW_MAXIMIZED; - } else { - latestFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP; - } - } - - if (data->coreWindow->Visible) { - latestFlags |= SDL_WINDOW_SHOWN; - } else { - latestFlags |= SDL_WINDOW_HIDDEN; - } - -#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) && (NTDDI_VERSION < NTDDI_WINBLUE) - // data->coreWindow->PointerPosition is not supported on WinPhone 8.0 - latestFlags |= SDL_WINDOW_MOUSE_FOCUS; -#else - if (data->coreWindow->Visible && data->coreWindow->Bounds.Contains(data->coreWindow->PointerPosition)) { - latestFlags |= SDL_WINDOW_MOUSE_FOCUS; - } -#endif - } - - return latestFlags; -} - -// TODO, WinRT: consider removing WINRT_UpdateWindowFlags, and just calling WINRT_DetectWindowFlags as-appropriate (with appropriate calls to SDL_SendWindowEvent) -void -WINRT_UpdateWindowFlags(SDL_Window * window, Uint32 mask) -{ - mask &= WINRT_DetectableFlags; - if (window) { - Uint32 apply = WINRT_DetectWindowFlags(window); - if ((apply & mask) & SDL_WINDOW_FULLSCREEN) { - window->last_fullscreen_flags = window->flags; // seems necessary to programmatically un-fullscreen, via SDL APIs - } - window->flags = (window->flags & ~mask) | (apply & mask); - } -} - -static bool -WINRT_IsCoreWindowActive(CoreWindow ^ coreWindow) -{ - /* WinRT does not appear to offer API(s) to determine window-activation state, - at least not that I am aware of in Win8 - Win10. As such, SDL tracks this - itself, via window-activation events. - - If there *is* an API to track this, it should probably get used instead - of the following hack (that uses "SDLHelperWindowActivationState"). - -- DavidL. - */ - if (coreWindow->CustomProperties->HasKey("SDLHelperWindowActivationState")) { - CoreWindowActivationState activationState = \ - safe_cast<CoreWindowActivationState>(coreWindow->CustomProperties->Lookup("SDLHelperWindowActivationState")); - return (activationState != CoreWindowActivationState::Deactivated); - } - - /* Assume that non-SDL tracked windows are active, although this should - probably be avoided, if possible. - - This might not even be possible, in normal SDL use, at least as of - this writing (Dec 22, 2015; via latest hg.libsdl.org/SDL clone) -- DavidL - */ - return true; -} - -int -WINRT_CreateWindow(_THIS, SDL_Window * window) -{ - // Make sure that only one window gets created, at least until multimonitor - // support is added. - if (WINRT_GlobalSDLWindow != NULL) { - SDL_SetError("WinRT only supports one window"); - return -1; - } - - SDL_WindowData *data = new SDL_WindowData; /* use 'new' here as SDL_WindowData may use WinRT/C++ types */ - if (!data) { - SDL_OutOfMemory(); - return -1; - } - window->driverdata = data; - data->sdlWindow = window; - - /* To note, when XAML support is enabled, access to the CoreWindow will not - be possible, at least not via the SDL/XAML thread. Attempts to access it - from there will throw exceptions. As such, the SDL_WindowData's - 'coreWindow' field will only be set (to a non-null value) if XAML isn't - enabled. - */ - if (!WINRT_XAMLWasEnabled) { - data->coreWindow = CoreWindow::GetForCurrentThread(); -#if SDL_WINRT_USE_APPLICATIONVIEW - data->appView = ApplicationView::GetForCurrentView(); -#endif - } - - /* Make note of the requested window flags, before they start getting changed. */ - const Uint32 requestedFlags = window->flags; - -#if SDL_VIDEO_OPENGL_EGL - /* Setup the EGL surface, but only if OpenGL ES 2 was requested. */ - if (!(window->flags & SDL_WINDOW_OPENGL)) { - /* OpenGL ES 2 wasn't requested. Don't set up an EGL surface. */ - data->egl_surface = EGL_NO_SURFACE; - } else { - /* OpenGL ES 2 was reuqested. Set up an EGL surface. */ - SDL_VideoData * video_data = (SDL_VideoData *)_this->driverdata; - - /* Call SDL_EGL_ChooseConfig and eglCreateWindowSurface directly, - * rather than via SDL_EGL_CreateSurface, as older versions of - * ANGLE/WinRT may require that a C++ object, ComPtr<IUnknown>, - * be passed into eglCreateWindowSurface. - */ - if (SDL_EGL_ChooseConfig(_this) != 0) { - char buf[512]; - SDL_snprintf(buf, sizeof(buf), "SDL_EGL_ChooseConfig failed: %s", SDL_GetError()); - return SDL_SetError("%s", buf); - } - - if (video_data->winrtEglWindow) { /* ... is the 'old' version of ANGLE/WinRT being used? */ - /* Attempt to create a window surface using older versions of - * ANGLE/WinRT: - */ - Microsoft::WRL::ComPtr<IUnknown> cpp_winrtEglWindow = video_data->winrtEglWindow; - data->egl_surface = ((eglCreateWindowSurface_Old_Function)_this->egl_data->eglCreateWindowSurface)( - _this->egl_data->egl_display, - _this->egl_data->egl_config, - cpp_winrtEglWindow, NULL); - if (data->egl_surface == NULL) { - return SDL_SetError("eglCreateWindowSurface failed"); - } - } else if (data->coreWindow.Get() != nullptr) { - /* Attempt to create a window surface using newer versions of - * ANGLE/WinRT: - */ - IInspectable * coreWindowAsIInspectable = reinterpret_cast<IInspectable *>(data->coreWindow.Get()); - data->egl_surface = _this->egl_data->eglCreateWindowSurface( - _this->egl_data->egl_display, - _this->egl_data->egl_config, - coreWindowAsIInspectable, - NULL); - if (data->egl_surface == NULL) { - return SDL_SetError("eglCreateWindowSurface failed"); - } - } else { - return SDL_SetError("No supported means to create an EGL window surface are available"); - } - } -#endif - - /* Determine as many flags dynamically, as possible. */ - window->flags = - SDL_WINDOW_BORDERLESS | - SDL_WINDOW_RESIZABLE; - -#if SDL_VIDEO_OPENGL_EGL - if (data->egl_surface) { - window->flags |= SDL_WINDOW_OPENGL; - } -#endif - - if (WINRT_XAMLWasEnabled) { - /* TODO, WinRT: set SDL_Window size, maybe position too, from XAML control */ - window->x = 0; - window->y = 0; - window->flags |= SDL_WINDOW_SHOWN; - SDL_SetMouseFocus(NULL); // TODO: detect this - SDL_SetKeyboardFocus(NULL); // TODO: detect this - } else { - /* WinRT 8.x apps seem to live in an environment where the OS controls the - app's window size, with some apps being fullscreen, depending on - user choice of various things. For now, just adapt the SDL_Window to - whatever Windows set-up as the native-window's geometry. - */ - window->x = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Left); - window->y = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Top); -#if NTDDI_VERSION < NTDDI_WIN10 - /* On WinRT 8.x / pre-Win10, just use the size we were given. */ - window->w = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Width); - window->h = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Height); -#else - /* On Windows 10, we occasionally get control over window size. For windowed - mode apps, try this. - */ - bool didSetSize = false; - if (!(requestedFlags & SDL_WINDOW_FULLSCREEN)) { - const Windows::Foundation::Size size(WINRT_PHYSICAL_PIXELS_TO_DIPS(window->w), - WINRT_PHYSICAL_PIXELS_TO_DIPS(window->h)); - didSetSize = data->appView->TryResizeView(size); - } - if (!didSetSize) { - /* We either weren't able to set the window size, or a request for - fullscreen was made. Get window-size info from the OS. - */ - window->w = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Width); - window->h = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Height); - } -#endif - - WINRT_UpdateWindowFlags( - window, - 0xffffffff /* Update any window flag(s) that WINRT_UpdateWindow can handle */ - ); - - /* Try detecting if the window is active */ - bool isWindowActive = WINRT_IsCoreWindowActive(data->coreWindow.Get()); - if (isWindowActive) { - SDL_SetKeyboardFocus(window); - } - } - - /* Make sure the WinRT app's IFramworkView can post events on - behalf of SDL: - */ - WINRT_GlobalSDLWindow = window; - - /* All done! */ - return 0; -} - -void -WINRT_SetWindowSize(_THIS, SDL_Window * window) -{ -#if NTDDI_VERSION >= NTDDI_WIN10 - SDL_WindowData * data = (SDL_WindowData *)window->driverdata; - const Windows::Foundation::Size size(WINRT_PHYSICAL_PIXELS_TO_DIPS(window->w), - WINRT_PHYSICAL_PIXELS_TO_DIPS(window->h)); - data->appView->TryResizeView(size); // TODO, WinRT: return failure (to caller?) from TryResizeView() -#endif -} - -void -WINRT_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen) -{ -#if NTDDI_VERSION >= NTDDI_WIN10 - SDL_WindowData * data = (SDL_WindowData *)window->driverdata; - bool isWindowActive = WINRT_IsCoreWindowActive(data->coreWindow.Get()); - if (isWindowActive) { - if (fullscreen) { - if (!data->appView->IsFullScreenMode) { - data->appView->TryEnterFullScreenMode(); // TODO, WinRT: return failure (to caller?) from TryEnterFullScreenMode() - } - } else { - if (data->appView->IsFullScreenMode) { - data->appView->ExitFullScreenMode(); - } - } - } -#endif -} - - -void -WINRT_DestroyWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData * data = (SDL_WindowData *) window->driverdata; - - if (WINRT_GlobalSDLWindow == window) { - WINRT_GlobalSDLWindow = NULL; - } - - if (data) { - // Delete the internal window data: - delete data; - data = NULL; - window->driverdata = NULL; - } -} - -SDL_bool -WINRT_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) -{ - SDL_WindowData * data = (SDL_WindowData *) window->driverdata; - - if (info->version.major <= SDL_MAJOR_VERSION) { - info->subsystem = SDL_SYSWM_WINRT; - info->info.winrt.window = reinterpret_cast<IInspectable *>(data->coreWindow.Get()); - return SDL_TRUE; - } else { - SDL_SetError("Application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } - return SDL_FALSE; -} - -static ABI::Windows::System::Display::IDisplayRequest * -WINRT_CreateDisplayRequest(_THIS) -{ - /* Setup a WinRT DisplayRequest object, usable for enabling/disabling screensaver requests */ - wchar_t *wClassName = L"Windows.System.Display.DisplayRequest"; - HSTRING hClassName; - IActivationFactory *pActivationFactory = NULL; - IInspectable * pDisplayRequestRaw = nullptr; - ABI::Windows::System::Display::IDisplayRequest * pDisplayRequest = nullptr; - HRESULT hr; - - hr = ::WindowsCreateString(wClassName, (UINT32)wcslen(wClassName), &hClassName); - if (FAILED(hr)) { - goto done; - } - - hr = Windows::Foundation::GetActivationFactory(hClassName, &pActivationFactory); - if (FAILED(hr)) { - goto done; - } - - hr = pActivationFactory->ActivateInstance(&pDisplayRequestRaw); - if (FAILED(hr)) { - goto done; - } - - hr = pDisplayRequestRaw->QueryInterface(IID_IDisplayRequest, (void **) &pDisplayRequest); - if (FAILED(hr)) { - goto done; - } - -done: - if (pDisplayRequestRaw) { - pDisplayRequestRaw->Release(); - } - if (pActivationFactory) { - pActivationFactory->Release(); - } - if (hClassName) { - ::WindowsDeleteString(hClassName); - } - - return pDisplayRequest; -} - -void -WINRT_SuspendScreenSaver(_THIS) -{ - SDL_VideoData *driverdata = (SDL_VideoData *)_this->driverdata; - if (driverdata && driverdata->displayRequest) { - ABI::Windows::System::Display::IDisplayRequest * displayRequest = (ABI::Windows::System::Display::IDisplayRequest *) driverdata->displayRequest; - if (_this->suspend_screensaver) { - displayRequest->RequestActive(); - } else { - displayRequest->RequestRelease(); - } - } -} - -#endif /* SDL_VIDEO_DRIVER_WINRT */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/winrt/SDL_winrtvideo_cpp.h b/3rdparty/SDL2/src/video/winrt/SDL_winrtvideo_cpp.h deleted file mode 100644 index 7d5ce13e0e5..00000000000 --- a/3rdparty/SDL2/src/video/winrt/SDL_winrtvideo_cpp.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* Windows includes: */ -#include <windows.h> -#ifdef __cplusplus_winrt -#include <agile.h> -#endif - -/* SDL includes: */ -#include "SDL_video.h" -#include "SDL_events.h" - -#if NTDDI_VERSION >= NTDDI_WINBLUE /* ApplicationView's functionality only becomes - useful for SDL in Win[Phone] 8.1 and up. - Plus, it is not available at all in WinPhone 8.0. */ -#define SDL_WINRT_USE_APPLICATIONVIEW 1 -#endif - -extern "C" { -#include "../SDL_sysvideo.h" -#include "../SDL_egl_c.h" -} - -/* Private display data */ -typedef struct SDL_VideoData { - /* An object created by ANGLE/WinRT (OpenGL ES 2 for WinRT) that gets - * passed to eglGetDisplay and eglCreateWindowSurface: - */ - IUnknown *winrtEglWindow; - - /* Event token(s), for unregistering WinRT event handler(s). - These are just a struct with a 64-bit integer inside them - */ - Windows::Foundation::EventRegistrationToken gameBarIsInputRedirectedToken; - - /* A WinRT DisplayRequest, used for implementing SDL_*ScreenSaver() functions. - * This is really a pointer to a 'ABI::Windows::System::Display::IDisplayRequest *', - * It's casted to 'IUnknown *', to help with building SDL. - */ - IUnknown *displayRequest; -} SDL_VideoData; - -/* The global, WinRT, SDL Window. - For now, SDL/WinRT only supports one window (due to platform limitations of - WinRT. -*/ -extern SDL_Window * WINRT_GlobalSDLWindow; - -/* Updates one or more SDL_Window flags, by querying the OS' native windowing APIs. - SDL_Window flags that can be updated should be specified in 'mask'. -*/ -extern void WINRT_UpdateWindowFlags(SDL_Window * window, Uint32 mask); -extern "C" Uint32 WINRT_DetectWindowFlags(SDL_Window * window); /* detects flags w/o applying them */ - -/* Display mode internals */ -//typedef struct -//{ -// Windows::Graphics::Display::DisplayOrientations currentOrientation; -//} SDL_DisplayModeData; - -#ifdef __cplusplus_winrt - -/* A convenience macro to get a WinRT display property */ -#if NTDDI_VERSION > NTDDI_WIN8 -#define WINRT_DISPLAY_PROPERTY(NAME) (Windows::Graphics::Display::DisplayInformation::GetForCurrentView()->NAME) -#else -#define WINRT_DISPLAY_PROPERTY(NAME) (Windows::Graphics::Display::DisplayProperties::NAME) -#endif - -/* Converts DIPS to/from physical pixels */ -#define WINRT_DIPS_TO_PHYSICAL_PIXELS(DIPS) ((int)(0.5f + (((float)(DIPS) * (float)WINRT_DISPLAY_PROPERTY(LogicalDpi)) / 96.f))) -#define WINRT_PHYSICAL_PIXELS_TO_DIPS(PHYSPIX) (((float)(PHYSPIX) * 96.f)/WINRT_DISPLAY_PROPERTY(LogicalDpi)) - -/* Internal window data */ -struct SDL_WindowData -{ - SDL_Window *sdlWindow; - Platform::Agile<Windows::UI::Core::CoreWindow> coreWindow; -#ifdef SDL_VIDEO_OPENGL_EGL - EGLSurface egl_surface; -#endif -#if SDL_WINRT_USE_APPLICATIONVIEW - Windows::UI::ViewManagement::ApplicationView ^ appView; -#endif -}; - -#endif // ifdef __cplusplus_winrt diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11clipboard.c b/3rdparty/SDL2/src/video/x11/SDL_x11clipboard.c deleted file mode 100644 index 34c0a71c69d..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11clipboard.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include <limits.h> /* For INT_MAX */ - -#include "SDL_events.h" -#include "SDL_x11video.h" -#include "SDL_timer.h" - - -/* If you don't support UTF-8, you might use XA_STRING here */ -#ifdef X_HAVE_UTF8_STRING -#define TEXT_FORMAT X11_XInternAtom(display, "UTF8_STRING", False) -#else -#define TEXT_FORMAT XA_STRING -#endif - -/* Get any application owned window handle for clipboard association */ -static Window -GetWindow(_THIS) -{ - SDL_Window *window; - - window = _this->windows; - if (window) { - return ((SDL_WindowData *) window->driverdata)->xwindow; - } - return None; -} - -/* We use our own cut-buffer for intermediate storage instead of - XA_CUT_BUFFER0 because their use isn't really defined for holding UTF8. */ -Atom -X11_GetSDLCutBufferClipboardType(Display *display) -{ - return X11_XInternAtom(display, "SDL_CUTBUFFER", False); -} - -int -X11_SetClipboardText(_THIS, const char *text) -{ - Display *display = ((SDL_VideoData *) _this->driverdata)->display; - Atom format; - Window window; - Atom XA_CLIPBOARD = X11_XInternAtom(display, "CLIPBOARD", 0); - - /* Get the SDL window that will own the selection */ - window = GetWindow(_this); - if (window == None) { - return SDL_SetError("Couldn't find a window to own the selection"); - } - - /* Save the selection on the root window */ - format = TEXT_FORMAT; - X11_XChangeProperty(display, DefaultRootWindow(display), - X11_GetSDLCutBufferClipboardType(display), format, 8, PropModeReplace, - (const unsigned char *)text, SDL_strlen(text)); - - if (XA_CLIPBOARD != None && - X11_XGetSelectionOwner(display, XA_CLIPBOARD) != window) { - X11_XSetSelectionOwner(display, XA_CLIPBOARD, window, CurrentTime); - } - - if (X11_XGetSelectionOwner(display, XA_PRIMARY) != window) { - X11_XSetSelectionOwner(display, XA_PRIMARY, window, CurrentTime); - } - return 0; -} - -char * -X11_GetClipboardText(_THIS) -{ - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - Display *display = videodata->display; - Atom format; - Window window; - Window owner; - Atom selection; - Atom seln_type; - int seln_format; - unsigned long nbytes; - unsigned long overflow; - unsigned char *src; - char *text; - Uint32 waitStart; - Uint32 waitElapsed; - Atom XA_CLIPBOARD = X11_XInternAtom(display, "CLIPBOARD", 0); - if (XA_CLIPBOARD == None) { - SDL_SetError("Couldn't access X clipboard"); - return SDL_strdup(""); - } - - text = NULL; - - /* Get the window that holds the selection */ - window = GetWindow(_this); - format = TEXT_FORMAT; - owner = X11_XGetSelectionOwner(display, XA_CLIPBOARD); - if (owner == None) { - /* Fall back to ancient X10 cut-buffers which do not support UTF8 strings*/ - owner = DefaultRootWindow(display); - selection = XA_CUT_BUFFER0; - format = XA_STRING; - } else if (owner == window) { - owner = DefaultRootWindow(display); - selection = X11_GetSDLCutBufferClipboardType(display); - } else { - /* Request that the selection owner copy the data to our window */ - owner = window; - selection = X11_XInternAtom(display, "SDL_SELECTION", False); - X11_XConvertSelection(display, XA_CLIPBOARD, format, selection, owner, - CurrentTime); - - /* When using synergy on Linux and when data has been put in the clipboard - on the remote (Windows anyway) machine then selection_waiting may never - be set to False. Time out after a while. */ - waitStart = SDL_GetTicks(); - videodata->selection_waiting = SDL_TRUE; - while (videodata->selection_waiting) { - SDL_PumpEvents(); - waitElapsed = SDL_GetTicks() - waitStart; - /* Wait one second for a clipboard response. */ - if (waitElapsed > 1000) { - videodata->selection_waiting = SDL_FALSE; - SDL_SetError("Clipboard timeout"); - /* We need to set the clipboard text so that next time we won't - timeout, otherwise we will hang on every call to this function. */ - X11_SetClipboardText(_this, ""); - return SDL_strdup(""); - } - } - } - - if (X11_XGetWindowProperty(display, owner, selection, 0, INT_MAX/4, False, - format, &seln_type, &seln_format, &nbytes, &overflow, &src) - == Success) { - if (seln_type == format) { - text = (char *)SDL_malloc(nbytes+1); - if (text) { - SDL_memcpy(text, src, nbytes); - text[nbytes] = '\0'; - } - } - X11_XFree(src); - } - - if (!text) { - text = SDL_strdup(""); - } - - return text; -} - -SDL_bool -X11_HasClipboardText(_THIS) -{ - SDL_bool result = SDL_FALSE; - char *text = X11_GetClipboardText(_this); - if (text) { - result = text[0] != '\0' ? SDL_TRUE : SDL_FALSE; - SDL_free(text); - } - return result; -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11clipboard.h b/3rdparty/SDL2/src/video/x11/SDL_x11clipboard.h deleted file mode 100644 index 15dae7dfdcd..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11clipboard.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11clipboard_h -#define _SDL_x11clipboard_h - -extern int X11_SetClipboardText(_THIS, const char *text); -extern char *X11_GetClipboardText(_THIS); -extern SDL_bool X11_HasClipboardText(_THIS); -extern Atom X11_GetSDLCutBufferClipboardType(Display *display); - -#endif /* _SDL_x11clipboard_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11dyn.c b/3rdparty/SDL2/src/video/x11/SDL_x11dyn.c deleted file mode 100644 index d07fda740aa..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11dyn.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#define DEBUG_DYNAMIC_X11 0 - -#include "SDL_x11dyn.h" - -#if DEBUG_DYNAMIC_X11 -#include <stdio.h> -#endif - -#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC - -#include "SDL_name.h" -#include "SDL_loadso.h" - -typedef struct -{ - void *lib; - const char *libname; -} x11dynlib; - -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC -#define SDL_VIDEO_DRIVER_X11_DYNAMIC NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE NULL -#endif - -static x11dynlib x11libs[] = { - {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC}, - {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT}, - {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR}, - {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA}, - {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2}, - {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR}, - {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS}, - {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE} -}; - -static void * -X11_GetSym(const char *fnname, int *pHasModule) -{ - int i; - void *fn = NULL; - for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { - if (x11libs[i].lib != NULL) { - fn = SDL_LoadFunction(x11libs[i].lib, fnname); - if (fn != NULL) - break; - } - } - -#if DEBUG_DYNAMIC_X11 - if (fn != NULL) - printf("X11: Found '%s' in %s (%p)\n", fnname, x11libs[i].libname, fn); - else - printf("X11: Symbol '%s' NOT FOUND!\n", fnname); -#endif - - if (fn == NULL) - *pHasModule = 0; /* kill this module. */ - - return fn; -} - -#endif /* SDL_VIDEO_DRIVER_X11_DYNAMIC */ - -/* Define all the function pointers and wrappers... */ -#define SDL_X11_SYM(rc,fn,params,args,ret) SDL_DYNX11FN_##fn X11_##fn = NULL; -#include "SDL_x11sym.h" - -/* Annoying varargs entry point... */ -#ifdef X_HAVE_UTF8_STRING -SDL_DYNX11FN_XCreateIC X11_XCreateIC = NULL; -SDL_DYNX11FN_XGetICValues X11_XGetICValues = NULL; -#endif - -/* These SDL_X11_HAVE_* flags are here whether you have dynamic X11 or not. */ -#define SDL_X11_MODULE(modname) int SDL_X11_HAVE_##modname = 0; -#include "SDL_x11sym.h" - -static int x11_load_refcount = 0; - -void -SDL_X11_UnloadSymbols(void) -{ - /* Don't actually unload if more than one module is using the libs... */ - if (x11_load_refcount > 0) { - if (--x11_load_refcount == 0) { - int i; - - /* set all the function pointers to NULL. */ -#define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 0; -#define SDL_X11_SYM(rc,fn,params,args,ret) X11_##fn = NULL; -#include "SDL_x11sym.h" - -#ifdef X_HAVE_UTF8_STRING - X11_XCreateIC = NULL; - X11_XGetICValues = NULL; -#endif - -#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC - for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { - if (x11libs[i].lib != NULL) { - SDL_UnloadObject(x11libs[i].lib); - x11libs[i].lib = NULL; - } - } -#endif - } - } -} - -/* returns non-zero if all needed symbols were loaded. */ -int -SDL_X11_LoadSymbols(void) -{ - int rc = 1; /* always succeed if not using Dynamic X11 stuff. */ - - /* deal with multiple modules (dga, x11, etc) needing these symbols... */ - if (x11_load_refcount++ == 0) { -#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC - int i; - int *thismod = NULL; - for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { - if (x11libs[i].libname != NULL) { - x11libs[i].lib = SDL_LoadObject(x11libs[i].libname); - } - } - -#define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 1; /* default yes */ -#include "SDL_x11sym.h" - -#define SDL_X11_MODULE(modname) thismod = &SDL_X11_HAVE_##modname; -#define SDL_X11_SYM(a,fn,x,y,z) X11_##fn = (SDL_DYNX11FN_##fn) X11_GetSym(#fn,thismod); -#include "SDL_x11sym.h" - -#ifdef X_HAVE_UTF8_STRING - X11_XCreateIC = (SDL_DYNX11FN_XCreateIC) - X11_GetSym("XCreateIC", &SDL_X11_HAVE_UTF8); - X11_XGetICValues = (SDL_DYNX11FN_XGetICValues) - X11_GetSym("XGetICValues", &SDL_X11_HAVE_UTF8); -#endif - - if (SDL_X11_HAVE_BASEXLIB) { - /* all required symbols loaded. */ - SDL_ClearError(); - } else { - /* in case something got loaded... */ - SDL_X11_UnloadSymbols(); - rc = 0; - } - -#else /* no dynamic X11 */ - -#define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 1; /* default yes */ -#define SDL_X11_SYM(a,fn,x,y,z) X11_##fn = (SDL_DYNX11FN_##fn) fn; -#include "SDL_x11sym.h" - -#ifdef X_HAVE_UTF8_STRING - X11_XCreateIC = XCreateIC; - X11_XGetICValues = XGetICValues; -#endif -#endif - } - - return rc; -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11dyn.h b/3rdparty/SDL2/src/video/x11/SDL_x11dyn.h deleted file mode 100644 index be1ddaa1c1b..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11dyn.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11dyn_h -#define _SDL_x11dyn_h - -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/Xatom.h> - -#if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM -#include <X11/XKBlib.h> -#endif - -/* Apparently some X11 systems can't include this multiple times... */ -#ifndef SDL_INCLUDED_XLIBINT_H -#define SDL_INCLUDED_XLIBINT_H 1 -#include <X11/Xlibint.h> -#endif - -#include <X11/Xproto.h> -#include <X11/extensions/Xext.h> -#include <X11/extensions/extutil.h> - -#ifndef NO_SHARED_MEMORY -#include <sys/ipc.h> -#include <sys/shm.h> -#include <X11/extensions/XShm.h> -#endif - -#if SDL_VIDEO_DRIVER_X11_XCURSOR -#include <X11/Xcursor/Xcursor.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XDBE -#include <X11/extensions/Xdbe.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XINERAMA -#include <X11/extensions/Xinerama.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XINPUT2 -#include <X11/extensions/XInput2.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XRANDR -#include <X11/extensions/Xrandr.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XSCRNSAVER -#include <X11/extensions/scrnsaver.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XSHAPE -#include <X11/extensions/shape.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XVIDMODE -#include <X11/extensions/xf86vmode.h> -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* evil function signatures... */ -typedef Bool(*SDL_X11_XESetWireToEventRetType) (Display *, XEvent *, xEvent *); -typedef int (*SDL_X11_XSynchronizeRetType) (Display *); -typedef Status(*SDL_X11_XESetEventToWireRetType) (Display *, XEvent *, xEvent *); - -int SDL_X11_LoadSymbols(void); -void SDL_X11_UnloadSymbols(void); - -/* Declare all the function pointers and wrappers... */ -#define SDL_X11_SYM(rc,fn,params,args,ret) \ - typedef rc (*SDL_DYNX11FN_##fn) params; \ - extern SDL_DYNX11FN_##fn X11_##fn; -#include "SDL_x11sym.h" - -/* Annoying varargs entry point... */ -#ifdef X_HAVE_UTF8_STRING -typedef XIC(*SDL_DYNX11FN_XCreateIC) (XIM,...); -typedef char *(*SDL_DYNX11FN_XGetICValues) (XIC, ...); -extern SDL_DYNX11FN_XCreateIC X11_XCreateIC; -extern SDL_DYNX11FN_XGetICValues X11_XGetICValues; -#endif - -/* These SDL_X11_HAVE_* flags are here whether you have dynamic X11 or not. */ -#define SDL_X11_MODULE(modname) extern int SDL_X11_HAVE_##modname; -#include "SDL_x11sym.h" - -#ifdef __cplusplus -} -#endif - -#endif /* !defined _SDL_x11dyn_h */ -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11events.c b/3rdparty/SDL2/src/video/x11/SDL_x11events.c deleted file mode 100644 index 56d2368a0b2..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11events.c +++ /dev/null @@ -1,1458 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include <sys/types.h> -#include <sys/time.h> -#include <signal.h> -#include <unistd.h> -#include <limits.h> /* For INT_MAX */ - -#include "SDL_x11video.h" -#include "SDL_x11touch.h" -#include "SDL_x11xinput2.h" -#include "../../events/SDL_events_c.h" -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_touch_c.h" - -#include "SDL_hints.h" -#include "SDL_timer.h" -#include "SDL_syswm.h" - -#include <stdio.h> - -/*#define DEBUG_XEVENTS*/ - -#ifndef _NET_WM_MOVERESIZE_SIZE_TOPLEFT -#define _NET_WM_MOVERESIZE_SIZE_TOPLEFT 0 -#endif - -#ifndef _NET_WM_MOVERESIZE_SIZE_TOP -#define _NET_WM_MOVERESIZE_SIZE_TOP 1 -#endif - -#ifndef _NET_WM_MOVERESIZE_SIZE_TOPRIGHT -#define _NET_WM_MOVERESIZE_SIZE_TOPRIGHT 2 -#endif - -#ifndef _NET_WM_MOVERESIZE_SIZE_RIGHT -#define _NET_WM_MOVERESIZE_SIZE_RIGHT 3 -#endif - -#ifndef _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT -#define _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT 4 -#endif - -#ifndef _NET_WM_MOVERESIZE_SIZE_BOTTOM -#define _NET_WM_MOVERESIZE_SIZE_BOTTOM 5 -#endif - -#ifndef _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT -#define _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT 6 -#endif - -#ifndef _NET_WM_MOVERESIZE_SIZE_LEFT -#define _NET_WM_MOVERESIZE_SIZE_LEFT 7 -#endif - -#ifndef _NET_WM_MOVERESIZE_MOVE -#define _NET_WM_MOVERESIZE_MOVE 8 -#endif - -typedef struct { - unsigned char *data; - int format, count; - Atom type; -} SDL_x11Prop; - -/* Reads property - Must call X11_XFree on results - */ -static void X11_ReadProperty(SDL_x11Prop *p, Display *disp, Window w, Atom prop) -{ - unsigned char *ret=NULL; - Atom type; - int fmt; - unsigned long count; - unsigned long bytes_left; - int bytes_fetch = 0; - - do { - if (ret != 0) X11_XFree(ret); - X11_XGetWindowProperty(disp, w, prop, 0, bytes_fetch, False, AnyPropertyType, &type, &fmt, &count, &bytes_left, &ret); - bytes_fetch += bytes_left; - } while (bytes_left != 0); - - p->data=ret; - p->format=fmt; - p->count=count; - p->type=type; -} - -/* Find text-uri-list in a list of targets and return it's atom - if available, else return None */ -static Atom X11_PickTarget(Display *disp, Atom list[], int list_count) -{ - Atom request = None; - char *name; - int i; - for (i=0; i < list_count && request == None; i++) { - name = X11_XGetAtomName(disp, list[i]); - if ((SDL_strcmp("text/uri-list", name) == 0) || (SDL_strcmp("text/plain", name) == 0)) { - request = list[i]; - } - X11_XFree(name); - } - return request; -} - -/* Wrapper for X11_PickTarget for a maximum of three targets, a special - case in the Xdnd protocol */ -static Atom X11_PickTargetFromAtoms(Display *disp, Atom a0, Atom a1, Atom a2) -{ - int count=0; - Atom atom[3]; - if (a0 != None) atom[count++] = a0; - if (a1 != None) atom[count++] = a1; - if (a2 != None) atom[count++] = a2; - return X11_PickTarget(disp, atom, count); -} - -struct KeyRepeatCheckData -{ - XEvent *event; - SDL_bool found; -}; - -static Bool X11_KeyRepeatCheckIfEvent(Display *display, XEvent *chkev, - XPointer arg) -{ - struct KeyRepeatCheckData *d = (struct KeyRepeatCheckData *) arg; - if (chkev->type == KeyPress && - chkev->xkey.keycode == d->event->xkey.keycode && - chkev->xkey.time - d->event->xkey.time < 2) - d->found = SDL_TRUE; - return False; -} - -/* Check to see if this is a repeated key. - (idea shamelessly lifted from GII -- thanks guys! :) - */ -static SDL_bool X11_KeyRepeat(Display *display, XEvent *event) -{ - XEvent dummyev; - struct KeyRepeatCheckData d; - d.event = event; - d.found = SDL_FALSE; - if (X11_XPending(display)) - X11_XCheckIfEvent(display, &dummyev, X11_KeyRepeatCheckIfEvent, - (XPointer) &d); - return d.found; -} - -static SDL_bool -X11_IsWheelEvent(Display * display,XEvent * event,int * xticks,int * yticks) -{ - /* according to the xlib docs, no specific mouse wheel events exist. - However, the defacto standard is that the vertical wheel is X buttons - 4 (up) and 5 (down) and a horizontal wheel is 6 (left) and 7 (right). */ - - /* Xlib defines "Button1" through 5, so we just use literals here. */ - switch (event->xbutton.button) { - case 4: *yticks = 1; return SDL_TRUE; - case 5: *yticks = -1; return SDL_TRUE; - case 6: *xticks = 1; return SDL_TRUE; - case 7: *xticks = -1; return SDL_TRUE; - default: break; - } - return SDL_FALSE; -} - -/* Decodes URI escape sequences in string buf of len bytes - (excluding the terminating NULL byte) in-place. Since - URI-encoded characters take three times the space of - normal characters, this should not be an issue. - - Returns the number of decoded bytes that wound up in - the buffer, excluding the terminating NULL byte. - - The buffer is guaranteed to be NULL-terminated but - may contain embedded NULL bytes. - - On error, -1 is returned. - */ -int X11_URIDecode(char *buf, int len) { - int ri, wi, di; - char decode = '\0'; - if (buf == NULL || len < 0) { - errno = EINVAL; - return -1; - } - if (len == 0) { - len = SDL_strlen(buf); - } - for (ri = 0, wi = 0, di = 0; ri < len && wi < len; ri += 1) { - if (di == 0) { - /* start decoding */ - if (buf[ri] == '%') { - decode = '\0'; - di += 1; - continue; - } - /* normal write */ - buf[wi] = buf[ri]; - wi += 1; - continue; - } else if (di == 1 || di == 2) { - char off = '\0'; - char isa = buf[ri] >= 'a' && buf[ri] <= 'f'; - char isA = buf[ri] >= 'A' && buf[ri] <= 'F'; - char isn = buf[ri] >= '0' && buf[ri] <= '9'; - if (!(isa || isA || isn)) { - /* not a hexadecimal */ - int sri; - for (sri = ri - di; sri <= ri; sri += 1) { - buf[wi] = buf[sri]; - wi += 1; - } - di = 0; - continue; - } - /* itsy bitsy magicsy */ - if (isn) { - off = 0 - '0'; - } else if (isa) { - off = 10 - 'a'; - } else if (isA) { - off = 10 - 'A'; - } - decode |= (buf[ri] + off) << (2 - di) * 4; - if (di == 2) { - buf[wi] = decode; - wi += 1; - di = 0; - } else { - di += 1; - } - continue; - } - } - buf[wi] = '\0'; - return wi; -} - -/* Convert URI to local filename - return filename if possible, else NULL -*/ -static char* X11_URIToLocal(char* uri) { - char *file = NULL; - SDL_bool local; - - if (memcmp(uri,"file:/",6) == 0) uri += 6; /* local file? */ - else if (strstr(uri,":/") != NULL) return file; /* wrong scheme */ - - local = uri[0] != '/' || (uri[0] != '\0' && uri[1] == '/'); - - /* got a hostname? */ - if (!local && uri[0] == '/' && uri[2] != '/') { - char* hostname_end = strchr(uri+1, '/'); - if (hostname_end != NULL) { - char hostname[ 257 ]; - if (gethostname(hostname, 255) == 0) { - hostname[ 256 ] = '\0'; - if (memcmp(uri+1, hostname, hostname_end - (uri+1)) == 0) { - uri = hostname_end + 1; - local = SDL_TRUE; - } - } - } - } - if (local) { - file = uri; - /* Convert URI escape sequences to real characters */ - X11_URIDecode(file, 0); - if (uri[1] == '/') { - file++; - } else { - file--; - } - } - return file; -} - -#if SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS -static void X11_HandleGenericEvent(SDL_VideoData *videodata,XEvent event) -{ - /* event is a union, so cookie == &event, but this is type safe. */ - XGenericEventCookie *cookie = &event.xcookie; - if (X11_XGetEventData(videodata->display, cookie)) { - X11_HandleXinput2Event(videodata, cookie); - X11_XFreeEventData(videodata->display, cookie); - } -} -#endif /* SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS */ - -static unsigned -X11_GetNumLockModifierMask(_THIS) -{ - SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata; - Display *display = viddata->display; - unsigned num_mask = 0; - int i, j; - XModifierKeymap *xmods; - unsigned n; - - xmods = X11_XGetModifierMapping(display); - n = xmods->max_keypermod; - for(i = 3; i < 8; i++) { - for(j = 0; j < n; j++) { - KeyCode kc = xmods->modifiermap[i * n + j]; - if (viddata->key_layout[kc] == SDL_SCANCODE_NUMLOCKCLEAR) { - num_mask = 1 << i; - break; - } - } - } - X11_XFreeModifiermap(xmods); - - return num_mask; -} - -static void -X11_ReconcileKeyboardState(_THIS) -{ - SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata; - Display *display = viddata->display; - char keys[32]; - int keycode; - Window junk_window; - int x, y; - unsigned int mask; - - X11_XQueryKeymap(display, keys); - - /* Sync up the keyboard modifier state */ - if (X11_XQueryPointer(display, DefaultRootWindow(display), &junk_window, &junk_window, &x, &y, &x, &y, &mask)) { - SDL_ToggleModState(KMOD_CAPS, (mask & LockMask) != 0); - SDL_ToggleModState(KMOD_NUM, (mask & X11_GetNumLockModifierMask(_this)) != 0); - } - - for (keycode = 0; keycode < 256; ++keycode) { - if (keys[keycode / 8] & (1 << (keycode % 8))) { - SDL_SendKeyboardKey(SDL_PRESSED, viddata->key_layout[keycode]); - } else { - SDL_SendKeyboardKey(SDL_RELEASED, viddata->key_layout[keycode]); - } - } -} - - -static void -X11_DispatchFocusIn(_THIS, SDL_WindowData *data) -{ -#ifdef DEBUG_XEVENTS - printf("window %p: Dispatching FocusIn\n", data); -#endif - SDL_SetKeyboardFocus(data->window); - X11_ReconcileKeyboardState(_this); -#ifdef X_HAVE_UTF8_STRING - if (data->ic) { - X11_XSetICFocus(data->ic); - } -#endif -#ifdef SDL_USE_IME - SDL_IME_SetFocus(SDL_TRUE); -#endif -} - -static void -X11_DispatchFocusOut(_THIS, SDL_WindowData *data) -{ -#ifdef DEBUG_XEVENTS - printf("window %p: Dispatching FocusOut\n", data); -#endif - /* If another window has already processed a focus in, then don't try to - * remove focus here. Doing so will incorrectly remove focus from that - * window, and the focus lost event for this window will have already - * been dispatched anyway. */ - if (data->window == SDL_GetKeyboardFocus()) { - SDL_SetKeyboardFocus(NULL); - } -#ifdef X_HAVE_UTF8_STRING - if (data->ic) { - X11_XUnsetICFocus(data->ic); - } -#endif -#ifdef SDL_USE_IME - SDL_IME_SetFocus(SDL_FALSE); -#endif -} - -static void -X11_DispatchMapNotify(SDL_WindowData *data) -{ - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_SHOWN, 0, 0); - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_RESTORED, 0, 0); -} - -static void -X11_DispatchUnmapNotify(SDL_WindowData *data) -{ - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_HIDDEN, 0, 0); - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_MINIMIZED, 0, 0); -} - -static void -InitiateWindowMove(_THIS, const SDL_WindowData *data, const SDL_Point *point) -{ - SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata; - SDL_Window* window = data->window; - Display *display = viddata->display; - XEvent evt; - - /* !!! FIXME: we need to regrab this if necessary when the drag is done. */ - X11_XUngrabPointer(display, 0L); - X11_XFlush(display); - - evt.xclient.type = ClientMessage; - evt.xclient.window = data->xwindow; - evt.xclient.message_type = X11_XInternAtom(display, "_NET_WM_MOVERESIZE", True); - evt.xclient.format = 32; - evt.xclient.data.l[0] = window->x + point->x; - evt.xclient.data.l[1] = window->y + point->y; - evt.xclient.data.l[2] = _NET_WM_MOVERESIZE_MOVE; - evt.xclient.data.l[3] = Button1; - evt.xclient.data.l[4] = 0; - X11_XSendEvent(display, DefaultRootWindow(display), False, SubstructureRedirectMask | SubstructureNotifyMask, &evt); - - X11_XSync(display, 0); -} - -static void -InitiateWindowResize(_THIS, const SDL_WindowData *data, const SDL_Point *point, int direction) -{ - SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata; - SDL_Window* window = data->window; - Display *display = viddata->display; - XEvent evt; - - if (direction < _NET_WM_MOVERESIZE_SIZE_TOPLEFT || direction > _NET_WM_MOVERESIZE_SIZE_LEFT) - return; - - /* !!! FIXME: we need to regrab this if necessary when the drag is done. */ - X11_XUngrabPointer(display, 0L); - X11_XFlush(display); - - evt.xclient.type = ClientMessage; - evt.xclient.window = data->xwindow; - evt.xclient.message_type = X11_XInternAtom(display, "_NET_WM_MOVERESIZE", True); - evt.xclient.format = 32; - evt.xclient.data.l[0] = window->x + point->x; - evt.xclient.data.l[1] = window->y + point->y; - evt.xclient.data.l[2] = direction; - evt.xclient.data.l[3] = Button1; - evt.xclient.data.l[4] = 0; - X11_XSendEvent(display, DefaultRootWindow(display), False, SubstructureRedirectMask | SubstructureNotifyMask, &evt); - - X11_XSync(display, 0); -} - -static SDL_bool -ProcessHitTest(_THIS, const SDL_WindowData *data, const XEvent *xev) -{ - SDL_Window *window = data->window; - - if (window->hit_test) { - const SDL_Point point = { xev->xbutton.x, xev->xbutton.y }; - const SDL_HitTestResult rc = window->hit_test(window, &point, window->hit_test_data); - static const int directions[] = { - _NET_WM_MOVERESIZE_SIZE_TOPLEFT, _NET_WM_MOVERESIZE_SIZE_TOP, - _NET_WM_MOVERESIZE_SIZE_TOPRIGHT, _NET_WM_MOVERESIZE_SIZE_RIGHT, - _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT, _NET_WM_MOVERESIZE_SIZE_BOTTOM, - _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT, _NET_WM_MOVERESIZE_SIZE_LEFT - }; - - switch (rc) { - case SDL_HITTEST_DRAGGABLE: - InitiateWindowMove(_this, data, &point); - return SDL_TRUE; - - case SDL_HITTEST_RESIZE_TOPLEFT: - case SDL_HITTEST_RESIZE_TOP: - case SDL_HITTEST_RESIZE_TOPRIGHT: - case SDL_HITTEST_RESIZE_RIGHT: - case SDL_HITTEST_RESIZE_BOTTOMRIGHT: - case SDL_HITTEST_RESIZE_BOTTOM: - case SDL_HITTEST_RESIZE_BOTTOMLEFT: - case SDL_HITTEST_RESIZE_LEFT: - InitiateWindowResize(_this, data, &point, directions[rc - SDL_HITTEST_RESIZE_TOPLEFT]); - return SDL_TRUE; - - default: return SDL_FALSE; - } - } - - return SDL_FALSE; -} - -static void -X11_UpdateUserTime(SDL_WindowData *data, const unsigned long latest) -{ - if (latest && (latest != data->user_time)) { - SDL_VideoData *videodata = data->videodata; - Display *display = videodata->display; - X11_XChangeProperty(display, data->xwindow, videodata->_NET_WM_USER_TIME, - XA_CARDINAL, 32, PropModeReplace, - (const unsigned char *) &latest, 1); -#ifdef DEBUG_XEVENTS - printf("window %p: updating _NET_WM_USER_TIME to %lu\n", data, latest); -#endif - data->user_time = latest; - } -} - - -static void -X11_DispatchEvent(_THIS) -{ - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - Display *display; - SDL_WindowData *data; - XEvent xevent; - int orig_event_type; - KeyCode orig_keycode; - XClientMessageEvent m; - int i; - - if (!videodata) { - return; - } - display = videodata->display; - - SDL_zero(xevent); /* valgrind fix. --ryan. */ - X11_XNextEvent(display, &xevent); - - /* Save the original keycode for dead keys, which are filtered out by - the XFilterEvent() call below. - */ - orig_event_type = xevent.type; - if (orig_event_type == KeyPress || orig_event_type == KeyRelease) { - orig_keycode = xevent.xkey.keycode; - } else { - orig_keycode = 0; - } - - /* filter events catchs XIM events and sends them to the correct handler */ - if (X11_XFilterEvent(&xevent, None) == True) { -#if 0 - printf("Filtered event type = %d display = %d window = %d\n", - xevent.type, xevent.xany.display, xevent.xany.window); -#endif - if (orig_keycode) { - /* Make sure dead key press/release events are sent */ - SDL_Scancode scancode = videodata->key_layout[orig_keycode]; - if (orig_event_type == KeyPress) { - SDL_SendKeyboardKey(SDL_PRESSED, scancode); - } else { - SDL_SendKeyboardKey(SDL_RELEASED, scancode); - } - } - return; - } - - /* Send a SDL_SYSWMEVENT if the application wants them */ - if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) { - SDL_SysWMmsg wmmsg; - - SDL_VERSION(&wmmsg.version); - wmmsg.subsystem = SDL_SYSWM_X11; - wmmsg.msg.x11.event = xevent; - SDL_SendSysWMEvent(&wmmsg); - } - -#if SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS - if(xevent.type == GenericEvent) { - X11_HandleGenericEvent(videodata,xevent); - return; - } -#endif - -#if 0 - printf("type = %d display = %d window = %d\n", - xevent.type, xevent.xany.display, xevent.xany.window); -#endif - - data = NULL; - if (videodata && videodata->windowlist) { - for (i = 0; i < videodata->numwindows; ++i) { - if ((videodata->windowlist[i] != NULL) && - (videodata->windowlist[i]->xwindow == xevent.xany.window)) { - data = videodata->windowlist[i]; - break; - } - } - } - if (!data) { - /* The window for KeymapNotify, etc events is 0 */ - if (xevent.type == KeymapNotify) { - if (SDL_GetKeyboardFocus() != NULL) { - X11_ReconcileKeyboardState(_this); - } - } else if (xevent.type == MappingNotify) { - /* Has the keyboard layout changed? */ - const int request = xevent.xmapping.request; - -#ifdef DEBUG_XEVENTS - printf("window %p: MappingNotify!\n", data); -#endif - if ((request == MappingKeyboard) || (request == MappingModifier)) { - X11_XRefreshKeyboardMapping(&xevent.xmapping); - } - - X11_UpdateKeymap(_this); - SDL_SendKeymapChangedEvent(); - } - return; - } - - switch (xevent.type) { - - /* Gaining mouse coverage? */ - case EnterNotify:{ - SDL_Mouse *mouse = SDL_GetMouse(); -#ifdef DEBUG_XEVENTS - printf("window %p: EnterNotify! (%d,%d,%d)\n", data, - xevent.xcrossing.x, - xevent.xcrossing.y, - xevent.xcrossing.mode); - if (xevent.xcrossing.mode == NotifyGrab) - printf("Mode: NotifyGrab\n"); - if (xevent.xcrossing.mode == NotifyUngrab) - printf("Mode: NotifyUngrab\n"); -#endif - SDL_SetMouseFocus(data->window); - - mouse->last_x = xevent.xcrossing.x; - mouse->last_y = xevent.xcrossing.y; - - if (!mouse->relative_mode) { - SDL_SendMouseMotion(data->window, 0, 0, xevent.xcrossing.x, xevent.xcrossing.y); - } - } - break; - /* Losing mouse coverage? */ - case LeaveNotify:{ -#ifdef DEBUG_XEVENTS - printf("window %p: LeaveNotify! (%d,%d,%d)\n", data, - xevent.xcrossing.x, - xevent.xcrossing.y, - xevent.xcrossing.mode); - if (xevent.xcrossing.mode == NotifyGrab) - printf("Mode: NotifyGrab\n"); - if (xevent.xcrossing.mode == NotifyUngrab) - printf("Mode: NotifyUngrab\n"); -#endif - if (!SDL_GetMouse()->relative_mode) { - SDL_SendMouseMotion(data->window, 0, 0, xevent.xcrossing.x, xevent.xcrossing.y); - } - - if (xevent.xcrossing.mode != NotifyGrab && - xevent.xcrossing.mode != NotifyUngrab && - xevent.xcrossing.detail != NotifyInferior) { - SDL_SetMouseFocus(NULL); - } - } - break; - - /* Gaining input focus? */ - case FocusIn:{ - if (xevent.xfocus.mode == NotifyGrab || xevent.xfocus.mode == NotifyUngrab) { - /* Someone is handling a global hotkey, ignore it */ -#ifdef DEBUG_XEVENTS - printf("window %p: FocusIn (NotifyGrab/NotifyUngrab, ignoring)\n", data); -#endif - break; - } - - if (xevent.xfocus.detail == NotifyInferior) { -#ifdef DEBUG_XEVENTS - printf("window %p: FocusIn (NotifierInferior, ignoring)\n", data); -#endif - break; - } -#ifdef DEBUG_XEVENTS - printf("window %p: FocusIn!\n", data); -#endif - if (!videodata->last_mode_change_deadline) /* no recent mode changes */ - { - data->pending_focus = PENDING_FOCUS_NONE; - data->pending_focus_time = 0; - X11_DispatchFocusIn(_this, data); - } - else - { - data->pending_focus = PENDING_FOCUS_IN; - data->pending_focus_time = SDL_GetTicks() + PENDING_FOCUS_TIME; - } - data->last_focus_event_time = SDL_GetTicks(); - } - break; - - /* Losing input focus? */ - case FocusOut:{ - if (xevent.xfocus.mode == NotifyGrab || xevent.xfocus.mode == NotifyUngrab) { - /* Someone is handling a global hotkey, ignore it */ -#ifdef DEBUG_XEVENTS - printf("window %p: FocusOut (NotifyGrab/NotifyUngrab, ignoring)\n", data); -#endif - break; - } - if (xevent.xfocus.detail == NotifyInferior) { - /* We still have focus if a child gets focus */ -#ifdef DEBUG_XEVENTS - printf("window %p: FocusOut (NotifierInferior, ignoring)\n", data); -#endif - break; - } -#ifdef DEBUG_XEVENTS - printf("window %p: FocusOut!\n", data); -#endif - if (!videodata->last_mode_change_deadline) /* no recent mode changes */ - { - data->pending_focus = PENDING_FOCUS_NONE; - data->pending_focus_time = 0; - X11_DispatchFocusOut(_this, data); - } - else - { - data->pending_focus = PENDING_FOCUS_OUT; - data->pending_focus_time = SDL_GetTicks() + PENDING_FOCUS_TIME; - } - } - break; - - /* Key press? */ - case KeyPress:{ - KeyCode keycode = xevent.xkey.keycode; - KeySym keysym = NoSymbol; - char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; - Status status = 0; - SDL_bool handled_by_ime = SDL_FALSE; - -#ifdef DEBUG_XEVENTS - printf("window %p: KeyPress (X11 keycode = 0x%X)\n", data, xevent.xkey.keycode); -#endif -#if 1 - if (videodata->key_layout[keycode] == SDL_SCANCODE_UNKNOWN && keycode) { - int min_keycode, max_keycode; - X11_XDisplayKeycodes(display, &min_keycode, &max_keycode); - keysym = X11_KeyCodeToSym(_this, keycode, xevent.xkey.state >> 13); - fprintf(stderr, - "The key you just pressed is not recognized by SDL. To help get this fixed, please report this to the SDL mailing list <sdl@libsdl.org> X11 KeyCode %d (%d), X11 KeySym 0x%lX (%s).\n", - keycode, keycode - min_keycode, keysym, - X11_XKeysymToString(keysym)); - } -#endif - /* */ - SDL_zero(text); -#ifdef X_HAVE_UTF8_STRING - if (data->ic) { - X11_Xutf8LookupString(data->ic, &xevent.xkey, text, sizeof(text), - &keysym, &status); - } else { - X11_XLookupString(&xevent.xkey, text, sizeof(text), &keysym, NULL); - } -#else - X11_XLookupString(&xevent.xkey, text, sizeof(text), &keysym, NULL); -#endif - -#ifdef SDL_USE_IME - if(SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE){ - handled_by_ime = SDL_IME_ProcessKeyEvent(keysym, keycode); - } -#endif - if (!handled_by_ime) { - SDL_SendKeyboardKey(SDL_PRESSED, videodata->key_layout[keycode]); - if(*text) { - SDL_SendKeyboardText(text); - } - } - - X11_UpdateUserTime(data, xevent.xkey.time); - } - break; - - /* Key release? */ - case KeyRelease:{ - KeyCode keycode = xevent.xkey.keycode; - -#ifdef DEBUG_XEVENTS - printf("window %p: KeyRelease (X11 keycode = 0x%X)\n", data, xevent.xkey.keycode); -#endif - if (X11_KeyRepeat(display, &xevent)) { - /* We're about to get a repeated key down, ignore the key up */ - break; - } - SDL_SendKeyboardKey(SDL_RELEASED, videodata->key_layout[keycode]); - } - break; - - /* Have we been iconified? */ - case UnmapNotify:{ -#ifdef DEBUG_XEVENTS - printf("window %p: UnmapNotify!\n", data); -#endif - X11_DispatchUnmapNotify(data); - } - break; - - /* Have we been restored? */ - case MapNotify:{ -#ifdef DEBUG_XEVENTS - printf("window %p: MapNotify!\n", data); -#endif - X11_DispatchMapNotify(data); - } - break; - - /* Have we been resized or moved? */ - case ConfigureNotify:{ -#ifdef DEBUG_XEVENTS - printf("window %p: ConfigureNotify! (position: %d,%d, size: %dx%d)\n", data, - xevent.xconfigure.x, xevent.xconfigure.y, - xevent.xconfigure.width, xevent.xconfigure.height); -#endif - /* Real configure notify events are relative to the parent, synthetic events are absolute. */ - if (!xevent.xconfigure.send_event) { - unsigned int NumChildren; - Window ChildReturn, Root, Parent; - Window * Children; - /* Translate these coodinates back to relative to root */ - X11_XQueryTree(data->videodata->display, xevent.xconfigure.window, &Root, &Parent, &Children, &NumChildren); - X11_XTranslateCoordinates(xevent.xconfigure.display, - Parent, DefaultRootWindow(xevent.xconfigure.display), - xevent.xconfigure.x, xevent.xconfigure.y, - &xevent.xconfigure.x, &xevent.xconfigure.y, - &ChildReturn); - } - - if (xevent.xconfigure.x != data->last_xconfigure.x || - xevent.xconfigure.y != data->last_xconfigure.y) { - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_MOVED, - xevent.xconfigure.x, xevent.xconfigure.y); -#ifdef SDL_USE_IME - if(SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE){ - /* Update IME candidate list position */ - SDL_IME_UpdateTextRect(NULL); - } -#endif - } - if (xevent.xconfigure.width != data->last_xconfigure.width || - xevent.xconfigure.height != data->last_xconfigure.height) { - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_RESIZED, - xevent.xconfigure.width, - xevent.xconfigure.height); - } - data->last_xconfigure = xevent.xconfigure; - } - break; - - /* Have we been requested to quit (or another client message?) */ - case ClientMessage:{ - - static int xdnd_version=0; - - if (xevent.xclient.message_type == videodata->XdndEnter) { - - SDL_bool use_list = xevent.xclient.data.l[1] & 1; - data->xdnd_source = xevent.xclient.data.l[0]; - xdnd_version = (xevent.xclient.data.l[1] >> 24); -#ifdef DEBUG_XEVENTS - printf("XID of source window : %ld\n", data->xdnd_source); - printf("Protocol version to use : %d\n", xdnd_version); - printf("More then 3 data types : %d\n", (int) use_list); -#endif - - if (use_list) { - /* fetch conversion targets */ - SDL_x11Prop p; - X11_ReadProperty(&p, display, data->xdnd_source, videodata->XdndTypeList); - /* pick one */ - data->xdnd_req = X11_PickTarget(display, (Atom*)p.data, p.count); - X11_XFree(p.data); - } else { - /* pick from list of three */ - data->xdnd_req = X11_PickTargetFromAtoms(display, xevent.xclient.data.l[2], xevent.xclient.data.l[3], xevent.xclient.data.l[4]); - } - } - else if (xevent.xclient.message_type == videodata->XdndPosition) { - -#ifdef DEBUG_XEVENTS - Atom act= videodata->XdndActionCopy; - if(xdnd_version >= 2) { - act = xevent.xclient.data.l[4]; - } - printf("Action requested by user is : %s\n", X11_XGetAtomName(display , act)); -#endif - - - /* reply with status */ - memset(&m, 0, sizeof(XClientMessageEvent)); - m.type = ClientMessage; - m.display = xevent.xclient.display; - m.window = xevent.xclient.data.l[0]; - m.message_type = videodata->XdndStatus; - m.format=32; - m.data.l[0] = data->xwindow; - m.data.l[1] = (data->xdnd_req != None); - m.data.l[2] = 0; /* specify an empty rectangle */ - m.data.l[3] = 0; - m.data.l[4] = videodata->XdndActionCopy; /* we only accept copying anyway */ - - X11_XSendEvent(display, xevent.xclient.data.l[0], False, NoEventMask, (XEvent*)&m); - X11_XFlush(display); - } - else if(xevent.xclient.message_type == videodata->XdndDrop) { - if (data->xdnd_req == None) { - /* say again - not interested! */ - memset(&m, 0, sizeof(XClientMessageEvent)); - m.type = ClientMessage; - m.display = xevent.xclient.display; - m.window = xevent.xclient.data.l[0]; - m.message_type = videodata->XdndFinished; - m.format=32; - m.data.l[0] = data->xwindow; - m.data.l[1] = 0; - m.data.l[2] = None; /* fail! */ - X11_XSendEvent(display, xevent.xclient.data.l[0], False, NoEventMask, (XEvent*)&m); - } else { - /* convert */ - if(xdnd_version >= 1) { - X11_XConvertSelection(display, videodata->XdndSelection, data->xdnd_req, videodata->PRIMARY, data->xwindow, xevent.xclient.data.l[2]); - } else { - X11_XConvertSelection(display, videodata->XdndSelection, data->xdnd_req, videodata->PRIMARY, data->xwindow, CurrentTime); - } - } - } - else if ((xevent.xclient.message_type == videodata->WM_PROTOCOLS) && - (xevent.xclient.format == 32) && - (xevent.xclient.data.l[0] == videodata->_NET_WM_PING)) { - Window root = DefaultRootWindow(display); - -#ifdef DEBUG_XEVENTS - printf("window %p: _NET_WM_PING\n", data); -#endif - xevent.xclient.window = root; - X11_XSendEvent(display, root, False, SubstructureRedirectMask | SubstructureNotifyMask, &xevent); - break; - } - - else if ((xevent.xclient.message_type == videodata->WM_PROTOCOLS) && - (xevent.xclient.format == 32) && - (xevent.xclient.data.l[0] == videodata->WM_DELETE_WINDOW)) { - -#ifdef DEBUG_XEVENTS - printf("window %p: WM_DELETE_WINDOW\n", data); -#endif - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_CLOSE, 0, 0); - break; - } - else if ((xevent.xclient.message_type == videodata->WM_PROTOCOLS) && - (xevent.xclient.format == 32) && - (xevent.xclient.data.l[0] == videodata->WM_TAKE_FOCUS)) { - -#ifdef DEBUG_XEVENTS - printf("window %p: WM_TAKE_FOCUS\n", data); -#endif - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_TAKE_FOCUS, 0, 0); - break; - } - } - break; - - /* Do we need to refresh ourselves? */ - case Expose:{ -#ifdef DEBUG_XEVENTS - printf("window %p: Expose (count = %d)\n", data, xevent.xexpose.count); -#endif - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_EXPOSED, 0, 0); - } - break; - - case MotionNotify:{ - SDL_Mouse *mouse = SDL_GetMouse(); - if(!mouse->relative_mode || mouse->relative_mode_warp) { -#ifdef DEBUG_MOTION - printf("window %p: X11 motion: %d,%d\n", data, xevent.xmotion.x, xevent.xmotion.y); -#endif - - SDL_SendMouseMotion(data->window, 0, 0, xevent.xmotion.x, xevent.xmotion.y); - } - } - break; - - case ButtonPress:{ - int xticks = 0, yticks = 0; -#ifdef DEBUG_XEVENTS - printf("window %p: ButtonPress (X11 button = %d)\n", data, xevent.xbutton.button); -#endif - if (X11_IsWheelEvent(display,&xevent,&xticks, &yticks)) { - SDL_SendMouseWheel(data->window, 0, xticks, yticks, SDL_MOUSEWHEEL_NORMAL); - } else { - SDL_bool ignore_click = SDL_FALSE; - int button = xevent.xbutton.button; - if(button == Button1) { - if (ProcessHitTest(_this, data, &xevent)) { - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); - break; /* don't pass this event on to app. */ - } - } - else if(button > 7) { - /* X button values 4-7 are used for scrolling, so X1 is 8, X2 is 9, ... - => subtract (8-SDL_BUTTON_X1) to get value SDL expects */ - button -= (8-SDL_BUTTON_X1); - } - if (data->last_focus_event_time) { - const int X11_FOCUS_CLICK_TIMEOUT = 10; - if (!SDL_TICKS_PASSED(SDL_GetTicks(), data->last_focus_event_time + X11_FOCUS_CLICK_TIMEOUT)) { - ignore_click = !SDL_GetHintBoolean(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, SDL_FALSE); - } - data->last_focus_event_time = 0; - } - if (!ignore_click) { - SDL_SendMouseButton(data->window, 0, SDL_PRESSED, button); - } - } - X11_UpdateUserTime(data, xevent.xbutton.time); - } - break; - - case ButtonRelease:{ - int button = xevent.xbutton.button; - /* The X server sends a Release event for each Press for wheels. Ignore them. */ - int xticks = 0, yticks = 0; -#ifdef DEBUG_XEVENTS - printf("window %p: ButtonRelease (X11 button = %d)\n", data, xevent.xbutton.button); -#endif - if (!X11_IsWheelEvent(display, &xevent, &xticks, &yticks)) { - if (button > 7) { - /* see explanation at case ButtonPress */ - button -= (8-SDL_BUTTON_X1); - } - SDL_SendMouseButton(data->window, 0, SDL_RELEASED, button); - } - } - break; - - case PropertyNotify:{ -#ifdef DEBUG_XEVENTS - unsigned char *propdata; - int status, real_format; - Atom real_type; - unsigned long items_read, items_left; - - char *name = X11_XGetAtomName(display, xevent.xproperty.atom); - if (name) { - printf("window %p: PropertyNotify: %s %s time=%lu\n", data, name, (xevent.xproperty.state == PropertyDelete) ? "deleted" : "changed", xevent.xproperty.time); - X11_XFree(name); - } - - status = X11_XGetWindowProperty(display, data->xwindow, xevent.xproperty.atom, 0L, 8192L, False, AnyPropertyType, &real_type, &real_format, &items_read, &items_left, &propdata); - if (status == Success && items_read > 0) { - if (real_type == XA_INTEGER) { - int *values = (int *)propdata; - - printf("{"); - for (i = 0; i < items_read; i++) { - printf(" %d", values[i]); - } - printf(" }\n"); - } else if (real_type == XA_CARDINAL) { - if (real_format == 32) { - Uint32 *values = (Uint32 *)propdata; - - printf("{"); - for (i = 0; i < items_read; i++) { - printf(" %d", values[i]); - } - printf(" }\n"); - } else if (real_format == 16) { - Uint16 *values = (Uint16 *)propdata; - - printf("{"); - for (i = 0; i < items_read; i++) { - printf(" %d", values[i]); - } - printf(" }\n"); - } else if (real_format == 8) { - Uint8 *values = (Uint8 *)propdata; - - printf("{"); - for (i = 0; i < items_read; i++) { - printf(" %d", values[i]); - } - printf(" }\n"); - } - } else if (real_type == XA_STRING || - real_type == videodata->UTF8_STRING) { - printf("{ \"%s\" }\n", propdata); - } else if (real_type == XA_ATOM) { - Atom *atoms = (Atom *)propdata; - - printf("{"); - for (i = 0; i < items_read; i++) { - char *atomname = X11_XGetAtomName(display, atoms[i]); - if (atomname) { - printf(" %s", atomname); - X11_XFree(atomname); - } - } - printf(" }\n"); - } else { - char *atomname = X11_XGetAtomName(display, real_type); - printf("Unknown type: %ld (%s)\n", real_type, atomname ? atomname : "UNKNOWN"); - if (atomname) { - X11_XFree(atomname); - } - } - } - if (status == Success) { - X11_XFree(propdata); - } -#endif /* DEBUG_XEVENTS */ - - /* Take advantage of this moment to make sure user_time has a - valid timestamp from the X server, so if we later try to - raise/restore this window, _NET_ACTIVE_WINDOW can have a - non-zero timestamp, even if there's never been a mouse or - key press to this window so far. Note that we don't try to - set _NET_WM_USER_TIME here, though. That's only for legit - user interaction with the window. */ - if (!data->user_time) { - data->user_time = xevent.xproperty.time; - } - - if (xevent.xproperty.atom == data->videodata->_NET_WM_STATE) { - /* Get the new state from the window manager. - Compositing window managers can alter visibility of windows - without ever mapping / unmapping them, so we handle that here, - because they use the NETWM protocol to notify us of changes. - */ - const Uint32 flags = X11_GetNetWMState(_this, xevent.xproperty.window); - const Uint32 changed = flags ^ data->window->flags; - - if ((changed & SDL_WINDOW_HIDDEN) || (changed & SDL_WINDOW_FULLSCREEN)) { - if (flags & SDL_WINDOW_HIDDEN) { - X11_DispatchUnmapNotify(data); - } else { - X11_DispatchMapNotify(data); - } - } - - if (changed & SDL_WINDOW_MAXIMIZED) { - if (flags & SDL_WINDOW_MAXIMIZED) { - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_MAXIMIZED, 0, 0); - } else { - SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_RESTORED, 0, 0); - } - } - } else if (xevent.xproperty.atom == videodata->XKLAVIER_STATE) { - /* Hack for Ubuntu 12.04 (etc) that doesn't send MappingNotify - events when the keyboard layout changes (for example, - changing from English to French on the menubar's keyboard - icon). Since it changes the XKLAVIER_STATE property, we - notice and reinit our keymap here. This might not be the - right approach, but it seems to work. */ - X11_UpdateKeymap(_this); - SDL_SendKeymapChangedEvent(); - } else if (xevent.xproperty.atom == videodata->_NET_FRAME_EXTENTS) { - Atom type; - int format; - unsigned long nitems, bytes_after; - unsigned char *property; - if (X11_XGetWindowProperty(display, data->xwindow, videodata->_NET_FRAME_EXTENTS, 0, 16, 0, XA_CARDINAL, &type, &format, &nitems, &bytes_after, &property) == Success) { - if (type != None && nitems == 4) { - data->border_left = (int) ((long*)property)[0]; - data->border_right = (int) ((long*)property)[1]; - data->border_top = (int) ((long*)property)[2]; - data->border_bottom = (int) ((long*)property)[3]; - } - X11_XFree(property); - - #ifdef DEBUG_XEVENTS - printf("New _NET_FRAME_EXTENTS: left=%d right=%d, top=%d, bottom=%d\n", data->border_left, data->border_right, data->border_top, data->border_bottom); - #endif - } - } - } - break; - - /* Copy the selection from our own CUTBUFFER to the requested property */ - case SelectionRequest: { - XSelectionRequestEvent *req; - XEvent sevent; - int seln_format; - unsigned long nbytes; - unsigned long overflow; - unsigned char *seln_data; - - req = &xevent.xselectionrequest; -#ifdef DEBUG_XEVENTS - printf("window %p: SelectionRequest (requestor = %ld, target = %ld)\n", data, - req->requestor, req->target); -#endif - - SDL_zero(sevent); - sevent.xany.type = SelectionNotify; - sevent.xselection.selection = req->selection; - sevent.xselection.target = None; - sevent.xselection.property = None; - sevent.xselection.requestor = req->requestor; - sevent.xselection.time = req->time; - - if (X11_XGetWindowProperty(display, DefaultRootWindow(display), - X11_GetSDLCutBufferClipboardType(display), 0, INT_MAX/4, False, req->target, - &sevent.xselection.target, &seln_format, &nbytes, - &overflow, &seln_data) == Success) { - Atom XA_TARGETS = X11_XInternAtom(display, "TARGETS", 0); - if (sevent.xselection.target == req->target) { - X11_XChangeProperty(display, req->requestor, req->property, - sevent.xselection.target, seln_format, PropModeReplace, - seln_data, nbytes); - sevent.xselection.property = req->property; - } else if (XA_TARGETS == req->target) { - Atom SupportedFormats[] = { XA_TARGETS, sevent.xselection.target }; - X11_XChangeProperty(display, req->requestor, req->property, - XA_ATOM, 32, PropModeReplace, - (unsigned char*)SupportedFormats, - SDL_arraysize(SupportedFormats)); - sevent.xselection.property = req->property; - sevent.xselection.target = XA_TARGETS; - } - X11_XFree(seln_data); - } - X11_XSendEvent(display, req->requestor, False, 0, &sevent); - X11_XSync(display, False); - } - break; - - case SelectionNotify: { - Atom target = xevent.xselection.target; -#ifdef DEBUG_XEVENTS - printf("window %p: SelectionNotify (requestor = %ld, target = %ld)\n", data, - xevent.xselection.requestor, xevent.xselection.target); -#endif - if (target == data->xdnd_req) { - /* read data */ - SDL_x11Prop p; - X11_ReadProperty(&p, display, data->xwindow, videodata->PRIMARY); - - if (p.format == 8) { - /* !!! FIXME: don't use strtok here. It's not reentrant and not in SDL_stdinc. */ - char* name = X11_XGetAtomName(display, target); - char *token = strtok((char *) p.data, "\r\n"); - while (token != NULL) { - if (SDL_strcmp("text/plain", name)==0) { - SDL_SendDropText(data->window, token); - } else if (SDL_strcmp("text/uri-list", name)==0) { - char *fn = X11_URIToLocal(token); - if (fn) { - SDL_SendDropFile(data->window, fn); - } - } - token = strtok(NULL, "\r\n"); - } - SDL_SendDropComplete(data->window); - } - X11_XFree(p.data); - - /* send reply */ - SDL_memset(&m, 0, sizeof(XClientMessageEvent)); - m.type = ClientMessage; - m.display = display; - m.window = data->xdnd_source; - m.message_type = videodata->XdndFinished; - m.format = 32; - m.data.l[0] = data->xwindow; - m.data.l[1] = 1; - m.data.l[2] = videodata->XdndActionCopy; - X11_XSendEvent(display, data->xdnd_source, False, NoEventMask, (XEvent*)&m); - - X11_XSync(display, False); - - } else { - videodata->selection_waiting = SDL_FALSE; - } - } - break; - - case SelectionClear: { - Atom XA_CLIPBOARD = X11_XInternAtom(display, "CLIPBOARD", 0); - - if (xevent.xselectionclear.selection == XA_PRIMARY || - (XA_CLIPBOARD != None && xevent.xselectionclear.selection == XA_CLIPBOARD)) { - SDL_SendClipboardUpdate(); - } - } - break; - - default:{ -#ifdef DEBUG_XEVENTS - printf("window %p: Unhandled event %d\n", data, xevent.type); -#endif - } - break; - } -} - -static void -X11_HandleFocusChanges(_THIS) -{ - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - int i; - - if (videodata && videodata->windowlist) { - for (i = 0; i < videodata->numwindows; ++i) { - SDL_WindowData *data = videodata->windowlist[i]; - if (data && data->pending_focus != PENDING_FOCUS_NONE) { - Uint32 now = SDL_GetTicks(); - if (SDL_TICKS_PASSED(now, data->pending_focus_time)) { - if (data->pending_focus == PENDING_FOCUS_IN) { - X11_DispatchFocusIn(_this, data); - } else { - X11_DispatchFocusOut(_this, data); - } - data->pending_focus = PENDING_FOCUS_NONE; - } - } - } - } -} -/* Ack! X11_XPending() actually performs a blocking read if no events available */ -static int -X11_Pending(Display * display) -{ - /* Flush the display connection and look to see if events are queued */ - X11_XFlush(display); - if (X11_XEventsQueued(display, QueuedAlready)) { - return (1); - } - - /* More drastic measures are required -- see if X is ready to talk */ - { - static struct timeval zero_time; /* static == 0 */ - int x11_fd; - fd_set fdset; - - x11_fd = ConnectionNumber(display); - FD_ZERO(&fdset); - FD_SET(x11_fd, &fdset); - if (select(x11_fd + 1, &fdset, NULL, NULL, &zero_time) == 1) { - return (X11_XPending(display)); - } - } - - /* Oh well, nothing is ready .. */ - return (0); -} - -void -X11_PumpEvents(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - if (data->last_mode_change_deadline) { - if (SDL_TICKS_PASSED(SDL_GetTicks(), data->last_mode_change_deadline)) { - data->last_mode_change_deadline = 0; /* assume we're done. */ - } - } - - /* Update activity every 30 seconds to prevent screensaver */ - if (_this->suspend_screensaver) { - const Uint32 now = SDL_GetTicks(); - if (!data->screensaver_activity || - SDL_TICKS_PASSED(now, data->screensaver_activity + 30000)) { - X11_XResetScreenSaver(data->display); - -#if SDL_USE_LIBDBUS - SDL_DBus_ScreensaverTickle(); -#endif - - data->screensaver_activity = now; - } - } - - /* Keep processing pending events */ - while (X11_Pending(data->display)) { - X11_DispatchEvent(_this); - } - -#ifdef SDL_USE_IME - if(SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE){ - SDL_IME_PumpEvents(); - } -#endif - - /* FIXME: Only need to do this when there are pending focus changes */ - X11_HandleFocusChanges(_this); -} - - -void -X11_SuspendScreenSaver(_THIS) -{ -#if SDL_VIDEO_DRIVER_X11_XSCRNSAVER - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - int dummy; - int major_version, minor_version; -#endif /* SDL_VIDEO_DRIVER_X11_XSCRNSAVER */ - -#if SDL_USE_LIBDBUS - if (SDL_DBus_ScreensaverInhibit(_this->suspend_screensaver)) { - return; - } - - if (_this->suspend_screensaver) { - SDL_DBus_ScreensaverTickle(); - } -#endif - -#if SDL_VIDEO_DRIVER_X11_XSCRNSAVER - if (SDL_X11_HAVE_XSS) { - /* X11_XScreenSaverSuspend was introduced in MIT-SCREEN-SAVER 1.1 */ - if (!X11_XScreenSaverQueryExtension(data->display, &dummy, &dummy) || - !X11_XScreenSaverQueryVersion(data->display, - &major_version, &minor_version) || - major_version < 1 || (major_version == 1 && minor_version < 1)) { - return; - } - - X11_XScreenSaverSuspend(data->display, _this->suspend_screensaver); - X11_XResetScreenSaver(data->display); - } -#endif -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11events.h b/3rdparty/SDL2/src/video/x11/SDL_x11events.h deleted file mode 100644 index 024fca3f451..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11events.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11events_h -#define _SDL_x11events_h - -extern void X11_PumpEvents(_THIS); -extern void X11_SuspendScreenSaver(_THIS); - -#endif /* _SDL_x11events_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11framebuffer.c b/3rdparty/SDL2/src/video/x11/SDL_x11framebuffer.c deleted file mode 100644 index a4886169fd8..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11framebuffer.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include "SDL_x11video.h" -#include "SDL_x11framebuffer.h" - - -#ifndef NO_SHARED_MEMORY - -/* Shared memory error handler routine */ -static int shm_error; -static int (*X_handler)(Display *, XErrorEvent *) = NULL; -static int shm_errhandler(Display *d, XErrorEvent *e) -{ - if ( e->error_code == BadAccess ) { - shm_error = True; - return(0); - } else - return(X_handler(d,e)); -} - -static SDL_bool have_mitshm(void) -{ - /* Only use shared memory on local X servers */ - if ( (SDL_strncmp(X11_XDisplayName(NULL), ":", 1) == 0) || - (SDL_strncmp(X11_XDisplayName(NULL), "unix:", 5) == 0) ) { - return SDL_X11_HAVE_SHM; - } - return SDL_FALSE; -} - -#endif /* !NO_SHARED_MEMORY */ - -int -X11_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, - void ** pixels, int *pitch) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - XGCValues gcv; - XVisualInfo vinfo; - - /* Free the old framebuffer surface */ - X11_DestroyWindowFramebuffer(_this, window); - - /* Create the graphics context for drawing */ - gcv.graphics_exposures = False; - data->gc = X11_XCreateGC(display, data->xwindow, GCGraphicsExposures, &gcv); - if (!data->gc) { - return SDL_SetError("Couldn't create graphics context"); - } - - /* Find out the pixel format and depth */ - if (X11_GetVisualInfoFromVisual(display, data->visual, &vinfo) < 0) { - return SDL_SetError("Couldn't get window visual information"); - } - - *format = X11_GetPixelFormatFromVisualInfo(display, &vinfo); - if (*format == SDL_PIXELFORMAT_UNKNOWN) { - return SDL_SetError("Unknown window pixel format"); - } - - /* Calculate pitch */ - *pitch = (((window->w * SDL_BYTESPERPIXEL(*format)) + 3) & ~3); - - /* Create the actual image */ -#ifndef NO_SHARED_MEMORY - if (have_mitshm()) { - XShmSegmentInfo *shminfo = &data->shminfo; - - shminfo->shmid = shmget(IPC_PRIVATE, window->h*(*pitch), IPC_CREAT | 0777); - if ( shminfo->shmid >= 0 ) { - shminfo->shmaddr = (char *)shmat(shminfo->shmid, 0, 0); - shminfo->readOnly = False; - if ( shminfo->shmaddr != (char *)-1 ) { - shm_error = False; - X_handler = X11_XSetErrorHandler(shm_errhandler); - X11_XShmAttach(display, shminfo); - X11_XSync(display, True); - X11_XSetErrorHandler(X_handler); - if ( shm_error ) - shmdt(shminfo->shmaddr); - } else { - shm_error = True; - } - shmctl(shminfo->shmid, IPC_RMID, NULL); - } else { - shm_error = True; - } - if (!shm_error) { - data->ximage = X11_XShmCreateImage(display, data->visual, - vinfo.depth, ZPixmap, - shminfo->shmaddr, shminfo, - window->w, window->h); - if (!data->ximage) { - X11_XShmDetach(display, shminfo); - X11_XSync(display, False); - shmdt(shminfo->shmaddr); - } else { - /* Done! */ - data->use_mitshm = SDL_TRUE; - *pixels = shminfo->shmaddr; - return 0; - } - } - } -#endif /* not NO_SHARED_MEMORY */ - - *pixels = SDL_malloc(window->h*(*pitch)); - if (*pixels == NULL) { - return SDL_OutOfMemory(); - } - - data->ximage = X11_XCreateImage(display, data->visual, - vinfo.depth, ZPixmap, 0, (char *)(*pixels), - window->w, window->h, 32, 0); - if (!data->ximage) { - SDL_free(*pixels); - return SDL_SetError("Couldn't create XImage"); - } - return 0; -} - -int -X11_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, - int numrects) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - int i; - int x, y, w ,h; -#ifndef NO_SHARED_MEMORY - if (data->use_mitshm) { - for (i = 0; i < numrects; ++i) { - x = rects[i].x; - y = rects[i].y; - w = rects[i].w; - h = rects[i].h; - - if (w <= 0 || h <= 0 || (x + w) <= 0 || (y + h) <= 0) { - /* Clipped? */ - continue; - } - if (x < 0) - { - x += w; - w += rects[i].x; - } - if (y < 0) - { - y += h; - h += rects[i].y; - } - if (x + w > window->w) - w = window->w - x; - if (y + h > window->h) - h = window->h - y; - - X11_XShmPutImage(display, data->xwindow, data->gc, data->ximage, - x, y, x, y, w, h, False); - } - } - else -#endif /* !NO_SHARED_MEMORY */ - { - for (i = 0; i < numrects; ++i) { - x = rects[i].x; - y = rects[i].y; - w = rects[i].w; - h = rects[i].h; - - if (w <= 0 || h <= 0 || (x + w) <= 0 || (y + h) <= 0) { - /* Clipped? */ - continue; - } - if (x < 0) - { - x += w; - w += rects[i].x; - } - if (y < 0) - { - y += h; - h += rects[i].y; - } - if (x + w > window->w) - w = window->w - x; - if (y + h > window->h) - h = window->h - y; - - X11_XPutImage(display, data->xwindow, data->gc, data->ximage, - x, y, x, y, w, h); - } - } - - X11_XSync(display, False); - - return 0; -} - -void -X11_DestroyWindowFramebuffer(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display; - - if (!data) { - /* The window wasn't fully initialized */ - return; - } - - display = data->videodata->display; - - if (data->ximage) { - XDestroyImage(data->ximage); - -#ifndef NO_SHARED_MEMORY - if (data->use_mitshm) { - X11_XShmDetach(display, &data->shminfo); - X11_XSync(display, False); - shmdt(data->shminfo.shmaddr); - data->use_mitshm = SDL_FALSE; - } -#endif /* !NO_SHARED_MEMORY */ - - data->ximage = NULL; - } - if (data->gc) { - X11_XFreeGC(display, data->gc); - data->gc = NULL; - } -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11framebuffer.h b/3rdparty/SDL2/src/video/x11/SDL_x11framebuffer.h deleted file mode 100644 index 7326e7da963..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11framebuffer.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - - -extern int X11_CreateWindowFramebuffer(_THIS, SDL_Window * window, - Uint32 * format, - void ** pixels, int *pitch); -extern int X11_UpdateWindowFramebuffer(_THIS, SDL_Window * window, - const SDL_Rect * rects, int numrects); -extern void X11_DestroyWindowFramebuffer(_THIS, SDL_Window * window); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11keyboard.c b/3rdparty/SDL2/src/video/x11/SDL_x11keyboard.c deleted file mode 100644 index b888bff355d..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11keyboard.c +++ /dev/null @@ -1,482 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include "SDL_x11video.h" - -#include "../../events/SDL_keyboard_c.h" -#include "../../events/scancodes_darwin.h" -#include "../../events/scancodes_xfree86.h" - -#include <X11/keysym.h> -#include <X11/XKBlib.h> - -#include "imKStoUCS.h" - -/* *INDENT-OFF* */ -static const struct { - KeySym keysym; - SDL_Scancode scancode; -} KeySymToSDLScancode[] = { - { XK_Return, SDL_SCANCODE_RETURN }, - { XK_Escape, SDL_SCANCODE_ESCAPE }, - { XK_BackSpace, SDL_SCANCODE_BACKSPACE }, - { XK_Tab, SDL_SCANCODE_TAB }, - { XK_Caps_Lock, SDL_SCANCODE_CAPSLOCK }, - { XK_F1, SDL_SCANCODE_F1 }, - { XK_F2, SDL_SCANCODE_F2 }, - { XK_F3, SDL_SCANCODE_F3 }, - { XK_F4, SDL_SCANCODE_F4 }, - { XK_F5, SDL_SCANCODE_F5 }, - { XK_F6, SDL_SCANCODE_F6 }, - { XK_F7, SDL_SCANCODE_F7 }, - { XK_F8, SDL_SCANCODE_F8 }, - { XK_F9, SDL_SCANCODE_F9 }, - { XK_F10, SDL_SCANCODE_F10 }, - { XK_F11, SDL_SCANCODE_F11 }, - { XK_F12, SDL_SCANCODE_F12 }, - { XK_Print, SDL_SCANCODE_PRINTSCREEN }, - { XK_Scroll_Lock, SDL_SCANCODE_SCROLLLOCK }, - { XK_Pause, SDL_SCANCODE_PAUSE }, - { XK_Insert, SDL_SCANCODE_INSERT }, - { XK_Home, SDL_SCANCODE_HOME }, - { XK_Prior, SDL_SCANCODE_PAGEUP }, - { XK_Delete, SDL_SCANCODE_DELETE }, - { XK_End, SDL_SCANCODE_END }, - { XK_Next, SDL_SCANCODE_PAGEDOWN }, - { XK_Right, SDL_SCANCODE_RIGHT }, - { XK_Left, SDL_SCANCODE_LEFT }, - { XK_Down, SDL_SCANCODE_DOWN }, - { XK_Up, SDL_SCANCODE_UP }, - { XK_Num_Lock, SDL_SCANCODE_NUMLOCKCLEAR }, - { XK_KP_Divide, SDL_SCANCODE_KP_DIVIDE }, - { XK_KP_Multiply, SDL_SCANCODE_KP_MULTIPLY }, - { XK_KP_Subtract, SDL_SCANCODE_KP_MINUS }, - { XK_KP_Add, SDL_SCANCODE_KP_PLUS }, - { XK_KP_Enter, SDL_SCANCODE_KP_ENTER }, - { XK_KP_Delete, SDL_SCANCODE_KP_PERIOD }, - { XK_KP_End, SDL_SCANCODE_KP_1 }, - { XK_KP_Down, SDL_SCANCODE_KP_2 }, - { XK_KP_Next, SDL_SCANCODE_KP_3 }, - { XK_KP_Left, SDL_SCANCODE_KP_4 }, - { XK_KP_Begin, SDL_SCANCODE_KP_5 }, - { XK_KP_Right, SDL_SCANCODE_KP_6 }, - { XK_KP_Home, SDL_SCANCODE_KP_7 }, - { XK_KP_Up, SDL_SCANCODE_KP_8 }, - { XK_KP_Prior, SDL_SCANCODE_KP_9 }, - { XK_KP_Insert, SDL_SCANCODE_KP_0 }, - { XK_KP_Decimal, SDL_SCANCODE_KP_PERIOD }, - { XK_KP_1, SDL_SCANCODE_KP_1 }, - { XK_KP_2, SDL_SCANCODE_KP_2 }, - { XK_KP_3, SDL_SCANCODE_KP_3 }, - { XK_KP_4, SDL_SCANCODE_KP_4 }, - { XK_KP_5, SDL_SCANCODE_KP_5 }, - { XK_KP_6, SDL_SCANCODE_KP_6 }, - { XK_KP_7, SDL_SCANCODE_KP_7 }, - { XK_KP_8, SDL_SCANCODE_KP_8 }, - { XK_KP_9, SDL_SCANCODE_KP_9 }, - { XK_KP_0, SDL_SCANCODE_KP_0 }, - { XK_KP_Decimal, SDL_SCANCODE_KP_PERIOD }, - { XK_Hyper_R, SDL_SCANCODE_APPLICATION }, - { XK_KP_Equal, SDL_SCANCODE_KP_EQUALS }, - { XK_F13, SDL_SCANCODE_F13 }, - { XK_F14, SDL_SCANCODE_F14 }, - { XK_F15, SDL_SCANCODE_F15 }, - { XK_F16, SDL_SCANCODE_F16 }, - { XK_F17, SDL_SCANCODE_F17 }, - { XK_F18, SDL_SCANCODE_F18 }, - { XK_F19, SDL_SCANCODE_F19 }, - { XK_F20, SDL_SCANCODE_F20 }, - { XK_F21, SDL_SCANCODE_F21 }, - { XK_F22, SDL_SCANCODE_F22 }, - { XK_F23, SDL_SCANCODE_F23 }, - { XK_F24, SDL_SCANCODE_F24 }, - { XK_Execute, SDL_SCANCODE_EXECUTE }, - { XK_Help, SDL_SCANCODE_HELP }, - { XK_Menu, SDL_SCANCODE_MENU }, - { XK_Select, SDL_SCANCODE_SELECT }, - { XK_Cancel, SDL_SCANCODE_STOP }, - { XK_Redo, SDL_SCANCODE_AGAIN }, - { XK_Undo, SDL_SCANCODE_UNDO }, - { XK_Find, SDL_SCANCODE_FIND }, - { XK_KP_Separator, SDL_SCANCODE_KP_COMMA }, - { XK_Sys_Req, SDL_SCANCODE_SYSREQ }, - { XK_Control_L, SDL_SCANCODE_LCTRL }, - { XK_Shift_L, SDL_SCANCODE_LSHIFT }, - { XK_Alt_L, SDL_SCANCODE_LALT }, - { XK_Meta_L, SDL_SCANCODE_LGUI }, - { XK_Super_L, SDL_SCANCODE_LGUI }, - { XK_Control_R, SDL_SCANCODE_RCTRL }, - { XK_Shift_R, SDL_SCANCODE_RSHIFT }, - { XK_Alt_R, SDL_SCANCODE_RALT }, - { XK_ISO_Level3_Shift, SDL_SCANCODE_RALT }, - { XK_Meta_R, SDL_SCANCODE_RGUI }, - { XK_Super_R, SDL_SCANCODE_RGUI }, - { XK_Mode_switch, SDL_SCANCODE_MODE }, - { XK_period, SDL_SCANCODE_PERIOD }, - { XK_comma, SDL_SCANCODE_COMMA }, - { XK_slash, SDL_SCANCODE_SLASH }, - { XK_backslash, SDL_SCANCODE_BACKSLASH }, - { XK_minus, SDL_SCANCODE_MINUS }, - { XK_equal, SDL_SCANCODE_EQUALS }, - { XK_space, SDL_SCANCODE_SPACE }, - { XK_grave, SDL_SCANCODE_GRAVE }, - { XK_apostrophe, SDL_SCANCODE_APOSTROPHE }, - { XK_bracketleft, SDL_SCANCODE_LEFTBRACKET }, - { XK_bracketright, SDL_SCANCODE_RIGHTBRACKET }, -}; - -static const struct -{ - SDL_Scancode const *table; - int table_size; -} scancode_set[] = { - { darwin_scancode_table, SDL_arraysize(darwin_scancode_table) }, - { xfree86_scancode_table, SDL_arraysize(xfree86_scancode_table) }, - { xfree86_scancode_table2, SDL_arraysize(xfree86_scancode_table2) }, - { xvnc_scancode_table, SDL_arraysize(xvnc_scancode_table) }, -}; -/* *INDENT-OFF* */ - -/* This function only works for keyboards in US QWERTY layout */ -static SDL_Scancode -X11_KeyCodeToSDLScancode(_THIS, KeyCode keycode) -{ - KeySym keysym; - int i; - - keysym = X11_KeyCodeToSym(_this, keycode, 0); - if (keysym == NoSymbol) { - return SDL_SCANCODE_UNKNOWN; - } - - if (keysym >= XK_a && keysym <= XK_z) { - return SDL_SCANCODE_A + (keysym - XK_a); - } - if (keysym >= XK_A && keysym <= XK_Z) { - return SDL_SCANCODE_A + (keysym - XK_A); - } - - if (keysym == XK_0) { - return SDL_SCANCODE_0; - } - if (keysym >= XK_1 && keysym <= XK_9) { - return SDL_SCANCODE_1 + (keysym - XK_1); - } - - for (i = 0; i < SDL_arraysize(KeySymToSDLScancode); ++i) { - if (keysym == KeySymToSDLScancode[i].keysym) { - return KeySymToSDLScancode[i].scancode; - } - } - return SDL_SCANCODE_UNKNOWN; -} - -static Uint32 -X11_KeyCodeToUcs4(_THIS, KeyCode keycode, unsigned char group) -{ - KeySym keysym = X11_KeyCodeToSym(_this, keycode, group); - - if (keysym == NoSymbol) { - return 0; - } - - return X11_KeySymToUcs4(keysym); -} - -KeySym -X11_KeyCodeToSym(_THIS, KeyCode keycode, unsigned char group) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - KeySym keysym; - -#if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM - if (data->xkb) { - int num_groups = XkbKeyNumGroups(data->xkb, keycode); - unsigned char info = XkbKeyGroupInfo(data->xkb, keycode); - - if (num_groups && group >= num_groups) { - - int action = XkbOutOfRangeGroupAction(info); - - if (action == XkbRedirectIntoRange) { - if ((group = XkbOutOfRangeGroupNumber(info)) >= num_groups) { - group = 0; - } - } else if (action == XkbClampIntoRange) { - group = num_groups - 1; - } else { - group %= num_groups; - } - } - keysym = X11_XkbKeycodeToKeysym(data->display, keycode, group, 0); - } else { - keysym = X11_XKeycodeToKeysym(data->display, keycode, 0); - } -#else - keysym = X11_XKeycodeToKeysym(data->display, keycode, 0); -#endif - - return keysym; -} - -int -X11_InitKeyboard(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - int i = 0; - int j = 0; - int min_keycode, max_keycode; - struct { - SDL_Scancode scancode; - KeySym keysym; - int value; - } fingerprint[] = { - { SDL_SCANCODE_HOME, XK_Home, 0 }, - { SDL_SCANCODE_PAGEUP, XK_Prior, 0 }, - { SDL_SCANCODE_UP, XK_Up, 0 }, - { SDL_SCANCODE_LEFT, XK_Left, 0 }, - { SDL_SCANCODE_DELETE, XK_Delete, 0 }, - { SDL_SCANCODE_KP_ENTER, XK_KP_Enter, 0 }, - }; - int best_distance; - int best_index; - int distance; - - X11_XAutoRepeatOn(data->display); - -#if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM - { - int xkb_major = XkbMajorVersion; - int xkb_minor = XkbMinorVersion; - if (X11_XkbQueryExtension(data->display, NULL, NULL, NULL, &xkb_major, &xkb_minor)) { - data->xkb = X11_XkbGetMap(data->display, XkbAllClientInfoMask, XkbUseCoreKbd); - } - } -#endif - - /* Try to determine which scancodes are being used based on fingerprint */ - best_distance = SDL_arraysize(fingerprint) + 1; - best_index = -1; - X11_XDisplayKeycodes(data->display, &min_keycode, &max_keycode); - for (i = 0; i < SDL_arraysize(fingerprint); ++i) { - fingerprint[i].value = - X11_XKeysymToKeycode(data->display, fingerprint[i].keysym) - - min_keycode; - } - for (i = 0; i < SDL_arraysize(scancode_set); ++i) { - /* Make sure the scancode set isn't too big */ - if ((max_keycode - min_keycode + 1) <= scancode_set[i].table_size) { - continue; - } - distance = 0; - for (j = 0; j < SDL_arraysize(fingerprint); ++j) { - if (fingerprint[j].value < 0 - || fingerprint[j].value >= scancode_set[i].table_size) { - distance += 1; - } else if (scancode_set[i].table[fingerprint[j].value] != fingerprint[j].scancode) { - distance += 1; - } - } - if (distance < best_distance) { - best_distance = distance; - best_index = i; - } - } - if (best_index >= 0 && best_distance <= 2) { -#ifdef DEBUG_KEYBOARD - printf("Using scancode set %d, min_keycode = %d, max_keycode = %d, table_size = %d\n", best_index, min_keycode, max_keycode, scancode_set[best_index].table_size); -#endif - SDL_memcpy(&data->key_layout[min_keycode], scancode_set[best_index].table, - sizeof(SDL_Scancode) * scancode_set[best_index].table_size); - } else { - SDL_Keycode keymap[SDL_NUM_SCANCODES]; - - printf - ("Keyboard layout unknown, please send the following to the SDL mailing list (sdl@libsdl.org):\n"); - - /* Determine key_layout - only works on US QWERTY layout */ - SDL_GetDefaultKeymap(keymap); - for (i = min_keycode; i <= max_keycode; ++i) { - KeySym sym; - sym = X11_KeyCodeToSym(_this, (KeyCode) i, 0); - if (sym != NoSymbol) { - SDL_Scancode scancode; - printf("code = %d, sym = 0x%X (%s) ", i - min_keycode, - (unsigned int) sym, X11_XKeysymToString(sym)); - scancode = X11_KeyCodeToSDLScancode(_this, i); - data->key_layout[i] = scancode; - if (scancode == SDL_SCANCODE_UNKNOWN) { - printf("scancode not found\n"); - } else { - printf("scancode = %d (%s)\n", scancode, SDL_GetScancodeName(scancode)); - } - } - } - } - - X11_UpdateKeymap(_this); - - SDL_SetScancodeName(SDL_SCANCODE_APPLICATION, "Menu"); - -#ifdef SDL_USE_IME - SDL_IME_Init(); -#endif - - return 0; -} - -void -X11_UpdateKeymap(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - int i; - SDL_Scancode scancode; - SDL_Keycode keymap[SDL_NUM_SCANCODES]; - unsigned char group = 0; - - SDL_GetDefaultKeymap(keymap); - -#if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM - if (data->xkb) { - XkbStateRec state; - X11_XkbGetUpdatedMap(data->display, XkbAllClientInfoMask, data->xkb); - - if (X11_XkbGetState(data->display, XkbUseCoreKbd, &state) == Success) { - group = state.group; - } - } -#endif - - - for (i = 0; i < SDL_arraysize(data->key_layout); i++) { - Uint32 key; - - /* Make sure this is a valid scancode */ - scancode = data->key_layout[i]; - if (scancode == SDL_SCANCODE_UNKNOWN) { - continue; - } - - /* See if there is a UCS keycode for this scancode */ - key = X11_KeyCodeToUcs4(_this, (KeyCode)i, group); - if (key) { - keymap[scancode] = key; - } else { - SDL_Scancode keyScancode = X11_KeyCodeToSDLScancode(_this, (KeyCode)i); - - switch (keyScancode) { - case SDL_SCANCODE_RETURN: - keymap[scancode] = SDLK_RETURN; - break; - case SDL_SCANCODE_ESCAPE: - keymap[scancode] = SDLK_ESCAPE; - break; - case SDL_SCANCODE_BACKSPACE: - keymap[scancode] = SDLK_BACKSPACE; - break; - case SDL_SCANCODE_TAB: - keymap[scancode] = SDLK_TAB; - break; - case SDL_SCANCODE_DELETE: - keymap[scancode] = SDLK_DELETE; - break; - default: - keymap[scancode] = SDL_SCANCODE_TO_KEYCODE(keyScancode); - break; - } - } - } - SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); -} - -void -X11_QuitKeyboard(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - -#if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM - if (data->xkb) { - X11_XkbFreeClientMap(data->xkb, 0, True); - data->xkb = NULL; - } -#endif - -#ifdef SDL_USE_IME - SDL_IME_Quit(); -#endif -} - -static void -X11_ResetXIM(_THIS) -{ -#ifdef X_HAVE_UTF8_STRING - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - int i; - - if (videodata && videodata->windowlist) { - for (i = 0; i < videodata->numwindows; ++i) { - SDL_WindowData *data = videodata->windowlist[i]; - if (data && data->ic) { - /* Clear any partially entered dead keys */ - char *contents = X11_Xutf8ResetIC(data->ic); - if (contents) { - X11_XFree(contents); - } - } - } - } -#endif -} - -void -X11_StartTextInput(_THIS) -{ - X11_ResetXIM(_this); -} - -void -X11_StopTextInput(_THIS) -{ - X11_ResetXIM(_this); -#ifdef SDL_USE_IME - SDL_IME_Reset(); -#endif -} - -void -X11_SetTextInputRect(_THIS, SDL_Rect *rect) -{ - if (!rect) { - SDL_InvalidParamError("rect"); - return; - } - -#ifdef SDL_USE_IME - SDL_IME_UpdateTextRect(rect); -#endif -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11keyboard.h b/3rdparty/SDL2/src/video/x11/SDL_x11keyboard.h deleted file mode 100644 index 6ce3c9cce6a..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11keyboard.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11keyboard_h -#define _SDL_x11keyboard_h - -extern int X11_InitKeyboard(_THIS); -extern void X11_UpdateKeymap(_THIS); -extern void X11_QuitKeyboard(_THIS); -extern void X11_StartTextInput(_THIS); -extern void X11_StopTextInput(_THIS); -extern void X11_SetTextInputRect(_THIS, SDL_Rect *rect); -extern KeySym X11_KeyCodeToSym(_THIS, KeyCode, unsigned char group); - -#endif /* _SDL_x11keyboard_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11messagebox.c b/3rdparty/SDL2/src/video/x11/SDL_x11messagebox.c deleted file mode 100644 index fc8b1b26b5d..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11messagebox.c +++ /dev/null @@ -1,831 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include "SDL.h" -#include "SDL_x11video.h" -#include "SDL_x11dyn.h" -#include "SDL_assert.h" - -#include <X11/keysym.h> -#include <locale.h> - - -#define SDL_FORK_MESSAGEBOX 1 -#define SDL_SET_LOCALE 1 - -#if SDL_FORK_MESSAGEBOX -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> -#include <errno.h> -#endif - -#define MAX_BUTTONS 8 /* Maximum number of buttons supported */ -#define MAX_TEXT_LINES 32 /* Maximum number of text lines supported */ -#define MIN_BUTTON_WIDTH 64 /* Minimum button width */ -#define MIN_DIALOG_WIDTH 200 /* Minimum dialog width */ -#define MIN_DIALOG_HEIGHT 100 /* Minimum dialog height */ - -static const char g_MessageBoxFontLatin1[] = "-*-*-medium-r-normal--0-120-*-*-p-0-iso8859-1"; -static const char g_MessageBoxFont[] = "-*-*-*-*-*-*-*-120-*-*-*-*-*-*"; - -static const SDL_MessageBoxColor g_default_colors[ SDL_MESSAGEBOX_COLOR_MAX ] = { - { 56, 54, 53 }, /* SDL_MESSAGEBOX_COLOR_BACKGROUND, */ - { 209, 207, 205 }, /* SDL_MESSAGEBOX_COLOR_TEXT, */ - { 140, 135, 129 }, /* SDL_MESSAGEBOX_COLOR_BUTTON_BORDER, */ - { 105, 102, 99 }, /* SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND, */ - { 205, 202, 53 }, /* SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED, */ -}; - -#define SDL_MAKE_RGB( _r, _g, _b ) ( ( ( Uint32 )( _r ) << 16 ) | \ - ( ( Uint32 )( _g ) << 8 ) | \ - ( ( Uint32 )( _b ) ) ) - -typedef struct SDL_MessageBoxButtonDataX11 { - int x, y; /* Text position */ - int length; /* Text length */ - int text_width; /* Text width */ - - SDL_Rect rect; /* Rectangle for entire button */ - - const SDL_MessageBoxButtonData *buttondata; /* Button data from caller */ -} SDL_MessageBoxButtonDataX11; - -typedef struct TextLineData { - int width; /* Width of this text line */ - int length; /* String length of this text line */ - const char *text; /* Text for this line */ -} TextLineData; - -typedef struct SDL_MessageBoxDataX11 -{ - Display *display; - int screen; - Window window; -#if SDL_VIDEO_DRIVER_X11_XDBE - XdbeBackBuffer buf; - SDL_bool xdbe; /* Whether Xdbe is present or not */ -#endif - long event_mask; - Atom wm_protocols; - Atom wm_delete_message; - - int dialog_width; /* Dialog box width. */ - int dialog_height; /* Dialog box height. */ - - XFontSet font_set; /* for UTF-8 systems */ - XFontStruct *font_struct; /* Latin1 (ASCII) fallback. */ - int xtext, ytext; /* Text position to start drawing at. */ - int numlines; /* Count of Text lines. */ - int text_height; /* Height for text lines. */ - TextLineData linedata[ MAX_TEXT_LINES ]; - - int *pbuttonid; /* Pointer to user return buttonid value. */ - - int button_press_index; /* Index into buttondata/buttonpos for button which is pressed (or -1). */ - int mouse_over_index; /* Index into buttondata/buttonpos for button mouse is over (or -1). */ - - int numbuttons; /* Count of buttons. */ - const SDL_MessageBoxButtonData *buttondata; - SDL_MessageBoxButtonDataX11 buttonpos[ MAX_BUTTONS ]; - - Uint32 color[ SDL_MESSAGEBOX_COLOR_MAX ]; - - const SDL_MessageBoxData *messageboxdata; -} SDL_MessageBoxDataX11; - -/* Maximum helper for ints. */ -static SDL_INLINE int -IntMax( int a, int b ) -{ - return ( a > b ) ? a : b; -} - -/* Return width and height for a string. */ -static void -GetTextWidthHeight( SDL_MessageBoxDataX11 *data, const char *str, int nbytes, int *pwidth, int *pheight ) -{ - if (SDL_X11_HAVE_UTF8) { - XRectangle overall_ink, overall_logical; - X11_Xutf8TextExtents(data->font_set, str, nbytes, &overall_ink, &overall_logical); - *pwidth = overall_logical.width; - *pheight = overall_logical.height; - } else { - XCharStruct text_structure; - int font_direction, font_ascent, font_descent; - X11_XTextExtents( data->font_struct, str, nbytes, - &font_direction, &font_ascent, &font_descent, - &text_structure ); - *pwidth = text_structure.width; - *pheight = text_structure.ascent + text_structure.descent; - } -} - -/* Return index of button if position x,y is contained therein. */ -static int -GetHitButtonIndex( SDL_MessageBoxDataX11 *data, int x, int y ) -{ - int i; - int numbuttons = data->numbuttons; - SDL_MessageBoxButtonDataX11 *buttonpos = data->buttonpos; - - for ( i = 0; i < numbuttons; i++ ) { - SDL_Rect *rect = &buttonpos[ i ].rect; - - if ( ( x >= rect->x ) && - ( x <= ( rect->x + rect->w ) ) && - ( y >= rect->y ) && - ( y <= ( rect->y + rect->h ) ) ) { - return i; - } - } - - return -1; -} - -/* Initialize SDL_MessageBoxData structure and Display, etc. */ -static int -X11_MessageBoxInit( SDL_MessageBoxDataX11 *data, const SDL_MessageBoxData * messageboxdata, int * pbuttonid ) -{ - int i; - int numbuttons = messageboxdata->numbuttons; - const SDL_MessageBoxButtonData *buttondata = messageboxdata->buttons; - const SDL_MessageBoxColor *colorhints; - - if ( numbuttons > MAX_BUTTONS ) { - return SDL_SetError("Too many buttons (%d max allowed)", MAX_BUTTONS); - } - - data->dialog_width = MIN_DIALOG_WIDTH; - data->dialog_height = MIN_DIALOG_HEIGHT; - data->messageboxdata = messageboxdata; - data->buttondata = buttondata; - data->numbuttons = numbuttons; - data->pbuttonid = pbuttonid; - - data->display = X11_XOpenDisplay( NULL ); - if ( !data->display ) { - return SDL_SetError("Couldn't open X11 display"); - } - - if (SDL_X11_HAVE_UTF8) { - char **missing = NULL; - int num_missing = 0; - data->font_set = X11_XCreateFontSet(data->display, g_MessageBoxFont, - &missing, &num_missing, NULL); - if ( missing != NULL ) { - X11_XFreeStringList(missing); - } - if ( data->font_set == NULL ) { - return SDL_SetError("Couldn't load font %s", g_MessageBoxFont); - } - } else { - data->font_struct = X11_XLoadQueryFont( data->display, g_MessageBoxFontLatin1 ); - if ( data->font_struct == NULL ) { - return SDL_SetError("Couldn't load font %s", g_MessageBoxFontLatin1); - } - } - - if ( messageboxdata->colorScheme ) { - colorhints = messageboxdata->colorScheme->colors; - } else { - colorhints = g_default_colors; - } - - /* Convert our SDL_MessageBoxColor r,g,b values to packed RGB format. */ - for ( i = 0; i < SDL_MESSAGEBOX_COLOR_MAX; i++ ) { - data->color[ i ] = SDL_MAKE_RGB( colorhints[ i ].r, colorhints[ i ].g, colorhints[ i ].b ); - } - - return 0; -} - -/* Calculate and initialize text and button locations. */ -static int -X11_MessageBoxInitPositions( SDL_MessageBoxDataX11 *data ) -{ - int i; - int ybuttons; - int text_width_max = 0; - int button_text_height = 0; - int button_width = MIN_BUTTON_WIDTH; - const SDL_MessageBoxData *messageboxdata = data->messageboxdata; - - /* Go over text and break linefeeds into separate lines. */ - if ( messageboxdata->message && messageboxdata->message[ 0 ] ) { - const char *text = messageboxdata->message; - TextLineData *plinedata = data->linedata; - - for ( i = 0; i < MAX_TEXT_LINES; i++, plinedata++ ) { - int height; - char *lf = SDL_strchr( ( char * )text, '\n' ); - - data->numlines++; - - /* Only grab length up to lf if it exists and isn't the last line. */ - plinedata->length = ( lf && ( i < MAX_TEXT_LINES - 1 ) ) ? ( lf - text ) : SDL_strlen( text ); - plinedata->text = text; - - GetTextWidthHeight( data, text, plinedata->length, &plinedata->width, &height ); - - /* Text and widths are the largest we've ever seen. */ - data->text_height = IntMax( data->text_height, height ); - text_width_max = IntMax( text_width_max, plinedata->width ); - - if (lf && (lf > text) && (lf[-1] == '\r')) { - plinedata->length--; - } - - text += plinedata->length + 1; - - /* Break if there are no more linefeeds. */ - if ( !lf ) - break; - } - - /* Bump up the text height slightly. */ - data->text_height += 2; - } - - /* Loop through all buttons and calculate the button widths and height. */ - for ( i = 0; i < data->numbuttons; i++ ) { - int height; - - data->buttonpos[ i ].buttondata = &data->buttondata[ i ]; - data->buttonpos[ i ].length = SDL_strlen( data->buttondata[ i ].text ); - - GetTextWidthHeight( data, data->buttondata[ i ].text, SDL_strlen( data->buttondata[ i ].text ), - &data->buttonpos[ i ].text_width, &height ); - - button_width = IntMax( button_width, data->buttonpos[ i ].text_width ); - button_text_height = IntMax( button_text_height, height ); - } - - if ( data->numlines ) { - /* x,y for this line of text. */ - data->xtext = data->text_height; - data->ytext = data->text_height + data->text_height; - - /* Bump button y down to bottom of text. */ - ybuttons = 3 * data->ytext / 2 + ( data->numlines - 1 ) * data->text_height; - - /* Bump the dialog box width and height up if needed. */ - data->dialog_width = IntMax( data->dialog_width, 2 * data->xtext + text_width_max ); - data->dialog_height = IntMax( data->dialog_height, ybuttons ); - } else { - /* Button y starts at height of button text. */ - ybuttons = button_text_height; - } - - if ( data->numbuttons ) { - int x, y; - int width_of_buttons; - int button_spacing = button_text_height; - int button_height = 2 * button_text_height; - - /* Bump button width up a bit. */ - button_width += button_text_height; - - /* Get width of all buttons lined up. */ - width_of_buttons = data->numbuttons * button_width + ( data->numbuttons - 1 ) * button_spacing; - - /* Bump up dialog width and height if buttons are wider than text. */ - data->dialog_width = IntMax( data->dialog_width, width_of_buttons + 2 * button_spacing ); - data->dialog_height = IntMax( data->dialog_height, ybuttons + 2 * button_height ); - - /* Location for first button. */ - x = ( data->dialog_width - width_of_buttons ) / 2; - y = ybuttons + ( data->dialog_height - ybuttons - button_height ) / 2; - - for ( i = 0; i < data->numbuttons; i++ ) { - /* Button coordinates. */ - data->buttonpos[ i ].rect.x = x; - data->buttonpos[ i ].rect.y = y; - data->buttonpos[ i ].rect.w = button_width; - data->buttonpos[ i ].rect.h = button_height; - - /* Button text coordinates. */ - data->buttonpos[ i ].x = x + ( button_width - data->buttonpos[ i ].text_width ) / 2; - data->buttonpos[ i ].y = y + ( button_height - button_text_height - 1 ) / 2 + button_text_height; - - /* Scoot over for next button. */ - x += button_width + button_spacing; - } - } - - return 0; -} - -/* Free SDL_MessageBoxData data. */ -static void -X11_MessageBoxShutdown( SDL_MessageBoxDataX11 *data ) -{ - if ( data->font_set != NULL ) { - X11_XFreeFontSet( data->display, data->font_set ); - data->font_set = NULL; - } - - if ( data->font_struct != NULL ) { - X11_XFreeFont( data->display, data->font_struct ); - data->font_struct = NULL; - } - -#if SDL_VIDEO_DRIVER_X11_XDBE - if ( SDL_X11_HAVE_XDBE && data->xdbe ) { - X11_XdbeDeallocateBackBufferName(data->display, data->buf); - } -#endif - - if ( data->display ) { - if ( data->window != None ) { - X11_XWithdrawWindow( data->display, data->window, data->screen ); - X11_XDestroyWindow( data->display, data->window ); - data->window = None; - } - - X11_XCloseDisplay( data->display ); - data->display = NULL; - } -} - -/* Create and set up our X11 dialog box indow. */ -static int -X11_MessageBoxCreateWindow( SDL_MessageBoxDataX11 *data ) -{ - int x, y; - XSizeHints *sizehints; - XSetWindowAttributes wnd_attr; - Atom _NET_WM_WINDOW_TYPE, _NET_WM_WINDOW_TYPE_DIALOG, _NET_WM_NAME, UTF8_STRING; - Display *display = data->display; - SDL_WindowData *windowdata = NULL; - const SDL_MessageBoxData *messageboxdata = data->messageboxdata; - - if ( messageboxdata->window ) { - SDL_DisplayData *displaydata = - (SDL_DisplayData *) SDL_GetDisplayForWindow(messageboxdata->window)->driverdata; - windowdata = (SDL_WindowData *)messageboxdata->window->driverdata; - data->screen = displaydata->screen; - } else { - data->screen = DefaultScreen( display ); - } - - data->event_mask = ExposureMask | - ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask | - StructureNotifyMask | FocusChangeMask | PointerMotionMask; - wnd_attr.event_mask = data->event_mask; - - data->window = X11_XCreateWindow( - display, RootWindow(display, data->screen), - 0, 0, - data->dialog_width, data->dialog_height, - 0, CopyFromParent, InputOutput, CopyFromParent, - CWEventMask, &wnd_attr ); - if ( data->window == None ) { - return SDL_SetError("Couldn't create X window"); - } - - if ( windowdata ) { - /* http://tronche.com/gui/x/icccm/sec-4.html#WM_TRANSIENT_FOR */ - X11_XSetTransientForHint( display, data->window, windowdata->xwindow ); - } - - X11_XStoreName( display, data->window, messageboxdata->title ); - _NET_WM_NAME = X11_XInternAtom(display, "_NET_WM_NAME", False); - UTF8_STRING = X11_XInternAtom(display, "UTF8_STRING", False); - X11_XChangeProperty(display, data->window, _NET_WM_NAME, UTF8_STRING, 8, - PropModeReplace, (unsigned char *) messageboxdata->title, - strlen(messageboxdata->title) + 1 ); - - /* Let the window manager know this is a dialog box */ - _NET_WM_WINDOW_TYPE = X11_XInternAtom(display, "_NET_WM_WINDOW_TYPE", False); - _NET_WM_WINDOW_TYPE_DIALOG = X11_XInternAtom(display, "_NET_WM_WINDOW_TYPE_DIALOG", False); - X11_XChangeProperty(display, data->window, _NET_WM_WINDOW_TYPE, XA_ATOM, 32, - PropModeReplace, - (unsigned char *)&_NET_WM_WINDOW_TYPE_DIALOG, 1); - - /* Allow the window to be deleted by the window manager */ - data->wm_protocols = X11_XInternAtom( display, "WM_PROTOCOLS", False ); - data->wm_delete_message = X11_XInternAtom( display, "WM_DELETE_WINDOW", False ); - X11_XSetWMProtocols( display, data->window, &data->wm_delete_message, 1 ); - - if ( windowdata ) { - XWindowAttributes attrib; - Window dummy; - - X11_XGetWindowAttributes(display, windowdata->xwindow, &attrib); - x = attrib.x + ( attrib.width - data->dialog_width ) / 2; - y = attrib.y + ( attrib.height - data->dialog_height ) / 3 ; - X11_XTranslateCoordinates(display, windowdata->xwindow, RootWindow(display, data->screen), x, y, &x, &y, &dummy); - } else { - const SDL_VideoDevice *dev = SDL_GetVideoDevice(); - if ((dev) && (dev->displays) && (dev->num_displays > 0)) { - const SDL_VideoDisplay *dpy = &dev->displays[0]; - const SDL_DisplayData *dpydata = (SDL_DisplayData *) dpy->driverdata; - x = dpydata->x + (( dpy->current_mode.w - data->dialog_width ) / 2); - y = dpydata->y + (( dpy->current_mode.h - data->dialog_height ) / 3); - } else { /* oh well. This will misposition on a multi-head setup. Init first next time. */ - x = ( DisplayWidth( display, data->screen ) - data->dialog_width ) / 2; - y = ( DisplayHeight( display, data->screen ) - data->dialog_height ) / 3 ; - } - } - X11_XMoveWindow( display, data->window, x, y ); - - sizehints = X11_XAllocSizeHints(); - if ( sizehints ) { - sizehints->flags = USPosition | USSize | PMaxSize | PMinSize; - sizehints->x = x; - sizehints->y = y; - sizehints->width = data->dialog_width; - sizehints->height = data->dialog_height; - - sizehints->min_width = sizehints->max_width = data->dialog_width; - sizehints->min_height = sizehints->max_height = data->dialog_height; - - X11_XSetWMNormalHints( display, data->window, sizehints ); - - X11_XFree( sizehints ); - } - - X11_XMapRaised( display, data->window ); - -#if SDL_VIDEO_DRIVER_X11_XDBE - /* Initialise a back buffer for double buffering */ - if (SDL_X11_HAVE_XDBE) { - int xdbe_major, xdbe_minor; - if (X11_XdbeQueryExtension(display, &xdbe_major, &xdbe_minor) != 0) { - data->xdbe = SDL_TRUE; - data->buf = X11_XdbeAllocateBackBufferName(display, data->window, XdbeUndefined); - } else { - data->xdbe = SDL_FALSE; - } - } -#endif - - return 0; -} - -/* Draw our message box. */ -static void -X11_MessageBoxDraw( SDL_MessageBoxDataX11 *data, GC ctx ) -{ - int i; - Drawable window = data->window; - Display *display = data->display; - -#if SDL_VIDEO_DRIVER_X11_XDBE - if (SDL_X11_HAVE_XDBE && data->xdbe) { - window = data->buf; - X11_XdbeBeginIdiom(data->display); - } -#endif - - X11_XSetForeground( display, ctx, data->color[ SDL_MESSAGEBOX_COLOR_BACKGROUND ] ); - X11_XFillRectangle( display, window, ctx, 0, 0, data->dialog_width, data->dialog_height ); - - X11_XSetForeground( display, ctx, data->color[ SDL_MESSAGEBOX_COLOR_TEXT ] ); - for ( i = 0; i < data->numlines; i++ ) { - TextLineData *plinedata = &data->linedata[ i ]; - - if (SDL_X11_HAVE_UTF8) { - X11_Xutf8DrawString( display, window, data->font_set, ctx, - data->xtext, data->ytext + i * data->text_height, - plinedata->text, plinedata->length ); - } else { - X11_XDrawString( display, window, ctx, - data->xtext, data->ytext + i * data->text_height, - plinedata->text, plinedata->length ); - } - } - - for ( i = 0; i < data->numbuttons; i++ ) { - SDL_MessageBoxButtonDataX11 *buttondatax11 = &data->buttonpos[ i ]; - const SDL_MessageBoxButtonData *buttondata = buttondatax11->buttondata; - int border = ( buttondata->flags & SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT ) ? 2 : 0; - int offset = ( ( data->mouse_over_index == i ) && ( data->button_press_index == data->mouse_over_index ) ) ? 1 : 0; - - X11_XSetForeground( display, ctx, data->color[ SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND ] ); - X11_XFillRectangle( display, window, ctx, - buttondatax11->rect.x - border, buttondatax11->rect.y - border, - buttondatax11->rect.w + 2 * border, buttondatax11->rect.h + 2 * border ); - - X11_XSetForeground( display, ctx, data->color[ SDL_MESSAGEBOX_COLOR_BUTTON_BORDER ] ); - X11_XDrawRectangle( display, window, ctx, - buttondatax11->rect.x, buttondatax11->rect.y, - buttondatax11->rect.w, buttondatax11->rect.h ); - - X11_XSetForeground( display, ctx, ( data->mouse_over_index == i ) ? - data->color[ SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED ] : - data->color[ SDL_MESSAGEBOX_COLOR_TEXT ] ); - - if (SDL_X11_HAVE_UTF8) { - X11_Xutf8DrawString( display, window, data->font_set, ctx, - buttondatax11->x + offset, - buttondatax11->y + offset, - buttondata->text, buttondatax11->length ); - } else { - X11_XDrawString( display, window, ctx, - buttondatax11->x + offset, buttondatax11->y + offset, - buttondata->text, buttondatax11->length ); - } - } - -#if SDL_VIDEO_DRIVER_X11_XDBE - if (SDL_X11_HAVE_XDBE && data->xdbe) { - XdbeSwapInfo swap_info; - swap_info.swap_window = data->window; - swap_info.swap_action = XdbeUndefined; - X11_XdbeSwapBuffers(data->display, &swap_info, 1); - X11_XdbeEndIdiom(data->display); - } -#endif -} - -static Bool -X11_MessageBoxEventTest(Display *display, XEvent *event, XPointer arg) -{ - const SDL_MessageBoxDataX11 *data = (const SDL_MessageBoxDataX11 *) arg; - return ((event->xany.display == data->display) && (event->xany.window == data->window)) ? True : False; -} - -/* Loop and handle message box event messages until something kills it. */ -static int -X11_MessageBoxLoop( SDL_MessageBoxDataX11 *data ) -{ - GC ctx; - XGCValues ctx_vals; - SDL_bool close_dialog = SDL_FALSE; - SDL_bool has_focus = SDL_TRUE; - KeySym last_key_pressed = XK_VoidSymbol; - unsigned long gcflags = GCForeground | GCBackground; - - SDL_zero(ctx_vals); - ctx_vals.foreground = data->color[ SDL_MESSAGEBOX_COLOR_BACKGROUND ]; - ctx_vals.background = data->color[ SDL_MESSAGEBOX_COLOR_BACKGROUND ]; - - if (!SDL_X11_HAVE_UTF8) { - gcflags |= GCFont; - ctx_vals.font = data->font_struct->fid; - } - - ctx = X11_XCreateGC( data->display, data->window, gcflags, &ctx_vals ); - if ( ctx == None ) { - return SDL_SetError("Couldn't create graphics context"); - } - - data->button_press_index = -1; /* Reset what button is currently depressed. */ - data->mouse_over_index = -1; /* Reset what button the mouse is over. */ - - while( !close_dialog ) { - XEvent e; - SDL_bool draw = SDL_TRUE; - - /* can't use XWindowEvent() because it can't handle ClientMessage events. */ - /* can't use XNextEvent() because we only want events for this window. */ - X11_XIfEvent( data->display, &e, X11_MessageBoxEventTest, (XPointer) data ); - - /* If X11_XFilterEvent returns True, then some input method has filtered the - event, and the client should discard the event. */ - if ( ( e.type != Expose ) && X11_XFilterEvent( &e, None ) ) - continue; - - switch( e.type ) { - case Expose: - if ( e.xexpose.count > 0 ) { - draw = SDL_FALSE; - } - break; - - case FocusIn: - /* Got focus. */ - has_focus = SDL_TRUE; - break; - - case FocusOut: - /* lost focus. Reset button and mouse info. */ - has_focus = SDL_FALSE; - data->button_press_index = -1; - data->mouse_over_index = -1; - break; - - case MotionNotify: - if ( has_focus ) { - /* Mouse moved... */ - const int previndex = data->mouse_over_index; - data->mouse_over_index = GetHitButtonIndex( data, e.xbutton.x, e.xbutton.y ); - if (data->mouse_over_index == previndex) { - draw = SDL_FALSE; - } - } - break; - - case ClientMessage: - if ( e.xclient.message_type == data->wm_protocols && - e.xclient.format == 32 && - e.xclient.data.l[ 0 ] == data->wm_delete_message ) { - close_dialog = SDL_TRUE; - } - break; - - case KeyPress: - /* Store key press - we make sure in key release that we got both. */ - last_key_pressed = X11_XLookupKeysym( &e.xkey, 0 ); - break; - - case KeyRelease: { - Uint32 mask = 0; - KeySym key = X11_XLookupKeysym( &e.xkey, 0 ); - - /* If this is a key release for something we didn't get the key down for, then bail. */ - if ( key != last_key_pressed ) - break; - - if ( key == XK_Escape ) - mask = SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT; - else if ( ( key == XK_Return ) || ( key == XK_KP_Enter ) ) - mask = SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT; - - if ( mask ) { - int i; - - /* Look for first button with this mask set, and return it if found. */ - for ( i = 0; i < data->numbuttons; i++ ) { - SDL_MessageBoxButtonDataX11 *buttondatax11 = &data->buttonpos[ i ]; - - if ( buttondatax11->buttondata->flags & mask ) { - *data->pbuttonid = buttondatax11->buttondata->buttonid; - close_dialog = SDL_TRUE; - break; - } - } - } - break; - } - - case ButtonPress: - data->button_press_index = -1; - if ( e.xbutton.button == Button1 ) { - /* Find index of button they clicked on. */ - data->button_press_index = GetHitButtonIndex( data, e.xbutton.x, e.xbutton.y ); - } - break; - - case ButtonRelease: - /* If button is released over the same button that was clicked down on, then return it. */ - if ( ( e.xbutton.button == Button1 ) && ( data->button_press_index >= 0 ) ) { - int button = GetHitButtonIndex( data, e.xbutton.x, e.xbutton.y ); - - if ( data->button_press_index == button ) { - SDL_MessageBoxButtonDataX11 *buttondatax11 = &data->buttonpos[ button ]; - - *data->pbuttonid = buttondatax11->buttondata->buttonid; - close_dialog = SDL_TRUE; - } - } - data->button_press_index = -1; - break; - } - - if ( draw ) { - /* Draw our dialog box. */ - X11_MessageBoxDraw( data, ctx ); - } - } - - X11_XFreeGC( data->display, ctx ); - return 0; -} - -static int -X11_ShowMessageBoxImpl(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ - int ret; - SDL_MessageBoxDataX11 data; -#if SDL_SET_LOCALE - char *origlocale; -#endif - - SDL_zero(data); - - if ( !SDL_X11_LoadSymbols() ) - return -1; - -#if SDL_SET_LOCALE - origlocale = setlocale(LC_ALL, NULL); - if (origlocale != NULL) { - origlocale = SDL_strdup(origlocale); - if (origlocale == NULL) { - return SDL_OutOfMemory(); - } - setlocale(LC_ALL, ""); - } -#endif - - /* This code could get called from multiple threads maybe? */ - X11_XInitThreads(); - - /* Initialize the return buttonid value to -1 (for error or dialogbox closed). */ - *buttonid = -1; - - /* Init and display the message box. */ - ret = X11_MessageBoxInit( &data, messageboxdata, buttonid ); - if ( ret != -1 ) { - ret = X11_MessageBoxInitPositions( &data ); - if ( ret != -1 ) { - ret = X11_MessageBoxCreateWindow( &data ); - if ( ret != -1 ) { - ret = X11_MessageBoxLoop( &data ); - } - } - } - - X11_MessageBoxShutdown( &data ); - -#if SDL_SET_LOCALE - if (origlocale) { - setlocale(LC_ALL, origlocale); - SDL_free(origlocale); - } -#endif - - return ret; -} - -/* Display an x11 message box. */ -int -X11_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ -#if SDL_FORK_MESSAGEBOX - /* Use a child process to protect against setlocale(). Annoying. */ - pid_t pid; - int fds[2]; - int status = 0; - - if (pipe(fds) == -1) { - return X11_ShowMessageBoxImpl(messageboxdata, buttonid); /* oh well. */ - } - - pid = fork(); - if (pid == -1) { /* failed */ - close(fds[0]); - close(fds[1]); - return X11_ShowMessageBoxImpl(messageboxdata, buttonid); /* oh well. */ - } else if (pid == 0) { /* we're the child */ - int exitcode = 0; - close(fds[0]); - status = X11_ShowMessageBoxImpl(messageboxdata, buttonid); - if (write(fds[1], &status, sizeof (int)) != sizeof (int)) - exitcode = 1; - else if (write(fds[1], buttonid, sizeof (int)) != sizeof (int)) - exitcode = 1; - close(fds[1]); - _exit(exitcode); /* don't run atexit() stuff, static destructors, etc. */ - } else { /* we're the parent */ - pid_t rc; - close(fds[1]); - do { - rc = waitpid(pid, &status, 0); - } while ((rc == -1) && (errno == EINTR)); - - SDL_assert(rc == pid); /* not sure what to do if this fails. */ - - if ((rc == -1) || (!WIFEXITED(status)) || (WEXITSTATUS(status) != 0)) { - return SDL_SetError("msgbox child process failed"); - } - - if (read(fds[0], &status, sizeof (int)) != sizeof (int)) - status = -1; - else if (read(fds[0], buttonid, sizeof (int)) != sizeof (int)) - status = -1; - close(fds[0]); - - return status; - } -#else - return X11_ShowMessageBoxImpl(messageboxdata, buttonid); -#endif -} -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11messagebox.h b/3rdparty/SDL2/src/video/x11/SDL_x11messagebox.h deleted file mode 100644 index c77c57fb18e..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11messagebox.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#if SDL_VIDEO_DRIVER_X11 - -extern int X11_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11modes.c b/3rdparty/SDL2/src/video/x11/SDL_x11modes.c deleted file mode 100644 index 29307b3a606..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11modes.c +++ /dev/null @@ -1,1106 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include "SDL_hints.h" -#include "SDL_x11video.h" -#include "SDL_timer.h" -#include "edid.h" - -/* #define X11MODES_DEBUG */ - -/* I'm becoming more and more convinced that the application should never - * use XRandR, and it's the window manager's responsibility to track and - * manage display modes for fullscreen windows. Right now XRandR is completely - * broken with respect to window manager behavior on every window manager that - * I can find. For example, on Unity 3D if you show a fullscreen window while - * the resolution is changing (within ~250 ms) your window will retain the - * fullscreen state hint but be decorated and windowed. - * - * However, many people swear by it, so let them swear at it. :) -*/ -/* #define XRANDR_DISABLED_BY_DEFAULT */ - - -static int -get_visualinfo(Display * display, int screen, XVisualInfo * vinfo) -{ - const char *visual_id = SDL_getenv("SDL_VIDEO_X11_VISUALID"); - int depth; - - /* Look for an exact visual, if requested */ - if (visual_id) { - XVisualInfo *vi, template; - int nvis; - - SDL_zero(template); - template.visualid = SDL_strtol(visual_id, NULL, 0); - vi = X11_XGetVisualInfo(display, VisualIDMask, &template, &nvis); - if (vi) { - *vinfo = *vi; - X11_XFree(vi); - return 0; - } - } - - depth = DefaultDepth(display, screen); - if ((X11_UseDirectColorVisuals() && - X11_XMatchVisualInfo(display, screen, depth, DirectColor, vinfo)) || - X11_XMatchVisualInfo(display, screen, depth, TrueColor, vinfo) || - X11_XMatchVisualInfo(display, screen, depth, PseudoColor, vinfo) || - X11_XMatchVisualInfo(display, screen, depth, StaticColor, vinfo)) { - return 0; - } - return -1; -} - -int -X11_GetVisualInfoFromVisual(Display * display, Visual * visual, XVisualInfo * vinfo) -{ - XVisualInfo *vi; - int nvis; - - vinfo->visualid = X11_XVisualIDFromVisual(visual); - vi = X11_XGetVisualInfo(display, VisualIDMask, vinfo, &nvis); - if (vi) { - *vinfo = *vi; - X11_XFree(vi); - return 0; - } - return -1; -} - -Uint32 -X11_GetPixelFormatFromVisualInfo(Display * display, XVisualInfo * vinfo) -{ - if (vinfo->class == DirectColor || vinfo->class == TrueColor) { - int bpp; - Uint32 Rmask, Gmask, Bmask, Amask; - - Rmask = vinfo->visual->red_mask; - Gmask = vinfo->visual->green_mask; - Bmask = vinfo->visual->blue_mask; - if (vinfo->depth == 32) { - Amask = (0xFFFFFFFF & ~(Rmask | Gmask | Bmask)); - } else { - Amask = 0; - } - - bpp = vinfo->depth; - if (bpp == 24) { - int i, n; - XPixmapFormatValues *p = X11_XListPixmapFormats(display, &n); - if (p) { - for (i = 0; i < n; ++i) { - if (p[i].depth == 24) { - bpp = p[i].bits_per_pixel; - break; - } - } - X11_XFree(p); - } - } - - return SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask); - } - - if (vinfo->class == PseudoColor || vinfo->class == StaticColor) { - switch (vinfo->depth) { - case 8: - return SDL_PIXELTYPE_INDEX8; - case 4: - if (BitmapBitOrder(display) == LSBFirst) { - return SDL_PIXELFORMAT_INDEX4LSB; - } else { - return SDL_PIXELFORMAT_INDEX4MSB; - } - break; - case 1: - if (BitmapBitOrder(display) == LSBFirst) { - return SDL_PIXELFORMAT_INDEX1LSB; - } else { - return SDL_PIXELFORMAT_INDEX1MSB; - } - break; - } - } - - return SDL_PIXELFORMAT_UNKNOWN; -} - -/* Global for the error handler */ -int vm_event, vm_error = -1; - -#if SDL_VIDEO_DRIVER_X11_XINERAMA -static SDL_bool -CheckXinerama(Display * display, int *major, int *minor) -{ - int event_base = 0; - int error_base = 0; - - /* Default the extension not available */ - *major = *minor = 0; - - /* Allow environment override */ - if (!SDL_GetHintBoolean(SDL_HINT_VIDEO_X11_XINERAMA, SDL_TRUE)) { -#ifdef X11MODES_DEBUG - printf("Xinerama disabled due to hint\n"); -#endif - return SDL_FALSE; - } - - if (!SDL_X11_HAVE_XINERAMA) { -#ifdef X11MODES_DEBUG - printf("Xinerama support not available\n"); -#endif - return SDL_FALSE; - } - - /* Query the extension version */ - if (!X11_XineramaQueryExtension(display, &event_base, &error_base) || - !X11_XineramaQueryVersion(display, major, minor) || - !X11_XineramaIsActive(display)) { -#ifdef X11MODES_DEBUG - printf("Xinerama not active on the display\n"); -#endif - return SDL_FALSE; - } -#ifdef X11MODES_DEBUG - printf("Xinerama available at version %d.%d!\n", *major, *minor); -#endif - return SDL_TRUE; -} - -/* !!! FIXME: remove this later. */ -/* we have a weird bug where XineramaQueryScreens() throws an X error, so this - is here to help track it down (and not crash, too!). */ -static SDL_bool xinerama_triggered_error = SDL_FALSE; -static int -X11_XineramaFailed(Display * d, XErrorEvent * e) -{ - xinerama_triggered_error = SDL_TRUE; - fprintf(stderr, "XINERAMA X ERROR: type=%d serial=%lu err=%u req=%u minor=%u\n", - e->type, e->serial, (unsigned int) e->error_code, - (unsigned int) e->request_code, (unsigned int) e->minor_code); - fflush(stderr); - return 0; -} -#endif /* SDL_VIDEO_DRIVER_X11_XINERAMA */ - -#if SDL_VIDEO_DRIVER_X11_XRANDR -static SDL_bool -CheckXRandR(Display * display, int *major, int *minor) -{ - /* Default the extension not available */ - *major = *minor = 0; - - /* Allow environment override */ -#ifdef XRANDR_DISABLED_BY_DEFAULT - if (!SDL_GetHintBoolean(SDL_HINT_VIDEO_X11_XRANDR, SDL_FALSE)) { -#ifdef X11MODES_DEBUG - printf("XRandR disabled by default due to window manager issues\n"); -#endif - return SDL_FALSE; - } -#else - if (!SDL_GetHintBoolean(SDL_HINT_VIDEO_X11_XRANDR, SDL_TRUE)) { -#ifdef X11MODES_DEBUG - printf("XRandR disabled due to hint\n"); -#endif - return SDL_FALSE; - } -#endif /* XRANDR_ENABLED_BY_DEFAULT */ - - if (!SDL_X11_HAVE_XRANDR) { -#ifdef X11MODES_DEBUG - printf("XRandR support not available\n"); -#endif - return SDL_FALSE; - } - - /* Query the extension version */ - *major = 1; *minor = 3; /* we want 1.3 */ - if (!X11_XRRQueryVersion(display, major, minor)) { -#ifdef X11MODES_DEBUG - printf("XRandR not active on the display\n"); -#endif - *major = *minor = 0; - return SDL_FALSE; - } -#ifdef X11MODES_DEBUG - printf("XRandR available at version %d.%d!\n", *major, *minor); -#endif - return SDL_TRUE; -} - -#define XRANDR_ROTATION_LEFT (1 << 1) -#define XRANDR_ROTATION_RIGHT (1 << 3) - -static int -CalculateXRandRRefreshRate(const XRRModeInfo *info) -{ - return (info->hTotal && info->vTotal) ? - round(((double)info->dotClock / (double)(info->hTotal * info->vTotal))) : 0; -} - -static SDL_bool -SetXRandRModeInfo(Display *display, XRRScreenResources *res, RRCrtc crtc, - RRMode modeID, SDL_DisplayMode *mode) -{ - int i; - for (i = 0; i < res->nmode; ++i) { - const XRRModeInfo *info = &res->modes[i]; - if (info->id == modeID) { - XRRCrtcInfo *crtcinfo; - Rotation rotation = 0; - - crtcinfo = X11_XRRGetCrtcInfo(display, res, crtc); - if (crtcinfo) { - rotation = crtcinfo->rotation; - X11_XRRFreeCrtcInfo(crtcinfo); - } - - if (rotation & (XRANDR_ROTATION_LEFT|XRANDR_ROTATION_RIGHT)) { - mode->w = info->height; - mode->h = info->width; - } else { - mode->w = info->width; - mode->h = info->height; - } - mode->refresh_rate = CalculateXRandRRefreshRate(info); - ((SDL_DisplayModeData*)mode->driverdata)->xrandr_mode = modeID; -#ifdef X11MODES_DEBUG - printf("XRandR mode %d: %dx%d@%dHz\n", (int) modeID, mode->w, mode->h, mode->refresh_rate); -#endif - return SDL_TRUE; - } - } - return SDL_FALSE; -} - -static void -SetXRandRDisplayName(Display *dpy, Atom EDID, char *name, const size_t namelen, RROutput output, const unsigned long widthmm, const unsigned long heightmm) -{ - /* See if we can get the EDID data for the real monitor name */ - int inches; - int nprop; - Atom *props = X11_XRRListOutputProperties(dpy, output, &nprop); - int i; - - for (i = 0; i < nprop; ++i) { - unsigned char *prop; - int actual_format; - unsigned long nitems, bytes_after; - Atom actual_type; - - if (props[i] == EDID) { - if (X11_XRRGetOutputProperty(dpy, output, props[i], 0, 100, False, - False, AnyPropertyType, &actual_type, - &actual_format, &nitems, &bytes_after, - &prop) == Success) { - MonitorInfo *info = decode_edid(prop); - if (info) { -#ifdef X11MODES_DEBUG - printf("Found EDID data for %s\n", name); - dump_monitor_info(info); -#endif - SDL_strlcpy(name, info->dsc_product_name, namelen); - free(info); - } - X11_XFree(prop); - } - break; - } - } - - if (props) { - X11_XFree(props); - } - - inches = (int)((SDL_sqrtf(widthmm * widthmm + heightmm * heightmm) / 25.4f) + 0.5f); - if (*name && inches) { - const size_t len = SDL_strlen(name); - SDL_snprintf(&name[len], namelen-len, " %d\"", inches); - } - -#ifdef X11MODES_DEBUG - printf("Display name: %s\n", name); -#endif -} - - -int -X11_InitModes_XRandR(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - Display *dpy = data->display; - const int screencount = ScreenCount(dpy); - const int default_screen = DefaultScreen(dpy); - RROutput primary = X11_XRRGetOutputPrimary(dpy, RootWindow(dpy, default_screen)); - Atom EDID = X11_XInternAtom(dpy, "EDID", False); - XRRScreenResources *res = NULL; - Uint32 pixelformat; - XVisualInfo vinfo; - XPixmapFormatValues *pixmapformats; - int looking_for_primary; - int scanline_pad; - int output; - int screen, i, n; - - for (looking_for_primary = 1; looking_for_primary >= 0; looking_for_primary--) { - for (screen = 0; screen < screencount; screen++) { - - /* we want the primary output first, and then skipped later. */ - if (looking_for_primary && (screen != default_screen)) { - continue; - } - - if (get_visualinfo(dpy, screen, &vinfo) < 0) { - continue; /* uh, skip this screen? */ - } - - pixelformat = X11_GetPixelFormatFromVisualInfo(dpy, &vinfo); - if (SDL_ISPIXELFORMAT_INDEXED(pixelformat)) { - continue; /* Palettized video modes are no longer supported */ - } - - scanline_pad = SDL_BYTESPERPIXEL(pixelformat) * 8; - pixmapformats = X11_XListPixmapFormats(dpy, &n); - if (pixmapformats) { - for (i = 0; i < n; ++i) { - if (pixmapformats[i].depth == vinfo.depth) { - scanline_pad = pixmapformats[i].scanline_pad; - break; - } - } - X11_XFree(pixmapformats); - } - - res = X11_XRRGetScreenResources(dpy, RootWindow(dpy, screen)); - if (!res) { - continue; - } - - for (output = 0; output < res->noutput; output++) { - XRROutputInfo *output_info; - int display_x, display_y; - unsigned long display_mm_width, display_mm_height; - SDL_DisplayData *displaydata; - char display_name[128]; - SDL_DisplayMode mode; - SDL_DisplayModeData *modedata; - SDL_VideoDisplay display; - RRMode modeID; - RRCrtc output_crtc; - XRRCrtcInfo *crtc; - - /* The primary output _should_ always be sorted first, but just in case... */ - if ((looking_for_primary && (res->outputs[output] != primary)) || - (!looking_for_primary && (screen == default_screen) && (res->outputs[output] == primary))) { - continue; - } - - output_info = X11_XRRGetOutputInfo(dpy, res, res->outputs[output]); - if (!output_info || !output_info->crtc || output_info->connection == RR_Disconnected) { - X11_XRRFreeOutputInfo(output_info); - continue; - } - - SDL_strlcpy(display_name, output_info->name, sizeof(display_name)); - display_mm_width = output_info->mm_width; - display_mm_height = output_info->mm_height; - output_crtc = output_info->crtc; - X11_XRRFreeOutputInfo(output_info); - - crtc = X11_XRRGetCrtcInfo(dpy, res, output_crtc); - if (!crtc) { - continue; - } - - SDL_zero(mode); - modeID = crtc->mode; - mode.w = crtc->width; - mode.h = crtc->height; - mode.format = pixelformat; - - display_x = crtc->x; - display_y = crtc->y; - - X11_XRRFreeCrtcInfo(crtc); - - displaydata = (SDL_DisplayData *) SDL_calloc(1, sizeof(*displaydata)); - if (!displaydata) { - return SDL_OutOfMemory(); - } - - modedata = (SDL_DisplayModeData *) SDL_calloc(1, sizeof(SDL_DisplayModeData)); - if (!modedata) { - SDL_free(displaydata); - return SDL_OutOfMemory(); - } - modedata->xrandr_mode = modeID; - mode.driverdata = modedata; - - displaydata->screen = screen; - displaydata->visual = vinfo.visual; - displaydata->depth = vinfo.depth; - displaydata->hdpi = ((float) mode.w) * 25.4f / display_mm_width; - displaydata->vdpi = ((float) mode.h) * 25.4f / display_mm_height; - displaydata->ddpi = SDL_ComputeDiagonalDPI(mode.w, mode.h, ((float) display_mm_width) / 25.4f,((float) display_mm_height) / 25.4f); - displaydata->scanline_pad = scanline_pad; - displaydata->x = display_x; - displaydata->y = display_y; - displaydata->use_xrandr = 1; - displaydata->xrandr_output = res->outputs[output]; - - SetXRandRModeInfo(dpy, res, output_crtc, modeID, &mode); - SetXRandRDisplayName(dpy, EDID, display_name, sizeof (display_name), res->outputs[output], display_mm_width, display_mm_height); - - SDL_zero(display); - if (*display_name) { - display.name = display_name; - } - display.desktop_mode = mode; - display.current_mode = mode; - display.driverdata = displaydata; - SDL_AddVideoDisplay(&display); - } - - X11_XRRFreeScreenResources(res); - } - } - - if (_this->num_displays == 0) { - return SDL_SetError("No available displays"); - } - - return 0; -} -#endif /* SDL_VIDEO_DRIVER_X11_XRANDR */ - -#if SDL_VIDEO_DRIVER_X11_XVIDMODE -static SDL_bool -CheckVidMode(Display * display, int *major, int *minor) -{ - /* Default the extension not available */ - *major = *minor = 0; - - /* Allow environment override */ - if (!SDL_GetHintBoolean(SDL_HINT_VIDEO_X11_XVIDMODE, SDL_TRUE)) { -#ifdef X11MODES_DEBUG - printf("XVidMode disabled due to hint\n"); -#endif - return SDL_FALSE; - } - - if (!SDL_X11_HAVE_XVIDMODE) { -#ifdef X11MODES_DEBUG - printf("XVidMode support not available\n"); -#endif - return SDL_FALSE; - } - - /* Query the extension version */ - vm_error = -1; - if (!X11_XF86VidModeQueryExtension(display, &vm_event, &vm_error) - || !X11_XF86VidModeQueryVersion(display, major, minor)) { -#ifdef X11MODES_DEBUG - printf("XVidMode not active on the display\n"); -#endif - return SDL_FALSE; - } -#ifdef X11MODES_DEBUG - printf("XVidMode available at version %d.%d!\n", *major, *minor); -#endif - return SDL_TRUE; -} - -static -Bool XF86VidModeGetModeInfo(Display * dpy, int scr, - XF86VidModeModeInfo* info) -{ - Bool retval; - int dotclock; - XF86VidModeModeLine l; - SDL_zerop(info); - SDL_zero(l); - retval = X11_XF86VidModeGetModeLine(dpy, scr, &dotclock, &l); - info->dotclock = dotclock; - info->hdisplay = l.hdisplay; - info->hsyncstart = l.hsyncstart; - info->hsyncend = l.hsyncend; - info->htotal = l.htotal; - info->hskew = l.hskew; - info->vdisplay = l.vdisplay; - info->vsyncstart = l.vsyncstart; - info->vsyncend = l.vsyncend; - info->vtotal = l.vtotal; - info->flags = l.flags; - info->privsize = l.privsize; - info->private = l.private; - return retval; -} - -static int -CalculateXVidModeRefreshRate(const XF86VidModeModeInfo * info) -{ - return (info->htotal - && info->vtotal) ? (1000 * info->dotclock / (info->htotal * - info->vtotal)) : 0; -} - -SDL_bool -SetXVidModeModeInfo(const XF86VidModeModeInfo *info, SDL_DisplayMode *mode) -{ - mode->w = info->hdisplay; - mode->h = info->vdisplay; - mode->refresh_rate = CalculateXVidModeRefreshRate(info); - ((SDL_DisplayModeData*)mode->driverdata)->vm_mode = *info; - return SDL_TRUE; -} -#endif /* SDL_VIDEO_DRIVER_X11_XVIDMODE */ - -int -X11_InitModes(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - int snum, screen, screencount; -#if SDL_VIDEO_DRIVER_X11_XINERAMA - int xinerama_major, xinerama_minor; - int use_xinerama = 0; - XineramaScreenInfo *xinerama = NULL; -#endif -#if SDL_VIDEO_DRIVER_X11_XRANDR - int xrandr_major, xrandr_minor; -#endif -#if SDL_VIDEO_DRIVER_X11_XVIDMODE - int vm_major, vm_minor; - int use_vidmode = 0; -#endif - -/* XRandR is the One True Modern Way to do this on X11. If it's enabled and - available, don't even look at other ways of doing things. */ -#if SDL_VIDEO_DRIVER_X11_XRANDR - /* require at least XRandR v1.3 */ - if (CheckXRandR(data->display, &xrandr_major, &xrandr_minor) && - (xrandr_major >= 2 || (xrandr_major == 1 && xrandr_minor >= 3))) { - return X11_InitModes_XRandR(_this); - } -#endif /* SDL_VIDEO_DRIVER_X11_XRANDR */ - -/* !!! FIXME: eventually remove support for Xinerama and XVidMode (everything below here). */ - - /* This is a workaround for some apps (UnrealEngine4, for example) until - we sort out the ramifications of removing XVidMode support outright. - This block should be removed with the XVidMode support. */ - { - if (SDL_GetHintBoolean("SDL_VIDEO_X11_REQUIRE_XRANDR", SDL_FALSE)) { - #if SDL_VIDEO_DRIVER_X11_XRANDR - return SDL_SetError("XRandR support is required but not available"); - #else - return SDL_SetError("XRandR support is required but not built into SDL!"); - #endif - } - } - -#if SDL_VIDEO_DRIVER_X11_XINERAMA - /* Query Xinerama extention - * NOTE: This works with Nvidia Twinview correctly, but you need version 302.17 (released on June 2012) - * or newer of the Nvidia binary drivers - */ - if (CheckXinerama(data->display, &xinerama_major, &xinerama_minor)) { - int (*handler) (Display *, XErrorEvent *); - X11_XSync(data->display, False); - handler = X11_XSetErrorHandler(X11_XineramaFailed); - xinerama = X11_XineramaQueryScreens(data->display, &screencount); - X11_XSync(data->display, False); - X11_XSetErrorHandler(handler); - if (xinerama_triggered_error) { - xinerama = 0; - } - if (xinerama) { - use_xinerama = xinerama_major * 100 + xinerama_minor; - } - } - if (!xinerama) { - screencount = ScreenCount(data->display); - } -#else - screencount = ScreenCount(data->display); -#endif /* SDL_VIDEO_DRIVER_X11_XINERAMA */ - -#if SDL_VIDEO_DRIVER_X11_XVIDMODE - if (CheckVidMode(data->display, &vm_major, &vm_minor)) { - use_vidmode = vm_major * 100 + vm_minor; - } -#endif /* SDL_VIDEO_DRIVER_X11_XVIDMODE */ - - for (snum = 0; snum < screencount; ++snum) { - XVisualInfo vinfo; - SDL_VideoDisplay display; - SDL_DisplayData *displaydata; - SDL_DisplayMode mode; - SDL_DisplayModeData *modedata; - XPixmapFormatValues *pixmapFormats; - char display_name[128]; - int i, n; - - /* Re-order screens to always put default screen first */ - if (snum == 0) { - screen = DefaultScreen(data->display); - } else if (snum == DefaultScreen(data->display)) { - screen = 0; - } else { - screen = snum; - } - -#if SDL_VIDEO_DRIVER_X11_XINERAMA - if (xinerama) { - if (get_visualinfo(data->display, 0, &vinfo) < 0) { - continue; - } - } else { - if (get_visualinfo(data->display, screen, &vinfo) < 0) { - continue; - } - } -#else - if (get_visualinfo(data->display, screen, &vinfo) < 0) { - continue; - } -#endif - - displaydata = (SDL_DisplayData *) SDL_calloc(1, sizeof(*displaydata)); - if (!displaydata) { - continue; - } - display_name[0] = '\0'; - - mode.format = X11_GetPixelFormatFromVisualInfo(data->display, &vinfo); - if (SDL_ISPIXELFORMAT_INDEXED(mode.format)) { - /* We don't support palettized modes now */ - SDL_free(displaydata); - continue; - } -#if SDL_VIDEO_DRIVER_X11_XINERAMA - if (xinerama) { - mode.w = xinerama[screen].width; - mode.h = xinerama[screen].height; - } else { - mode.w = DisplayWidth(data->display, screen); - mode.h = DisplayHeight(data->display, screen); - } -#else - mode.w = DisplayWidth(data->display, screen); - mode.h = DisplayHeight(data->display, screen); -#endif - mode.refresh_rate = 0; - - modedata = (SDL_DisplayModeData *) SDL_calloc(1, sizeof(SDL_DisplayModeData)); - if (!modedata) { - SDL_free(displaydata); - continue; - } - mode.driverdata = modedata; - -#if SDL_VIDEO_DRIVER_X11_XINERAMA - /* Most of SDL's calls to X11 are unwaware of Xinerama, and to X11 standard calls, when Xinerama is active, - * there's only one screen available. So we force the screen number to zero and - * let Xinerama specific code handle specific functionality using displaydata->xinerama_info - */ - if (use_xinerama) { - displaydata->screen = 0; - displaydata->use_xinerama = use_xinerama; - displaydata->xinerama_info = xinerama[screen]; - displaydata->xinerama_screen = screen; - } - else displaydata->screen = screen; -#else - displaydata->screen = screen; -#endif - displaydata->visual = vinfo.visual; - displaydata->depth = vinfo.depth; - - // We use the displaydata screen index here so that this works - // for both the Xinerama case, where we get the overall DPI, - // and the regular X11 screen info case. - displaydata->hdpi = (float)DisplayWidth(data->display, displaydata->screen) * 25.4f / - DisplayWidthMM(data->display, displaydata->screen); - displaydata->vdpi = (float)DisplayHeight(data->display, displaydata->screen) * 25.4f / - DisplayHeightMM(data->display, displaydata->screen); - displaydata->ddpi = SDL_ComputeDiagonalDPI(DisplayWidth(data->display, displaydata->screen), - DisplayHeight(data->display, displaydata->screen), - (float)DisplayWidthMM(data->display, displaydata->screen) / 25.4f, - (float)DisplayHeightMM(data->display, displaydata->screen) / 25.4f); - - displaydata->scanline_pad = SDL_BYTESPERPIXEL(mode.format) * 8; - pixmapFormats = X11_XListPixmapFormats(data->display, &n); - if (pixmapFormats) { - for (i = 0; i < n; ++i) { - if (pixmapFormats[i].depth == displaydata->depth) { - displaydata->scanline_pad = pixmapFormats[i].scanline_pad; - break; - } - } - X11_XFree(pixmapFormats); - } - -#if SDL_VIDEO_DRIVER_X11_XINERAMA - if (use_xinerama) { - displaydata->x = xinerama[screen].x_org; - displaydata->y = xinerama[screen].y_org; - } - else -#endif - { - displaydata->x = 0; - displaydata->y = 0; - } - -#if SDL_VIDEO_DRIVER_X11_XVIDMODE - if (!displaydata->use_xrandr && -#if SDL_VIDEO_DRIVER_X11_XINERAMA - /* XVidMode only works on the screen at the origin */ - (!displaydata->use_xinerama || - (displaydata->x == 0 && displaydata->y == 0)) && -#endif - use_vidmode) { - displaydata->use_vidmode = use_vidmode; - if (displaydata->use_xinerama) { - displaydata->vidmode_screen = 0; - } else { - displaydata->vidmode_screen = screen; - } - XF86VidModeGetModeInfo(data->display, displaydata->vidmode_screen, &modedata->vm_mode); - } -#endif /* SDL_VIDEO_DRIVER_X11_XVIDMODE */ - - SDL_zero(display); - if (*display_name) { - display.name = display_name; - } - display.desktop_mode = mode; - display.current_mode = mode; - display.driverdata = displaydata; - SDL_AddVideoDisplay(&display); - } - -#if SDL_VIDEO_DRIVER_X11_XINERAMA - if (xinerama) X11_XFree(xinerama); -#endif - - if (_this->num_displays == 0) { - return SDL_SetError("No available displays"); - } - return 0; -} - -void -X11_GetDisplayModes(_THIS, SDL_VideoDisplay * sdl_display) -{ - Display *display = ((SDL_VideoData *) _this->driverdata)->display; - SDL_DisplayData *data = (SDL_DisplayData *) sdl_display->driverdata; -#if SDL_VIDEO_DRIVER_X11_XVIDMODE - int nmodes; - XF86VidModeModeInfo ** modes; -#endif - int screen_w; - int screen_h; - SDL_DisplayMode mode; - - /* Unfortunately X11 requires the window to be created with the correct - * visual and depth ahead of time, but the SDL API allows you to create - * a window before setting the fullscreen display mode. This means that - * we have to use the same format for all windows and all display modes. - * (or support recreating the window with a new visual behind the scenes) - */ - mode.format = sdl_display->current_mode.format; - mode.driverdata = NULL; - - screen_w = DisplayWidth(display, data->screen); - screen_h = DisplayHeight(display, data->screen); - -#if SDL_VIDEO_DRIVER_X11_XINERAMA - if (data->use_xinerama) { - if (data->use_vidmode && !data->xinerama_info.x_org && !data->xinerama_info.y_org && - (screen_w > data->xinerama_info.width || screen_h > data->xinerama_info.height)) { - SDL_DisplayModeData *modedata; - /* Add the full (both screens combined) xinerama mode only on the display that starts at 0,0 - * if we're using vidmode. - */ - mode.w = screen_w; - mode.h = screen_h; - mode.refresh_rate = 0; - modedata = (SDL_DisplayModeData *) SDL_calloc(1, sizeof(SDL_DisplayModeData)); - if (modedata) { - *modedata = *(SDL_DisplayModeData *)sdl_display->desktop_mode.driverdata; - } - mode.driverdata = modedata; - if (!SDL_AddDisplayMode(sdl_display, &mode)) { - SDL_free(modedata); - } - } - else if (!data->use_xrandr) - { - SDL_DisplayModeData *modedata; - /* Add the current mode of each monitor otherwise if we can't get them from xrandr */ - mode.w = data->xinerama_info.width; - mode.h = data->xinerama_info.height; - mode.refresh_rate = 0; - modedata = (SDL_DisplayModeData *) SDL_calloc(1, sizeof(SDL_DisplayModeData)); - if (modedata) { - *modedata = *(SDL_DisplayModeData *)sdl_display->desktop_mode.driverdata; - } - mode.driverdata = modedata; - if (!SDL_AddDisplayMode(sdl_display, &mode)) { - SDL_free(modedata); - } - } - - } -#endif /* SDL_VIDEO_DRIVER_X11_XINERAMA */ - -#if SDL_VIDEO_DRIVER_X11_XRANDR - if (data->use_xrandr) { - XRRScreenResources *res; - - res = X11_XRRGetScreenResources (display, RootWindow(display, data->screen)); - if (res) { - SDL_DisplayModeData *modedata; - XRROutputInfo *output_info; - int i; - - output_info = X11_XRRGetOutputInfo(display, res, data->xrandr_output); - if (output_info && output_info->connection != RR_Disconnected) { - for (i = 0; i < output_info->nmode; ++i) { - modedata = (SDL_DisplayModeData *) SDL_calloc(1, sizeof(SDL_DisplayModeData)); - if (!modedata) { - continue; - } - mode.driverdata = modedata; - - if (!SetXRandRModeInfo(display, res, output_info->crtc, output_info->modes[i], &mode) || - !SDL_AddDisplayMode(sdl_display, &mode)) { - SDL_free(modedata); - } - } - } - X11_XRRFreeOutputInfo(output_info); - X11_XRRFreeScreenResources(res); - } - return; - } -#endif /* SDL_VIDEO_DRIVER_X11_XRANDR */ - -#if SDL_VIDEO_DRIVER_X11_XVIDMODE - if (data->use_vidmode && - X11_XF86VidModeGetAllModeLines(display, data->vidmode_screen, &nmodes, &modes)) { - int i; - SDL_DisplayModeData *modedata; - -#ifdef X11MODES_DEBUG - printf("VidMode modes: (unsorted)\n"); - for (i = 0; i < nmodes; ++i) { - printf("Mode %d: %d x %d @ %d, flags: 0x%x\n", i, - modes[i]->hdisplay, modes[i]->vdisplay, - CalculateXVidModeRefreshRate(modes[i]), modes[i]->flags); - } -#endif - for (i = 0; i < nmodes; ++i) { - modedata = (SDL_DisplayModeData *) SDL_calloc(1, sizeof(SDL_DisplayModeData)); - if (!modedata) { - continue; - } - mode.driverdata = modedata; - - if (!SetXVidModeModeInfo(modes[i], &mode) || !SDL_AddDisplayMode(sdl_display, &mode)) { - SDL_free(modedata); - } - } - X11_XFree(modes); - return; - } -#endif /* SDL_VIDEO_DRIVER_X11_XVIDMODE */ - - if (!data->use_xrandr && !data->use_vidmode) { - SDL_DisplayModeData *modedata; - /* Add the desktop mode */ - mode = sdl_display->desktop_mode; - modedata = (SDL_DisplayModeData *) SDL_calloc(1, sizeof(SDL_DisplayModeData)); - if (modedata) { - *modedata = *(SDL_DisplayModeData *)sdl_display->desktop_mode.driverdata; - } - mode.driverdata = modedata; - if (!SDL_AddDisplayMode(sdl_display, &mode)) { - SDL_free(modedata); - } - } -} - -int -X11_SetDisplayMode(_THIS, SDL_VideoDisplay * sdl_display, SDL_DisplayMode * mode) -{ - SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata; - Display *display = viddata->display; - SDL_DisplayData *data = (SDL_DisplayData *) sdl_display->driverdata; - SDL_DisplayModeData *modedata = (SDL_DisplayModeData *)mode->driverdata; - - viddata->last_mode_change_deadline = SDL_GetTicks() + (PENDING_FOCUS_TIME * 2); - -#if SDL_VIDEO_DRIVER_X11_XRANDR - if (data->use_xrandr) { - XRRScreenResources *res; - XRROutputInfo *output_info; - XRRCrtcInfo *crtc; - Status status; - - res = X11_XRRGetScreenResources (display, RootWindow(display, data->screen)); - if (!res) { - return SDL_SetError("Couldn't get XRandR screen resources"); - } - - output_info = X11_XRRGetOutputInfo(display, res, data->xrandr_output); - if (!output_info || output_info->connection == RR_Disconnected) { - X11_XRRFreeScreenResources(res); - return SDL_SetError("Couldn't get XRandR output info"); - } - - crtc = X11_XRRGetCrtcInfo(display, res, output_info->crtc); - if (!crtc) { - X11_XRRFreeOutputInfo(output_info); - X11_XRRFreeScreenResources(res); - return SDL_SetError("Couldn't get XRandR crtc info"); - } - - status = X11_XRRSetCrtcConfig (display, res, output_info->crtc, CurrentTime, - crtc->x, crtc->y, modedata->xrandr_mode, crtc->rotation, - &data->xrandr_output, 1); - - X11_XRRFreeCrtcInfo(crtc); - X11_XRRFreeOutputInfo(output_info); - X11_XRRFreeScreenResources(res); - - if (status != Success) { - return SDL_SetError("X11_XRRSetCrtcConfig failed"); - } - } -#endif /* SDL_VIDEO_DRIVER_X11_XRANDR */ - -#if SDL_VIDEO_DRIVER_X11_XVIDMODE - if (data->use_vidmode) { - X11_XF86VidModeSwitchToMode(display, data->vidmode_screen, &modedata->vm_mode); - } -#endif /* SDL_VIDEO_DRIVER_X11_XVIDMODE */ - - return 0; -} - -void -X11_QuitModes(_THIS) -{ -} - -int -X11_GetDisplayBounds(_THIS, SDL_VideoDisplay * sdl_display, SDL_Rect * rect) -{ - SDL_DisplayData *data = (SDL_DisplayData *) sdl_display->driverdata; - - rect->x = data->x; - rect->y = data->y; - rect->w = sdl_display->current_mode.w; - rect->h = sdl_display->current_mode.h; - -#if SDL_VIDEO_DRIVER_X11_XINERAMA - /* Get the real current bounds of the display */ - if (data->use_xinerama) { - Display *display = ((SDL_VideoData *) _this->driverdata)->display; - int screencount; - XineramaScreenInfo *xinerama = X11_XineramaQueryScreens(display, &screencount); - if (xinerama) { - rect->x = xinerama[data->xinerama_screen].x_org; - rect->y = xinerama[data->xinerama_screen].y_org; - X11_XFree(xinerama); - } - } -#endif /* SDL_VIDEO_DRIVER_X11_XINERAMA */ - return 0; -} - -int -X11_GetDisplayDPI(_THIS, SDL_VideoDisplay * sdl_display, float * ddpi, float * hdpi, float * vdpi) -{ - SDL_DisplayData *data = (SDL_DisplayData *) sdl_display->driverdata; - - if (ddpi) { - *ddpi = data->ddpi; - } - if (hdpi) { - *hdpi = data->hdpi; - } - if (vdpi) { - *vdpi = data->vdpi; - } - - return data->ddpi != 0.0f ? 0 : SDL_SetError("Couldn't get DPI"); -} - -int -X11_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * sdl_display, SDL_Rect * rect) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - Display *display = data->display; - Atom _NET_WORKAREA; - int status, real_format; - int retval = -1; - Atom real_type; - unsigned long items_read = 0, items_left = 0; - unsigned char *propdata = NULL; - - if (X11_GetDisplayBounds(_this, sdl_display, rect) < 0) { - return -1; - } - - _NET_WORKAREA = X11_XInternAtom(display, "_NET_WORKAREA", False); - status = X11_XGetWindowProperty(display, DefaultRootWindow(display), - _NET_WORKAREA, 0L, 4L, False, XA_CARDINAL, - &real_type, &real_format, &items_read, - &items_left, &propdata); - if ((status == Success) && (items_read >= 4)) { - const long *p = (long*) propdata; - const SDL_Rect usable = { (int)p[0], (int)p[1], (int)p[2], (int)p[3] }; - retval = 0; - if (!SDL_IntersectRect(rect, &usable, rect)) { - SDL_zerop(rect); - } - } - - if (propdata) { - X11_XFree(propdata); - } - - return retval; -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11modes.h b/3rdparty/SDL2/src/video/x11/SDL_x11modes.h deleted file mode 100644 index 4f47f3b5c91..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11modes.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11modes_h -#define _SDL_x11modes_h - -typedef struct -{ - int screen; - Visual *visual; - int depth; - int scanline_pad; - int x; - int y; - float ddpi; - float hdpi; - float vdpi; - - int use_xinerama; - int use_xrandr; - int use_vidmode; - -#if SDL_VIDEO_DRIVER_X11_XINERAMA - XineramaScreenInfo xinerama_info; - int xinerama_screen; -#endif - -#if SDL_VIDEO_DRIVER_X11_XRANDR - RROutput xrandr_output; -#endif - -#if SDL_VIDEO_DRIVER_X11_XVIDMODE - int vidmode_screen; -#endif - -} SDL_DisplayData; - -typedef struct -{ -#if SDL_VIDEO_DRIVER_X11_XRANDR - RRMode xrandr_mode; -#endif - -#if SDL_VIDEO_DRIVER_X11_XVIDMODE - XF86VidModeModeInfo vm_mode; -#endif - -} SDL_DisplayModeData; - -extern int X11_InitModes(_THIS); -extern void X11_GetDisplayModes(_THIS, SDL_VideoDisplay * display); -extern int X11_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode); -extern void X11_QuitModes(_THIS); - -/* Some utility functions for working with visuals */ -extern int X11_GetVisualInfoFromVisual(Display * display, Visual * visual, - XVisualInfo * vinfo); -extern Uint32 X11_GetPixelFormatFromVisualInfo(Display * display, - XVisualInfo * vinfo); -extern int X11_GetDisplayBounds(_THIS, SDL_VideoDisplay * sdl_display, SDL_Rect * rect); -extern int X11_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * sdl_display, SDL_Rect * rect); -extern int X11_GetDisplayDPI(_THIS, SDL_VideoDisplay * sdl_display, float * ddpi, float * hdpi, float * vdpi); - -#endif /* _SDL_x11modes_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11mouse.c b/3rdparty/SDL2/src/video/x11/SDL_x11mouse.c deleted file mode 100644 index e1a16c22524..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11mouse.c +++ /dev/null @@ -1,444 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include <X11/cursorfont.h> -#include "SDL_assert.h" -#include "SDL_x11video.h" -#include "SDL_x11mouse.h" -#include "SDL_x11xinput2.h" -#include "../../events/SDL_mouse_c.h" - - -/* FIXME: Find a better place to put this... */ -static Cursor x11_empty_cursor = None; - -static Display * -GetDisplay(void) -{ - return ((SDL_VideoData *)SDL_GetVideoDevice()->driverdata)->display; -} - -static Cursor -X11_CreateEmptyCursor() -{ - if (x11_empty_cursor == None) { - Display *display = GetDisplay(); - char data[1]; - XColor color; - Pixmap pixmap; - - SDL_zero(data); - color.red = color.green = color.blue = 0; - pixmap = X11_XCreateBitmapFromData(display, DefaultRootWindow(display), - data, 1, 1); - if (pixmap) { - x11_empty_cursor = X11_XCreatePixmapCursor(display, pixmap, pixmap, - &color, &color, 0, 0); - X11_XFreePixmap(display, pixmap); - } - } - return x11_empty_cursor; -} - -static void -X11_DestroyEmptyCursor(void) -{ - if (x11_empty_cursor != None) { - X11_XFreeCursor(GetDisplay(), x11_empty_cursor); - x11_empty_cursor = None; - } -} - -static SDL_Cursor * -X11_CreateDefaultCursor() -{ - SDL_Cursor *cursor; - - cursor = SDL_calloc(1, sizeof(*cursor)); - if (cursor) { - /* None is used to indicate the default cursor */ - cursor->driverdata = (void*)None; - } else { - SDL_OutOfMemory(); - } - - return cursor; -} - -#if SDL_VIDEO_DRIVER_X11_XCURSOR -static Cursor -X11_CreateXCursorCursor(SDL_Surface * surface, int hot_x, int hot_y) -{ - Display *display = GetDisplay(); - Cursor cursor = None; - XcursorImage *image; - - image = X11_XcursorImageCreate(surface->w, surface->h); - if (!image) { - SDL_OutOfMemory(); - return None; - } - image->xhot = hot_x; - image->yhot = hot_y; - image->delay = 0; - - SDL_assert(surface->format->format == SDL_PIXELFORMAT_ARGB8888); - SDL_assert(surface->pitch == surface->w * 4); - SDL_memcpy(image->pixels, surface->pixels, surface->h * surface->pitch); - - cursor = X11_XcursorImageLoadCursor(display, image); - - X11_XcursorImageDestroy(image); - - return cursor; -} -#endif /* SDL_VIDEO_DRIVER_X11_XCURSOR */ - -static Cursor -X11_CreatePixmapCursor(SDL_Surface * surface, int hot_x, int hot_y) -{ - Display *display = GetDisplay(); - XColor fg, bg; - Cursor cursor = None; - Uint32 *ptr; - Uint8 *data_bits, *mask_bits; - Pixmap data_pixmap, mask_pixmap; - int x, y; - unsigned int rfg, gfg, bfg, rbg, gbg, bbg, fgBits, bgBits; - unsigned int width_bytes = ((surface->w + 7) & ~7) / 8; - - data_bits = SDL_calloc(1, surface->h * width_bytes); - if (!data_bits) { - SDL_OutOfMemory(); - return None; - } - - mask_bits = SDL_calloc(1, surface->h * width_bytes); - if (!mask_bits) { - SDL_free(data_bits); - SDL_OutOfMemory(); - return None; - } - - /* Code below assumes ARGB pixel format */ - SDL_assert(surface->format->format == SDL_PIXELFORMAT_ARGB8888); - - rfg = gfg = bfg = rbg = gbg = bbg = fgBits = bgBits = 0; - for (y = 0; y < surface->h; ++y) { - ptr = (Uint32 *)((Uint8 *)surface->pixels + y * surface->pitch); - for (x = 0; x < surface->w; ++x) { - int alpha = (*ptr >> 24) & 0xff; - int red = (*ptr >> 16) & 0xff; - int green = (*ptr >> 8) & 0xff; - int blue = (*ptr >> 0) & 0xff; - if (alpha > 25) { - mask_bits[y * width_bytes + x / 8] |= (0x01 << (x % 8)); - - if ((red + green + blue) > 0x40) { - fgBits++; - rfg += red; - gfg += green; - bfg += blue; - data_bits[y * width_bytes + x / 8] |= (0x01 << (x % 8)); - } else { - bgBits++; - rbg += red; - gbg += green; - bbg += blue; - } - } - ++ptr; - } - } - - if (fgBits) { - fg.red = rfg * 257 / fgBits; - fg.green = gfg * 257 / fgBits; - fg.blue = bfg * 257 / fgBits; - } - else fg.red = fg.green = fg.blue = 0; - - if (bgBits) { - bg.red = rbg * 257 / bgBits; - bg.green = gbg * 257 / bgBits; - bg.blue = bbg * 257 / bgBits; - } - else bg.red = bg.green = bg.blue = 0; - - data_pixmap = X11_XCreateBitmapFromData(display, DefaultRootWindow(display), - (char*)data_bits, - surface->w, surface->h); - mask_pixmap = X11_XCreateBitmapFromData(display, DefaultRootWindow(display), - (char*)mask_bits, - surface->w, surface->h); - cursor = X11_XCreatePixmapCursor(display, data_pixmap, mask_pixmap, - &fg, &bg, hot_x, hot_y); - X11_XFreePixmap(display, data_pixmap); - X11_XFreePixmap(display, mask_pixmap); - - return cursor; -} - -static SDL_Cursor * -X11_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y) -{ - SDL_Cursor *cursor; - - cursor = SDL_calloc(1, sizeof(*cursor)); - if (cursor) { - Cursor x11_cursor = None; - -#if SDL_VIDEO_DRIVER_X11_XCURSOR - if (SDL_X11_HAVE_XCURSOR) { - x11_cursor = X11_CreateXCursorCursor(surface, hot_x, hot_y); - } -#endif - if (x11_cursor == None) { - x11_cursor = X11_CreatePixmapCursor(surface, hot_x, hot_y); - } - cursor->driverdata = (void*)x11_cursor; - } else { - SDL_OutOfMemory(); - } - - return cursor; -} - -static SDL_Cursor * -X11_CreateSystemCursor(SDL_SystemCursor id) -{ - SDL_Cursor *cursor; - unsigned int shape; - - switch(id) - { - default: - SDL_assert(0); - return NULL; - /* X Font Cursors reference: */ - /* http://tronche.com/gui/x/xlib/appendix/b/ */ - case SDL_SYSTEM_CURSOR_ARROW: shape = XC_left_ptr; break; - case SDL_SYSTEM_CURSOR_IBEAM: shape = XC_xterm; break; - case SDL_SYSTEM_CURSOR_WAIT: shape = XC_watch; break; - case SDL_SYSTEM_CURSOR_CROSSHAIR: shape = XC_tcross; break; - case SDL_SYSTEM_CURSOR_WAITARROW: shape = XC_watch; break; - case SDL_SYSTEM_CURSOR_SIZENWSE: shape = XC_fleur; break; - case SDL_SYSTEM_CURSOR_SIZENESW: shape = XC_fleur; break; - case SDL_SYSTEM_CURSOR_SIZEWE: shape = XC_sb_h_double_arrow; break; - case SDL_SYSTEM_CURSOR_SIZENS: shape = XC_sb_v_double_arrow; break; - case SDL_SYSTEM_CURSOR_SIZEALL: shape = XC_fleur; break; - case SDL_SYSTEM_CURSOR_NO: shape = XC_pirate; break; - case SDL_SYSTEM_CURSOR_HAND: shape = XC_hand2; break; - } - - cursor = SDL_calloc(1, sizeof(*cursor)); - if (cursor) { - Cursor x11_cursor; - - x11_cursor = X11_XCreateFontCursor(GetDisplay(), shape); - - cursor->driverdata = (void*)x11_cursor; - } else { - SDL_OutOfMemory(); - } - - return cursor; -} - -static void -X11_FreeCursor(SDL_Cursor * cursor) -{ - Cursor x11_cursor = (Cursor)cursor->driverdata; - - if (x11_cursor != None) { - X11_XFreeCursor(GetDisplay(), x11_cursor); - } - SDL_free(cursor); -} - -static int -X11_ShowCursor(SDL_Cursor * cursor) -{ - Cursor x11_cursor = 0; - - if (cursor) { - x11_cursor = (Cursor)cursor->driverdata; - } else { - x11_cursor = X11_CreateEmptyCursor(); - } - - /* FIXME: Is there a better way than this? */ - { - SDL_VideoDevice *video = SDL_GetVideoDevice(); - Display *display = GetDisplay(); - SDL_Window *window; - SDL_WindowData *data; - - for (window = video->windows; window; window = window->next) { - data = (SDL_WindowData *)window->driverdata; - if (x11_cursor != None) { - X11_XDefineCursor(display, data->xwindow, x11_cursor); - } else { - X11_XUndefineCursor(display, data->xwindow); - } - } - X11_XFlush(display); - } - return 0; -} - -static void -X11_WarpMouse(SDL_Window * window, int x, int y) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - - X11_XWarpPointer(display, None, data->xwindow, 0, 0, 0, 0, x, y); - X11_XSync(display, False); -} - -static int -X11_WarpMouseGlobal(int x, int y) -{ - Display *display = GetDisplay(); - - X11_XWarpPointer(display, None, DefaultRootWindow(display), 0, 0, 0, 0, x, y); - X11_XSync(display, False); - return 0; -} - -static int -X11_SetRelativeMouseMode(SDL_bool enabled) -{ -#if SDL_VIDEO_DRIVER_X11_XINPUT2 - if(X11_Xinput2IsInitialized()) - return 0; -#else - SDL_Unsupported(); -#endif - return -1; -} - -static int -X11_CaptureMouse(SDL_Window *window) -{ - Display *display = GetDisplay(); - - if (window) { - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - const unsigned int mask = ButtonPressMask | ButtonReleaseMask | PointerMotionMask | FocusChangeMask; - const int rc = X11_XGrabPointer(display, data->xwindow, False, - mask, GrabModeAsync, GrabModeAsync, - None, None, CurrentTime); - if (rc != GrabSuccess) { - return SDL_SetError("X server refused mouse capture"); - } - } else { - X11_XUngrabPointer(display, CurrentTime); - } - - X11_XSync(display, False); - - return 0; -} - -static Uint32 -X11_GetGlobalMouseState(int *x, int *y) -{ - SDL_VideoData *videodata = (SDL_VideoData *) SDL_GetVideoDevice()->driverdata; - Display *display = GetDisplay(); - const int num_screens = SDL_GetNumVideoDisplays(); - int i; - - /* !!! FIXME: should we XSync() here first? */ - -#if !SDL_VIDEO_DRIVER_X11_XINPUT2 - videodata->global_mouse_changed = SDL_TRUE; -#endif - - /* check if we have this cached since XInput last saw the mouse move. */ - /* !!! FIXME: can we just calculate this from XInput's events? */ - if (videodata->global_mouse_changed) { - for (i = 0; i < num_screens; i++) { - SDL_DisplayData *data = (SDL_DisplayData *) SDL_GetDisplayDriverData(i); - if (data != NULL) { - Window root, child; - int rootx, rooty, winx, winy; - unsigned int mask; - if (X11_XQueryPointer(display, RootWindow(display, data->screen), &root, &child, &rootx, &rooty, &winx, &winy, &mask)) { - XWindowAttributes root_attrs; - Uint32 buttons = 0; - buttons |= (mask & Button1Mask) ? SDL_BUTTON_LMASK : 0; - buttons |= (mask & Button2Mask) ? SDL_BUTTON_MMASK : 0; - buttons |= (mask & Button3Mask) ? SDL_BUTTON_RMASK : 0; - /* SDL_DisplayData->x,y point to screen origin, and adding them to mouse coordinates relative to root window doesn't do the right thing - * (observed on dual monitor setup with primary display being the rightmost one - mouse was offset to the right). - * - * Adding root position to root-relative coordinates seems to be a better way to get absolute position. */ - X11_XGetWindowAttributes(display, root, &root_attrs); - videodata->global_mouse_position.x = root_attrs.x + rootx; - videodata->global_mouse_position.y = root_attrs.y + rooty; - videodata->global_mouse_buttons = buttons; - videodata->global_mouse_changed = SDL_FALSE; - break; - } - } - } - } - - SDL_assert(!videodata->global_mouse_changed); /* The pointer wasn't on any X11 screen?! */ - - *x = videodata->global_mouse_position.x; - *y = videodata->global_mouse_position.y; - return videodata->global_mouse_buttons; -} - - -void -X11_InitMouse(_THIS) -{ - SDL_Mouse *mouse = SDL_GetMouse(); - - mouse->CreateCursor = X11_CreateCursor; - mouse->CreateSystemCursor = X11_CreateSystemCursor; - mouse->ShowCursor = X11_ShowCursor; - mouse->FreeCursor = X11_FreeCursor; - mouse->WarpMouse = X11_WarpMouse; - mouse->WarpMouseGlobal = X11_WarpMouseGlobal; - mouse->SetRelativeMouseMode = X11_SetRelativeMouseMode; - mouse->CaptureMouse = X11_CaptureMouse; - mouse->GetGlobalMouseState = X11_GetGlobalMouseState; - - SDL_SetDefaultCursor(X11_CreateDefaultCursor()); -} - -void -X11_QuitMouse(_THIS) -{ - X11_DestroyEmptyCursor(); -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11mouse.h b/3rdparty/SDL2/src/video/x11/SDL_x11mouse.h deleted file mode 100644 index d31d6b72202..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11mouse.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11mouse_h -#define _SDL_x11mouse_h - -extern void X11_InitMouse(_THIS); -extern void X11_QuitMouse(_THIS); - -#endif /* _SDL_x11mouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11opengl.c b/3rdparty/SDL2/src/video/x11/SDL_x11opengl.c deleted file mode 100644 index abc699dd47a..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11opengl.c +++ /dev/null @@ -1,820 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include "SDL_x11video.h" -#include "SDL_assert.h" - -/* GLX implementation of SDL OpenGL support */ - -#if SDL_VIDEO_OPENGL_GLX -#include "SDL_loadso.h" -#include "SDL_x11opengles.h" - -#if defined(__IRIX__) -/* IRIX doesn't have a GL library versioning system */ -#define DEFAULT_OPENGL "libGL.so" -#elif defined(__MACOSX__) -#define DEFAULT_OPENGL "/usr/X11R6/lib/libGL.1.dylib" -#elif defined(__QNXNTO__) -#define DEFAULT_OPENGL "libGL.so.3" -#else -#define DEFAULT_OPENGL "libGL.so.1" -#endif - -#ifndef GLX_NONE_EXT -#define GLX_NONE_EXT 0x8000 -#endif - -#ifndef GLX_ARB_multisample -#define GLX_ARB_multisample -#define GLX_SAMPLE_BUFFERS_ARB 100000 -#define GLX_SAMPLES_ARB 100001 -#endif - -#ifndef GLX_EXT_visual_rating -#define GLX_EXT_visual_rating -#define GLX_VISUAL_CAVEAT_EXT 0x20 -#define GLX_NONE_EXT 0x8000 -#define GLX_SLOW_VISUAL_EXT 0x8001 -#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D -#endif - -#ifndef GLX_EXT_visual_info -#define GLX_EXT_visual_info -#define GLX_X_VISUAL_TYPE_EXT 0x22 -#define GLX_DIRECT_COLOR_EXT 0x8003 -#endif - -#ifndef GLX_ARB_create_context -#define GLX_ARB_create_context -#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define GLX_CONTEXT_FLAGS_ARB 0x2094 -#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 - -/* Typedef for the GL 3.0 context creation function */ -typedef GLXContext(*PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display * dpy, - GLXFBConfig config, - GLXContext - share_context, - Bool direct, - const int - *attrib_list); -#endif - -#ifndef GLX_ARB_create_context_profile -#define GLX_ARB_create_context_profile -#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 -#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#endif - -#ifndef GLX_ARB_create_context_robustness -#define GLX_ARB_create_context_robustness -#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 -#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#endif - -#ifndef GLX_EXT_create_context_es2_profile -#define GLX_EXT_create_context_es2_profile -#ifndef GLX_CONTEXT_ES2_PROFILE_BIT_EXT -#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000002 -#endif -#endif - -#ifndef GLX_ARB_framebuffer_sRGB -#define GLX_ARB_framebuffer_sRGB -#ifndef GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 -#endif -#endif - -#ifndef GLX_EXT_swap_control -#define GLX_SWAP_INTERVAL_EXT 0x20F1 -#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 -#endif - -#ifndef GLX_EXT_swap_control_tear -#define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 -#endif - -#ifndef GLX_ARB_context_flush_control -#define GLX_ARB_context_flush_control -#define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 -#define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0x0000 -#define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 -#endif - -#define OPENGL_REQUIRES_DLOPEN -#if defined(OPENGL_REQUIRES_DLOPEN) && defined(SDL_LOADSO_DLOPEN) -#include <dlfcn.h> -#define GL_LoadObject(X) dlopen(X, (RTLD_NOW|RTLD_GLOBAL)) -#define GL_LoadFunction dlsym -#define GL_UnloadObject dlclose -#else -#define GL_LoadObject SDL_LoadObject -#define GL_LoadFunction SDL_LoadFunction -#define GL_UnloadObject SDL_UnloadObject -#endif - -static void X11_GL_InitExtensions(_THIS); - - -int -X11_GL_LoadLibrary(_THIS, const char *path) -{ - Display *display; - void *handle; - - if (_this->gl_data) { - return SDL_SetError("OpenGL context already created"); - } - - /* Load the OpenGL library */ - if (path == NULL) { - path = SDL_getenv("SDL_OPENGL_LIBRARY"); - } - if (path == NULL) { - path = DEFAULT_OPENGL; - } - _this->gl_config.dll_handle = GL_LoadObject(path); - if (!_this->gl_config.dll_handle) { -#if defined(OPENGL_REQUIRES_DLOPEN) && defined(SDL_LOADSO_DLOPEN) - SDL_SetError("Failed loading %s: %s", path, dlerror()); -#endif - return -1; - } - SDL_strlcpy(_this->gl_config.driver_path, path, - SDL_arraysize(_this->gl_config.driver_path)); - - /* Allocate OpenGL memory */ - _this->gl_data = - (struct SDL_GLDriverData *) SDL_calloc(1, - sizeof(struct - SDL_GLDriverData)); - if (!_this->gl_data) { - return SDL_OutOfMemory(); - } - - /* Load function pointers */ - handle = _this->gl_config.dll_handle; - _this->gl_data->glXQueryExtension = - (Bool (*)(Display *, int *, int *)) - GL_LoadFunction(handle, "glXQueryExtension"); - _this->gl_data->glXGetProcAddress = - (void *(*)(const GLubyte *)) - GL_LoadFunction(handle, "glXGetProcAddressARB"); - _this->gl_data->glXChooseVisual = - (XVisualInfo * (*)(Display *, int, int *)) - X11_GL_GetProcAddress(_this, "glXChooseVisual"); - _this->gl_data->glXCreateContext = - (GLXContext(*)(Display *, XVisualInfo *, GLXContext, int)) - X11_GL_GetProcAddress(_this, "glXCreateContext"); - _this->gl_data->glXDestroyContext = - (void (*)(Display *, GLXContext)) - X11_GL_GetProcAddress(_this, "glXDestroyContext"); - _this->gl_data->glXMakeCurrent = - (int (*)(Display *, GLXDrawable, GLXContext)) - X11_GL_GetProcAddress(_this, "glXMakeCurrent"); - _this->gl_data->glXSwapBuffers = - (void (*)(Display *, GLXDrawable)) - X11_GL_GetProcAddress(_this, "glXSwapBuffers"); - _this->gl_data->glXQueryDrawable = - (void (*)(Display*,GLXDrawable,int,unsigned int*)) - X11_GL_GetProcAddress(_this, "glXQueryDrawable"); - - if (!_this->gl_data->glXQueryExtension || - !_this->gl_data->glXChooseVisual || - !_this->gl_data->glXCreateContext || - !_this->gl_data->glXDestroyContext || - !_this->gl_data->glXMakeCurrent || - !_this->gl_data->glXSwapBuffers) { - return SDL_SetError("Could not retrieve OpenGL functions"); - } - - display = ((SDL_VideoData *) _this->driverdata)->display; - if (!_this->gl_data->glXQueryExtension(display, &_this->gl_data->errorBase, &_this->gl_data->eventBase)) { - return SDL_SetError("GLX is not supported"); - } - - /* Initialize extensions */ - X11_GL_InitExtensions(_this); - - /* If we need a GL ES context and there's no - * GLX_EXT_create_context_es2_profile extension, switch over to X11_GLES functions - */ - if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES && - ! _this->gl_data->HAS_GLX_EXT_create_context_es2_profile ) { -#if SDL_VIDEO_OPENGL_EGL - X11_GL_UnloadLibrary(_this); - /* Better avoid conflicts! */ - if (_this->gl_config.dll_handle != NULL ) { - GL_UnloadObject(_this->gl_config.dll_handle); - _this->gl_config.dll_handle = NULL; - } - _this->GL_LoadLibrary = X11_GLES_LoadLibrary; - _this->GL_GetProcAddress = X11_GLES_GetProcAddress; - _this->GL_UnloadLibrary = X11_GLES_UnloadLibrary; - _this->GL_CreateContext = X11_GLES_CreateContext; - _this->GL_MakeCurrent = X11_GLES_MakeCurrent; - _this->GL_SetSwapInterval = X11_GLES_SetSwapInterval; - _this->GL_GetSwapInterval = X11_GLES_GetSwapInterval; - _this->GL_SwapWindow = X11_GLES_SwapWindow; - _this->GL_DeleteContext = X11_GLES_DeleteContext; - return X11_GLES_LoadLibrary(_this, NULL); -#else - return SDL_SetError("SDL not configured with EGL support"); -#endif - } - - return 0; -} - -void * -X11_GL_GetProcAddress(_THIS, const char *proc) -{ - if (_this->gl_data->glXGetProcAddress) { - return _this->gl_data->glXGetProcAddress((const GLubyte *) proc); - } - return GL_LoadFunction(_this->gl_config.dll_handle, proc); -} - -void -X11_GL_UnloadLibrary(_THIS) -{ - /* Don't actually unload the library, since it may have registered - * X11 shutdown hooks, per the notes at: - * http://dri.sourceforge.net/doc/DRIuserguide.html - */ -#if 0 - GL_UnloadObject(_this->gl_config.dll_handle); - _this->gl_config.dll_handle = NULL; -#endif - - /* Free OpenGL memory */ - SDL_free(_this->gl_data); - _this->gl_data = NULL; -} - -static SDL_bool -HasExtension(const char *extension, const char *extensions) -{ - const char *start; - const char *where, *terminator; - - if (!extensions) - return SDL_FALSE; - - /* Extension names should not have spaces. */ - where = SDL_strchr(extension, ' '); - if (where || *extension == '\0') - return SDL_FALSE; - - /* It takes a bit of care to be fool-proof about parsing the - * OpenGL extensions string. Don't be fooled by sub-strings, - * etc. */ - - start = extensions; - - for (;;) { - where = SDL_strstr(start, extension); - if (!where) - break; - - terminator = where + SDL_strlen(extension); - if (where == start || *(where - 1) == ' ') - if (*terminator == ' ' || *terminator == '\0') - return SDL_TRUE; - - start = terminator; - } - return SDL_FALSE; -} - -static void -X11_GL_InitExtensions(_THIS) -{ - Display *display = ((SDL_VideoData *) _this->driverdata)->display; - const int screen = DefaultScreen(display); - const char *(*glXQueryExtensionsStringFunc) (Display *, int); - const char *extensions; - - glXQueryExtensionsStringFunc = - (const char *(*)(Display *, int)) X11_GL_GetProcAddress(_this, - "glXQueryExtensionsString"); - if (glXQueryExtensionsStringFunc) { - extensions = glXQueryExtensionsStringFunc(display, screen); - } else { - extensions = NULL; - } - - /* Check for GLX_EXT_swap_control(_tear) */ - _this->gl_data->HAS_GLX_EXT_swap_control_tear = SDL_FALSE; - if (HasExtension("GLX_EXT_swap_control", extensions)) { - _this->gl_data->glXSwapIntervalEXT = - (void (*)(Display*,GLXDrawable,int)) - X11_GL_GetProcAddress(_this, "glXSwapIntervalEXT"); - if (HasExtension("GLX_EXT_swap_control_tear", extensions)) { - _this->gl_data->HAS_GLX_EXT_swap_control_tear = SDL_TRUE; - } - } - - /* Check for GLX_MESA_swap_control */ - if (HasExtension("GLX_MESA_swap_control", extensions)) { - _this->gl_data->glXSwapIntervalMESA = - (int(*)(int)) X11_GL_GetProcAddress(_this, "glXSwapIntervalMESA"); - _this->gl_data->glXGetSwapIntervalMESA = - (int(*)(void)) X11_GL_GetProcAddress(_this, - "glXGetSwapIntervalMESA"); - } - - /* Check for GLX_SGI_swap_control */ - if (HasExtension("GLX_SGI_swap_control", extensions)) { - _this->gl_data->glXSwapIntervalSGI = - (int (*)(int)) X11_GL_GetProcAddress(_this, "glXSwapIntervalSGI"); - } - - /* Check for GLX_ARB_create_context */ - if (HasExtension("GLX_ARB_create_context", extensions)) { - _this->gl_data->glXCreateContextAttribsARB = - (GLXContext (*)(Display*,GLXFBConfig,GLXContext,Bool,const int *)) - X11_GL_GetProcAddress(_this, "glXCreateContextAttribsARB"); - _this->gl_data->glXChooseFBConfig = - (GLXFBConfig *(*)(Display *, int, const int *, int *)) - X11_GL_GetProcAddress(_this, "glXChooseFBConfig"); - } - - /* Check for GLX_EXT_visual_rating */ - if (HasExtension("GLX_EXT_visual_rating", extensions)) { - _this->gl_data->HAS_GLX_EXT_visual_rating = SDL_TRUE; - } - - /* Check for GLX_EXT_visual_info */ - if (HasExtension("GLX_EXT_visual_info", extensions)) { - _this->gl_data->HAS_GLX_EXT_visual_info = SDL_TRUE; - } - - /* Check for GLX_EXT_create_context_es2_profile */ - if (HasExtension("GLX_EXT_create_context_es2_profile", extensions)) { - _this->gl_data->HAS_GLX_EXT_create_context_es2_profile = SDL_TRUE; - } - - /* Check for GLX_ARB_context_flush_control */ - if (HasExtension("GLX_ARB_context_flush_control", extensions)) { - _this->gl_data->HAS_GLX_ARB_context_flush_control = SDL_TRUE; - } -} - -/* glXChooseVisual and glXChooseFBConfig have some small differences in - * the attribute encoding, it can be chosen with the for_FBConfig parameter. - */ -static int -X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int size, Bool for_FBConfig) -{ - int i = 0; - const int MAX_ATTRIBUTES = 64; - - /* assert buffer is large enough to hold all SDL attributes. */ - SDL_assert(size >= MAX_ATTRIBUTES); - - /* Setup our GLX attributes according to the gl_config. */ - if( for_FBConfig ) { - attribs[i++] = GLX_RENDER_TYPE; - attribs[i++] = GLX_RGBA_BIT; - } else { - attribs[i++] = GLX_RGBA; - } - attribs[i++] = GLX_RED_SIZE; - attribs[i++] = _this->gl_config.red_size; - attribs[i++] = GLX_GREEN_SIZE; - attribs[i++] = _this->gl_config.green_size; - attribs[i++] = GLX_BLUE_SIZE; - attribs[i++] = _this->gl_config.blue_size; - - if (_this->gl_config.alpha_size) { - attribs[i++] = GLX_ALPHA_SIZE; - attribs[i++] = _this->gl_config.alpha_size; - } - - if (_this->gl_config.double_buffer) { - attribs[i++] = GLX_DOUBLEBUFFER; - if( for_FBConfig ) { - attribs[i++] = True; - } - } - - attribs[i++] = GLX_DEPTH_SIZE; - attribs[i++] = _this->gl_config.depth_size; - - if (_this->gl_config.stencil_size) { - attribs[i++] = GLX_STENCIL_SIZE; - attribs[i++] = _this->gl_config.stencil_size; - } - - if (_this->gl_config.accum_red_size) { - attribs[i++] = GLX_ACCUM_RED_SIZE; - attribs[i++] = _this->gl_config.accum_red_size; - } - - if (_this->gl_config.accum_green_size) { - attribs[i++] = GLX_ACCUM_GREEN_SIZE; - attribs[i++] = _this->gl_config.accum_green_size; - } - - if (_this->gl_config.accum_blue_size) { - attribs[i++] = GLX_ACCUM_BLUE_SIZE; - attribs[i++] = _this->gl_config.accum_blue_size; - } - - if (_this->gl_config.accum_alpha_size) { - attribs[i++] = GLX_ACCUM_ALPHA_SIZE; - attribs[i++] = _this->gl_config.accum_alpha_size; - } - - if (_this->gl_config.stereo) { - attribs[i++] = GLX_STEREO; - if( for_FBConfig ) { - attribs[i++] = True; - } - } - - if (_this->gl_config.multisamplebuffers) { - attribs[i++] = GLX_SAMPLE_BUFFERS_ARB; - attribs[i++] = _this->gl_config.multisamplebuffers; - } - - if (_this->gl_config.multisamplesamples) { - attribs[i++] = GLX_SAMPLES_ARB; - attribs[i++] = _this->gl_config.multisamplesamples; - } - - if (_this->gl_config.framebuffer_srgb_capable) { - attribs[i++] = GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB; - attribs[i++] = True; /* always needed, for_FBConfig or not! */ - } - - if (_this->gl_config.accelerated >= 0 && - _this->gl_data->HAS_GLX_EXT_visual_rating) { - attribs[i++] = GLX_VISUAL_CAVEAT_EXT; - attribs[i++] = _this->gl_config.accelerated ? GLX_NONE_EXT : - GLX_SLOW_VISUAL_EXT; - } - - /* If we're supposed to use DirectColor visuals, and we've got the - EXT_visual_info extension, then add GLX_X_VISUAL_TYPE_EXT. */ - if (X11_UseDirectColorVisuals() && - _this->gl_data->HAS_GLX_EXT_visual_info) { - attribs[i++] = GLX_X_VISUAL_TYPE_EXT; - attribs[i++] = GLX_DIRECT_COLOR_EXT; - } - - attribs[i++] = None; - - SDL_assert(i <= MAX_ATTRIBUTES); - - return i; -} - -XVisualInfo * -X11_GL_GetVisual(_THIS, Display * display, int screen) -{ - /* 64 seems nice. */ - int attribs[64]; - XVisualInfo *vinfo; - - if (!_this->gl_data) { - /* The OpenGL library wasn't loaded, SDL_GetError() should have info */ - return NULL; - } - - X11_GL_GetAttributes(_this, display, screen, attribs, 64, SDL_FALSE); - vinfo = _this->gl_data->glXChooseVisual(display, screen, attribs); - if (!vinfo) { - SDL_SetError("Couldn't find matching GLX visual"); - } - return vinfo; -} - -#ifndef GLXBadContext -#define GLXBadContext 0 -#endif -#ifndef GLXBadFBConfig -#define GLXBadFBConfig 9 -#endif -#ifndef GLXBadProfileARB -#define GLXBadProfileARB 13 -#endif -static int (*handler) (Display *, XErrorEvent *) = NULL; -static const char *errorHandlerOperation = NULL; -static int errorBase = 0; -static int errorCode = 0; -static int -X11_GL_ErrorHandler(Display * d, XErrorEvent * e) -{ - char *x11_error = NULL; - char x11_error_locale[256]; - - errorCode = e->error_code; - if (X11_XGetErrorText(d, errorCode, x11_error_locale, sizeof(x11_error_locale)) == Success) - { - x11_error = SDL_iconv_string("UTF-8", "", x11_error_locale, SDL_strlen(x11_error_locale)+1); - } - - if (x11_error) - { - SDL_SetError("Could not %s: %s", errorHandlerOperation, x11_error); - SDL_free(x11_error); - } - else - { - SDL_SetError("Could not %s: %i (Base %i)\n", errorHandlerOperation, errorCode, errorBase); - } - - return (0); -} - -SDL_GLContext -X11_GL_CreateContext(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - int screen = - ((SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata)->screen; - XWindowAttributes xattr; - XVisualInfo v, *vinfo; - int n; - GLXContext context = NULL, share_context; - - if (_this->gl_config.share_with_current_context) { - share_context = (GLXContext)SDL_GL_GetCurrentContext(); - } else { - share_context = NULL; - } - - /* We do this to create a clean separation between X and GLX errors. */ - X11_XSync(display, False); - errorHandlerOperation = "create GL context"; - errorBase = _this->gl_data->errorBase; - errorCode = Success; - handler = X11_XSetErrorHandler(X11_GL_ErrorHandler); - X11_XGetWindowAttributes(display, data->xwindow, &xattr); - v.screen = screen; - v.visualid = X11_XVisualIDFromVisual(xattr.visual); - vinfo = X11_XGetVisualInfo(display, VisualScreenMask | VisualIDMask, &v, &n); - if (vinfo) { - if (_this->gl_config.major_version < 3 && - _this->gl_config.profile_mask == 0 && - _this->gl_config.flags == 0) { - /* Create legacy context */ - context = - _this->gl_data->glXCreateContext(display, vinfo, share_context, True); - } else { - /* max 10 attributes plus terminator */ - int attribs[11] = { - GLX_CONTEXT_MAJOR_VERSION_ARB, - _this->gl_config.major_version, - GLX_CONTEXT_MINOR_VERSION_ARB, - _this->gl_config.minor_version, - 0 - }; - int iattr = 4; - - /* SDL profile bits match GLX profile bits */ - if( _this->gl_config.profile_mask != 0 ) { - attribs[iattr++] = GLX_CONTEXT_PROFILE_MASK_ARB; - attribs[iattr++] = _this->gl_config.profile_mask; - } - - /* SDL flags match GLX flags */ - if( _this->gl_config.flags != 0 ) { - attribs[iattr++] = GLX_CONTEXT_FLAGS_ARB; - attribs[iattr++] = _this->gl_config.flags; - } - - /* only set if glx extension is available */ - if( _this->gl_data->HAS_GLX_ARB_context_flush_control ) { - attribs[iattr++] = GLX_CONTEXT_RELEASE_BEHAVIOR_ARB; - attribs[iattr++] = - _this->gl_config.release_behavior ? - GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB : - GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB; - } - - attribs[iattr++] = 0; - - /* Get a pointer to the context creation function for GL 3.0 */ - if (!_this->gl_data->glXCreateContextAttribsARB) { - SDL_SetError("OpenGL 3.0 and later are not supported by this system"); - } else { - int glxAttribs[64]; - - /* Create a GL 3.x context */ - GLXFBConfig *framebuffer_config = NULL; - int fbcount = 0; - - X11_GL_GetAttributes(_this,display,screen,glxAttribs,64,SDL_TRUE); - - if (!_this->gl_data->glXChooseFBConfig - || !(framebuffer_config = - _this->gl_data->glXChooseFBConfig(display, - DefaultScreen(display), glxAttribs, - &fbcount))) { - SDL_SetError("No good framebuffers found. OpenGL 3.0 and later unavailable"); - } else { - context = _this->gl_data->glXCreateContextAttribsARB(display, - framebuffer_config[0], - share_context, True, attribs); - } - } - } - X11_XFree(vinfo); - } - X11_XSync(display, False); - X11_XSetErrorHandler(handler); - - if (!context) { - if (errorCode == Success) { - SDL_SetError("Could not create GL context"); - } - return NULL; - } - - if (X11_GL_MakeCurrent(_this, window, context) < 0) { - X11_GL_DeleteContext(_this, context); - return NULL; - } - - return context; -} - -int -X11_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) -{ - Display *display = ((SDL_VideoData *) _this->driverdata)->display; - Window drawable = - (context ? ((SDL_WindowData *) window->driverdata)->xwindow : None); - GLXContext glx_context = (GLXContext) context; - int rc; - - if (!_this->gl_data) { - return SDL_SetError("OpenGL not initialized"); - } - - /* We do this to create a clean separation between X and GLX errors. */ - X11_XSync(display, False); - errorHandlerOperation = "make GL context current"; - errorBase = _this->gl_data->errorBase; - errorCode = Success; - handler = X11_XSetErrorHandler(X11_GL_ErrorHandler); - rc = _this->gl_data->glXMakeCurrent(display, drawable, glx_context); - X11_XSetErrorHandler(handler); - - if (errorCode != Success) { /* uhoh, an X error was thrown! */ - return -1; /* the error handler called SDL_SetError() already. */ - } else if (!rc) { /* glXMakeCurrent() failed without throwing an X error */ - return SDL_SetError("Unable to make GL context current"); - } - - return 0; -} - -/* - 0 is a valid argument to glXSwapInterval(MESA|EXT) and setting it to 0 - will undo the effect of a previous call with a value that is greater - than zero (or at least that is what the docs say). OTOH, 0 is an invalid - argument to glXSwapIntervalSGI and it returns an error if you call it - with 0 as an argument. -*/ - -static int swapinterval = 0; -int -X11_GL_SetSwapInterval(_THIS, int interval) -{ - int status = -1; - - if ((interval < 0) && (!_this->gl_data->HAS_GLX_EXT_swap_control_tear)) { - SDL_SetError("Negative swap interval unsupported in this GL"); - } else if (_this->gl_data->glXSwapIntervalEXT) { - Display *display = ((SDL_VideoData *) _this->driverdata)->display; - const SDL_WindowData *windowdata = (SDL_WindowData *) - SDL_GL_GetCurrentWindow()->driverdata; - - Window drawable = windowdata->xwindow; - - /* - * This is a workaround for a bug in NVIDIA drivers. Bug has been reported - * and will be fixed in a future release (probably 319.xx). - * - * There's a bug where glXSetSwapIntervalEXT ignores updates because - * it has the wrong value cached. To work around it, we just run a no-op - * update to the current value. - */ - int currentInterval = X11_GL_GetSwapInterval(_this); - _this->gl_data->glXSwapIntervalEXT(display, drawable, currentInterval); - _this->gl_data->glXSwapIntervalEXT(display, drawable, interval); - - status = 0; - swapinterval = interval; - } else if (_this->gl_data->glXSwapIntervalMESA) { - status = _this->gl_data->glXSwapIntervalMESA(interval); - if (status != 0) { - SDL_SetError("glXSwapIntervalMESA failed"); - } else { - swapinterval = interval; - } - } else if (_this->gl_data->glXSwapIntervalSGI) { - status = _this->gl_data->glXSwapIntervalSGI(interval); - if (status != 0) { - SDL_SetError("glXSwapIntervalSGI failed"); - } else { - swapinterval = interval; - } - } else { - SDL_Unsupported(); - } - return status; -} - -int -X11_GL_GetSwapInterval(_THIS) -{ - if (_this->gl_data->glXSwapIntervalEXT) { - Display *display = ((SDL_VideoData *) _this->driverdata)->display; - const SDL_WindowData *windowdata = (SDL_WindowData *) - SDL_GL_GetCurrentWindow()->driverdata; - Window drawable = windowdata->xwindow; - unsigned int allow_late_swap_tearing = 0; - unsigned int interval = 0; - - if (_this->gl_data->HAS_GLX_EXT_swap_control_tear) { - _this->gl_data->glXQueryDrawable(display, drawable, - GLX_LATE_SWAPS_TEAR_EXT, - &allow_late_swap_tearing); - } - - _this->gl_data->glXQueryDrawable(display, drawable, - GLX_SWAP_INTERVAL_EXT, &interval); - - if ((allow_late_swap_tearing) && (interval > 0)) { - return -((int) interval); - } - - return (int) interval; - } else if (_this->gl_data->glXGetSwapIntervalMESA) { - return _this->gl_data->glXGetSwapIntervalMESA(); - } else { - return swapinterval; - } -} - -void -X11_GL_SwapWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - - _this->gl_data->glXSwapBuffers(display, data->xwindow); -} - -void -X11_GL_DeleteContext(_THIS, SDL_GLContext context) -{ - Display *display = ((SDL_VideoData *) _this->driverdata)->display; - GLXContext glx_context = (GLXContext) context; - - if (!_this->gl_data) { - return; - } - _this->gl_data->glXDestroyContext(display, glx_context); - X11_XSync(display, False); -} - -#endif /* SDL_VIDEO_OPENGL_GLX */ - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11opengl.h b/3rdparty/SDL2/src/video/x11/SDL_x11opengl.h deleted file mode 100644 index 86e77d7da13..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11opengl.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11opengl_h -#define _SDL_x11opengl_h - -#if SDL_VIDEO_OPENGL_GLX -#include "SDL_opengl.h" -#include <GL/glx.h> - -struct SDL_GLDriverData -{ - int errorBase, eventBase; - - SDL_bool HAS_GLX_EXT_visual_rating; - SDL_bool HAS_GLX_EXT_visual_info; - SDL_bool HAS_GLX_EXT_swap_control_tear; - SDL_bool HAS_GLX_EXT_create_context_es2_profile; - SDL_bool HAS_GLX_ARB_context_flush_control; - - Bool (*glXQueryExtension) (Display*,int*,int*); - void *(*glXGetProcAddress) (const GLubyte*); - XVisualInfo *(*glXChooseVisual) (Display*,int,int*); - GLXContext (*glXCreateContext) (Display*,XVisualInfo*,GLXContext,Bool); - GLXContext (*glXCreateContextAttribsARB) (Display*,GLXFBConfig,GLXContext,Bool,const int *); - GLXFBConfig *(*glXChooseFBConfig) (Display*,int,const int *,int *); - void (*glXDestroyContext) (Display*, GLXContext); - Bool(*glXMakeCurrent) (Display*,GLXDrawable,GLXContext); - void (*glXSwapBuffers) (Display*, GLXDrawable); - void (*glXQueryDrawable) (Display*,GLXDrawable,int,unsigned int*); - void (*glXSwapIntervalEXT) (Display*,GLXDrawable,int); - int (*glXSwapIntervalSGI) (int); - int (*glXSwapIntervalMESA) (int); - int (*glXGetSwapIntervalMESA) (void); -}; - -/* OpenGL functions */ -extern int X11_GL_LoadLibrary(_THIS, const char *path); -extern void *X11_GL_GetProcAddress(_THIS, const char *proc); -extern void X11_GL_UnloadLibrary(_THIS); -extern XVisualInfo *X11_GL_GetVisual(_THIS, Display * display, int screen); -extern SDL_GLContext X11_GL_CreateContext(_THIS, SDL_Window * window); -extern int X11_GL_MakeCurrent(_THIS, SDL_Window * window, - SDL_GLContext context); -extern int X11_GL_SetSwapInterval(_THIS, int interval); -extern int X11_GL_GetSwapInterval(_THIS); -extern void X11_GL_SwapWindow(_THIS, SDL_Window * window); -extern void X11_GL_DeleteContext(_THIS, SDL_GLContext context); - -#endif /* SDL_VIDEO_OPENGL_GLX */ - -#endif /* _SDL_x11opengl_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11opengles.c b/3rdparty/SDL2/src/video/x11/SDL_x11opengles.c deleted file mode 100644 index 53117220080..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11opengles.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 && SDL_VIDEO_OPENGL_EGL - -#include "SDL_x11video.h" -#include "SDL_x11opengles.h" -#include "SDL_x11opengl.h" - -/* EGL implementation of SDL OpenGL support */ - -int -X11_GLES_LoadLibrary(_THIS, const char *path) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - /* If the profile requested is not GL ES, switch over to X11_GL functions */ - if (_this->gl_config.profile_mask != SDL_GL_CONTEXT_PROFILE_ES) { - #if SDL_VIDEO_OPENGL_GLX - X11_GLES_UnloadLibrary(_this); - _this->GL_LoadLibrary = X11_GL_LoadLibrary; - _this->GL_GetProcAddress = X11_GL_GetProcAddress; - _this->GL_UnloadLibrary = X11_GL_UnloadLibrary; - _this->GL_CreateContext = X11_GL_CreateContext; - _this->GL_MakeCurrent = X11_GL_MakeCurrent; - _this->GL_SetSwapInterval = X11_GL_SetSwapInterval; - _this->GL_GetSwapInterval = X11_GL_GetSwapInterval; - _this->GL_SwapWindow = X11_GL_SwapWindow; - _this->GL_DeleteContext = X11_GL_DeleteContext; - return X11_GL_LoadLibrary(_this, path); - #else - return SDL_SetError("SDL not configured with OpenGL/GLX support"); - #endif - } - - return SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) data->display); -} - -XVisualInfo * -X11_GLES_GetVisual(_THIS, Display * display, int screen) -{ - - XVisualInfo *egl_visualinfo = NULL; - EGLint visual_id; - XVisualInfo vi_in; - int out_count; - - if (!_this->egl_data) { - /* The EGL library wasn't loaded, SDL_GetError() should have info */ - return NULL; - } - - if (_this->egl_data->eglGetConfigAttrib(_this->egl_data->egl_display, - _this->egl_data->egl_config, - EGL_NATIVE_VISUAL_ID, - &visual_id) == EGL_FALSE || !visual_id) { - /* Use the default visual when all else fails */ - vi_in.screen = screen; - egl_visualinfo = X11_XGetVisualInfo(display, - VisualScreenMask, - &vi_in, &out_count); - } else { - vi_in.screen = screen; - vi_in.visualid = visual_id; - egl_visualinfo = X11_XGetVisualInfo(display, VisualScreenMask | VisualIDMask, &vi_in, &out_count); - } - - return egl_visualinfo; -} - -SDL_GLContext -X11_GLES_CreateContext(_THIS, SDL_Window * window) -{ - SDL_GLContext context; - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - - X11_XSync(display, False); - context = SDL_EGL_CreateContext(_this, data->egl_surface); - X11_XSync(display, False); - - return context; -} - -SDL_EGL_SwapWindow_impl(X11) -SDL_EGL_MakeCurrent_impl(X11) - -#endif /* SDL_VIDEO_DRIVER_X11 && SDL_VIDEO_OPENGL_EGL */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11opengles.h b/3rdparty/SDL2/src/video/x11/SDL_x11opengles.h deleted file mode 100644 index 716e6e68825..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11opengles.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11opengles_h -#define _SDL_x11opengles_h - -#if SDL_VIDEO_OPENGL_EGL - -#include "../SDL_sysvideo.h" -#include "../SDL_egl_c.h" - -typedef struct SDL_PrivateGLESData -{ -} SDL_PrivateGLESData; - -/* OpenGLES functions */ -#define X11_GLES_GetAttribute SDL_EGL_GetAttribute -#define X11_GLES_GetProcAddress SDL_EGL_GetProcAddress -#define X11_GLES_UnloadLibrary SDL_EGL_UnloadLibrary -#define X11_GLES_SetSwapInterval SDL_EGL_SetSwapInterval -#define X11_GLES_GetSwapInterval SDL_EGL_GetSwapInterval -#define X11_GLES_DeleteContext SDL_EGL_DeleteContext - -extern int X11_GLES_LoadLibrary(_THIS, const char *path); -extern XVisualInfo *X11_GLES_GetVisual(_THIS, Display * display, int screen); -extern SDL_GLContext X11_GLES_CreateContext(_THIS, SDL_Window * window); -extern void X11_GLES_SwapWindow(_THIS, SDL_Window * window); -extern int X11_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); - -#endif /* SDL_VIDEO_OPENGL_EGL */ - -#endif /* _SDL_x11opengles_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11shape.c b/3rdparty/SDL2/src/video/x11/SDL_x11shape.c deleted file mode 100644 index 4f78ae89973..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11shape.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include "SDL_assert.h" -#include "SDL_x11video.h" -#include "SDL_x11shape.h" -#include "SDL_x11window.h" -#include "../SDL_shape_internals.h" - -SDL_Window* -X11_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags) { - return SDL_CreateWindow(title,x,y,w,h,flags); -} - -SDL_WindowShaper* -X11_CreateShaper(SDL_Window* window) { - SDL_WindowShaper* result = NULL; - SDL_ShapeData* data = NULL; - int resized_properly; - -#if SDL_VIDEO_DRIVER_X11_XSHAPE - if (SDL_X11_HAVE_XSHAPE) { /* Make sure X server supports it. */ - result = malloc(sizeof(SDL_WindowShaper)); - result->window = window; - result->mode.mode = ShapeModeDefault; - result->mode.parameters.binarizationCutoff = 1; - result->userx = result->usery = 0; - data = SDL_malloc(sizeof(SDL_ShapeData)); - result->driverdata = data; - data->bitmapsize = 0; - data->bitmap = NULL; - window->shaper = result; - resized_properly = X11_ResizeWindowShape(window); - SDL_assert(resized_properly == 0); - } -#endif - - return result; -} - -int -X11_ResizeWindowShape(SDL_Window* window) { - SDL_ShapeData* data = window->shaper->driverdata; - unsigned int bitmapsize = window->w / 8; - SDL_assert(data != NULL); - - if(window->w % 8 > 0) - bitmapsize += 1; - bitmapsize *= window->h; - if(data->bitmapsize != bitmapsize || data->bitmap == NULL) { - data->bitmapsize = bitmapsize; - if(data->bitmap != NULL) - free(data->bitmap); - data->bitmap = malloc(data->bitmapsize); - if(data->bitmap == NULL) { - return SDL_SetError("Could not allocate memory for shaped-window bitmap."); - } - } - memset(data->bitmap,0,data->bitmapsize); - - window->shaper->userx = window->x; - window->shaper->usery = window->y; - SDL_SetWindowPosition(window,-1000,-1000); - - return 0; -} - -int -X11_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode) { - SDL_ShapeData *data = NULL; - SDL_WindowData *windowdata = NULL; - Pixmap shapemask; - - if(shaper == NULL || shape == NULL || shaper->driverdata == NULL) - return -1; - -#if SDL_VIDEO_DRIVER_X11_XSHAPE - if(shape->format->Amask == 0 && SDL_SHAPEMODEALPHA(shape_mode->mode)) - return -2; - if(shape->w != shaper->window->w || shape->h != shaper->window->h) - return -3; - data = shaper->driverdata; - - /* Assume that shaper->alphacutoff already has a value, because SDL_SetWindowShape() should have given it one. */ - SDL_CalculateShapeBitmap(shaper->mode,shape,data->bitmap,8); - - windowdata = (SDL_WindowData*)(shaper->window->driverdata); - shapemask = X11_XCreateBitmapFromData(windowdata->videodata->display,windowdata->xwindow,data->bitmap,shaper->window->w,shaper->window->h); - - X11_XShapeCombineMask(windowdata->videodata->display,windowdata->xwindow, ShapeBounding, 0, 0,shapemask, ShapeSet); - X11_XSync(windowdata->videodata->display,False); - - X11_XFreePixmap(windowdata->videodata->display,shapemask); -#endif - - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11shape.h b/3rdparty/SDL2/src/video/x11/SDL_x11shape.h deleted file mode 100644 index cd88ab70f5b..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11shape.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11shape_h -#define _SDL_x11shape_h - -#include "SDL_video.h" -#include "SDL_shape.h" -#include "../SDL_sysvideo.h" - -typedef struct { - void* bitmap; - Uint32 bitmapsize; -} SDL_ShapeData; - -extern SDL_Window* X11_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags); -extern SDL_WindowShaper* X11_CreateShaper(SDL_Window* window); -extern int X11_ResizeWindowShape(SDL_Window* window); -extern int X11_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shapeMode); - -#endif /* _SDL_x11shape_h */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11sym.h b/3rdparty/SDL2/src/video/x11/SDL_x11sym.h deleted file mode 100644 index 7290412b719..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11sym.h +++ /dev/null @@ -1,334 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* *INDENT-OFF* */ - -#ifndef SDL_X11_MODULE -#define SDL_X11_MODULE(modname) -#endif - -#ifndef SDL_X11_SYM -#define SDL_X11_SYM(rc,fn,params,args,ret) -#endif - -SDL_X11_MODULE(BASEXLIB) -SDL_X11_SYM(XSizeHints*,XAllocSizeHints,(void),(),return) -SDL_X11_SYM(XWMHints*,XAllocWMHints,(void),(),return) -SDL_X11_SYM(XClassHint*,XAllocClassHint,(void),(),return) -SDL_X11_SYM(int,XAutoRepeatOn,(Display* a),(a),return) -SDL_X11_SYM(int,XAutoRepeatOff,(Display* a),(a),return) -SDL_X11_SYM(int,XChangePointerControl,(Display* a,Bool b,Bool c,int d,int e,int f),(a,b,c,d,e,f),return) -SDL_X11_SYM(int,XChangeProperty,(Display* a,Window b,Atom c,Atom d,int e,int f,_Xconst unsigned char* g,int h),(a,b,c,d,e,f,g,h),return) -SDL_X11_SYM(Bool,XCheckIfEvent,(Display* a,XEvent *b,Bool (*c)(Display*,XEvent*,XPointer),XPointer d),(a,b,c,d),return) -SDL_X11_SYM(int,XClearWindow,(Display* a,Window b),(a,b),return) -SDL_X11_SYM(int,XCloseDisplay,(Display* a),(a),return) -SDL_X11_SYM(int,XConvertSelection,(Display* a,Atom b,Atom c,Atom d,Window e,Time f),(a,b,c,d,e,f),return) -SDL_X11_SYM(Pixmap,XCreateBitmapFromData,(Display *dpy,Drawable d,_Xconst char *data,unsigned int width,unsigned int height),(dpy,d,data,width,height),return) -SDL_X11_SYM(Colormap,XCreateColormap,(Display* a,Window b,Visual* c,int d),(a,b,c,d),return) -SDL_X11_SYM(Cursor,XCreatePixmapCursor,(Display* a,Pixmap b,Pixmap c,XColor* d,XColor* e,unsigned int f,unsigned int g),(a,b,c,d,e,f,g),return) -SDL_X11_SYM(Cursor,XCreateFontCursor,(Display* a,unsigned int b),(a,b),return) -SDL_X11_SYM(XFontSet,XCreateFontSet,(Display* a, _Xconst char* b, char*** c, int* d, char** e),(a,b,c,d,e),return) -SDL_X11_SYM(GC,XCreateGC,(Display* a,Drawable b,unsigned long c,XGCValues* d),(a,b,c,d),return) -SDL_X11_SYM(XImage*,XCreateImage,(Display* a,Visual* b,unsigned int c,int d,int e,char* f,unsigned int g,unsigned int h,int i,int j),(a,b,c,d,e,f,g,h,i,j),return) -SDL_X11_SYM(Window,XCreateWindow,(Display* a,Window b,int c,int d,unsigned int e,unsigned int f,unsigned int g,int h,unsigned int i,Visual* j,unsigned long k,XSetWindowAttributes* l),(a,b,c,d,e,f,g,h,i,j,k,l),return) -SDL_X11_SYM(int,XDefineCursor,(Display* a,Window b,Cursor c),(a,b,c),return) -SDL_X11_SYM(int,XDeleteProperty,(Display* a,Window b,Atom c),(a,b,c),return) -SDL_X11_SYM(int,XDestroyWindow,(Display* a,Window b),(a,b),return) -SDL_X11_SYM(int,XDisplayKeycodes,(Display* a,int* b,int* c),(a,b,c),return) -SDL_X11_SYM(int,XDrawRectangle,(Display* a,Drawable b,GC c,int d,int e,unsigned int f,unsigned int g),(a,b,c,d,e,f,g),return) -SDL_X11_SYM(char*,XDisplayName,(_Xconst char* a),(a),return) -SDL_X11_SYM(int,XDrawString,(Display* a,Drawable b,GC c,int d,int e,_Xconst char* f,int g),(a,b,c,d,e,f,g),return) -SDL_X11_SYM(int,XEventsQueued,(Display* a,int b),(a,b),return) -SDL_X11_SYM(int,XFillRectangle,(Display* a,Drawable b,GC c,int d,int e,unsigned int f,unsigned int g),(a,b,c,d,e,f,g),return) -SDL_X11_SYM(Bool,XFilterEvent,(XEvent *event,Window w),(event,w),return) -SDL_X11_SYM(int,XFlush,(Display* a),(a),return) -SDL_X11_SYM(int,XFree,(void*a),(a),return) -SDL_X11_SYM(int,XFreeCursor,(Display* a,Cursor b),(a,b),return) -SDL_X11_SYM(void,XFreeFontSet,(Display* a, XFontSet b),(a,b),) -SDL_X11_SYM(int,XFreeGC,(Display* a,GC b),(a,b),return) -SDL_X11_SYM(int,XFreeFont,(Display* a, XFontStruct* b),(a,b),return) -SDL_X11_SYM(int,XFreeModifiermap,(XModifierKeymap* a),(a),return) -SDL_X11_SYM(int,XFreePixmap,(Display* a,Pixmap b),(a,b),return) -SDL_X11_SYM(void,XFreeStringList,(char** a),(a),) -SDL_X11_SYM(char*,XGetAtomName,(Display *a,Atom b),(a,b),return) -SDL_X11_SYM(int,XGetInputFocus,(Display *a,Window *b,int *c),(a,b,c),return) -SDL_X11_SYM(int,XGetErrorDatabaseText,(Display* a,_Xconst char* b,_Xconst char* c,_Xconst char* d,char* e,int f),(a,b,c,d,e,f),return) -SDL_X11_SYM(XModifierKeymap*,XGetModifierMapping,(Display* a),(a),return) -SDL_X11_SYM(int,XGetPointerControl,(Display* a,int* b,int* c,int* d),(a,b,c,d),return) -SDL_X11_SYM(Window,XGetSelectionOwner,(Display* a,Atom b),(a,b),return) -SDL_X11_SYM(XVisualInfo*,XGetVisualInfo,(Display* a,long b,XVisualInfo* c,int* d),(a,b,c,d),return) -SDL_X11_SYM(Status,XGetWindowAttributes,(Display* a,Window b,XWindowAttributes* c),(a,b,c),return) -SDL_X11_SYM(int,XGetWindowProperty,(Display* a,Window b,Atom c,long d,long e,Bool f,Atom g,Atom* h,int* i,unsigned long* j,unsigned long *k,unsigned char **l),(a,b,c,d,e,f,g,h,i,j,k,l),return) -SDL_X11_SYM(XWMHints*,XGetWMHints,(Display* a,Window b),(a,b),return) -SDL_X11_SYM(Status,XGetWMNormalHints,(Display *a,Window b, XSizeHints *c, long *d),(a,b,c,d),return) -SDL_X11_SYM(int,XIfEvent,(Display* a,XEvent *b,Bool (*c)(Display*,XEvent*,XPointer),XPointer d),(a,b,c,d),return) -SDL_X11_SYM(int,XGrabKeyboard,(Display* a,Window b,Bool c,int d,int e,Time f),(a,b,c,d,e,f),return) -SDL_X11_SYM(int,XGrabPointer,(Display* a,Window b,Bool c,unsigned int d,int e,int f,Window g,Cursor h,Time i),(a,b,c,d,e,f,g,h,i),return) -SDL_X11_SYM(int,XGrabServer,(Display* a),(a),return) -SDL_X11_SYM(Status,XIconifyWindow,(Display* a,Window b,int c),(a,b,c),return) -SDL_X11_SYM(KeyCode,XKeysymToKeycode,(Display* a,KeySym b),(a,b),return) -SDL_X11_SYM(char*,XKeysymToString,(KeySym a),(a),return) -SDL_X11_SYM(int,XInstallColormap,(Display* a,Colormap b),(a,b),return) -SDL_X11_SYM(Atom,XInternAtom,(Display* a,_Xconst char* b,Bool c),(a,b,c),return) -SDL_X11_SYM(XPixmapFormatValues*,XListPixmapFormats,(Display* a,int* b),(a,b),return) -SDL_X11_SYM(XFontStruct*,XLoadQueryFont,(Display* a,_Xconst char* b),(a,b),return) -SDL_X11_SYM(KeySym,XLookupKeysym,(XKeyEvent* a,int b),(a,b),return) -SDL_X11_SYM(int,XLookupString,(XKeyEvent* a,char* b,int c,KeySym* d,XComposeStatus* e),(a,b,c,d,e),return) -SDL_X11_SYM(int,XMapRaised,(Display* a,Window b),(a,b),return) -SDL_X11_SYM(Status,XMatchVisualInfo,(Display* a,int b,int c,int d,XVisualInfo* e),(a,b,c,d,e),return) -SDL_X11_SYM(int,XMissingExtension,(Display* a,_Xconst char* b),(a,b),return) -SDL_X11_SYM(int,XMoveWindow,(Display* a,Window b,int c,int d),(a,b,c,d),return) -SDL_X11_SYM(int,XNextEvent,(Display* a,XEvent* b),(a,b),return) -SDL_X11_SYM(Display*,XOpenDisplay,(_Xconst char* a),(a),return) -SDL_X11_SYM(Status,XInitThreads,(void),(),return) -SDL_X11_SYM(int,XPeekEvent,(Display* a,XEvent* b),(a,b),return) -SDL_X11_SYM(int,XPending,(Display* a),(a),return) -SDL_X11_SYM(int,XPutImage,(Display* a,Drawable b,GC c,XImage* d,int e,int f,int g,int h,unsigned int i,unsigned int j),(a,b,c,d,e,f,g,h,i,j),return) -SDL_X11_SYM(int,XQueryKeymap,(Display* a,char *b),(a,b),return) -SDL_X11_SYM(Bool,XQueryPointer,(Display* a,Window b,Window* c,Window* d,int* e,int* f,int* g,int* h,unsigned int* i),(a,b,c,d,e,f,g,h,i),return) -SDL_X11_SYM(int,XRaiseWindow,(Display* a,Window b),(a,b),return) -SDL_X11_SYM(int,XReparentWindow,(Display* a,Window b,Window c,int d,int e),(a,b,c,d,e),return) -SDL_X11_SYM(int,XResetScreenSaver,(Display* a),(a),return) -SDL_X11_SYM(int,XResizeWindow,(Display* a,Window b,unsigned int c,unsigned int d),(a,b,c,d),return) -SDL_X11_SYM(int,XSelectInput,(Display* a,Window b,long c),(a,b,c),return) -SDL_X11_SYM(Status,XSendEvent,(Display* a,Window b,Bool c,long d,XEvent* e),(a,b,c,d,e),return) -SDL_X11_SYM(XErrorHandler,XSetErrorHandler,(XErrorHandler a),(a),return) -SDL_X11_SYM(int,XSetForeground,(Display* a,GC b,unsigned long c),(a,b,c),return) -SDL_X11_SYM(XIOErrorHandler,XSetIOErrorHandler,(XIOErrorHandler a),(a),return) -SDL_X11_SYM(int,XSetInputFocus,(Display *a,Window b,int c,Time d),(a,b,c,d),return) -SDL_X11_SYM(int,XSetSelectionOwner,(Display* a,Atom b,Window c,Time d),(a,b,c,d),return) -SDL_X11_SYM(int,XSetTransientForHint,(Display* a,Window b,Window c),(a,b,c),return) -SDL_X11_SYM(void,XSetTextProperty,(Display* a,Window b,XTextProperty* c,Atom d),(a,b,c,d),) -SDL_X11_SYM(int,XSetWindowBackground,(Display* a,Window b,unsigned long c),(a,b,c),return) -SDL_X11_SYM(void,XSetWMProperties,(Display* a,Window b,XTextProperty* c,XTextProperty* d,char** e,int f,XSizeHints* g,XWMHints* h,XClassHint* i),(a,b,c,d,e,f,g,h,i),) -SDL_X11_SYM(void,XSetWMNormalHints,(Display* a,Window b,XSizeHints* c),(a,b,c),) -SDL_X11_SYM(Status,XSetWMProtocols,(Display* a,Window b,Atom* c,int d),(a,b,c,d),return) -SDL_X11_SYM(int,XStoreColors,(Display* a,Colormap b,XColor* c,int d),(a,b,c,d),return) -SDL_X11_SYM(int,XStoreName,(Display* a,Window b,_Xconst char* c),(a,b,c),return) -SDL_X11_SYM(Status,XStringListToTextProperty,(char** a,int b,XTextProperty* c),(a,b,c),return) -SDL_X11_SYM(int,XSync,(Display* a,Bool b),(a,b),return) -SDL_X11_SYM(int,XTextExtents,(XFontStruct* a,_Xconst char* b,int c,int* d,int* e,int* f,XCharStruct* g),(a,b,c,d,e,f,g),return) -SDL_X11_SYM(Bool,XTranslateCoordinates,(Display *a,Window b,Window c,int d,int e,int* f,int* g,Window* h),(a,b,c,d,e,f,g,h),return) -SDL_X11_SYM(int,XUndefineCursor,(Display* a,Window b),(a,b),return) -SDL_X11_SYM(int,XUngrabKeyboard,(Display* a,Time b),(a,b),return) -SDL_X11_SYM(int,XUngrabPointer,(Display* a,Time b),(a,b),return) -SDL_X11_SYM(int,XUngrabServer,(Display* a),(a),return) -SDL_X11_SYM(int,XUninstallColormap,(Display* a,Colormap b),(a,b),return) -SDL_X11_SYM(int,XUnloadFont,(Display* a,Font b),(a,b),return) -SDL_X11_SYM(int,XWarpPointer,(Display* a,Window b,Window c,int d,int e,unsigned int f,unsigned int g,int h,int i),(a,b,c,d,e,f,g,h,i),return) -SDL_X11_SYM(int,XWindowEvent,(Display* a,Window b,long c,XEvent* d),(a,b,c,d),return) -SDL_X11_SYM(Status,XWithdrawWindow,(Display* a,Window b,int c),(a,b,c),return) -SDL_X11_SYM(VisualID,XVisualIDFromVisual,(Visual* a),(a),return) -#if SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY -SDL_X11_SYM(XExtDisplayInfo*,XextAddDisplay,(XExtensionInfo* a,Display* b,_Xconst char* c,XExtensionHooks* d,int e,XPointer f),(a,b,c,d,e,f),return) -#else -SDL_X11_SYM(XExtDisplayInfo*,XextAddDisplay,(XExtensionInfo* a,Display* b,char* c,XExtensionHooks* d,int e,XPointer f),(a,b,c,d,e,f),return) -#endif -SDL_X11_SYM(XExtensionInfo*,XextCreateExtension,(void),(),return) -SDL_X11_SYM(void,XextDestroyExtension,(XExtensionInfo* a),(a),) -SDL_X11_SYM(XExtDisplayInfo*,XextFindDisplay,(XExtensionInfo* a,Display* b),(a,b),return) -SDL_X11_SYM(int,XextRemoveDisplay,(XExtensionInfo* a,Display* b),(a,b),return) -SDL_X11_SYM(Bool,XQueryExtension,(Display* a,_Xconst char* b,int* c,int* d,int* e),(a,b,c,d,e),return) -SDL_X11_SYM(char *,XDisplayString,(Display* a),(a),return) -SDL_X11_SYM(int,XGetErrorText,(Display* a,int b,char* c,int d),(a,b,c,d),return) -SDL_X11_SYM(void,_XEatData,(Display* a,unsigned long b),(a,b),) -SDL_X11_SYM(void,_XFlush,(Display* a),(a),) -SDL_X11_SYM(void,_XFlushGCCache,(Display* a,GC b),(a,b),) -SDL_X11_SYM(int,_XRead,(Display* a,char* b,long c),(a,b,c),return) -SDL_X11_SYM(void,_XReadPad,(Display* a,char* b,long c),(a,b,c),) -SDL_X11_SYM(void,_XSend,(Display* a,_Xconst char* b,long c),(a,b,c),) -SDL_X11_SYM(Status,_XReply,(Display* a,xReply* b,int c,Bool d),(a,b,c,d),return) -SDL_X11_SYM(unsigned long,_XSetLastRequestRead,(Display* a,xGenericReply* b),(a,b),return) -SDL_X11_SYM(SDL_X11_XSynchronizeRetType,XSynchronize,(Display* a,Bool b),(a,b),return) -SDL_X11_SYM(SDL_X11_XESetWireToEventRetType,XESetWireToEvent,(Display* a,int b,SDL_X11_XESetWireToEventRetType c),(a,b,c),return) -SDL_X11_SYM(SDL_X11_XESetEventToWireRetType,XESetEventToWire,(Display* a,int b,SDL_X11_XESetEventToWireRetType c),(a,b,c),return) -SDL_X11_SYM(void,XRefreshKeyboardMapping,(XMappingEvent *a),(a),) -SDL_X11_SYM(int,XQueryTree,(Display* a,Window b,Window* c,Window* d,Window** e,unsigned int* f),(a,b,c,d,e,f),return) - -#if SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS -SDL_X11_SYM(Bool,XGetEventData,(Display* a,XGenericEventCookie* b),(a,b),return) -SDL_X11_SYM(void,XFreeEventData,(Display* a,XGenericEventCookie* b),(a,b),) -#endif - -#if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM -SDL_X11_SYM(Bool,XkbQueryExtension,(Display* a,int * b,int * c,int * d,int * e, int *f),(a,b,c,d,e,f),return) -#if NeedWidePrototypes -SDL_X11_SYM(KeySym,XkbKeycodeToKeysym,(Display* a,unsigned int b,int c,int d),(a,b,c,d),return) -#else -SDL_X11_SYM(KeySym,XkbKeycodeToKeysym,(Display* a,KeyCode b,int c,int d),(a,b,c,d),return) -#endif -SDL_X11_SYM(Status,XkbGetState,(Display* a,unsigned int b,XkbStatePtr c),(a,b,c),return) -SDL_X11_SYM(Status,XkbGetUpdatedMap,(Display* a,unsigned int b,XkbDescPtr c),(a,b,c),return) -SDL_X11_SYM(XkbDescPtr,XkbGetMap,(Display* a,unsigned int b,unsigned int c),(a,b,c),return) -SDL_X11_SYM(void,XkbFreeClientMap,(XkbDescPtr a,unsigned int b, Bool c),(a,b,c),) -#endif - -#if NeedWidePrototypes -SDL_X11_SYM(KeySym,XKeycodeToKeysym,(Display* a,unsigned int b,int c),(a,b,c),return) -#else -SDL_X11_SYM(KeySym,XKeycodeToKeysym,(Display* a,KeyCode b,int c),(a,b,c),return) -#endif - -#ifdef X_HAVE_UTF8_STRING -SDL_X11_MODULE(UTF8) -SDL_X11_SYM(int,Xutf8TextListToTextProperty,(Display* a,char** b,int c,XICCEncodingStyle d,XTextProperty* e),(a,b,c,d,e),return) -SDL_X11_SYM(int,Xutf8LookupString,(XIC a,XKeyPressedEvent* b,char* c,int d,KeySym* e,Status* f),(a,b,c,d,e,f),return) -/* SDL_X11_SYM(XIC,XCreateIC,(XIM, ...),return) !!! ARGH! */ -SDL_X11_SYM(void,XDestroyIC,(XIC a),(a),) -/* SDL_X11_SYM(char*,XGetICValues,(XIC, ...),return) !!! ARGH! */ -SDL_X11_SYM(void,XSetICFocus,(XIC a),(a),) -SDL_X11_SYM(void,XUnsetICFocus,(XIC a),(a),) -SDL_X11_SYM(XIM,XOpenIM,(Display* a,struct _XrmHashBucketRec* b,char* c,char* d),(a,b,c,d),return) -SDL_X11_SYM(Status,XCloseIM,(XIM a),(a),return) -SDL_X11_SYM(void,Xutf8DrawString,(Display *a, Drawable b, XFontSet c, GC d, int e, int f, _Xconst char *g, int h),(a,b,c,d,e,f,g,h),) -SDL_X11_SYM(int,Xutf8TextExtents,(XFontSet a, _Xconst char* b, int c, XRectangle* d, XRectangle* e),(a,b,c,d,e),return) -SDL_X11_SYM(char*,XSetLocaleModifiers,(const char *a),(a),return) -SDL_X11_SYM(char*,Xutf8ResetIC,(XIC a),(a),return) -#endif - -#ifndef NO_SHARED_MEMORY -SDL_X11_MODULE(SHM) -SDL_X11_SYM(Status,XShmAttach,(Display* a,XShmSegmentInfo* b),(a,b),return) -SDL_X11_SYM(Status,XShmDetach,(Display* a,XShmSegmentInfo* b),(a,b),return) -SDL_X11_SYM(Status,XShmPutImage,(Display* a,Drawable b,GC c,XImage* d,int e,int f,int g,int h,unsigned int i,unsigned int j,Bool k),(a,b,c,d,e,f,g,h,i,j,k),return) -SDL_X11_SYM(XImage*,XShmCreateImage,(Display* a,Visual* b,unsigned int c,int d,char* e,XShmSegmentInfo* f,unsigned int g,unsigned int h),(a,b,c,d,e,f,g,h),return) -SDL_X11_SYM(Pixmap,XShmCreatePixmap,(Display *a,Drawable b,char* c,XShmSegmentInfo* d, unsigned int e, unsigned int f, unsigned int g),(a,b,c,d,e,f,g),return) -SDL_X11_SYM(Bool,XShmQueryExtension,(Display* a),(a),return) -#endif - -/* - * Not required...these only exist in code in headers on some 64-bit platforms, - * and are removed via macros elsewhere, so it's safe for them to be missing. - */ -#ifdef LONG64 -SDL_X11_MODULE(IO_32BIT) -SDL_X11_SYM(int,_XData32,(Display *dpy,register _Xconst long *data,unsigned len),(dpy,data,len),return) -SDL_X11_SYM(void,_XRead32,(Display *dpy,register long *data,long len),(dpy,data,len),) -#endif - -/* - * These only show up on some variants of Unix. - */ -#if defined(__osf__) -SDL_X11_MODULE(OSF_ENTRY_POINTS) -SDL_X11_SYM(void,_SmtBufferOverflow,(Display *dpy,register smtDisplayPtr p),(dpy,p),) -SDL_X11_SYM(void,_SmtIpError,(Display *dpy,register smtDisplayPtr p,int i),(dpy,p,i),) -SDL_X11_SYM(int,ipAllocateData,(ChannelPtr a,IPCard b,IPDataPtr * c),(a,b,c),return) -SDL_X11_SYM(int,ipUnallocateAndSendData,(ChannelPtr a,IPCard b),(a,b),return) -#endif - -/* XCursor support */ -#if SDL_VIDEO_DRIVER_X11_XCURSOR -SDL_X11_MODULE(XCURSOR) -SDL_X11_SYM(XcursorImage*,XcursorImageCreate,(int a,int b),(a,b),return) -SDL_X11_SYM(void,XcursorImageDestroy,(XcursorImage *a),(a),) -SDL_X11_SYM(Cursor,XcursorImageLoadCursor,(Display *a,const XcursorImage *b),(a,b),return) -#endif - -/* Xdbe support */ -#if SDL_VIDEO_DRIVER_X11_XDBE -SDL_X11_MODULE(XDBE) -SDL_X11_SYM(Status,XdbeQueryExtension,(Display *dpy,int *major_version_return,int *minor_version_return),(dpy,major_version_return,minor_version_return),return) -SDL_X11_SYM(XdbeBackBuffer,XdbeAllocateBackBufferName,(Display *dpy,Window window,XdbeSwapAction swap_action),(dpy,window,swap_action),return) -SDL_X11_SYM(Status,XdbeDeallocateBackBufferName,(Display *dpy,XdbeBackBuffer buffer),(dpy,buffer),return) -SDL_X11_SYM(Status,XdbeSwapBuffers,(Display *dpy,XdbeSwapInfo *swap_info,int num_windows),(dpy,swap_info,num_windows),return) -SDL_X11_SYM(Status,XdbeBeginIdiom,(Display *dpy),(dpy),return) -SDL_X11_SYM(Status,XdbeEndIdiom,(Display *dpy),(dpy),return) -SDL_X11_SYM(XdbeScreenVisualInfo*,XdbeGetVisualInfo,(Display *dpy,Drawable *screen_specifiers,int *num_screens),(dpy,screen_specifiers,num_screens),return) -SDL_X11_SYM(void,XdbeFreeVisualInfo,(XdbeScreenVisualInfo *visual_info),(visual_info),) -SDL_X11_SYM(XdbeBackBufferAttributes*,XdbeGetBackBufferAttributes,(Display *dpy,XdbeBackBuffer buffer),(dpy,buffer),return) -#endif - -/* Xinerama support */ -#if SDL_VIDEO_DRIVER_X11_XINERAMA -SDL_X11_MODULE(XINERAMA) -SDL_X11_SYM(Bool,XineramaIsActive,(Display *a),(a),return) -SDL_X11_SYM(Bool,XineramaQueryExtension,(Display *a,int *b,int *c),(a,b,c),return) -SDL_X11_SYM(Status,XineramaQueryVersion,(Display *a,int *b,int *c),(a,b,c),return) -SDL_X11_SYM(XineramaScreenInfo*,XineramaQueryScreens,(Display *a, int *b),(a,b),return) -#endif - -/* XInput2 support for multiple mice, tablets, etc. */ -#if SDL_VIDEO_DRIVER_X11_XINPUT2 -SDL_X11_MODULE(XINPUT2) -SDL_X11_SYM(XIDeviceInfo*,XIQueryDevice,(Display *a,int b,int *c),(a,b,c),return) -SDL_X11_SYM(void,XIFreeDeviceInfo,(XIDeviceInfo *a),(a),) -SDL_X11_SYM(int,XISelectEvents,(Display *a,Window b,XIEventMask *c,int d),(a,b,c,d),return) -SDL_X11_SYM(Status,XIQueryVersion,(Display *a,int *b,int *c),(a,b,c),return) -SDL_X11_SYM(XIEventMask*,XIGetSelectedEvents,(Display *a,Window b,int *c),(a,b,c),return) -#endif - -/* XRandR support */ -#if SDL_VIDEO_DRIVER_X11_XRANDR -SDL_X11_MODULE(XRANDR) -SDL_X11_SYM(Status,XRRQueryVersion,(Display *dpy,int *major_versionp,int *minor_versionp),(dpy,major_versionp,minor_versionp),return) -SDL_X11_SYM(XRRScreenConfiguration *,XRRGetScreenInfo,(Display *dpy,Drawable draw),(dpy,draw),return) -SDL_X11_SYM(SizeID,XRRConfigCurrentConfiguration,(XRRScreenConfiguration *config,Rotation *rotation),(config,rotation),return) -SDL_X11_SYM(short,XRRConfigCurrentRate,(XRRScreenConfiguration *config),(config),return) -SDL_X11_SYM(short *,XRRConfigRates,(XRRScreenConfiguration *config,int sizeID,int *nrates),(config,sizeID,nrates),return) -SDL_X11_SYM(XRRScreenSize *,XRRConfigSizes,(XRRScreenConfiguration *config,int *nsizes),(config,nsizes),return) -SDL_X11_SYM(Status,XRRSetScreenConfigAndRate,(Display *dpy,XRRScreenConfiguration *config,Drawable draw,int size_index,Rotation rotation,short rate,Time timestamp),(dpy,config,draw,size_index,rotation,rate,timestamp),return) -SDL_X11_SYM(void,XRRFreeScreenConfigInfo,(XRRScreenConfiguration *config),(config),) -SDL_X11_SYM(void,XRRSetScreenSize,(Display *dpy, Window window,int width, int height,int mmWidth, int mmHeight),(dpy,window,width,height,mmWidth,mmHeight),) -SDL_X11_SYM(Status,XRRGetScreenSizeRange,(Display *dpy, Window window,int *minWidth, int *minHeight, int *maxWidth, int *maxHeight),(dpy,window,minWidth,minHeight,maxWidth,maxHeight),return) -SDL_X11_SYM(XRRScreenResources *,XRRGetScreenResources,(Display *dpy, Window window),(dpy, window),return) -SDL_X11_SYM(void,XRRFreeScreenResources,(XRRScreenResources *resources),(resources),) -SDL_X11_SYM(XRROutputInfo *,XRRGetOutputInfo,(Display *dpy, XRRScreenResources *resources, RROutput output),(dpy,resources,output),return) -SDL_X11_SYM(void,XRRFreeOutputInfo,(XRROutputInfo *outputInfo),(outputInfo),) -SDL_X11_SYM(XRRCrtcInfo *,XRRGetCrtcInfo,(Display *dpy, XRRScreenResources *resources, RRCrtc crtc),(dpy,resources,crtc),return) -SDL_X11_SYM(void,XRRFreeCrtcInfo,(XRRCrtcInfo *crtcInfo),(crtcInfo),) -SDL_X11_SYM(Status,XRRSetCrtcConfig,(Display *dpy, XRRScreenResources *resources, RRCrtc crtc, Time timestamp, int x, int y, RRMode mode, Rotation rotation, RROutput *outputs, int noutputs),(dpy,resources,crtc,timestamp,x,y,mode,rotation,outputs,noutputs),return) -SDL_X11_SYM(Atom*,XRRListOutputProperties,(Display *dpy, RROutput output, int *nprop),(dpy,output,nprop),return) -SDL_X11_SYM(XRRPropertyInfo*,XRRQueryOutputProperty,(Display *dpy,RROutput output, Atom property),(dpy,output,property),return) -SDL_X11_SYM(int,XRRGetOutputProperty,(Display *dpy,RROutput output, Atom property, long offset, long length, Bool _delete, Bool pending, Atom req_type, Atom *actual_type, int *actual_format, unsigned long *nitems, unsigned long *bytes_after, unsigned char **prop),(dpy,output,property,offset,length, _delete, pending, req_type, actual_type, actual_format, nitems, bytes_after, prop),return) -SDL_X11_SYM(RROutput,XRRGetOutputPrimary,(Display *dpy,Window window),(dpy,window),return) -#endif - -/* MIT-SCREEN-SAVER support */ -#if SDL_VIDEO_DRIVER_X11_XSCRNSAVER -SDL_X11_MODULE(XSS) -SDL_X11_SYM(Bool,XScreenSaverQueryExtension,(Display *dpy,int *event_base,int *error_base),(dpy,event_base,error_base),return) -SDL_X11_SYM(Status,XScreenSaverQueryVersion,(Display *dpy,int *major_versionp,int *minor_versionp),(dpy,major_versionp,minor_versionp),return) -SDL_X11_SYM(void,XScreenSaverSuspend,(Display *dpy,Bool suspend),(dpy,suspend),return) -#endif - -#if SDL_VIDEO_DRIVER_X11_XSHAPE -SDL_X11_MODULE(XSHAPE) -SDL_X11_SYM(void,XShapeCombineMask,(Display *dpy,Window dest,int dest_kind,int x_off,int y_off,Pixmap src,int op),(dpy,dest,dest_kind,x_off,y_off,src,op),) -#endif - -#if SDL_VIDEO_DRIVER_X11_XVIDMODE -SDL_X11_MODULE(XVIDMODE) -SDL_X11_SYM(Bool,XF86VidModeGetAllModeLines,(Display *a,int b,int *c,XF86VidModeModeInfo ***d),(a,b,c,d),return) -SDL_X11_SYM(Bool,XF86VidModeGetModeLine,(Display *a,int b,int *c,XF86VidModeModeLine *d),(a,b,c,d),return) -SDL_X11_SYM(Bool,XF86VidModeGetViewPort,(Display *a,int b,int *c,int *d),(a,b,c,d),return) -SDL_X11_SYM(Bool,XF86VidModeQueryExtension,(Display *a,int *b,int *c),(a,b,c),return) -SDL_X11_SYM(Bool,XF86VidModeQueryVersion,(Display *a,int *b,int *c),(a,b,c),return) -SDL_X11_SYM(Bool,XF86VidModeSwitchToMode,(Display *a,int b,XF86VidModeModeInfo *c),(a,b,c),return) -SDL_X11_SYM(Bool,XF86VidModeLockModeSwitch,(Display *a,int b,int c),(a,b,c),return) -#endif - -#undef SDL_X11_MODULE -#undef SDL_X11_SYM - -/* *INDENT-ON* */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11touch.c b/3rdparty/SDL2/src/video/x11/SDL_x11touch.c deleted file mode 100644 index c19e80a6735..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11touch.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include "SDL_x11video.h" -#include "SDL_x11touch.h" -#include "SDL_x11xinput2.h" -#include "../../events/SDL_touch_c.h" - - -void -X11_InitTouch(_THIS) -{ - if (X11_Xinput2IsMultitouchSupported()) { - X11_InitXinput2Multitouch(_this); - } -} - -void -X11_QuitTouch(_THIS) -{ - SDL_TouchQuit(); -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11touch.h b/3rdparty/SDL2/src/video/x11/SDL_x11touch.h deleted file mode 100644 index 7f8d18e1c48..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11touch.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11touch_h -#define _SDL_x11touch_h - -extern void X11_InitTouch(_THIS); -extern void X11_QuitTouch(_THIS); - -#endif /* _SDL_x11touch_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11video.c b/3rdparty/SDL2/src/video/x11/SDL_x11video.c deleted file mode 100644 index 38b34de3421..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11video.c +++ /dev/null @@ -1,539 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include <unistd.h> /* For getpid() and readlink() */ - -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" - -#include "SDL_x11video.h" -#include "SDL_x11framebuffer.h" -#include "SDL_x11shape.h" -#include "SDL_x11touch.h" -#include "SDL_x11xinput2.h" - -#if SDL_VIDEO_OPENGL_EGL -#include "SDL_x11opengles.h" -#endif - -#ifdef X_HAVE_UTF8_STRING -#include <locale.h> -#endif - -/* Initialization/Query functions */ -static int X11_VideoInit(_THIS); -static void X11_VideoQuit(_THIS); - -/* Find out what class name we should use */ -static char * -get_classname() -{ - char *spot; -#if defined(__LINUX__) || defined(__FREEBSD__) - char procfile[1024]; - char linkfile[1024]; - int linksize; -#endif - - /* First allow environment variable override */ - spot = SDL_getenv("SDL_VIDEO_X11_WMCLASS"); - if (spot) { - return SDL_strdup(spot); - } - - /* Next look at the application's executable name */ -#if defined(__LINUX__) || defined(__FREEBSD__) -#if defined(__LINUX__) - SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/exe", getpid()); -#elif defined(__FREEBSD__) - SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/file", - getpid()); -#else -#error Where can we find the executable name? -#endif - linksize = readlink(procfile, linkfile, sizeof(linkfile) - 1); - if (linksize > 0) { - linkfile[linksize] = '\0'; - spot = SDL_strrchr(linkfile, '/'); - if (spot) { - return SDL_strdup(spot + 1); - } else { - return SDL_strdup(linkfile); - } - } -#endif /* __LINUX__ || __FREEBSD__ */ - - /* Finally use the default we've used forever */ - return SDL_strdup("SDL_App"); -} - -/* X11 driver bootstrap functions */ - -static int -X11_Available(void) -{ - Display *display = NULL; - if (SDL_X11_LoadSymbols()) { - display = X11_XOpenDisplay(NULL); - if (display != NULL) { - X11_XCloseDisplay(display); - } - SDL_X11_UnloadSymbols(); - } - return (display != NULL); -} - -static void -X11_DeleteDevice(SDL_VideoDevice * device) -{ - SDL_VideoData *data = (SDL_VideoData *) device->driverdata; - if (data->display) { - X11_XCloseDisplay(data->display); - } - SDL_free(data->windowlist); - SDL_free(device->driverdata); - SDL_free(device); - - SDL_X11_UnloadSymbols(); -} - -/* An error handler to reset the vidmode and then call the default handler. */ -static SDL_bool safety_net_triggered = SDL_FALSE; -static int (*orig_x11_errhandler) (Display *, XErrorEvent *) = NULL; -static int -X11_SafetyNetErrHandler(Display * d, XErrorEvent * e) -{ - SDL_VideoDevice *device = NULL; - /* if we trigger an error in our error handler, don't try again. */ - if (!safety_net_triggered) { - safety_net_triggered = SDL_TRUE; - device = SDL_GetVideoDevice(); - if (device != NULL) { - int i; - for (i = 0; i < device->num_displays; i++) { - SDL_VideoDisplay *display = &device->displays[i]; - if (SDL_memcmp(&display->current_mode, &display->desktop_mode, - sizeof (SDL_DisplayMode)) != 0) { - X11_SetDisplayMode(device, display, &display->desktop_mode); - } - } - } - } - - if (orig_x11_errhandler != NULL) { - return orig_x11_errhandler(d, e); /* probably terminate. */ - } - - return 0; -} - -static SDL_VideoDevice * -X11_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - SDL_VideoData *data; - const char *display = NULL; /* Use the DISPLAY environment variable */ - - if (!SDL_X11_LoadSymbols()) { - return NULL; - } - - /* Need for threading gl calls. This is also required for the proprietary - nVidia driver to be threaded. */ - X11_XInitThreads(); - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (!device) { - SDL_OutOfMemory(); - return NULL; - } - data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); - if (!data) { - SDL_free(device); - SDL_OutOfMemory(); - return NULL; - } - device->driverdata = data; - - data->global_mouse_changed = SDL_TRUE; - - /* FIXME: Do we need this? - if ( (SDL_strncmp(X11_XDisplayName(display), ":", 1) == 0) || - (SDL_strncmp(X11_XDisplayName(display), "unix:", 5) == 0) ) { - local_X11 = 1; - } else { - local_X11 = 0; - } - */ - data->display = X11_XOpenDisplay(display); -#if defined(__osf__) && defined(SDL_VIDEO_DRIVER_X11_DYNAMIC) - /* On Tru64 if linking without -lX11, it fails and you get following message. - * Xlib: connection to ":0.0" refused by server - * Xlib: XDM authorization key matches an existing client! - * - * It succeeds if retrying 1 second later - * or if running xhost +localhost on shell. - */ - if (data->display == NULL) { - SDL_Delay(1000); - data->display = X11_XOpenDisplay(display); - } -#endif - if (data->display == NULL) { - SDL_free(device->driverdata); - SDL_free(device); - SDL_SetError("Couldn't open X11 display"); - return NULL; - } -#ifdef X11_DEBUG - X11_XSynchronize(data->display, True); -#endif - - /* Hook up an X11 error handler to recover the desktop resolution. */ - safety_net_triggered = SDL_FALSE; - orig_x11_errhandler = X11_XSetErrorHandler(X11_SafetyNetErrHandler); - - /* Set the function pointers */ - device->VideoInit = X11_VideoInit; - device->VideoQuit = X11_VideoQuit; - device->GetDisplayModes = X11_GetDisplayModes; - device->GetDisplayBounds = X11_GetDisplayBounds; - device->GetDisplayUsableBounds = X11_GetDisplayUsableBounds; - device->GetDisplayDPI = X11_GetDisplayDPI; - device->SetDisplayMode = X11_SetDisplayMode; - device->SuspendScreenSaver = X11_SuspendScreenSaver; - device->PumpEvents = X11_PumpEvents; - - device->CreateWindow = X11_CreateWindow; - device->CreateWindowFrom = X11_CreateWindowFrom; - device->SetWindowTitle = X11_SetWindowTitle; - device->SetWindowIcon = X11_SetWindowIcon; - device->SetWindowPosition = X11_SetWindowPosition; - device->SetWindowSize = X11_SetWindowSize; - device->SetWindowMinimumSize = X11_SetWindowMinimumSize; - device->SetWindowMaximumSize = X11_SetWindowMaximumSize; - device->GetWindowBordersSize = X11_GetWindowBordersSize; - device->SetWindowOpacity = X11_SetWindowOpacity; - device->SetWindowModalFor = X11_SetWindowModalFor; - device->SetWindowInputFocus = X11_SetWindowInputFocus; - device->ShowWindow = X11_ShowWindow; - device->HideWindow = X11_HideWindow; - device->RaiseWindow = X11_RaiseWindow; - device->MaximizeWindow = X11_MaximizeWindow; - device->MinimizeWindow = X11_MinimizeWindow; - device->RestoreWindow = X11_RestoreWindow; - device->SetWindowBordered = X11_SetWindowBordered; - device->SetWindowResizable = X11_SetWindowResizable; - device->SetWindowFullscreen = X11_SetWindowFullscreen; - device->SetWindowGammaRamp = X11_SetWindowGammaRamp; - device->SetWindowGrab = X11_SetWindowGrab; - device->DestroyWindow = X11_DestroyWindow; - device->CreateWindowFramebuffer = X11_CreateWindowFramebuffer; - device->UpdateWindowFramebuffer = X11_UpdateWindowFramebuffer; - device->DestroyWindowFramebuffer = X11_DestroyWindowFramebuffer; - device->GetWindowWMInfo = X11_GetWindowWMInfo; - device->SetWindowHitTest = X11_SetWindowHitTest; - - device->shape_driver.CreateShaper = X11_CreateShaper; - device->shape_driver.SetWindowShape = X11_SetWindowShape; - device->shape_driver.ResizeWindowShape = X11_ResizeWindowShape; - -#if SDL_VIDEO_OPENGL_GLX - device->GL_LoadLibrary = X11_GL_LoadLibrary; - device->GL_GetProcAddress = X11_GL_GetProcAddress; - device->GL_UnloadLibrary = X11_GL_UnloadLibrary; - device->GL_CreateContext = X11_GL_CreateContext; - device->GL_MakeCurrent = X11_GL_MakeCurrent; - device->GL_SetSwapInterval = X11_GL_SetSwapInterval; - device->GL_GetSwapInterval = X11_GL_GetSwapInterval; - device->GL_SwapWindow = X11_GL_SwapWindow; - device->GL_DeleteContext = X11_GL_DeleteContext; -#elif SDL_VIDEO_OPENGL_EGL - device->GL_LoadLibrary = X11_GLES_LoadLibrary; - device->GL_GetProcAddress = X11_GLES_GetProcAddress; - device->GL_UnloadLibrary = X11_GLES_UnloadLibrary; - device->GL_CreateContext = X11_GLES_CreateContext; - device->GL_MakeCurrent = X11_GLES_MakeCurrent; - device->GL_SetSwapInterval = X11_GLES_SetSwapInterval; - device->GL_GetSwapInterval = X11_GLES_GetSwapInterval; - device->GL_SwapWindow = X11_GLES_SwapWindow; - device->GL_DeleteContext = X11_GLES_DeleteContext; -#endif - - device->SetClipboardText = X11_SetClipboardText; - device->GetClipboardText = X11_GetClipboardText; - device->HasClipboardText = X11_HasClipboardText; - device->StartTextInput = X11_StartTextInput; - device->StopTextInput = X11_StopTextInput; - device->SetTextInputRect = X11_SetTextInputRect; - - device->free = X11_DeleteDevice; - - return device; -} - -VideoBootStrap X11_bootstrap = { - "x11", "SDL X11 video driver", - X11_Available, X11_CreateDevice -}; - -static int (*handler) (Display *, XErrorEvent *) = NULL; -static int -X11_CheckWindowManagerErrorHandler(Display * d, XErrorEvent * e) -{ - if (e->error_code == BadWindow) { - return (0); - } else { - return (handler(d, e)); - } -} - -static void -X11_CheckWindowManager(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - Display *display = data->display; - Atom _NET_SUPPORTING_WM_CHECK; - int status, real_format; - Atom real_type; - unsigned long items_read = 0, items_left = 0; - unsigned char *propdata = NULL; - Window wm_window = 0; -#ifdef DEBUG_WINDOW_MANAGER - char *wm_name; -#endif - - /* Set up a handler to gracefully catch errors */ - X11_XSync(display, False); - handler = X11_XSetErrorHandler(X11_CheckWindowManagerErrorHandler); - - _NET_SUPPORTING_WM_CHECK = X11_XInternAtom(display, "_NET_SUPPORTING_WM_CHECK", False); - status = X11_XGetWindowProperty(display, DefaultRootWindow(display), _NET_SUPPORTING_WM_CHECK, 0L, 1L, False, XA_WINDOW, &real_type, &real_format, &items_read, &items_left, &propdata); - if (status == Success) { - if (items_read) { - wm_window = ((Window*)propdata)[0]; - } - if (propdata) { - X11_XFree(propdata); - propdata = NULL; - } - } - - if (wm_window) { - status = X11_XGetWindowProperty(display, wm_window, _NET_SUPPORTING_WM_CHECK, 0L, 1L, False, XA_WINDOW, &real_type, &real_format, &items_read, &items_left, &propdata); - if (status != Success || !items_read || wm_window != ((Window*)propdata)[0]) { - wm_window = None; - } - if (status == Success && propdata) { - X11_XFree(propdata); - propdata = NULL; - } - } - - /* Reset the error handler, we're done checking */ - X11_XSync(display, False); - X11_XSetErrorHandler(handler); - - if (!wm_window) { -#ifdef DEBUG_WINDOW_MANAGER - printf("Couldn't get _NET_SUPPORTING_WM_CHECK property\n"); -#endif - return; - } - data->net_wm = SDL_TRUE; - -#ifdef DEBUG_WINDOW_MANAGER - wm_name = X11_GetWindowTitle(_this, wm_window); - printf("Window manager: %s\n", wm_name); - SDL_free(wm_name); -#endif -} - - -int -X11_VideoInit(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - /* Get the window class name, usually the name of the application */ - data->classname = get_classname(); - - /* Get the process PID to be associated to the window */ - data->pid = getpid(); - - /* I have no idea how random this actually is, or has to be. */ - data->window_group = (XID) (((size_t) data->pid) ^ ((size_t) _this)); - - /* Open a connection to the X input manager */ -#ifdef X_HAVE_UTF8_STRING - if (SDL_X11_HAVE_UTF8) { - /* Set the locale, and call XSetLocaleModifiers before XOpenIM so that - Compose keys will work correctly. */ - char *prev_locale = setlocale(LC_ALL, NULL); - char *prev_xmods = X11_XSetLocaleModifiers(NULL); - const char *new_xmods = ""; -#if defined(HAVE_IBUS_IBUS_H) || defined(HAVE_FCITX_FRONTEND_H) - const char *env_xmods = SDL_getenv("XMODIFIERS"); -#endif - SDL_bool has_dbus_ime_support = SDL_FALSE; - - if (prev_locale) { - prev_locale = SDL_strdup(prev_locale); - } - - if (prev_xmods) { - prev_xmods = SDL_strdup(prev_xmods); - } - - /* IBus resends some key events that were filtered by XFilterEvents - when it is used via XIM which causes issues. Prevent this by forcing - @im=none if XMODIFIERS contains @im=ibus. IBus can still be used via - the DBus implementation, which also has support for pre-editing. */ -#ifdef HAVE_IBUS_IBUS_H - if (env_xmods && SDL_strstr(env_xmods, "@im=ibus") != NULL) { - has_dbus_ime_support = SDL_TRUE; - } -#endif -#ifdef HAVE_FCITX_FRONTEND_H - if (env_xmods && SDL_strstr(env_xmods, "@im=fcitx") != NULL) { - has_dbus_ime_support = SDL_TRUE; - } -#endif - if (has_dbus_ime_support) { - new_xmods = "@im=none"; - } - - setlocale(LC_ALL, ""); - X11_XSetLocaleModifiers(new_xmods); - - data->im = X11_XOpenIM(data->display, NULL, data->classname, data->classname); - - /* Reset the locale + X locale modifiers back to how they were, - locale first because the X locale modifiers depend on it. */ - setlocale(LC_ALL, prev_locale); - X11_XSetLocaleModifiers(prev_xmods); - - if (prev_locale) { - SDL_free(prev_locale); - } - - if (prev_xmods) { - SDL_free(prev_xmods); - } - } -#endif - - /* Look up some useful Atoms */ -#define GET_ATOM(X) data->X = X11_XInternAtom(data->display, #X, False) - GET_ATOM(WM_PROTOCOLS); - GET_ATOM(WM_DELETE_WINDOW); - GET_ATOM(WM_TAKE_FOCUS); - GET_ATOM(_NET_WM_STATE); - GET_ATOM(_NET_WM_STATE_HIDDEN); - GET_ATOM(_NET_WM_STATE_FOCUSED); - GET_ATOM(_NET_WM_STATE_MAXIMIZED_VERT); - GET_ATOM(_NET_WM_STATE_MAXIMIZED_HORZ); - GET_ATOM(_NET_WM_STATE_FULLSCREEN); - GET_ATOM(_NET_WM_STATE_ABOVE); - GET_ATOM(_NET_WM_STATE_SKIP_TASKBAR); - GET_ATOM(_NET_WM_STATE_SKIP_PAGER); - GET_ATOM(_NET_WM_ALLOWED_ACTIONS); - GET_ATOM(_NET_WM_ACTION_FULLSCREEN); - GET_ATOM(_NET_WM_NAME); - GET_ATOM(_NET_WM_ICON_NAME); - GET_ATOM(_NET_WM_ICON); - GET_ATOM(_NET_WM_PING); - GET_ATOM(_NET_WM_WINDOW_OPACITY); - GET_ATOM(_NET_WM_USER_TIME); - GET_ATOM(_NET_ACTIVE_WINDOW); - GET_ATOM(_NET_FRAME_EXTENTS); - GET_ATOM(UTF8_STRING); - GET_ATOM(PRIMARY); - GET_ATOM(XdndEnter); - GET_ATOM(XdndPosition); - GET_ATOM(XdndStatus); - GET_ATOM(XdndTypeList); - GET_ATOM(XdndActionCopy); - GET_ATOM(XdndDrop); - GET_ATOM(XdndFinished); - GET_ATOM(XdndSelection); - GET_ATOM(XKLAVIER_STATE); - - /* Detect the window manager */ - X11_CheckWindowManager(_this); - - if (X11_InitModes(_this) < 0) { - return -1; - } - - X11_InitXinput2(_this); - - if (X11_InitKeyboard(_this) != 0) { - return -1; - } - X11_InitMouse(_this); - - X11_InitTouch(_this); - -#if SDL_USE_LIBDBUS - SDL_DBus_Init(); -#endif - - return 0; -} - -void -X11_VideoQuit(_THIS) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - SDL_free(data->classname); -#ifdef X_HAVE_UTF8_STRING - if (data->im) { - X11_XCloseIM(data->im); - } -#endif - - X11_QuitModes(_this); - X11_QuitKeyboard(_this); - X11_QuitMouse(_this); - X11_QuitTouch(_this); - -#if SDL_USE_LIBDBUS - SDL_DBus_Quit(); -#endif -} - -SDL_bool -X11_UseDirectColorVisuals(void) -{ - return SDL_getenv("SDL_VIDEO_X11_NODIRECTCOLOR") ? SDL_FALSE : SDL_TRUE; -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vim: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11video.h b/3rdparty/SDL2/src/video/x11/SDL_x11video.h deleted file mode 100644 index a3324ff5343..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11video.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11video_h -#define _SDL_x11video_h - -#include "SDL_keycode.h" - -#include "../SDL_sysvideo.h" - -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/Xatom.h> - -#if SDL_VIDEO_DRIVER_X11_XCURSOR -#include <X11/Xcursor/Xcursor.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XDBE -#include <X11/extensions/Xdbe.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XINERAMA -#include <X11/extensions/Xinerama.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XINPUT2 -#include <X11/extensions/XInput2.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XRANDR -#include <X11/extensions/Xrandr.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XSCRNSAVER -#include <X11/extensions/scrnsaver.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XSHAPE -#include <X11/extensions/shape.h> -#endif -#if SDL_VIDEO_DRIVER_X11_XVIDMODE -#include <X11/extensions/xf86vmode.h> -#endif - -#include "../../core/linux/SDL_dbus.h" -#include "../../core/linux/SDL_ime.h" - -#include "SDL_x11dyn.h" - -#include "SDL_x11clipboard.h" -#include "SDL_x11events.h" -#include "SDL_x11keyboard.h" -#include "SDL_x11modes.h" -#include "SDL_x11mouse.h" -#include "SDL_x11opengl.h" -#include "SDL_x11window.h" - -/* Private display data */ - -typedef struct SDL_VideoData -{ - Display *display; - char *classname; - pid_t pid; - XIM im; - Uint32 screensaver_activity; - int numwindows; - SDL_WindowData **windowlist; - int windowlistlength; - XID window_group; - - /* This is true for ICCCM2.0-compliant window managers */ - SDL_bool net_wm; - - /* Useful atoms */ - Atom WM_PROTOCOLS; - Atom WM_DELETE_WINDOW; - Atom WM_TAKE_FOCUS; - Atom _NET_WM_STATE; - Atom _NET_WM_STATE_HIDDEN; - Atom _NET_WM_STATE_FOCUSED; - Atom _NET_WM_STATE_MAXIMIZED_VERT; - Atom _NET_WM_STATE_MAXIMIZED_HORZ; - Atom _NET_WM_STATE_FULLSCREEN; - Atom _NET_WM_STATE_ABOVE; - Atom _NET_WM_STATE_SKIP_TASKBAR; - Atom _NET_WM_STATE_SKIP_PAGER; - Atom _NET_WM_ALLOWED_ACTIONS; - Atom _NET_WM_ACTION_FULLSCREEN; - Atom _NET_WM_NAME; - Atom _NET_WM_ICON_NAME; - Atom _NET_WM_ICON; - Atom _NET_WM_PING; - Atom _NET_WM_WINDOW_OPACITY; - Atom _NET_WM_USER_TIME; - Atom _NET_ACTIVE_WINDOW; - Atom _NET_FRAME_EXTENTS; - Atom UTF8_STRING; - Atom PRIMARY; - Atom XdndEnter; - Atom XdndPosition; - Atom XdndStatus; - Atom XdndTypeList; - Atom XdndActionCopy; - Atom XdndDrop; - Atom XdndFinished; - Atom XdndSelection; - Atom XKLAVIER_STATE; - - SDL_Scancode key_layout[256]; - SDL_bool selection_waiting; - - Uint32 last_mode_change_deadline; - - SDL_bool global_mouse_changed; - SDL_Point global_mouse_position; - Uint32 global_mouse_buttons; - -#if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM - XkbDescPtr xkb; -#endif -} SDL_VideoData; - -extern SDL_bool X11_UseDirectColorVisuals(void); - -#endif /* _SDL_x11video_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11window.c b/3rdparty/SDL2/src/video/x11/SDL_x11window.c deleted file mode 100644 index 668bce2257b..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11window.c +++ /dev/null @@ -1,1583 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include "SDL_assert.h" -#include "SDL_hints.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../../events/SDL_keyboard_c.h" -#include "../../events/SDL_mouse_c.h" - -#include "SDL_x11video.h" -#include "SDL_x11mouse.h" -#include "SDL_x11shape.h" -#include "SDL_x11xinput2.h" - -#if SDL_VIDEO_OPENGL_EGL -#include "SDL_x11opengles.h" -#endif - -#include "SDL_timer.h" -#include "SDL_syswm.h" -#include "SDL_assert.h" - -#define _NET_WM_STATE_REMOVE 0l -#define _NET_WM_STATE_ADD 1l -#define _NET_WM_STATE_TOGGLE 2l - -static Bool isMapNotify(Display *dpy, XEvent *ev, XPointer win) -{ - return ev->type == MapNotify && ev->xmap.window == *((Window*)win); -} -static Bool isUnmapNotify(Display *dpy, XEvent *ev, XPointer win) -{ - return ev->type == UnmapNotify && ev->xunmap.window == *((Window*)win); -} - -/* -static Bool isConfigureNotify(Display *dpy, XEvent *ev, XPointer win) -{ - return ev->type == ConfigureNotify && ev->xconfigure.window == *((Window*)win); -} -static Bool -X11_XIfEventTimeout(Display *display, XEvent *event_return, Bool (*predicate)(), XPointer arg, int timeoutMS) -{ - Uint32 start = SDL_GetTicks(); - - while (!X11_XCheckIfEvent(display, event_return, predicate, arg)) { - if (SDL_TICKS_PASSED(SDL_GetTicks(), start + timeoutMS)) { - return False; - } - } - return True; -} -*/ - -static SDL_bool -X11_IsWindowLegacyFullscreen(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - return (data->fswindow != 0); -} - -static SDL_bool -X11_IsWindowMapped(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - XWindowAttributes attr; - - X11_XGetWindowAttributes(videodata->display, data->xwindow, &attr); - if (attr.map_state != IsUnmapped) { - return SDL_TRUE; - } else { - return SDL_FALSE; - } -} - -#if 0 -static SDL_bool -X11_IsActionAllowed(SDL_Window *window, Atom action) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Atom _NET_WM_ALLOWED_ACTIONS = data->videodata->_NET_WM_ALLOWED_ACTIONS; - Atom type; - Display *display = data->videodata->display; - int form; - unsigned long remain; - unsigned long len, i; - Atom *list; - SDL_bool ret = SDL_FALSE; - - if (X11_XGetWindowProperty(display, data->xwindow, _NET_WM_ALLOWED_ACTIONS, 0, 1024, False, XA_ATOM, &type, &form, &len, &remain, (unsigned char **)&list) == Success) - { - for (i=0; i<len; ++i) - { - if (list[i] == action) { - ret = SDL_TRUE; - break; - } - } - X11_XFree(list); - } - return ret; -} -#endif /* 0 */ - -void -X11_SetNetWMState(_THIS, Window xwindow, Uint32 flags) -{ - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - Display *display = videodata->display; - /* !!! FIXME: just dereference videodata below instead of copying to locals. */ - Atom _NET_WM_STATE = videodata->_NET_WM_STATE; - /* Atom _NET_WM_STATE_HIDDEN = videodata->_NET_WM_STATE_HIDDEN; */ - Atom _NET_WM_STATE_FOCUSED = videodata->_NET_WM_STATE_FOCUSED; - Atom _NET_WM_STATE_MAXIMIZED_VERT = videodata->_NET_WM_STATE_MAXIMIZED_VERT; - Atom _NET_WM_STATE_MAXIMIZED_HORZ = videodata->_NET_WM_STATE_MAXIMIZED_HORZ; - Atom _NET_WM_STATE_FULLSCREEN = videodata->_NET_WM_STATE_FULLSCREEN; - Atom _NET_WM_STATE_ABOVE = videodata->_NET_WM_STATE_ABOVE; - Atom _NET_WM_STATE_SKIP_TASKBAR = videodata->_NET_WM_STATE_SKIP_TASKBAR; - Atom _NET_WM_STATE_SKIP_PAGER = videodata->_NET_WM_STATE_SKIP_PAGER; - Atom atoms[16]; - int count = 0; - - /* The window manager sets this property, we shouldn't set it. - If we did, this would indicate to the window manager that we don't - actually want to be mapped during X11_XMapRaised(), which would be bad. - * - if (flags & SDL_WINDOW_HIDDEN) { - atoms[count++] = _NET_WM_STATE_HIDDEN; - } - */ - - if (flags & SDL_WINDOW_ALWAYS_ON_TOP) { - atoms[count++] = _NET_WM_STATE_ABOVE; - } - if (flags & SDL_WINDOW_SKIP_TASKBAR) { - atoms[count++] = _NET_WM_STATE_SKIP_TASKBAR; - atoms[count++] = _NET_WM_STATE_SKIP_PAGER; - } - if (flags & SDL_WINDOW_INPUT_FOCUS) { - atoms[count++] = _NET_WM_STATE_FOCUSED; - } - if (flags & SDL_WINDOW_MAXIMIZED) { - atoms[count++] = _NET_WM_STATE_MAXIMIZED_VERT; - atoms[count++] = _NET_WM_STATE_MAXIMIZED_HORZ; - } - if (flags & SDL_WINDOW_FULLSCREEN) { - atoms[count++] = _NET_WM_STATE_FULLSCREEN; - } - - SDL_assert(count <= SDL_arraysize(atoms)); - - if (count > 0) { - X11_XChangeProperty(display, xwindow, _NET_WM_STATE, XA_ATOM, 32, - PropModeReplace, (unsigned char *)atoms, count); - } else { - X11_XDeleteProperty(display, xwindow, _NET_WM_STATE); - } -} - -Uint32 -X11_GetNetWMState(_THIS, Window xwindow) -{ - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - Display *display = videodata->display; - Atom _NET_WM_STATE = videodata->_NET_WM_STATE; - Atom _NET_WM_STATE_HIDDEN = videodata->_NET_WM_STATE_HIDDEN; - Atom _NET_WM_STATE_FOCUSED = videodata->_NET_WM_STATE_FOCUSED; - Atom _NET_WM_STATE_MAXIMIZED_VERT = videodata->_NET_WM_STATE_MAXIMIZED_VERT; - Atom _NET_WM_STATE_MAXIMIZED_HORZ = videodata->_NET_WM_STATE_MAXIMIZED_HORZ; - Atom _NET_WM_STATE_FULLSCREEN = videodata->_NET_WM_STATE_FULLSCREEN; - Atom actualType; - int actualFormat; - unsigned long i, numItems, bytesAfter; - unsigned char *propertyValue = NULL; - long maxLength = 1024; - Uint32 flags = 0; - - if (X11_XGetWindowProperty(display, xwindow, _NET_WM_STATE, - 0l, maxLength, False, XA_ATOM, &actualType, - &actualFormat, &numItems, &bytesAfter, - &propertyValue) == Success) { - Atom *atoms = (Atom *) propertyValue; - int maximized = 0; - int fullscreen = 0; - - for (i = 0; i < numItems; ++i) { - if (atoms[i] == _NET_WM_STATE_HIDDEN) { - flags |= SDL_WINDOW_HIDDEN; - } else if (atoms[i] == _NET_WM_STATE_FOCUSED) { - flags |= SDL_WINDOW_INPUT_FOCUS; - } else if (atoms[i] == _NET_WM_STATE_MAXIMIZED_VERT) { - maximized |= 1; - } else if (atoms[i] == _NET_WM_STATE_MAXIMIZED_HORZ) { - maximized |= 2; - } else if ( atoms[i] == _NET_WM_STATE_FULLSCREEN) { - fullscreen = 1; - } - } - if (maximized == 3) { - flags |= SDL_WINDOW_MAXIMIZED; - } - - if (fullscreen == 1) { - flags |= SDL_WINDOW_FULLSCREEN; - } - X11_XFree(propertyValue); - } - - /* FIXME, check the size hints for resizable */ - /* flags |= SDL_WINDOW_RESIZABLE; */ - - return flags; -} - -static int -SetupWindowData(_THIS, SDL_Window * window, Window w, BOOL created) -{ - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - SDL_WindowData *data; - int numwindows = videodata->numwindows; - int windowlistlength = videodata->windowlistlength; - SDL_WindowData **windowlist = videodata->windowlist; - - /* Allocate the window data */ - data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data)); - if (!data) { - return SDL_OutOfMemory(); - } - data->window = window; - data->xwindow = w; -#ifdef X_HAVE_UTF8_STRING - if (SDL_X11_HAVE_UTF8 && videodata->im) { - data->ic = - X11_XCreateIC(videodata->im, XNClientWindow, w, XNFocusWindow, w, - XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - NULL); - } -#endif - data->created = created; - data->videodata = videodata; - - /* Associate the data with the window */ - - if (numwindows < windowlistlength) { - windowlist[numwindows] = data; - videodata->numwindows++; - } else { - windowlist = - (SDL_WindowData **) SDL_realloc(windowlist, - (numwindows + - 1) * sizeof(*windowlist)); - if (!windowlist) { - SDL_free(data); - return SDL_OutOfMemory(); - } - windowlist[numwindows] = data; - videodata->numwindows++; - videodata->windowlistlength++; - videodata->windowlist = windowlist; - } - - /* Fill in the SDL window with the window data */ - { - XWindowAttributes attrib; - - X11_XGetWindowAttributes(data->videodata->display, w, &attrib); - window->x = attrib.x; - window->y = attrib.y; - window->w = attrib.width; - window->h = attrib.height; - if (attrib.map_state != IsUnmapped) { - window->flags |= SDL_WINDOW_SHOWN; - } else { - window->flags &= ~SDL_WINDOW_SHOWN; - } - data->visual = attrib.visual; - data->colormap = attrib.colormap; - } - - window->flags |= X11_GetNetWMState(_this, w); - - { - Window FocalWindow; - int RevertTo=0; - X11_XGetInputFocus(data->videodata->display, &FocalWindow, &RevertTo); - if (FocalWindow==w) - { - window->flags |= SDL_WINDOW_INPUT_FOCUS; - } - - if (window->flags & SDL_WINDOW_INPUT_FOCUS) { - SDL_SetKeyboardFocus(data->window); - } - - if (window->flags & SDL_WINDOW_INPUT_GRABBED) { - /* Tell x11 to clip mouse */ - } - } - - /* All done! */ - window->driverdata = data; - return 0; -} - -static void -SetWindowBordered(Display *display, int screen, Window window, SDL_bool border) -{ - /* - * this code used to check for KWM_WIN_DECORATION, but KDE hasn't - * supported it for years and years. It now respects _MOTIF_WM_HINTS. - * Gnome is similar: just use the Motif atom. - */ - - Atom WM_HINTS = X11_XInternAtom(display, "_MOTIF_WM_HINTS", True); - if (WM_HINTS != None) { - /* Hints used by Motif compliant window managers */ - struct - { - unsigned long flags; - unsigned long functions; - unsigned long decorations; - long input_mode; - unsigned long status; - } MWMHints = { - (1L << 1), 0, border ? 1 : 0, 0, 0 - }; - - X11_XChangeProperty(display, window, WM_HINTS, WM_HINTS, 32, - PropModeReplace, (unsigned char *) &MWMHints, - sizeof(MWMHints) / sizeof(long)); - } else { /* set the transient hints instead, if necessary */ - X11_XSetTransientForHint(display, window, RootWindow(display, screen)); - } -} - -int -X11_CreateWindow(_THIS, SDL_Window * window) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - SDL_DisplayData *displaydata = - (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata; - SDL_WindowData *windowdata; - Display *display = data->display; - int screen = displaydata->screen; - Visual *visual; - int depth; - XSetWindowAttributes xattr; - Window w; - XSizeHints *sizehints; - XWMHints *wmhints; - XClassHint *classhints; - Atom _NET_WM_BYPASS_COMPOSITOR; - Atom _NET_WM_WINDOW_TYPE; - Atom wintype; - const char *wintype_name = NULL; - int compositor = 1; - Atom _NET_WM_PID; - Atom XdndAware, xdnd_version = 5; - long fevent = 0; - -#if SDL_VIDEO_OPENGL_GLX || SDL_VIDEO_OPENGL_EGL - if ((window->flags & SDL_WINDOW_OPENGL) && - !SDL_getenv("SDL_VIDEO_X11_VISUALID")) { - XVisualInfo *vinfo = NULL; - -#if SDL_VIDEO_OPENGL_EGL - if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES -#if SDL_VIDEO_OPENGL_GLX - && ( !_this->gl_data || ! _this->gl_data->HAS_GLX_EXT_create_context_es2_profile ) -#endif - ) { - vinfo = X11_GLES_GetVisual(_this, display, screen); - } else -#endif - { -#if SDL_VIDEO_OPENGL_GLX - vinfo = X11_GL_GetVisual(_this, display, screen); -#endif - } - - if (!vinfo) { - return -1; - } - visual = vinfo->visual; - depth = vinfo->depth; - X11_XFree(vinfo); - } else -#endif - { - visual = displaydata->visual; - depth = displaydata->depth; - } - - xattr.override_redirect = ((window->flags & SDL_WINDOW_TOOLTIP) || (window->flags & SDL_WINDOW_POPUP_MENU)) ? True : False; - xattr.background_pixmap = None; - xattr.border_pixel = 0; - - if (visual->class == DirectColor) { - XColor *colorcells; - int i; - int ncolors; - int rmax, gmax, bmax; - int rmask, gmask, bmask; - int rshift, gshift, bshift; - - xattr.colormap = - X11_XCreateColormap(display, RootWindow(display, screen), - visual, AllocAll); - - /* If we can't create a colormap, then we must die */ - if (!xattr.colormap) { - return SDL_SetError("Could not create writable colormap"); - } - - /* OK, we got a colormap, now fill it in as best as we can */ - colorcells = SDL_malloc(visual->map_entries * sizeof(XColor)); - if (!colorcells) { - return SDL_OutOfMemory(); - } - ncolors = visual->map_entries; - rmax = 0xffff; - gmax = 0xffff; - bmax = 0xffff; - - rshift = 0; - rmask = visual->red_mask; - while (0 == (rmask & 1)) { - rshift++; - rmask >>= 1; - } - - gshift = 0; - gmask = visual->green_mask; - while (0 == (gmask & 1)) { - gshift++; - gmask >>= 1; - } - - bshift = 0; - bmask = visual->blue_mask; - while (0 == (bmask & 1)) { - bshift++; - bmask >>= 1; - } - - /* build the color table pixel values */ - for (i = 0; i < ncolors; i++) { - Uint32 red = (rmax * i) / (ncolors - 1); - Uint32 green = (gmax * i) / (ncolors - 1); - Uint32 blue = (bmax * i) / (ncolors - 1); - - Uint32 rbits = (rmask * i) / (ncolors - 1); - Uint32 gbits = (gmask * i) / (ncolors - 1); - Uint32 bbits = (bmask * i) / (ncolors - 1); - - Uint32 pix = - (rbits << rshift) | (gbits << gshift) | (bbits << bshift); - - colorcells[i].pixel = pix; - - colorcells[i].red = red; - colorcells[i].green = green; - colorcells[i].blue = blue; - - colorcells[i].flags = DoRed | DoGreen | DoBlue; - } - - X11_XStoreColors(display, xattr.colormap, colorcells, ncolors); - - SDL_free(colorcells); - } else { - xattr.colormap = - X11_XCreateColormap(display, RootWindow(display, screen), - visual, AllocNone); - } - - w = X11_XCreateWindow(display, RootWindow(display, screen), - window->x, window->y, window->w, window->h, - 0, depth, InputOutput, visual, - (CWOverrideRedirect | CWBackPixmap | CWBorderPixel | - CWColormap), &xattr); - if (!w) { - return SDL_SetError("Couldn't create window"); - } - - SetWindowBordered(display, screen, w, - (window->flags & SDL_WINDOW_BORDERLESS) == 0); - - sizehints = X11_XAllocSizeHints(); - /* Setup the normal size hints */ - sizehints->flags = 0; - if (!(window->flags & SDL_WINDOW_RESIZABLE)) { - sizehints->min_width = sizehints->max_width = window->w; - sizehints->min_height = sizehints->max_height = window->h; - sizehints->flags |= (PMaxSize | PMinSize); - } - sizehints->x = window->x; - sizehints->y = window->y; - sizehints->flags |= USPosition; - - /* Setup the input hints so we get keyboard input */ - wmhints = X11_XAllocWMHints(); - wmhints->input = True; - wmhints->window_group = data->window_group; - wmhints->flags = InputHint | WindowGroupHint; - - /* Setup the class hints so we can get an icon (AfterStep) */ - classhints = X11_XAllocClassHint(); - classhints->res_name = data->classname; - classhints->res_class = data->classname; - - /* Set the size, input and class hints, and define WM_CLIENT_MACHINE and WM_LOCALE_NAME */ - X11_XSetWMProperties(display, w, NULL, NULL, NULL, 0, sizehints, wmhints, classhints); - - X11_XFree(sizehints); - X11_XFree(wmhints); - X11_XFree(classhints); - /* Set the PID related to the window for the given hostname, if possible */ - if (data->pid > 0) { - long pid = (long) data->pid; - _NET_WM_PID = X11_XInternAtom(display, "_NET_WM_PID", False); - X11_XChangeProperty(display, w, _NET_WM_PID, XA_CARDINAL, 32, PropModeReplace, - (unsigned char *) &pid, 1); - } - - /* Set the window manager state */ - X11_SetNetWMState(_this, w, window->flags); - - compositor = 2; /* don't disable compositing except for "normal" windows */ - - if (window->flags & SDL_WINDOW_UTILITY) { - wintype_name = "_NET_WM_WINDOW_TYPE_UTILITY"; - } else if (window->flags & SDL_WINDOW_TOOLTIP) { - wintype_name = "_NET_WM_WINDOW_TYPE_TOOLTIP"; - } else if (window->flags & SDL_WINDOW_POPUP_MENU) { - wintype_name = "_NET_WM_WINDOW_TYPE_POPUP_MENU"; - } else { - wintype_name = "_NET_WM_WINDOW_TYPE_NORMAL"; - compositor = 1; /* disable compositing for "normal" windows */ - } - - /* Let the window manager know what type of window we are. */ - _NET_WM_WINDOW_TYPE = X11_XInternAtom(display, "_NET_WM_WINDOW_TYPE", False); - wintype = X11_XInternAtom(display, wintype_name, False); - X11_XChangeProperty(display, w, _NET_WM_WINDOW_TYPE, XA_ATOM, 32, - PropModeReplace, (unsigned char *)&wintype, 1); - - _NET_WM_BYPASS_COMPOSITOR = X11_XInternAtom(display, "_NET_WM_BYPASS_COMPOSITOR", False); - X11_XChangeProperty(display, w, _NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32, - PropModeReplace, - (unsigned char *)&compositor, 1); - - { - Atom protocols[3]; - int proto_count = 0; - - protocols[proto_count++] = data->WM_DELETE_WINDOW; /* Allow window to be deleted by the WM */ - protocols[proto_count++] = data->WM_TAKE_FOCUS; /* Since we will want to set input focus explicitly */ - - /* Default to using ping if there is no hint */ - if (SDL_GetHintBoolean(SDL_HINT_VIDEO_X11_NET_WM_PING, SDL_TRUE)) { - protocols[proto_count++] = data->_NET_WM_PING; /* Respond so WM knows we're alive */ - } - - SDL_assert(proto_count <= sizeof(protocols) / sizeof(protocols[0])); - - X11_XSetWMProtocols(display, w, protocols, proto_count); - } - - if (SetupWindowData(_this, window, w, SDL_TRUE) < 0) { - X11_XDestroyWindow(display, w); - return -1; - } - windowdata = (SDL_WindowData *) window->driverdata; - -#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2 - if ((window->flags & SDL_WINDOW_OPENGL) && - _this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES -#if SDL_VIDEO_OPENGL_GLX - && ( !_this->gl_data || ! _this->gl_data->HAS_GLX_EXT_create_context_es2_profile ) -#endif - ) { -#if SDL_VIDEO_OPENGL_EGL - if (!_this->egl_data) { - X11_XDestroyWindow(display, w); - return -1; - } - - /* Create the GLES window surface */ - windowdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) w); - - if (windowdata->egl_surface == EGL_NO_SURFACE) { - X11_XDestroyWindow(display, w); - return SDL_SetError("Could not create GLES window surface"); - } -#else - return SDL_SetError("Could not create GLES window surface (no EGL support available)"); -#endif /* SDL_VIDEO_OPENGL_EGL */ - } -#endif - - -#ifdef X_HAVE_UTF8_STRING - if (SDL_X11_HAVE_UTF8 && windowdata->ic) { - X11_XGetICValues(windowdata->ic, XNFilterEvents, &fevent, NULL); - } -#endif - - X11_Xinput2SelectTouch(_this, window); - - X11_XSelectInput(display, w, - (FocusChangeMask | EnterWindowMask | LeaveWindowMask | - ExposureMask | ButtonPressMask | ButtonReleaseMask | - PointerMotionMask | KeyPressMask | KeyReleaseMask | - PropertyChangeMask | StructureNotifyMask | - KeymapStateMask | fevent)); - - XdndAware = X11_XInternAtom(display, "XdndAware", False); - X11_XChangeProperty(display, w, XdndAware, XA_ATOM, 32, - PropModeReplace, - (unsigned char*)&xdnd_version, 1); - - X11_XFlush(display); - - return 0; -} - -int -X11_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) -{ - Window w = (Window) data; - - window->title = X11_GetWindowTitle(_this, w); - - if (SetupWindowData(_this, window, w, SDL_FALSE) < 0) { - return -1; - } - return 0; -} - -char * -X11_GetWindowTitle(_THIS, Window xwindow) -{ - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - Display *display = data->display; - int status, real_format; - Atom real_type; - unsigned long items_read, items_left; - unsigned char *propdata; - char *title = NULL; - - status = X11_XGetWindowProperty(display, xwindow, data->_NET_WM_NAME, - 0L, 8192L, False, data->UTF8_STRING, &real_type, &real_format, - &items_read, &items_left, &propdata); - if (status == Success && propdata) { - title = SDL_strdup(SDL_static_cast(char*, propdata)); - X11_XFree(propdata); - } else { - status = X11_XGetWindowProperty(display, xwindow, XA_WM_NAME, - 0L, 8192L, False, XA_STRING, &real_type, &real_format, - &items_read, &items_left, &propdata); - if (status == Success && propdata) { - title = SDL_iconv_string("UTF-8", "", SDL_static_cast(char*, propdata), items_read+1); - X11_XFree(propdata); - } else { - title = SDL_strdup(""); - } - } - return title; -} - -void -X11_SetWindowTitle(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - XTextProperty titleprop; - Status status; - const char *title = window->title ? window->title : ""; - char *title_locale = NULL; - -#ifdef X_HAVE_UTF8_STRING - Atom _NET_WM_NAME = data->videodata->_NET_WM_NAME; -#endif - - title_locale = SDL_iconv_utf8_locale(title); - if (!title_locale) { - SDL_OutOfMemory(); - return; - } - - status = X11_XStringListToTextProperty(&title_locale, 1, &titleprop); - SDL_free(title_locale); - if (status) { - X11_XSetTextProperty(display, data->xwindow, &titleprop, XA_WM_NAME); - X11_XFree(titleprop.value); - } -#ifdef X_HAVE_UTF8_STRING - if (SDL_X11_HAVE_UTF8) { - status = X11_Xutf8TextListToTextProperty(display, (char **) &title, 1, - XUTF8StringStyle, &titleprop); - if (status == Success) { - X11_XSetTextProperty(display, data->xwindow, &titleprop, - _NET_WM_NAME); - X11_XFree(titleprop.value); - } - } -#endif - - X11_XFlush(display); -} - -void -X11_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - Atom _NET_WM_ICON = data->videodata->_NET_WM_ICON; - - if (icon) { - int propsize; - long *propdata; - - /* Set the _NET_WM_ICON property */ - SDL_assert(icon->format->format == SDL_PIXELFORMAT_ARGB8888); - propsize = 2 + (icon->w * icon->h); - propdata = SDL_malloc(propsize * sizeof(long)); - if (propdata) { - int x, y; - Uint32 *src; - long *dst; - - propdata[0] = icon->w; - propdata[1] = icon->h; - dst = &propdata[2]; - for (y = 0; y < icon->h; ++y) { - src = (Uint32*)((Uint8*)icon->pixels + y * icon->pitch); - for (x = 0; x < icon->w; ++x) { - *dst++ = *src++; - } - } - X11_XChangeProperty(display, data->xwindow, _NET_WM_ICON, XA_CARDINAL, - 32, PropModeReplace, (unsigned char *) propdata, - propsize); - } - SDL_free(propdata); - } else { - X11_XDeleteProperty(display, data->xwindow, _NET_WM_ICON); - } - X11_XFlush(display); -} - -void -X11_SetWindowPosition(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - - X11_XMoveWindow(display, data->xwindow, window->x - data->border_left, window->y - data->border_top); - X11_XFlush(display); -} - -void -X11_SetWindowMinimumSize(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - - if (window->flags & SDL_WINDOW_RESIZABLE) { - XSizeHints *sizehints = X11_XAllocSizeHints(); - long userhints; - - X11_XGetWMNormalHints(display, data->xwindow, sizehints, &userhints); - - sizehints->min_width = window->min_w; - sizehints->min_height = window->min_h; - sizehints->flags |= PMinSize; - - X11_XSetWMNormalHints(display, data->xwindow, sizehints); - - X11_XFree(sizehints); - - /* See comment in X11_SetWindowSize. */ - X11_XResizeWindow(display, data->xwindow, window->w, window->h); - X11_XMoveWindow(display, data->xwindow, window->x - data->border_left, window->y - data->border_top); - X11_XRaiseWindow(display, data->xwindow); - } - - X11_XFlush(display); -} - -void -X11_SetWindowMaximumSize(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - - if (window->flags & SDL_WINDOW_RESIZABLE) { - XSizeHints *sizehints = X11_XAllocSizeHints(); - long userhints; - - X11_XGetWMNormalHints(display, data->xwindow, sizehints, &userhints); - - sizehints->max_width = window->max_w; - sizehints->max_height = window->max_h; - sizehints->flags |= PMaxSize; - - X11_XSetWMNormalHints(display, data->xwindow, sizehints); - - X11_XFree(sizehints); - - /* See comment in X11_SetWindowSize. */ - X11_XResizeWindow(display, data->xwindow, window->w, window->h); - X11_XMoveWindow(display, data->xwindow, window->x - data->border_left, window->y - data->border_top); - X11_XRaiseWindow(display, data->xwindow); - } - - X11_XFlush(display); -} - -void -X11_SetWindowSize(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - - if (SDL_IsShapedWindow(window)) { - X11_ResizeWindowShape(window); - } - if (!(window->flags & SDL_WINDOW_RESIZABLE)) { - /* Apparently, if the X11 Window is set to a 'non-resizable' window, you cannot resize it using the X11_XResizeWindow, thus - we must set the size hints to adjust the window size. */ - XSizeHints *sizehints = X11_XAllocSizeHints(); - long userhints; - - X11_XGetWMNormalHints(display, data->xwindow, sizehints, &userhints); - - sizehints->min_width = sizehints->max_width = window->w; - sizehints->min_height = sizehints->max_height = window->h; - sizehints->flags |= PMinSize | PMaxSize; - - X11_XSetWMNormalHints(display, data->xwindow, sizehints); - - X11_XFree(sizehints); - - /* From Pierre-Loup: - WMs each have their little quirks with that. When you change the - size hints, they get a ConfigureNotify event with the - WM_NORMAL_SIZE_HINTS Atom. They all save the hints then, but they - don't all resize the window right away to enforce the new hints. - - Some of them resize only after: - - A user-initiated move or resize - - A code-initiated move or resize - - Hiding & showing window (Unmap & map) - - The following move & resize seems to help a lot of WMs that didn't - properly update after the hints were changed. We don't do a - hide/show, because there are supposedly subtle problems with doing so - and transitioning from windowed to fullscreen in Unity. - */ - X11_XResizeWindow(display, data->xwindow, window->w, window->h); - X11_XMoveWindow(display, data->xwindow, window->x - data->border_left, window->y - data->border_top); - X11_XRaiseWindow(display, data->xwindow); - } else { - X11_XResizeWindow(display, data->xwindow, window->w, window->h); - } - - X11_XFlush(display); -} - -int -X11_GetWindowBordersSize(_THIS, SDL_Window * window, int *top, int *left, int *bottom, int *right) -{ - SDL_WindowData *data = (SDL_WindowData *)window->driverdata; - - *left = data->border_left; - *right = data->border_right; - *top = data->border_top; - *bottom = data->border_bottom; - - return 0; -} - -int -X11_SetWindowOpacity(_THIS, SDL_Window * window, float opacity) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - Atom _NET_WM_WINDOW_OPACITY = data->videodata->_NET_WM_WINDOW_OPACITY; - - if (opacity == 1.0f) { - X11_XDeleteProperty(display, data->xwindow, _NET_WM_WINDOW_OPACITY); - } else { - const Uint32 FullyOpaque = 0xFFFFFFFF; - const long alpha = (long) ((double)opacity * (double)FullyOpaque); - X11_XChangeProperty(display, data->xwindow, _NET_WM_WINDOW_OPACITY, XA_CARDINAL, 32, - PropModeReplace, (unsigned char *)&alpha, 1); - } - - return 0; -} - -int -X11_SetWindowModalFor(_THIS, SDL_Window * modal_window, SDL_Window * parent_window) { - SDL_WindowData *data = (SDL_WindowData *) modal_window->driverdata; - SDL_WindowData *parent_data = (SDL_WindowData *) parent_window->driverdata; - Display *display = data->videodata->display; - - X11_XSetTransientForHint(display, data->xwindow, parent_data->xwindow); - return 0; -} - -int -X11_SetWindowInputFocus(_THIS, SDL_Window * window) -{ - if (X11_IsWindowMapped(_this, window)) { - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - X11_XSetInputFocus(display, data->xwindow, RevertToNone, CurrentTime); - X11_XFlush(display); - return 0; - } - return -1; -} - -void -X11_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) -{ - const SDL_bool focused = ((window->flags & SDL_WINDOW_INPUT_FOCUS) != 0); - const SDL_bool visible = ((window->flags & SDL_WINDOW_HIDDEN) == 0); - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_DisplayData *displaydata = - (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata; - Display *display = data->videodata->display; - XEvent event; - - SetWindowBordered(display, displaydata->screen, data->xwindow, bordered); - X11_XFlush(display); - - if (visible) { - XWindowAttributes attr; - do { - X11_XSync(display, False); - X11_XGetWindowAttributes(display, data->xwindow, &attr); - } while (attr.map_state != IsViewable); - - if (focused) { - X11_XSetInputFocus(display, data->xwindow, RevertToParent, CurrentTime); - } - } - - /* make sure these don't make it to the real event queue if they fired here. */ - X11_XSync(display, False); - X11_XCheckIfEvent(display, &event, &isUnmapNotify, (XPointer)&data->xwindow); - X11_XCheckIfEvent(display, &event, &isMapNotify, (XPointer)&data->xwindow); -} - -void -X11_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - - XSizeHints *sizehints = X11_XAllocSizeHints(); - long userhints; - - X11_XGetWMNormalHints(display, data->xwindow, sizehints, &userhints); - - if (resizable) { - /* FIXME: Is there a better way to get max window size from X? -flibit */ - const int maxsize = 0x7FFFFFFF; - sizehints->min_width = window->min_w; - sizehints->min_height = window->min_h; - sizehints->max_width = (window->max_w == 0) ? maxsize : window->max_w; - sizehints->max_height = (window->max_h == 0) ? maxsize : window->max_h; - } else { - sizehints->min_width = window->w; - sizehints->min_height = window->h; - sizehints->max_width = window->w; - sizehints->max_height = window->h; - } - sizehints->flags |= PMinSize | PMaxSize; - - X11_XSetWMNormalHints(display, data->xwindow, sizehints); - - X11_XFree(sizehints); - - /* See comment in X11_SetWindowSize. */ - X11_XResizeWindow(display, data->xwindow, window->w, window->h); - X11_XMoveWindow(display, data->xwindow, window->x - data->border_left, window->y - data->border_top); - X11_XRaiseWindow(display, data->xwindow); - - X11_XFlush(display); -} - -void -X11_ShowWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - XEvent event; - - if (!X11_IsWindowMapped(_this, window)) { - X11_XMapRaised(display, data->xwindow); - /* Blocking wait for "MapNotify" event. - * We use X11_XIfEvent because pXWindowEvent takes a mask rather than a type, - * and XCheckTypedWindowEvent doesn't block */ - X11_XIfEvent(display, &event, &isMapNotify, (XPointer)&data->xwindow); - X11_XFlush(display); - } - - if (!data->videodata->net_wm) { - /* no WM means no FocusIn event, which confuses us. Force it. */ - X11_XSetInputFocus(display, data->xwindow, RevertToNone, CurrentTime); - X11_XFlush(display); - } -} - -void -X11_HideWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_DisplayData *displaydata = (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata; - Display *display = data->videodata->display; - XEvent event; - - if (X11_IsWindowMapped(_this, window)) { - X11_XWithdrawWindow(display, data->xwindow, displaydata->screen); - /* Blocking wait for "UnmapNotify" event */ - X11_XIfEvent(display, &event, &isUnmapNotify, (XPointer)&data->xwindow); - X11_XFlush(display); - } -} - -static void -SetWindowActive(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_DisplayData *displaydata = - (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata; - Display *display = data->videodata->display; - Atom _NET_ACTIVE_WINDOW = data->videodata->_NET_ACTIVE_WINDOW; - - if (X11_IsWindowMapped(_this, window)) { - XEvent e; - - /*printf("SDL Window %p: sending _NET_ACTIVE_WINDOW with timestamp %lu\n", window, data->user_time);*/ - - SDL_zero(e); - e.xany.type = ClientMessage; - e.xclient.message_type = _NET_ACTIVE_WINDOW; - e.xclient.format = 32; - e.xclient.window = data->xwindow; - e.xclient.data.l[0] = 1; /* source indication. 1 = application */ - e.xclient.data.l[1] = data->user_time; - e.xclient.data.l[2] = 0; - - X11_XSendEvent(display, RootWindow(display, displaydata->screen), 0, - SubstructureNotifyMask | SubstructureRedirectMask, &e); - - X11_XFlush(display); - } -} - -void -X11_RaiseWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - - X11_XRaiseWindow(display, data->xwindow); - SetWindowActive(_this, window); - X11_XFlush(display); -} - -static void -SetWindowMaximized(_THIS, SDL_Window * window, SDL_bool maximized) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_DisplayData *displaydata = - (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata; - Display *display = data->videodata->display; - Atom _NET_WM_STATE = data->videodata->_NET_WM_STATE; - Atom _NET_WM_STATE_MAXIMIZED_VERT = data->videodata->_NET_WM_STATE_MAXIMIZED_VERT; - Atom _NET_WM_STATE_MAXIMIZED_HORZ = data->videodata->_NET_WM_STATE_MAXIMIZED_HORZ; - - if (maximized) { - window->flags |= SDL_WINDOW_MAXIMIZED; - } else { - window->flags &= ~SDL_WINDOW_MAXIMIZED; - } - - if (X11_IsWindowMapped(_this, window)) { - XEvent e; - - SDL_zero(e); - e.xany.type = ClientMessage; - e.xclient.message_type = _NET_WM_STATE; - e.xclient.format = 32; - e.xclient.window = data->xwindow; - e.xclient.data.l[0] = - maximized ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE; - e.xclient.data.l[1] = _NET_WM_STATE_MAXIMIZED_VERT; - e.xclient.data.l[2] = _NET_WM_STATE_MAXIMIZED_HORZ; - e.xclient.data.l[3] = 0l; - - X11_XSendEvent(display, RootWindow(display, displaydata->screen), 0, - SubstructureNotifyMask | SubstructureRedirectMask, &e); - } else { - X11_SetNetWMState(_this, data->xwindow, window->flags); - } - X11_XFlush(display); -} - -void -X11_MaximizeWindow(_THIS, SDL_Window * window) -{ - SetWindowMaximized(_this, window, SDL_TRUE); -} - -void -X11_MinimizeWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_DisplayData *displaydata = - (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata; - Display *display = data->videodata->display; - - X11_XIconifyWindow(display, data->xwindow, displaydata->screen); - X11_XFlush(display); -} - -void -X11_RestoreWindow(_THIS, SDL_Window * window) -{ - SetWindowMaximized(_this, window, SDL_FALSE); - X11_ShowWindow(_this, window); - SetWindowActive(_this, window); -} - -/* This asks the Window Manager to handle fullscreen for us. This is the modern way. */ -static void -X11_SetWindowFullscreenViaWM(_THIS, SDL_Window * window, SDL_VideoDisplay * _display, SDL_bool fullscreen) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_DisplayData *displaydata = (SDL_DisplayData *) _display->driverdata; - Display *display = data->videodata->display; - Atom _NET_WM_STATE = data->videodata->_NET_WM_STATE; - Atom _NET_WM_STATE_FULLSCREEN = data->videodata->_NET_WM_STATE_FULLSCREEN; - - if (X11_IsWindowMapped(_this, window)) { - XEvent e; - - if (!(window->flags & SDL_WINDOW_RESIZABLE)) { - /* Compiz refuses fullscreen toggle if we're not resizable, so update the hints so we - can be resized to the fullscreen resolution (or reset so we're not resizable again) */ - XSizeHints *sizehints = X11_XAllocSizeHints(); - long flags = 0; - X11_XGetWMNormalHints(display, data->xwindow, sizehints, &flags); - /* set the resize flags on */ - if (fullscreen) { - /* we are going fullscreen so turn the flags off */ - sizehints->flags &= ~(PMinSize | PMaxSize); - } else { - /* Reset the min/max width height to make the window non-resizable again */ - sizehints->flags |= PMinSize | PMaxSize; - sizehints->min_width = sizehints->max_width = window->windowed.w; - sizehints->min_height = sizehints->max_height = window->windowed.h; - } - X11_XSetWMNormalHints(display, data->xwindow, sizehints); - X11_XFree(sizehints); - } - - SDL_zero(e); - e.xany.type = ClientMessage; - e.xclient.message_type = _NET_WM_STATE; - e.xclient.format = 32; - e.xclient.window = data->xwindow; - e.xclient.data.l[0] = - fullscreen ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE; - e.xclient.data.l[1] = _NET_WM_STATE_FULLSCREEN; - e.xclient.data.l[3] = 0l; - - X11_XSendEvent(display, RootWindow(display, displaydata->screen), 0, - SubstructureNotifyMask | SubstructureRedirectMask, &e); - - /* Fullscreen windows sometimes end up being marked maximized by - window managers. Force it back to how we expect it to be. */ - if (!fullscreen && ((window->flags & SDL_WINDOW_MAXIMIZED) == 0)) { - SDL_zero(e); - e.xany.type = ClientMessage; - e.xclient.message_type = _NET_WM_STATE; - e.xclient.format = 32; - e.xclient.window = data->xwindow; - e.xclient.data.l[0] = _NET_WM_STATE_REMOVE; - e.xclient.data.l[1] = data->videodata->_NET_WM_STATE_MAXIMIZED_VERT; - e.xclient.data.l[2] = data->videodata->_NET_WM_STATE_MAXIMIZED_HORZ; - e.xclient.data.l[3] = 0l; - X11_XSendEvent(display, RootWindow(display, displaydata->screen), 0, - SubstructureNotifyMask | SubstructureRedirectMask, &e); - } - } else { - Uint32 flags; - - flags = window->flags; - if (fullscreen) { - flags |= SDL_WINDOW_FULLSCREEN; - } else { - flags &= ~SDL_WINDOW_FULLSCREEN; - } - X11_SetNetWMState(_this, data->xwindow, flags); - } - - if (data->visual->class == DirectColor) { - if ( fullscreen ) { - X11_XInstallColormap(display, data->colormap); - } else { - X11_XUninstallColormap(display, data->colormap); - } - } - - X11_XFlush(display); -} - -/* This handles fullscreen itself, outside the Window Manager. */ -static void -X11_BeginWindowFullscreenLegacy(_THIS, SDL_Window * window, SDL_VideoDisplay * _display) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_DisplayData *displaydata = (SDL_DisplayData *) _display->driverdata; - Visual *visual = data->visual; - Display *display = data->videodata->display; - const int screen = displaydata->screen; - Window root = RootWindow(display, screen); - const int def_vis = (visual == DefaultVisual(display, screen)); - unsigned long xattrmask = 0; - XSetWindowAttributes xattr; - XEvent ev; - SDL_Rect rect; - - if ( data->fswindow ) { - return; /* already fullscreen, I hope. */ - } - - X11_GetDisplayBounds(_this, _display, &rect); - - SDL_zero(xattr); - xattr.override_redirect = True; - xattrmask |= CWOverrideRedirect; - xattr.background_pixel = def_vis ? BlackPixel(display, screen) : 0; - xattrmask |= CWBackPixel; - xattr.border_pixel = 0; - xattrmask |= CWBorderPixel; - xattr.colormap = data->colormap; - xattrmask |= CWColormap; - - data->fswindow = X11_XCreateWindow(display, root, - rect.x, rect.y, rect.w, rect.h, 0, - displaydata->depth, InputOutput, - visual, xattrmask, &xattr); - - X11_XSelectInput(display, data->fswindow, StructureNotifyMask); - X11_XSetWindowBackground(display, data->fswindow, 0); - X11_XInstallColormap(display, data->colormap); - X11_XClearWindow(display, data->fswindow); - X11_XMapRaised(display, data->fswindow); - - /* Make sure the fswindow is in view by warping mouse to the corner */ - X11_XUngrabPointer(display, CurrentTime); - X11_XWarpPointer(display, None, root, 0, 0, 0, 0, rect.x, rect.y); - - /* Wait to be mapped, filter Unmap event out if it arrives. */ - X11_XIfEvent(display, &ev, &isMapNotify, (XPointer)&data->fswindow); - X11_XCheckIfEvent(display, &ev, &isUnmapNotify, (XPointer)&data->fswindow); - -#if SDL_VIDEO_DRIVER_X11_XVIDMODE - if ( displaydata->use_vidmode ) { - X11_XF86VidModeLockModeSwitch(display, screen, True); - } -#endif - - SetWindowBordered(display, displaydata->screen, data->xwindow, SDL_FALSE); - - /* Center actual window within our cover-the-screen window. */ - X11_XReparentWindow(display, data->xwindow, data->fswindow, - (rect.w - window->w) / 2, (rect.h - window->h) / 2); - - /* Move the mouse to the upper left to make sure it's on-screen */ - X11_XWarpPointer(display, None, root, 0, 0, 0, 0, rect.x, rect.y); - - /* Center mouse in the fullscreen window. */ - rect.x += (rect.w / 2); - rect.y += (rect.h / 2); - X11_XWarpPointer(display, None, root, 0, 0, 0, 0, rect.x, rect.y); - - /* Wait to be mapped, filter Unmap event out if it arrives. */ - X11_XIfEvent(display, &ev, &isMapNotify, (XPointer)&data->xwindow); - X11_XCheckIfEvent(display, &ev, &isUnmapNotify, (XPointer)&data->xwindow); - - SDL_UpdateWindowGrab(window); -} - -static void -X11_EndWindowFullscreenLegacy(_THIS, SDL_Window * window, SDL_VideoDisplay * _display) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_DisplayData *displaydata = (SDL_DisplayData *) _display->driverdata; - Display *display = data->videodata->display; - const int screen = displaydata->screen; - Window root = RootWindow(display, screen); - Window fswindow = data->fswindow; - XEvent ev; - - if (!data->fswindow) { - return; /* already not fullscreen, I hope. */ - } - - data->fswindow = None; - -#if SDL_VIDEO_DRIVER_X11_VIDMODE - if ( displaydata->use_vidmode ) { - X11_XF86VidModeLockModeSwitch(display, screen, False); - } -#endif - - SDL_UpdateWindowGrab(window); - - X11_XReparentWindow(display, data->xwindow, root, window->x, window->y); - - /* flush these events so they don't confuse normal event handling */ - X11_XSync(display, False); - X11_XCheckIfEvent(display, &ev, &isMapNotify, (XPointer)&data->xwindow); - X11_XCheckIfEvent(display, &ev, &isUnmapNotify, (XPointer)&data->xwindow); - - SetWindowBordered(display, screen, data->xwindow, - (window->flags & SDL_WINDOW_BORDERLESS) == 0); - - X11_XWithdrawWindow(display, fswindow, screen); - - /* Wait to be unmapped. */ - X11_XIfEvent(display, &ev, &isUnmapNotify, (XPointer)&fswindow); - X11_XDestroyWindow(display, fswindow); -} - - -void -X11_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * _display, SDL_bool fullscreen) -{ - /* !!! FIXME: SDL_Hint? */ - SDL_bool legacy = SDL_FALSE; - const char *env = SDL_getenv("SDL_VIDEO_X11_LEGACY_FULLSCREEN"); - if (env) { - legacy = SDL_atoi(env); - } else { - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; - SDL_DisplayData *displaydata = (SDL_DisplayData *) _display->driverdata; - if ( displaydata->use_vidmode ) { - legacy = SDL_TRUE; /* the new stuff only works with XRandR. */ - } else if ( !videodata->net_wm ) { - legacy = SDL_TRUE; /* The window manager doesn't support it */ - } else { - /* !!! FIXME: look at the window manager name, and blacklist certain ones? */ - /* http://stackoverflow.com/questions/758648/find-the-name-of-the-x-window-manager */ - legacy = SDL_FALSE; /* try the new way. */ - } - } - - if (legacy) { - if (fullscreen) { - X11_BeginWindowFullscreenLegacy(_this, window, _display); - } else { - X11_EndWindowFullscreenLegacy(_this, window, _display); - } - } else { - X11_SetWindowFullscreenViaWM(_this, window, _display, fullscreen); - } -} - - -int -X11_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - Visual *visual = data->visual; - Colormap colormap = data->colormap; - XColor *colorcells; - int ncolors; - int rmask, gmask, bmask; - int rshift, gshift, bshift; - int i; - - if (visual->class != DirectColor) { - return SDL_SetError("Window doesn't have DirectColor visual"); - } - - ncolors = visual->map_entries; - colorcells = SDL_malloc(ncolors * sizeof(XColor)); - if (!colorcells) { - return SDL_OutOfMemory(); - } - - rshift = 0; - rmask = visual->red_mask; - while (0 == (rmask & 1)) { - rshift++; - rmask >>= 1; - } - - gshift = 0; - gmask = visual->green_mask; - while (0 == (gmask & 1)) { - gshift++; - gmask >>= 1; - } - - bshift = 0; - bmask = visual->blue_mask; - while (0 == (bmask & 1)) { - bshift++; - bmask >>= 1; - } - - /* build the color table pixel values */ - for (i = 0; i < ncolors; i++) { - Uint32 rbits = (rmask * i) / (ncolors - 1); - Uint32 gbits = (gmask * i) / (ncolors - 1); - Uint32 bbits = (bmask * i) / (ncolors - 1); - Uint32 pix = (rbits << rshift) | (gbits << gshift) | (bbits << bshift); - - colorcells[i].pixel = pix; - - colorcells[i].red = ramp[(0 * 256) + i]; - colorcells[i].green = ramp[(1 * 256) + i]; - colorcells[i].blue = ramp[(2 * 256) + i]; - - colorcells[i].flags = DoRed | DoGreen | DoBlue; - } - - X11_XStoreColors(display, colormap, colorcells, ncolors); - X11_XFlush(display); - SDL_free(colorcells); - - return 0; -} - -void -X11_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - SDL_bool oldstyle_fullscreen; - SDL_bool grab_keyboard; - - /* ICCCM2.0-compliant window managers can handle fullscreen windows - If we're using XVidMode to change resolution we need to confine - the cursor so we don't pan around the virtual desktop. - */ - oldstyle_fullscreen = X11_IsWindowLegacyFullscreen(_this, window); - - if (oldstyle_fullscreen || grabbed) { - /* Try to grab the mouse */ - for (;;) { - int result = - X11_XGrabPointer(display, data->xwindow, True, 0, GrabModeAsync, - GrabModeAsync, data->xwindow, None, CurrentTime); - if (result == GrabSuccess) { - break; - } - SDL_Delay(50); - } - - /* Raise the window if we grab the mouse */ - X11_XRaiseWindow(display, data->xwindow); - - /* Now grab the keyboard */ - if (SDL_GetHintBoolean(SDL_HINT_GRAB_KEYBOARD, SDL_FALSE)) { - grab_keyboard = SDL_TRUE; - } else { - /* We need to do this with the old style override_redirect - fullscreen window otherwise we won't get keyboard focus. - */ - grab_keyboard = oldstyle_fullscreen; - } - if (grab_keyboard) { - X11_XGrabKeyboard(display, data->xwindow, True, GrabModeAsync, - GrabModeAsync, CurrentTime); - } - } else { - X11_XUngrabPointer(display, CurrentTime); - X11_XUngrabKeyboard(display, CurrentTime); - } - X11_XSync(display, False); -} - -void -X11_DestroyWindow(_THIS, SDL_Window * window) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - - if (data) { - SDL_VideoData *videodata = (SDL_VideoData *) data->videodata; - Display *display = videodata->display; - int numwindows = videodata->numwindows; - SDL_WindowData **windowlist = videodata->windowlist; - int i; - - if (windowlist) { - for (i = 0; i < numwindows; ++i) { - if (windowlist[i] && (windowlist[i]->window == window)) { - windowlist[i] = windowlist[numwindows - 1]; - windowlist[numwindows - 1] = NULL; - videodata->numwindows--; - break; - } - } - } -#ifdef X_HAVE_UTF8_STRING - if (data->ic) { - X11_XDestroyIC(data->ic); - } -#endif - if (data->created) { - X11_XDestroyWindow(display, data->xwindow); - X11_XFlush(display); - } - SDL_free(data); - } - window->driverdata = NULL; -} - -SDL_bool -X11_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; - - if (info->version.major == SDL_MAJOR_VERSION && - info->version.minor == SDL_MINOR_VERSION) { - info->subsystem = SDL_SYSWM_X11; - info->info.x11.display = display; - info->info.x11.window = data->xwindow; - return SDL_TRUE; - } else { - SDL_SetError("Application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return SDL_FALSE; - } -} - -int -X11_SetWindowHitTest(SDL_Window *window, SDL_bool enabled) -{ - return 0; /* just succeed, the real work is done elsewhere. */ -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11window.h b/3rdparty/SDL2/src/video/x11/SDL_x11window.h deleted file mode 100644 index 50a739dad9f..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11window.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11window_h -#define _SDL_x11window_h - -/* We need to queue the focus in/out changes because they may occur during - video mode changes and we can respond to them by triggering more mode - changes. -*/ -#define PENDING_FOCUS_TIME 200 - -#if SDL_VIDEO_OPENGL_EGL -#include <EGL/egl.h> -#endif - -typedef enum -{ - PENDING_FOCUS_NONE, - PENDING_FOCUS_IN, - PENDING_FOCUS_OUT -} PendingFocusEnum; - -typedef struct -{ - SDL_Window *window; - Window xwindow; - Window fswindow; /* used if we can't have the WM handle fullscreen. */ - Visual *visual; - Colormap colormap; -#ifndef NO_SHARED_MEMORY - /* MIT shared memory extension information */ - SDL_bool use_mitshm; - XShmSegmentInfo shminfo; -#endif - XImage *ximage; - GC gc; - XIC ic; - SDL_bool created; - int border_left; - int border_right; - int border_top; - int border_bottom; - Uint32 last_focus_event_time; - PendingFocusEnum pending_focus; - Uint32 pending_focus_time; - XConfigureEvent last_xconfigure; - struct SDL_VideoData *videodata; - unsigned long user_time; - Atom xdnd_req; - Window xdnd_source; -#if SDL_VIDEO_OPENGL_EGL - EGLSurface egl_surface; -#endif -} SDL_WindowData; - -extern void X11_SetNetWMState(_THIS, Window xwindow, Uint32 flags); -extern Uint32 X11_GetNetWMState(_THIS, Window xwindow); - -extern int X11_CreateWindow(_THIS, SDL_Window * window); -extern int X11_CreateWindowFrom(_THIS, SDL_Window * window, const void *data); -extern char *X11_GetWindowTitle(_THIS, Window xwindow); -extern void X11_SetWindowTitle(_THIS, SDL_Window * window); -extern void X11_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon); -extern void X11_SetWindowPosition(_THIS, SDL_Window * window); -extern void X11_SetWindowMinimumSize(_THIS, SDL_Window * window); -extern void X11_SetWindowMaximumSize(_THIS, SDL_Window * window); -extern int X11_GetWindowBordersSize(_THIS, SDL_Window * window, int *top, int *left, int *bottom, int *right); -extern int X11_SetWindowOpacity(_THIS, SDL_Window * window, float opacity); -extern int X11_SetWindowModalFor(_THIS, SDL_Window * modal_window, SDL_Window * parent_window); -extern int X11_SetWindowInputFocus(_THIS, SDL_Window * window); -extern void X11_SetWindowSize(_THIS, SDL_Window * window); -extern void X11_ShowWindow(_THIS, SDL_Window * window); -extern void X11_HideWindow(_THIS, SDL_Window * window); -extern void X11_RaiseWindow(_THIS, SDL_Window * window); -extern void X11_MaximizeWindow(_THIS, SDL_Window * window); -extern void X11_MinimizeWindow(_THIS, SDL_Window * window); -extern void X11_RestoreWindow(_THIS, SDL_Window * window); -extern void X11_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered); -extern void X11_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable); -extern void X11_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen); -extern int X11_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp); -extern void X11_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed); -extern void X11_DestroyWindow(_THIS, SDL_Window * window); -extern SDL_bool X11_GetWindowWMInfo(_THIS, SDL_Window * window, - struct SDL_SysWMinfo *info); -extern int X11_SetWindowHitTest(SDL_Window *window, SDL_bool enabled); - -#endif /* _SDL_x11window_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11xinput2.c b/3rdparty/SDL2/src/video/x11/SDL_x11xinput2.c deleted file mode 100644 index bed4234f032..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11xinput2.c +++ /dev/null @@ -1,278 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 - -#include "SDL_x11video.h" -#include "SDL_x11xinput2.h" -#include "../../events/SDL_mouse_c.h" -#include "../../events/SDL_touch_c.h" - -#define MAX_AXIS 16 - -#if SDL_VIDEO_DRIVER_X11_XINPUT2 -static int xinput2_initialized = 0; - -#if SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH -static int xinput2_multitouch_supported = 0; -#endif - -/* Opcode returned X11_XQueryExtension - * It will be used in event processing - * to know that the event came from - * this extension */ -static int xinput2_opcode; - -static void parse_valuators(const double *input_values,unsigned char *mask,int mask_len, - double *output_values,int output_values_len) { - int i = 0,z = 0; - int top = mask_len * 8; - if (top > MAX_AXIS) - top = MAX_AXIS; - - SDL_memset(output_values,0,output_values_len * sizeof(double)); - for (; i < top && z < output_values_len; i++) { - if (XIMaskIsSet(mask, i)) { - const int value = (int) *input_values; - output_values[z] = value; - input_values++; - } - z++; - } -} - -static int -query_xinput2_version(Display *display, int major, int minor) -{ - /* We don't care if this fails, so long as it sets major/minor on it's way out the door. */ - X11_XIQueryVersion(display, &major, &minor); - return ((major * 1000) + minor); -} - -static SDL_bool -xinput2_version_atleast(const int version, const int wantmajor, const int wantminor) -{ - return ( version >= ((wantmajor * 1000) + wantminor) ); -} -#endif /* SDL_VIDEO_DRIVER_X11_XINPUT2 */ - -void -X11_InitXinput2(_THIS) -{ -#if SDL_VIDEO_DRIVER_X11_XINPUT2 - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - int version = 0; - XIEventMask eventmask; - unsigned char mask[3] = { 0,0,0 }; - int event, err; - - /* - * Initialize XInput 2 - * According to http://who-t.blogspot.com/2009/05/xi2-recipes-part-1.html its better - * to inform Xserver what version of Xinput we support.The server will store the version we support. - * "As XI2 progresses it becomes important that you use this call as the server may treat the client - * differently depending on the supported version". - * - * FIXME:event and err are not needed but if not passed X11_XQueryExtension returns SegmentationFault - */ - if (!SDL_X11_HAVE_XINPUT2 || - !X11_XQueryExtension(data->display, "XInputExtension", &xinput2_opcode, &event, &err)) { - return; /* X server does not have XInput at all */ - } - - /* We need at least 2.2 for Multitouch, 2.0 otherwise. */ - version = query_xinput2_version(data->display, 2, 2); - if (!xinput2_version_atleast(version, 2, 0)) { - return; /* X server does not support the version we want at all. */ - } - - xinput2_initialized = 1; - -#if SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH /* Multitouch needs XInput 2.2 */ - xinput2_multitouch_supported = xinput2_version_atleast(version, 2, 2); -#endif - - /* Enable Raw motion events for this display */ - eventmask.deviceid = XIAllMasterDevices; - eventmask.mask_len = sizeof(mask); - eventmask.mask = mask; - - XISetMask(mask, XI_RawMotion); - XISetMask(mask, XI_RawButtonPress); - XISetMask(mask, XI_RawButtonRelease); - - if (X11_XISelectEvents(data->display,DefaultRootWindow(data->display),&eventmask,1) != Success) { - return; - } -#endif -} - -int -X11_HandleXinput2Event(SDL_VideoData *videodata,XGenericEventCookie *cookie) -{ -#if SDL_VIDEO_DRIVER_X11_XINPUT2 - if(cookie->extension != xinput2_opcode) { - return 0; - } - switch(cookie->evtype) { - case XI_RawMotion: { - const XIRawEvent *rawev = (const XIRawEvent*)cookie->data; - SDL_Mouse *mouse = SDL_GetMouse(); - double relative_coords[2]; - static Time prev_time = 0; - static double prev_rel_coords[2]; - - videodata->global_mouse_changed = SDL_TRUE; - - if (!mouse->relative_mode || mouse->relative_mode_warp) { - return 0; - } - - parse_valuators(rawev->raw_values,rawev->valuators.mask, - rawev->valuators.mask_len,relative_coords,2); - - if ((rawev->time == prev_time) && (relative_coords[0] == prev_rel_coords[0]) && (relative_coords[1] == prev_rel_coords[1])) { - return 0; /* duplicate event, drop it. */ - } - - SDL_SendMouseMotion(mouse->focus,mouse->mouseID,1,(int)relative_coords[0],(int)relative_coords[1]); - prev_rel_coords[0] = relative_coords[0]; - prev_rel_coords[1] = relative_coords[1]; - prev_time = rawev->time; - return 1; - } - break; - - case XI_RawButtonPress: - case XI_RawButtonRelease: - videodata->global_mouse_changed = SDL_TRUE; - break; - -#if SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH - case XI_TouchBegin: { - const XIDeviceEvent *xev = (const XIDeviceEvent *) cookie->data; - SDL_SendTouch(xev->sourceid,xev->detail, - SDL_TRUE, xev->event_x, xev->event_y, 1.0); - return 1; - } - break; - case XI_TouchEnd: { - const XIDeviceEvent *xev = (const XIDeviceEvent *) cookie->data; - SDL_SendTouch(xev->sourceid,xev->detail, - SDL_FALSE, xev->event_x, xev->event_y, 1.0); - return 1; - } - break; - case XI_TouchUpdate: { - const XIDeviceEvent *xev = (const XIDeviceEvent *) cookie->data; - SDL_SendTouchMotion(xev->sourceid,xev->detail, - xev->event_x, xev->event_y, 1.0); - return 1; - } - break; -#endif - } -#endif - return 0; -} - -void -X11_InitXinput2Multitouch(_THIS) -{ -#if SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - XIDeviceInfo *info; - int ndevices,i,j; - info = X11_XIQueryDevice(data->display, XIAllDevices, &ndevices); - - for (i = 0; i < ndevices; i++) { - XIDeviceInfo *dev = &info[i]; - for (j = 0; j < dev->num_classes; j++) { - SDL_TouchID touchId; - XIAnyClassInfo *class = dev->classes[j]; - XITouchClassInfo *t = (XITouchClassInfo*)class; - - /* Only touch devices */ - if (class->type != XITouchClass) - continue; - - touchId = t->sourceid; - SDL_AddTouch(touchId, dev->name); - } - } - X11_XIFreeDeviceInfo(info); -#endif -} - -void -X11_Xinput2SelectTouch(_THIS, SDL_Window *window) -{ -#if SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH - SDL_VideoData *data = NULL; - XIEventMask eventmask; - unsigned char mask[3] = { 0,0,0 }; - SDL_WindowData *window_data = NULL; - - if (!X11_Xinput2IsMultitouchSupported()) { - return; - } - - data = (SDL_VideoData *) _this->driverdata; - window_data = (SDL_WindowData*)window->driverdata; - - eventmask.deviceid = XIAllMasterDevices; - eventmask.mask_len = sizeof(mask); - eventmask.mask = mask; - - XISetMask(mask, XI_TouchBegin); - XISetMask(mask, XI_TouchUpdate); - XISetMask(mask, XI_TouchEnd); - - X11_XISelectEvents(data->display,window_data->xwindow,&eventmask,1); -#endif -} - - -int -X11_Xinput2IsInitialized() -{ -#if SDL_VIDEO_DRIVER_X11_XINPUT2 - return xinput2_initialized; -#else - return 0; -#endif -} - -int -X11_Xinput2IsMultitouchSupported() -{ -#if SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH - return xinput2_initialized && xinput2_multitouch_supported; -#else - return 0; -#endif -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/SDL_x11xinput2.h b/3rdparty/SDL2/src/video/x11/SDL_x11xinput2.h deleted file mode 100644 index ed8dd1a4a02..00000000000 --- a/3rdparty/SDL2/src/video/x11/SDL_x11xinput2.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#ifndef _SDL_x11xinput2_h -#define _SDL_x11xinput2_h - -#ifndef SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS -/* Define XGenericEventCookie as forward declaration when - *xinput2 is not available in order to compile */ -struct XGenericEventCookie; -typedef struct XGenericEventCookie XGenericEventCookie; -#endif - -extern void X11_InitXinput2(_THIS); -extern void X11_InitXinput2Multitouch(_THIS); -extern int X11_HandleXinput2Event(SDL_VideoData *videodata,XGenericEventCookie *cookie); -extern int X11_Xinput2IsInitialized(void); -extern int X11_Xinput2IsMultitouchSupported(void); -extern void X11_Xinput2SelectTouch(_THIS, SDL_Window *window); - -#endif /* _SDL_x11xinput2_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/3rdparty/SDL2/src/video/x11/edid-parse.c b/3rdparty/SDL2/src/video/x11/edid-parse.c deleted file mode 100644 index 57f225b8522..00000000000 --- a/3rdparty/SDL2/src/video/x11/edid-parse.c +++ /dev/null @@ -1,754 +0,0 @@ -/* - * Copyright 2007 Red Hat, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * on the rights to use, copy, modify, merge, publish, distribute, sub - * license, and/or sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* Author: Soren Sandmann <sandmann@redhat.com> */ -#include "../../SDL_internal.h" -#include "SDL_stdinc.h" - -#include "edid.h" -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <stdio.h> - -#define TRUE 1 -#define FALSE 0 - -static int -get_bit (int in, int bit) -{ - return (in & (1 << bit)) >> bit; -} - -static int -get_bits (int in, int begin, int end) -{ - int mask = (1 << (end - begin + 1)) - 1; - - return (in >> begin) & mask; -} - -static int -decode_header (const uchar *edid) -{ - if (memcmp (edid, "\x00\xff\xff\xff\xff\xff\xff\x00", 8) == 0) - return TRUE; - return FALSE; -} - -static int -decode_vendor_and_product_identification (const uchar *edid, MonitorInfo *info) -{ - int is_model_year; - - /* Manufacturer Code */ - info->manufacturer_code[0] = get_bits (edid[0x08], 2, 6); - info->manufacturer_code[1] = get_bits (edid[0x08], 0, 1) << 3; - info->manufacturer_code[1] |= get_bits (edid[0x09], 5, 7); - info->manufacturer_code[2] = get_bits (edid[0x09], 0, 4); - info->manufacturer_code[3] = '\0'; - - info->manufacturer_code[0] += 'A' - 1; - info->manufacturer_code[1] += 'A' - 1; - info->manufacturer_code[2] += 'A' - 1; - - /* Product Code */ - info->product_code = edid[0x0b] << 8 | edid[0x0a]; - - /* Serial Number */ - info->serial_number = - edid[0x0c] | edid[0x0d] << 8 | edid[0x0e] << 16 | edid[0x0f] << 24; - - /* Week and Year */ - is_model_year = FALSE; - switch (edid[0x10]) - { - case 0x00: - info->production_week = -1; - break; - - case 0xff: - info->production_week = -1; - is_model_year = TRUE; - break; - - default: - info->production_week = edid[0x10]; - break; - } - - if (is_model_year) - { - info->production_year = -1; - info->model_year = 1990 + edid[0x11]; - } - else - { - info->production_year = 1990 + edid[0x11]; - info->model_year = -1; - } - - return TRUE; -} - -static int -decode_edid_version (const uchar *edid, MonitorInfo *info) -{ - info->major_version = edid[0x12]; - info->minor_version = edid[0x13]; - - return TRUE; -} - -static int -decode_display_parameters (const uchar *edid, MonitorInfo *info) -{ - /* Digital vs Analog */ - info->is_digital = get_bit (edid[0x14], 7); - - if (info->is_digital) - { - int bits; - - static const int bit_depth[8] = - { - -1, 6, 8, 10, 12, 14, 16, -1 - }; - - static const Interface interfaces[6] = - { - UNDEFINED, DVI, HDMI_A, HDMI_B, MDDI, DISPLAY_PORT - }; - - bits = get_bits (edid[0x14], 4, 6); - info->digital.bits_per_primary = bit_depth[bits]; - - bits = get_bits (edid[0x14], 0, 3); - - if (bits <= 5) - info->digital.interface = interfaces[bits]; - else - info->digital.interface = UNDEFINED; - } - else - { - int bits = get_bits (edid[0x14], 5, 6); - - static const double levels[][3] = - { - { 0.7, 0.3, 1.0 }, - { 0.714, 0.286, 1.0 }, - { 1.0, 0.4, 1.4 }, - { 0.7, 0.0, 0.7 }, - }; - - info->analog.video_signal_level = levels[bits][0]; - info->analog.sync_signal_level = levels[bits][1]; - info->analog.total_signal_level = levels[bits][2]; - - info->analog.blank_to_black = get_bit (edid[0x14], 4); - - info->analog.separate_hv_sync = get_bit (edid[0x14], 3); - info->analog.composite_sync_on_h = get_bit (edid[0x14], 2); - info->analog.composite_sync_on_green = get_bit (edid[0x14], 1); - - info->analog.serration_on_vsync = get_bit (edid[0x14], 0); - } - - /* Screen Size / Aspect Ratio */ - if (edid[0x15] == 0 && edid[0x16] == 0) - { - info->width_mm = -1; - info->height_mm = -1; - info->aspect_ratio = -1.0; - } - else if (edid[0x16] == 0) - { - info->width_mm = -1; - info->height_mm = -1; - info->aspect_ratio = 100.0 / (edid[0x15] + 99); - } - else if (edid[0x15] == 0) - { - info->width_mm = -1; - info->height_mm = -1; - info->aspect_ratio = 100.0 / (edid[0x16] + 99); - info->aspect_ratio = 1/info->aspect_ratio; /* portrait */ - } - else - { - info->width_mm = 10 * edid[0x15]; - info->height_mm = 10 * edid[0x16]; - } - - /* Gamma */ - if (edid[0x17] == 0xFF) - info->gamma = -1.0; - else - info->gamma = (edid[0x17] + 100.0) / 100.0; - - /* Features */ - info->standby = get_bit (edid[0x18], 7); - info->suspend = get_bit (edid[0x18], 6); - info->active_off = get_bit (edid[0x18], 5); - - if (info->is_digital) - { - info->digital.rgb444 = TRUE; - if (get_bit (edid[0x18], 3)) - info->digital.ycrcb444 = 1; - if (get_bit (edid[0x18], 4)) - info->digital.ycrcb422 = 1; - } - else - { - int bits = get_bits (edid[0x18], 3, 4); - ColorType color_type[4] = - { - MONOCHROME, RGB, OTHER_COLOR, UNDEFINED_COLOR - }; - - info->analog.color_type = color_type[bits]; - } - - info->srgb_is_standard = get_bit (edid[0x18], 2); - - /* In 1.3 this is called "has preferred timing" */ - info->preferred_timing_includes_native = get_bit (edid[0x18], 1); - - /* FIXME: In 1.3 this indicates whether the monitor accepts GTF */ - info->continuous_frequency = get_bit (edid[0x18], 0); - return TRUE; -} - -static double -decode_fraction (int high, int low) -{ - double result = 0.0; - int i; - - high = (high << 2) | low; - - for (i = 0; i < 10; ++i) - result += get_bit (high, i) * SDL_pow (2, i - 10); - - return result; -} - -static int -decode_color_characteristics (const uchar *edid, MonitorInfo *info) -{ - info->red_x = decode_fraction (edid[0x1b], get_bits (edid[0x19], 6, 7)); - info->red_y = decode_fraction (edid[0x1c], get_bits (edid[0x19], 5, 4)); - info->green_x = decode_fraction (edid[0x1d], get_bits (edid[0x19], 2, 3)); - info->green_y = decode_fraction (edid[0x1e], get_bits (edid[0x19], 0, 1)); - info->blue_x = decode_fraction (edid[0x1f], get_bits (edid[0x1a], 6, 7)); - info->blue_y = decode_fraction (edid[0x20], get_bits (edid[0x1a], 4, 5)); - info->white_x = decode_fraction (edid[0x21], get_bits (edid[0x1a], 2, 3)); - info->white_y = decode_fraction (edid[0x22], get_bits (edid[0x1a], 0, 1)); - - return TRUE; -} - -static int -decode_established_timings (const uchar *edid, MonitorInfo *info) -{ - static const Timing established[][8] = - { - { - { 800, 600, 60 }, - { 800, 600, 56 }, - { 640, 480, 75 }, - { 640, 480, 72 }, - { 640, 480, 67 }, - { 640, 480, 60 }, - { 720, 400, 88 }, - { 720, 400, 70 } - }, - { - { 1280, 1024, 75 }, - { 1024, 768, 75 }, - { 1024, 768, 70 }, - { 1024, 768, 60 }, - { 1024, 768, 87 }, - { 832, 624, 75 }, - { 800, 600, 75 }, - { 800, 600, 72 } - }, - { - { 0, 0, 0 }, - { 0, 0, 0 }, - { 0, 0, 0 }, - { 0, 0, 0 }, - { 0, 0, 0 }, - { 0, 0, 0 }, - { 0, 0, 0 }, - { 1152, 870, 75 } - }, - }; - - int i, j, idx; - - idx = 0; - for (i = 0; i < 3; ++i) - { - for (j = 0; j < 8; ++j) - { - int byte = edid[0x23 + i]; - - if (get_bit (byte, j) && established[i][j].frequency != 0) - info->established[idx++] = established[i][j]; - } - } - return TRUE; -} - -static int -decode_standard_timings (const uchar *edid, MonitorInfo *info) -{ - int i; - - for (i = 0; i < 8; i++) - { - int first = edid[0x26 + 2 * i]; - int second = edid[0x27 + 2 * i]; - - if (first != 0x01 && second != 0x01) - { - int w = 8 * (first + 31); - int h = 0; - - switch (get_bits (second, 6, 7)) - { - case 0x00: h = (w / 16) * 10; break; - case 0x01: h = (w / 4) * 3; break; - case 0x02: h = (w / 5) * 4; break; - case 0x03: h = (w / 16) * 9; break; - } - - info->standard[i].width = w; - info->standard[i].height = h; - info->standard[i].frequency = get_bits (second, 0, 5) + 60; - } - } - - return TRUE; -} - -static void -decode_lf_string (const uchar *s, int n_chars, char *result) -{ - int i; - for (i = 0; i < n_chars; ++i) - { - if (s[i] == 0x0a) - { - *result++ = '\0'; - break; - } - else if (s[i] == 0x00) - { - /* Convert embedded 0's to spaces */ - *result++ = ' '; - } - else - { - *result++ = s[i]; - } - } -} - -static void -decode_display_descriptor (const uchar *desc, - MonitorInfo *info) -{ - switch (desc[0x03]) - { - case 0xFC: - decode_lf_string (desc + 5, 13, info->dsc_product_name); - break; - case 0xFF: - decode_lf_string (desc + 5, 13, info->dsc_serial_number); - break; - case 0xFE: - decode_lf_string (desc + 5, 13, info->dsc_string); - break; - case 0xFD: - /* Range Limits */ - break; - case 0xFB: - /* Color Point */ - break; - case 0xFA: - /* Timing Identifications */ - break; - case 0xF9: - /* Color Management */ - break; - case 0xF8: - /* Timing Codes */ - break; - case 0xF7: - /* Established Timings */ - break; - case 0x10: - break; - } -} - -static void -decode_detailed_timing (const uchar *timing, - DetailedTiming *detailed) -{ - int bits; - StereoType stereo[] = - { - NO_STEREO, NO_STEREO, FIELD_RIGHT, FIELD_LEFT, - TWO_WAY_RIGHT_ON_EVEN, TWO_WAY_LEFT_ON_EVEN, - FOUR_WAY_INTERLEAVED, SIDE_BY_SIDE - }; - - detailed->pixel_clock = (timing[0x00] | timing[0x01] << 8) * 10000; - detailed->h_addr = timing[0x02] | ((timing[0x04] & 0xf0) << 4); - detailed->h_blank = timing[0x03] | ((timing[0x04] & 0x0f) << 8); - detailed->v_addr = timing[0x05] | ((timing[0x07] & 0xf0) << 4); - detailed->v_blank = timing[0x06] | ((timing[0x07] & 0x0f) << 8); - detailed->h_front_porch = timing[0x08] | get_bits (timing[0x0b], 6, 7) << 8; - detailed->h_sync = timing[0x09] | get_bits (timing[0x0b], 4, 5) << 8; - detailed->v_front_porch = - get_bits (timing[0x0a], 4, 7) | get_bits (timing[0x0b], 2, 3) << 4; - detailed->v_sync = - get_bits (timing[0x0a], 0, 3) | get_bits (timing[0x0b], 0, 1) << 4; - detailed->width_mm = timing[0x0c] | get_bits (timing[0x0e], 4, 7) << 8; - detailed->height_mm = timing[0x0d] | get_bits (timing[0x0e], 0, 3) << 8; - detailed->right_border = timing[0x0f]; - detailed->top_border = timing[0x10]; - - detailed->interlaced = get_bit (timing[0x11], 7); - - /* Stereo */ - bits = get_bits (timing[0x11], 5, 6) << 1 | get_bit (timing[0x11], 0); - detailed->stereo = stereo[bits]; - - /* Sync */ - bits = timing[0x11]; - - detailed->digital_sync = get_bit (bits, 4); - if (detailed->digital_sync) - { - detailed->digital.composite = !get_bit (bits, 3); - - if (detailed->digital.composite) - { - detailed->digital.serrations = get_bit (bits, 2); - detailed->digital.negative_vsync = FALSE; - } - else - { - detailed->digital.serrations = FALSE; - detailed->digital.negative_vsync = !get_bit (bits, 2); - } - - detailed->digital.negative_hsync = !get_bit (bits, 0); - } - else - { - detailed->analog.bipolar = get_bit (bits, 3); - detailed->analog.serrations = get_bit (bits, 2); - detailed->analog.sync_on_green = !get_bit (bits, 1); - } -} - -static int -decode_descriptors (const uchar *edid, MonitorInfo *info) -{ - int i; - int timing_idx; - - timing_idx = 0; - - for (i = 0; i < 4; ++i) - { - int index = 0x36 + i * 18; - - if (edid[index + 0] == 0x00 && edid[index + 1] == 0x00) - { - decode_display_descriptor (edid + index, info); - } - else - { - decode_detailed_timing ( - edid + index, &(info->detailed_timings[timing_idx++])); - } - } - - info->n_detailed_timings = timing_idx; - - return TRUE; -} - -static void -decode_check_sum (const uchar *edid, - MonitorInfo *info) -{ - int i; - uchar check = 0; - - for (i = 0; i < 128; ++i) - check += edid[i]; - - info->checksum = check; -} - -MonitorInfo * -decode_edid (const uchar *edid) -{ - MonitorInfo *info = calloc (1, sizeof (MonitorInfo)); - - decode_check_sum (edid, info); - - if (!decode_header (edid) || - !decode_vendor_and_product_identification (edid, info) || - !decode_edid_version (edid, info) || - !decode_display_parameters (edid, info) || - !decode_color_characteristics (edid, info) || - !decode_established_timings (edid, info) || - !decode_standard_timings (edid, info) || - !decode_descriptors (edid, info)) { - free(info); - return NULL; - } - - return info; -} - -static const char * -yesno (int v) -{ - return v? "yes" : "no"; -} - -void -dump_monitor_info (MonitorInfo *info) -{ - int i; - - printf ("Checksum: %d (%s)\n", - info->checksum, info->checksum? "incorrect" : "correct"); - printf ("Manufacturer Code: %s\n", info->manufacturer_code); - printf ("Product Code: 0x%x\n", info->product_code); - printf ("Serial Number: %u\n", info->serial_number); - - if (info->production_week != -1) - printf ("Production Week: %d\n", info->production_week); - else - printf ("Production Week: unspecified\n"); - - if (info->production_year != -1) - printf ("Production Year: %d\n", info->production_year); - else - printf ("Production Year: unspecified\n"); - - if (info->model_year != -1) - printf ("Model Year: %d\n", info->model_year); - else - printf ("Model Year: unspecified\n"); - - printf ("EDID revision: %d.%d\n", info->major_version, info->minor_version); - - printf ("Display is %s\n", info->is_digital? "digital" : "analog"); - if (info->is_digital) - { - const char *interface; - if (info->digital.bits_per_primary != -1) - printf ("Bits Per Primary: %d\n", info->digital.bits_per_primary); - else - printf ("Bits Per Primary: undefined\n"); - - switch (info->digital.interface) - { - case DVI: interface = "DVI"; break; - case HDMI_A: interface = "HDMI-a"; break; - case HDMI_B: interface = "HDMI-b"; break; - case MDDI: interface = "MDDI"; break; - case DISPLAY_PORT: interface = "DisplayPort"; break; - case UNDEFINED: interface = "undefined"; break; - default: interface = "unknown"; break; - } - printf ("Interface: %s\n", interface); - - printf ("RGB 4:4:4: %s\n", yesno (info->digital.rgb444)); - printf ("YCrCb 4:4:4: %s\n", yesno (info->digital.ycrcb444)); - printf ("YCrCb 4:2:2: %s\n", yesno (info->digital.ycrcb422)); - } - else - { - const char *s; - printf ("Video Signal Level: %f\n", info->analog.video_signal_level); - printf ("Sync Signal Level: %f\n", info->analog.sync_signal_level); - printf ("Total Signal Level: %f\n", info->analog.total_signal_level); - - printf ("Blank to Black: %s\n", - yesno (info->analog.blank_to_black)); - printf ("Separate HV Sync: %s\n", - yesno (info->analog.separate_hv_sync)); - printf ("Composite Sync on H: %s\n", - yesno (info->analog.composite_sync_on_h)); - printf ("Serration on VSync: %s\n", - yesno (info->analog.serration_on_vsync)); - - switch (info->analog.color_type) - { - case UNDEFINED_COLOR: s = "undefined"; break; - case MONOCHROME: s = "monochrome"; break; - case RGB: s = "rgb"; break; - case OTHER_COLOR: s = "other color"; break; - default: s = "unknown"; break; - }; - - printf ("Color: %s\n", s); - } - - if (info->width_mm == -1) - printf ("Width: undefined\n"); - else - printf ("Width: %d mm\n", info->width_mm); - - if (info->height_mm == -1) - printf ("Height: undefined\n"); - else - printf ("Height: %d mm\n", info->height_mm); - - if (info->aspect_ratio > 0) - printf ("Aspect Ratio: %f\n", info->aspect_ratio); - else - printf ("Aspect Ratio: undefined\n"); - - if (info->gamma >= 0) - printf ("Gamma: %f\n", info->gamma); - else - printf ("Gamma: undefined\n"); - - printf ("Standby: %s\n", yesno (info->standby)); - printf ("Suspend: %s\n", yesno (info->suspend)); - printf ("Active Off: %s\n", yesno (info->active_off)); - - printf ("SRGB is Standard: %s\n", yesno (info->srgb_is_standard)); - printf ("Preferred Timing Includes Native: %s\n", - yesno (info->preferred_timing_includes_native)); - printf ("Continuous Frequency: %s\n", yesno (info->continuous_frequency)); - - printf ("Red X: %f\n", info->red_x); - printf ("Red Y: %f\n", info->red_y); - printf ("Green X: %f\n", info->green_x); - printf ("Green Y: %f\n", info->green_y); - printf ("Blue X: %f\n", info->blue_x); - printf ("Blue Y: %f\n", info->blue_y); - printf ("White X: %f\n", info->white_x); - printf ("White Y: %f\n", info->white_y); - - printf ("Established Timings:\n"); - - for (i = 0; i < 24; ++i) - { - Timing *timing = &(info->established[i]); - - if (timing->frequency == 0) - break; - - printf (" %d x %d @ %d Hz\n", - timing->width, timing->height, timing->frequency); - - } - - printf ("Standard Timings:\n"); - for (i = 0; i < 8; ++i) - { - Timing *timing = &(info->standard[i]); - - if (timing->frequency == 0) - break; - - printf (" %d x %d @ %d Hz\n", - timing->width, timing->height, timing->frequency); - } - - for (i = 0; i < info->n_detailed_timings; ++i) - { - DetailedTiming *timing = &(info->detailed_timings[i]); - const char *s; - - printf ("Timing%s: \n", - (i == 0 && info->preferred_timing_includes_native)? - " (Preferred)" : ""); - printf (" Pixel Clock: %d\n", timing->pixel_clock); - printf (" H Addressable: %d\n", timing->h_addr); - printf (" H Blank: %d\n", timing->h_blank); - printf (" H Front Porch: %d\n", timing->h_front_porch); - printf (" H Sync: %d\n", timing->h_sync); - printf (" V Addressable: %d\n", timing->v_addr); - printf (" V Blank: %d\n", timing->v_blank); - printf (" V Front Porch: %d\n", timing->v_front_porch); - printf (" V Sync: %d\n", timing->v_sync); - printf (" Width: %d mm\n", timing->width_mm); - printf (" Height: %d mm\n", timing->height_mm); - printf (" Right Border: %d\n", timing->right_border); - printf (" Top Border: %d\n", timing->top_border); - switch (timing->stereo) - { - default: - case NO_STEREO: s = "No Stereo"; break; - case FIELD_RIGHT: s = "Field Sequential, Right on Sync"; break; - case FIELD_LEFT: s = "Field Sequential, Left on Sync"; break; - case TWO_WAY_RIGHT_ON_EVEN: s = "Two-way, Right on Even"; break; - case TWO_WAY_LEFT_ON_EVEN: s = "Two-way, Left on Even"; break; - case FOUR_WAY_INTERLEAVED: s = "Four-way Interleaved"; break; - case SIDE_BY_SIDE: s = "Side-by-Side"; break; - } - printf (" Stereo: %s\n", s); - - if (timing->digital_sync) - { - printf (" Digital Sync:\n"); - printf (" composite: %s\n", yesno (timing->digital.composite)); - printf (" serrations: %s\n", yesno (timing->digital.serrations)); - printf (" negative vsync: %s\n", - yesno (timing->digital.negative_vsync)); - printf (" negative hsync: %s\n", - yesno (timing->digital.negative_hsync)); - } - else - { - printf (" Analog Sync:\n"); - printf (" bipolar: %s\n", yesno (timing->analog.bipolar)); - printf (" serrations: %s\n", yesno (timing->analog.serrations)); - printf (" sync on green: %s\n", yesno ( - timing->analog.sync_on_green)); - } - } - - printf ("Detailed Product information:\n"); - printf (" Product Name: %s\n", info->dsc_product_name); - printf (" Serial Number: %s\n", info->dsc_serial_number); - printf (" Unspecified String: %s\n", info->dsc_string); -} - diff --git a/3rdparty/SDL2/src/video/x11/edid.h b/3rdparty/SDL2/src/video/x11/edid.h deleted file mode 100644 index 8c217eba2b0..00000000000 --- a/3rdparty/SDL2/src/video/x11/edid.h +++ /dev/null @@ -1,167 +0,0 @@ -typedef unsigned char uchar; -typedef struct MonitorInfo MonitorInfo; -typedef struct Timing Timing; -typedef struct DetailedTiming DetailedTiming; - -typedef enum -{ - UNDEFINED, - DVI, - HDMI_A, - HDMI_B, - MDDI, - DISPLAY_PORT -} Interface; - -typedef enum -{ - UNDEFINED_COLOR, - MONOCHROME, - RGB, - OTHER_COLOR -} ColorType; - -typedef enum -{ - NO_STEREO, - FIELD_RIGHT, - FIELD_LEFT, - TWO_WAY_RIGHT_ON_EVEN, - TWO_WAY_LEFT_ON_EVEN, - FOUR_WAY_INTERLEAVED, - SIDE_BY_SIDE -} StereoType; - -struct Timing -{ - int width; - int height; - int frequency; -}; - -struct DetailedTiming -{ - int pixel_clock; - int h_addr; - int h_blank; - int h_sync; - int h_front_porch; - int v_addr; - int v_blank; - int v_sync; - int v_front_porch; - int width_mm; - int height_mm; - int right_border; - int top_border; - int interlaced; - StereoType stereo; - - int digital_sync; - union - { - struct - { - int bipolar; - int serrations; - int sync_on_green; - } analog; - - struct - { - int composite; - int serrations; - int negative_vsync; - int negative_hsync; - } digital; - }; -}; - -struct MonitorInfo -{ - int checksum; - char manufacturer_code[4]; - int product_code; - unsigned int serial_number; - - int production_week; /* -1 if not specified */ - int production_year; /* -1 if not specified */ - int model_year; /* -1 if not specified */ - - int major_version; - int minor_version; - - int is_digital; - - union - { - struct - { - int bits_per_primary; - Interface interface; - int rgb444; - int ycrcb444; - int ycrcb422; - } digital; - - struct - { - double video_signal_level; - double sync_signal_level; - double total_signal_level; - - int blank_to_black; - - int separate_hv_sync; - int composite_sync_on_h; - int composite_sync_on_green; - int serration_on_vsync; - ColorType color_type; - } analog; - }; - - int width_mm; /* -1 if not specified */ - int height_mm; /* -1 if not specified */ - double aspect_ratio; /* -1.0 if not specififed */ - - double gamma; /* -1.0 if not specified */ - - int standby; - int suspend; - int active_off; - - int srgb_is_standard; - int preferred_timing_includes_native; - int continuous_frequency; - - double red_x; - double red_y; - double green_x; - double green_y; - double blue_x; - double blue_y; - double white_x; - double white_y; - - Timing established[24]; /* Terminated by 0x0x0 */ - Timing standard[8]; - - int n_detailed_timings; - DetailedTiming detailed_timings[4]; /* If monitor has a preferred - * mode, it is the first one - * (whether it has, is - * determined by the - * preferred_timing_includes - * bit. - */ - - /* Optional product description */ - char dsc_serial_number[14]; - char dsc_product_name[14]; - char dsc_string[14]; /* Unspecified ASCII data */ -}; - -MonitorInfo *decode_edid (const uchar *data); -void dump_monitor_info (MonitorInfo *info); -char * make_display_name (const char *output_name, - const MonitorInfo *info); diff --git a/3rdparty/SDL2/src/video/x11/imKStoUCS.c b/3rdparty/SDL2/src/video/x11/imKStoUCS.c deleted file mode 100644 index 40e2242435b..00000000000 --- a/3rdparty/SDL2/src/video/x11/imKStoUCS.c +++ /dev/null @@ -1,350 +0,0 @@ -/* -Copyright (C) 2003-2006,2008 Jamey Sharp, Josh Triplett -Copyright © 2009 Red Hat, Inc. -Copyright 1990-1992,1999,2000,2004,2009,2010 Oracle and/or its affiliates. -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next -paragraph) shall be included in all copies or substantial portions of the -Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_X11 -#include <X11/X.h> -#include "imKStoUCS.h" - -static unsigned short const keysym_to_unicode_1a1_1ff[] = { - 0x0104, 0x02d8, 0x0141, 0x0000, 0x013d, 0x015a, 0x0000, /* 0x01a0-0x01a7 */ - 0x0000, 0x0160, 0x015e, 0x0164, 0x0179, 0x0000, 0x017d, 0x017b, /* 0x01a8-0x01af */ - 0x0000, 0x0105, 0x02db, 0x0142, 0x0000, 0x013e, 0x015b, 0x02c7, /* 0x01b0-0x01b7 */ - 0x0000, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* 0x01b8-0x01bf */ - 0x0154, 0x0000, 0x0000, 0x0102, 0x0000, 0x0139, 0x0106, 0x0000, /* 0x01c0-0x01c7 */ - 0x010c, 0x0000, 0x0118, 0x0000, 0x011a, 0x0000, 0x0000, 0x010e, /* 0x01c8-0x01cf */ - 0x0110, 0x0143, 0x0147, 0x0000, 0x0000, 0x0150, 0x0000, 0x0000, /* 0x01d0-0x01d7 */ - 0x0158, 0x016e, 0x0000, 0x0170, 0x0000, 0x0000, 0x0162, 0x0000, /* 0x01d8-0x01df */ - 0x0155, 0x0000, 0x0000, 0x0103, 0x0000, 0x013a, 0x0107, 0x0000, /* 0x01e0-0x01e7 */ - 0x010d, 0x0000, 0x0119, 0x0000, 0x011b, 0x0000, 0x0000, 0x010f, /* 0x01e8-0x01ef */ - 0x0111, 0x0144, 0x0148, 0x0000, 0x0000, 0x0151, 0x0000, 0x0000, /* 0x01f0-0x01f7 */ - 0x0159, 0x016f, 0x0000, 0x0171, 0x0000, 0x0000, 0x0163, 0x02d9 /* 0x01f8-0x01ff */ -}; - -static unsigned short const keysym_to_unicode_2a1_2fe[] = { - 0x0126, 0x0000, 0x0000, 0x0000, 0x0000, 0x0124, 0x0000, /* 0x02a0-0x02a7 */ - 0x0000, 0x0130, 0x0000, 0x011e, 0x0134, 0x0000, 0x0000, 0x0000, /* 0x02a8-0x02af */ - 0x0000, 0x0127, 0x0000, 0x0000, 0x0000, 0x0000, 0x0125, 0x0000, /* 0x02b0-0x02b7 */ - 0x0000, 0x0131, 0x0000, 0x011f, 0x0135, 0x0000, 0x0000, 0x0000, /* 0x02b8-0x02bf */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x010a, 0x0108, 0x0000, /* 0x02c0-0x02c7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x02c8-0x02cf */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0120, 0x0000, 0x0000, /* 0x02d0-0x02d7 */ - 0x011c, 0x0000, 0x0000, 0x0000, 0x0000, 0x016c, 0x015c, 0x0000, /* 0x02d8-0x02df */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x010b, 0x0109, 0x0000, /* 0x02e0-0x02e7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x02e8-0x02ef */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0121, 0x0000, 0x0000, /* 0x02f0-0x02f7 */ - 0x011d, 0x0000, 0x0000, 0x0000, 0x0000, 0x016d, 0x015d /* 0x02f8-0x02ff */ -}; - -static unsigned short const keysym_to_unicode_3a2_3fe[] = { - 0x0138, 0x0156, 0x0000, 0x0128, 0x013b, 0x0000, /* 0x03a0-0x03a7 */ - 0x0000, 0x0000, 0x0112, 0x0122, 0x0166, 0x0000, 0x0000, 0x0000, /* 0x03a8-0x03af */ - 0x0000, 0x0000, 0x0000, 0x0157, 0x0000, 0x0129, 0x013c, 0x0000, /* 0x03b0-0x03b7 */ - 0x0000, 0x0000, 0x0113, 0x0123, 0x0167, 0x014a, 0x0000, 0x014b, /* 0x03b8-0x03bf */ - 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x012e, /* 0x03c0-0x03c7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0116, 0x0000, 0x0000, 0x012a, /* 0x03c8-0x03cf */ - 0x0000, 0x0145, 0x014c, 0x0136, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x03d0-0x03d7 */ - 0x0000, 0x0172, 0x0000, 0x0000, 0x0000, 0x0168, 0x016a, 0x0000, /* 0x03d8-0x03df */ - 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x012f, /* 0x03e0-0x03e7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0117, 0x0000, 0x0000, 0x012b, /* 0x03e8-0x03ef */ - 0x0000, 0x0146, 0x014d, 0x0137, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x03f0-0x03f7 */ - 0x0000, 0x0173, 0x0000, 0x0000, 0x0000, 0x0169, 0x016b /* 0x03f8-0x03ff */ -}; - -static unsigned short const keysym_to_unicode_4a1_4df[] = { - 0x3002, 0x3008, 0x3009, 0x3001, 0x30fb, 0x30f2, 0x30a1, /* 0x04a0-0x04a7 */ - 0x30a3, 0x30a5, 0x30a7, 0x30a9, 0x30e3, 0x30e5, 0x30e7, 0x30c3, /* 0x04a8-0x04af */ - 0x30fc, 0x30a2, 0x30a4, 0x30a6, 0x30a8, 0x30aa, 0x30ab, 0x30ad, /* 0x04b0-0x04b7 */ - 0x30af, 0x30b1, 0x30b3, 0x30b5, 0x30b7, 0x30b9, 0x30bb, 0x30bd, /* 0x04b8-0x04bf */ - 0x30bf, 0x30c1, 0x30c4, 0x30c6, 0x30c8, 0x30ca, 0x30cb, 0x30cc, /* 0x04c0-0x04c7 */ - 0x30cd, 0x30ce, 0x30cf, 0x30d2, 0x30d5, 0x30d8, 0x30db, 0x30de, /* 0x04c8-0x04cf */ - 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e4, 0x30e6, 0x30e8, 0x30e9, /* 0x04d0-0x04d7 */ - 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ef, 0x30f3, 0x309b, 0x309c /* 0x04d8-0x04df */ -}; - -static unsigned short const keysym_to_unicode_590_5fe[] = { - 0x06f0, 0x06f1, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06f6, 0x06f7, /* 0x0590-0x0597 */ - 0x06f8, 0x06f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0598-0x059f */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x066a, 0x0670, 0x0679, /* 0x05a0-0x05a7 */ - - 0x067e, 0x0686, 0x0688, 0x0691, 0x060c, 0x0000, 0x06d4, 0x0000, /* 0x05ac-0x05af */ - 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, /* 0x05b0-0x05b7 */ - 0x0668, 0x0669, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, /* 0x05b8-0x05bf */ - 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, /* 0x05c0-0x05c7 */ - 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0x05c8-0x05cf */ - 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, /* 0x05d0-0x05d7 */ - 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x05d8-0x05df */ - 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, /* 0x05e0-0x05e7 */ - 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, /* 0x05e8-0x05ef */ - 0x0650, 0x0651, 0x0652, 0x0653, 0x0654, 0x0655, 0x0698, 0x06a4, /* 0x05f0-0x05f7 */ - 0x06a9, 0x06af, 0x06ba, 0x06be, 0x06cc, 0x06d2, 0x06c1 /* 0x05f8-0x05fe */ -}; - -static unsigned short keysym_to_unicode_680_6ff[] = { - 0x0492, 0x0496, 0x049a, 0x049c, 0x04a2, 0x04ae, 0x04b0, 0x04b2, /* 0x0680-0x0687 */ - 0x04b6, 0x04b8, 0x04ba, 0x0000, 0x04d8, 0x04e2, 0x04e8, 0x04ee, /* 0x0688-0x068f */ - 0x0493, 0x0497, 0x049b, 0x049d, 0x04a3, 0x04af, 0x04b1, 0x04b3, /* 0x0690-0x0697 */ - 0x04b7, 0x04b9, 0x04bb, 0x0000, 0x04d9, 0x04e3, 0x04e9, 0x04ef, /* 0x0698-0x069f */ - 0x0000, 0x0452, 0x0453, 0x0451, 0x0454, 0x0455, 0x0456, 0x0457, /* 0x06a0-0x06a7 */ - 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x0491, 0x045e, 0x045f, /* 0x06a8-0x06af */ - 0x2116, 0x0402, 0x0403, 0x0401, 0x0404, 0x0405, 0x0406, 0x0407, /* 0x06b0-0x06b7 */ - 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x0490, 0x040e, 0x040f, /* 0x06b8-0x06bf */ - 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, /* 0x06c0-0x06c7 */ - 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0x06c8-0x06cf */ - 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, /* 0x06d0-0x06d7 */ - 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0x06d8-0x06df */ - 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, /* 0x06e0-0x06e7 */ - 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0x06e8-0x06ef */ - 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, /* 0x06f0-0x06f7 */ - 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a /* 0x06f8-0x06ff */ -}; - -static unsigned short const keysym_to_unicode_7a1_7f9[] = { - 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c, /* 0x07a0-0x07a7 */ - 0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0385, 0x2015, /* 0x07a8-0x07af */ - 0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, /* 0x07b0-0x07b7 */ - 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x07b8-0x07bf */ - 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, /* 0x07c0-0x07c7 */ - 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0x07c8-0x07cf */ - 0x03a0, 0x03a1, 0x03a3, 0x0000, 0x03a4, 0x03a5, 0x03a6, 0x03a7, /* 0x07d0-0x07d7 */ - 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x07d8-0x07df */ - 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, /* 0x07e0-0x07e7 */ - 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0x07e8-0x07ef */ - 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, /* 0x07f0-0x07f7 */ - 0x03c8, 0x03c9 /* 0x07f8-0x07ff */ -}; - -static unsigned short const keysym_to_unicode_8a4_8fe[] = { - 0x2320, 0x2321, 0x0000, 0x231c, /* 0x08a0-0x08a7 */ - 0x231d, 0x231e, 0x231f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08a8-0x08af */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08b0-0x08b7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x2264, 0x2260, 0x2265, 0x222b, /* 0x08b8-0x08bf */ - 0x2234, 0x0000, 0x221e, 0x0000, 0x0000, 0x2207, 0x0000, 0x0000, /* 0x08c0-0x08c7 */ - 0x2245, 0x2246, 0x0000, 0x0000, 0x0000, 0x0000, 0x21d2, 0x0000, /* 0x08c8-0x08cf */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221a, 0x0000, /* 0x08d0-0x08d7 */ - 0x0000, 0x0000, 0x2282, 0x2283, 0x2229, 0x222a, 0x2227, 0x2228, /* 0x08d8-0x08df */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08e0-0x08e7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2202, /* 0x08e8-0x08ef */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0192, 0x0000, /* 0x08f0-0x08f7 */ - 0x0000, 0x0000, 0x0000, 0x2190, 0x2191, 0x2192, 0x2193 /* 0x08f8-0x08ff */ -}; - -static unsigned short const keysym_to_unicode_9df_9f8[] = { - 0x2422, /* 0x09d8-0x09df */ - 0x2666, 0x25a6, 0x2409, 0x240c, 0x240d, 0x240a, 0x0000, 0x0000, /* 0x09e0-0x09e7 */ - 0x240a, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x2500, /* 0x09e8-0x09ef */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x251c, 0x2524, 0x2534, 0x252c, /* 0x09f0-0x09f7 */ - 0x2502 /* 0x09f8-0x09ff */ -}; - -static unsigned short const keysym_to_unicode_aa1_afe[] = { - 0x2003, 0x2002, 0x2004, 0x2005, 0x2007, 0x2008, 0x2009, /* 0x0aa0-0x0aa7 */ - 0x200a, 0x2014, 0x2013, 0x0000, 0x0000, 0x0000, 0x2026, 0x2025, /* 0x0aa8-0x0aaf */ - 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, /* 0x0ab0-0x0ab7 */ - 0x2105, 0x0000, 0x0000, 0x2012, 0x2039, 0x2024, 0x203a, 0x0000, /* 0x0ab8-0x0abf */ - 0x0000, 0x0000, 0x0000, 0x215b, 0x215c, 0x215d, 0x215e, 0x0000, /* 0x0ac0-0x0ac7 */ - 0x0000, 0x2122, 0x2120, 0x0000, 0x25c1, 0x25b7, 0x25cb, 0x25ad, /* 0x0ac8-0x0acf */ - 0x2018, 0x2019, 0x201c, 0x201d, 0x211e, 0x2030, 0x2032, 0x2033, /* 0x0ad0-0x0ad7 */ - 0x0000, 0x271d, 0x0000, 0x220e, 0x25c2, 0x2023, 0x25cf, 0x25ac, /* 0x0ad8-0x0adf */ - 0x25e6, 0x25ab, 0x25ae, 0x25b5, 0x25bf, 0x2606, 0x2022, 0x25aa, /* 0x0ae0-0x0ae7 */ - 0x25b4, 0x25be, 0x261a, 0x261b, 0x2663, 0x2666, 0x2665, 0x0000, /* 0x0ae8-0x0aef */ - 0x2720, 0x2020, 0x2021, 0x2713, 0x2612, 0x266f, 0x266d, 0x2642, /* 0x0af0-0x0af7 */ - 0x2640, 0x2121, 0x2315, 0x2117, 0x2038, 0x201a, 0x201e /* 0x0af8-0x0aff */ -}; - -/* none of the APL keysyms match the Unicode characters */ - -static unsigned short const keysym_to_unicode_cdf_cfa[] = { - 0x2017, /* 0x0cd8-0x0cdf */ - 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, /* 0x0ce0-0x0ce7 */ - 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0x0ce8-0x0cef */ - 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, /* 0x0cf0-0x0cf7 */ - 0x05e8, 0x05e9, 0x05ea /* 0x0cf8-0x0cff */ -}; - -static unsigned short const keysym_to_unicode_da1_df9[] = { - 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, /* 0x0da0-0x0da7 */ - 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, /* 0x0da8-0x0daf */ - 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, /* 0x0db0-0x0db7 */ - 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, /* 0x0db8-0x0dbf */ - 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, /* 0x0dc0-0x0dc7 */ - 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, /* 0x0dc8-0x0dcf */ - 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, /* 0x0dd0-0x0dd7 */ - 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0e3e, 0x0e3f, /* 0x0dd8-0x0ddf */ - 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, /* 0x0de0-0x0de7 */ - 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0000, 0x0000, /* 0x0de8-0x0def */ - 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, /* 0x0df0-0x0df7 */ - 0x0e58, 0x0e59 /* 0x0df8-0x0dff */ -}; - -static unsigned short const keysym_to_unicode_ea0_eff[] = { - 0x0000, 0x1101, 0x1101, 0x11aa, 0x1102, 0x11ac, 0x11ad, 0x1103, /* 0x0ea0-0x0ea7 */ - 0x1104, 0x1105, 0x11b0, 0x11b1, 0x11b2, 0x11b3, 0x11b4, 0x11b5, /* 0x0ea8-0x0eaf */ - 0x11b6, 0x1106, 0x1107, 0x1108, 0x11b9, 0x1109, 0x110a, 0x110b, /* 0x0eb0-0x0eb7 */ - 0x110c, 0x110d, 0x110e, 0x110f, 0x1110, 0x1111, 0x1112, 0x1161, /* 0x0eb8-0x0ebf */ - 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, /* 0x0ec0-0x0ec7 */ - 0x116a, 0x116b, 0x116c, 0x116d, 0x116e, 0x116f, 0x1170, 0x1171, /* 0x0ec8-0x0ecf */ - 0x1172, 0x1173, 0x1174, 0x1175, 0x11a8, 0x11a9, 0x11aa, 0x11ab, /* 0x0ed0-0x0ed7 */ - 0x11ac, 0x11ad, 0x11ae, 0x11af, 0x11b0, 0x11b1, 0x11b2, 0x11b3, /* 0x0ed8-0x0edf */ - 0x11b4, 0x11b5, 0x11b6, 0x11b7, 0x11b8, 0x11b9, 0x11ba, 0x11bb, /* 0x0ee0-0x0ee7 */ - 0x11bc, 0x11bd, 0x11be, 0x11bf, 0x11c0, 0x11c1, 0x11c2, 0x0000, /* 0x0ee8-0x0eef */ - 0x0000, 0x0000, 0x1140, 0x0000, 0x0000, 0x1159, 0x119e, 0x0000, /* 0x0ef0-0x0ef7 */ - 0x11eb, 0x0000, 0x11f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a9, /* 0x0ef8-0x0eff */ -}; - -static unsigned short keysym_to_unicode_12a1_12fe[] = { - 0x1e02, 0x1e03, 0x0000, 0x0000, 0x0000, 0x1e0a, 0x0000, /* 0x12a0-0x12a7 */ - 0x1e80, 0x0000, 0x1e82, 0x1e0b, 0x1ef2, 0x0000, 0x0000, 0x0000, /* 0x12a8-0x12af */ - 0x1e1e, 0x1e1f, 0x0000, 0x0000, 0x1e40, 0x1e41, 0x0000, 0x1e56, /* 0x12b0-0x12b7 */ - 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, /* 0x12b8-0x12bf */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12c0-0x12c7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12c8-0x12cf */ - 0x0174, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e6a, /* 0x12d0-0x12d7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0176, 0x0000, /* 0x12d8-0x12df */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12e0-0x12e7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12e8-0x12ef */ - 0x0175, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e6b, /* 0x12f0-0x12f7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0177 /* 0x12f0-0x12ff */ -}; - -static unsigned short const keysym_to_unicode_13bc_13be[] = { - 0x0152, 0x0153, 0x0178 /* 0x13b8-0x13bf */ -}; - -static unsigned short keysym_to_unicode_14a1_14ff[] = { - 0x2741, 0x00a7, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab, /* 0x14a0-0x14a7 */ - 0x2014, 0x002e, 0x055d, 0x002c, 0x2013, 0x058a, 0x2026, 0x055c, /* 0x14a8-0x14af */ - 0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, /* 0x14b0-0x14b7 */ - 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, /* 0x14b8-0x14bf */ - 0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, /* 0x14c0-0x14c7 */ - 0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, /* 0x14c8-0x14cf */ - 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, /* 0x14d0-0x14d7 */ - 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, /* 0x14d8-0x14df */ - 0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, /* 0x14e0-0x14e7 */ - 0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, /* 0x14e8-0x14ef */ - 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, /* 0x14f0-0x14f7 */ - 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x2019, 0x0027, /* 0x14f8-0x14ff */ -}; - -static unsigned short keysym_to_unicode_15d0_15f6[] = { - 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10d7, /* 0x15d0-0x15d7 */ - 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, 0x10de, 0x10df, /* 0x15d8-0x15df */ - 0x10e0, 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7, /* 0x15e0-0x15e7 */ - 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, 0x10ee, 0x10ef, /* 0x15e8-0x15ef */ - 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6 /* 0x15f0-0x15f7 */ -}; - -static unsigned short keysym_to_unicode_16a0_16f6[] = { - 0x0000, 0x0000, 0xf0a2, 0x1e8a, 0x0000, 0xf0a5, 0x012c, 0xf0a7, /* 0x16a0-0x16a7 */ - 0xf0a8, 0x01b5, 0x01e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x019f, /* 0x16a8-0x16af */ - 0x0000, 0x0000, 0xf0b2, 0x1e8b, 0x01d1, 0xf0b5, 0x012d, 0xf0b7, /* 0x16b0-0x16b7 */ - 0xf0b8, 0x01b6, 0x01e7, 0x0000, 0x0000, 0x01d2, 0x0000, 0x0275, /* 0x16b8-0x16bf */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x018f, 0x0000, /* 0x16c0-0x16c7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16c8-0x16cf */ - 0x0000, 0x1e36, 0xf0d2, 0xf0d3, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16d0-0x16d7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16d8-0x16df */ - 0x0000, 0x1e37, 0xf0e2, 0xf0e3, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16e0-0x16e7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16e8-0x16ef */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0259 /* 0x16f0-0x16f6 */ -}; - -static unsigned short const keysym_to_unicode_1e9f_1eff[] = { - 0x0303, - 0x1ea0, 0x1ea1, 0x1ea2, 0x1ea3, 0x1ea4, 0x1ea5, 0x1ea6, 0x1ea7, /* 0x1ea0-0x1ea7 */ - 0x1ea8, 0x1ea9, 0x1eaa, 0x1eab, 0x1eac, 0x1ead, 0x1eae, 0x1eaf, /* 0x1ea8-0x1eaf */ - 0x1eb0, 0x1eb1, 0x1eb2, 0x1eb3, 0x1eb4, 0x1eb5, 0x1eb6, 0x1eb7, /* 0x1eb0-0x1eb7 */ - 0x1eb8, 0x1eb9, 0x1eba, 0x1ebb, 0x1ebc, 0x1ebd, 0x1ebe, 0x1ebf, /* 0x1eb8-0x1ebf */ - 0x1ec0, 0x1ec1, 0x1ec2, 0x1ec3, 0x1ec4, 0x1ec5, 0x1ec6, 0x1ec7, /* 0x1ec0-0x1ec7 */ - 0x1ec8, 0x1ec9, 0x1eca, 0x1ecb, 0x1ecc, 0x1ecd, 0x1ece, 0x1ecf, /* 0x1ec8-0x1ecf */ - 0x1ed0, 0x1ed1, 0x1ed2, 0x1ed3, 0x1ed4, 0x1ed5, 0x1ed6, 0x1ed7, /* 0x1ed0-0x1ed7 */ - 0x1ed8, 0x1ed9, 0x1eda, 0x1edb, 0x1edc, 0x1edd, 0x1ede, 0x1edf, /* 0x1ed8-0x1edf */ - 0x1ee0, 0x1ee1, 0x1ee2, 0x1ee3, 0x1ee4, 0x1ee5, 0x1ee6, 0x1ee7, /* 0x1ee0-0x1ee7 */ - 0x1ee8, 0x1ee9, 0x1eea, 0x1eeb, 0x1eec, 0x1eed, 0x1eee, 0x1eef, /* 0x1ee8-0x1eef */ - 0x1ef0, 0x1ef1, 0x0300, 0x0301, 0x1ef4, 0x1ef5, 0x1ef6, 0x1ef7, /* 0x1ef0-0x1ef7 */ - 0x1ef8, 0x1ef9, 0x01a0, 0x01a1, 0x01af, 0x01b0, 0x0309, 0x0323 /* 0x1ef8-0x1eff */ -}; - -static unsigned short const keysym_to_unicode_20a0_20ac[] = { - 0x20a0, 0x20a1, 0x20a2, 0x20a3, 0x20a4, 0x20a5, 0x20a6, 0x20a7, /* 0x20a0-0x20a7 */ - 0x20a8, 0x20a9, 0x20aa, 0x20ab, 0x20ac /* 0x20a8-0x20af */ -}; - -unsigned int -X11_KeySymToUcs4(KeySym keysym) -{ - /* 'Unicode keysym' */ - if ((keysym & 0xff000000) == 0x01000000) - return (keysym & 0x00ffffff); - - if (keysym > 0 && keysym < 0x100) - return keysym; - else if (keysym > 0x1a0 && keysym < 0x200) - return keysym_to_unicode_1a1_1ff[keysym - 0x1a1]; - else if (keysym > 0x2a0 && keysym < 0x2ff) - return keysym_to_unicode_2a1_2fe[keysym - 0x2a1]; - else if (keysym > 0x3a1 && keysym < 0x3ff) - return keysym_to_unicode_3a2_3fe[keysym - 0x3a2]; - else if (keysym > 0x4a0 && keysym < 0x4e0) - return keysym_to_unicode_4a1_4df[keysym - 0x4a1]; - else if (keysym > 0x589 && keysym < 0x5ff) - return keysym_to_unicode_590_5fe[keysym - 0x590]; - else if (keysym > 0x67f && keysym < 0x700) - return keysym_to_unicode_680_6ff[keysym - 0x680]; - else if (keysym > 0x7a0 && keysym < 0x7fa) - return keysym_to_unicode_7a1_7f9[keysym - 0x7a1]; - else if (keysym > 0x8a3 && keysym < 0x8ff) - return keysym_to_unicode_8a4_8fe[keysym - 0x8a4]; - else if (keysym > 0x9de && keysym < 0x9f9) - return keysym_to_unicode_9df_9f8[keysym - 0x9df]; - else if (keysym > 0xaa0 && keysym < 0xaff) - return keysym_to_unicode_aa1_afe[keysym - 0xaa1]; - else if (keysym > 0xcde && keysym < 0xcfb) - return keysym_to_unicode_cdf_cfa[keysym - 0xcdf]; - else if (keysym > 0xda0 && keysym < 0xdfa) - return keysym_to_unicode_da1_df9[keysym - 0xda1]; - else if (keysym > 0xe9f && keysym < 0xf00) - return keysym_to_unicode_ea0_eff[keysym - 0xea0]; - else if (keysym > 0x12a0 && keysym < 0x12ff) - return keysym_to_unicode_12a1_12fe[keysym - 0x12a1]; - else if (keysym > 0x13bb && keysym < 0x13bf) - return keysym_to_unicode_13bc_13be[keysym - 0x13bc]; - else if (keysym > 0x14a0 && keysym < 0x1500) - return keysym_to_unicode_14a1_14ff[keysym - 0x14a1]; - else if (keysym > 0x15cf && keysym < 0x15f7) - return keysym_to_unicode_15d0_15f6[keysym - 0x15d0]; - else if (keysym > 0x169f && keysym < 0x16f7) - return keysym_to_unicode_16a0_16f6[keysym - 0x16a0]; - else if (keysym > 0x1e9e && keysym < 0x1f00) - return keysym_to_unicode_1e9f_1eff[keysym - 0x1e9f]; - else if (keysym > 0x209f && keysym < 0x20ad) - return keysym_to_unicode_20a0_20ac[keysym - 0x20a0]; - else - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_X11 */ - diff --git a/3rdparty/SDL2/src/video/x11/imKStoUCS.h b/3rdparty/SDL2/src/video/x11/imKStoUCS.h deleted file mode 100644 index fe4381d98fa..00000000000 --- a/3rdparty/SDL2/src/video/x11/imKStoUCS.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _imKStoUCS_h -#define _imKStoUCS_h - -/* -Copyright (C) 2003-2006,2008 Jamey Sharp, Josh Triplett -Copyright © 2009 Red Hat, Inc. -Copyright 1990-1992,1999,2000,2004,2009,2010 Oracle and/or its affiliates. -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next -paragraph) shall be included in all copies or substantial portions of the -Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - -extern unsigned int X11_KeySymToUcs4(KeySym keysym); - -#endif /* _imKStoUCS_h */ |