From 236cd4ff6fce68036e46b55985d1f473e02f5a53 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Tue, 22 Dec 2020 12:21:56 +0100 Subject: [PATCH] [WIP] icon-palette --- app/src/icon.c | 42 ++++++++++++++++++++++++++++++++++++++---- data/icon.png | Bin 6540 -> 4156 bytes 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/app/src/icon.c b/app/src/icon.c index f5988c18..b646b7ba 100644 --- a/app/src/icon.c +++ b/app/src/icon.c @@ -182,6 +182,7 @@ to_sdl_pixel_format(enum AVPixelFormat fmt) { case AV_PIX_FMT_BGR555BE: return SDL_PIXELFORMAT_BGR555; case AV_PIX_FMT_RGB444BE: return SDL_PIXELFORMAT_RGB444; case AV_PIX_FMT_BGR444BE: return SDL_PIXELFORMAT_BGR444; + case AV_PIX_FMT_PAL8: return SDL_PIXELFORMAT_INDEX8; default: return SDL_PIXELFORMAT_UNKNOWN; } } @@ -203,10 +204,9 @@ scrcpy_icon_load() { goto error; } - bool is_packed_rgb = desc->flags & AV_PIX_FMT_FLAG_RGB - && !(desc->flags & AV_PIX_FMT_FLAG_PLANAR); - if (!is_packed_rgb) { - LOGE("Could not load non-RGB icon"); + bool is_packed = !(desc->flags & AV_PIX_FMT_FLAG_PLANAR); + if (!is_packed) { + LOGE("Could not load non-packed icon"); goto error; } @@ -230,6 +230,40 @@ scrcpy_icon_load() { goto error; } + if (frame->format == AV_PIX_FMT_PAL8) { + // Initialize the SDL palette + uint8_t *data = frame->data[1]; + SDL_Color colors[256]; + for (int i = 0; i < 256; ++i) { + SDL_Color *color = &colors[i]; + + // The palette is transported in AVFrame.data[1], is 1024 bytes + // long (256 4-byte entries) and is formatted the same as in + // AV_PIX_FMT_RGB32 described above (i.e., it is also + // endian-specific). + // +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + color->a = data[i * 4]; + color->r = data[i * 4 + 1]; + color->g = data[i * 4 + 2]; + color->b = data[i * 4 + 3]; +#else + color->a = data[i * 4 + 3]; + color->r = data[i * 4 + 2]; + color->g = data[i * 4 + 1]; + color->b = data[i * 4]; +#endif + } + + SDL_Palette *palette = surface->format->palette; + assert(palette); + int ret = SDL_SetPaletteColors(palette, colors, 0, 256); + if (ret) { + LOGE("Could not set palette colors"); + goto error; + } + } + surface->userdata = frame; // frame owns the data return surface; diff --git a/data/icon.png b/data/icon.png index 06617be8a5496c8dc141dfaa898130275aa42918..9db8983a8c361bbf4018067679f62843d0b8d701 100644 GIT binary patch literal 4156 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 literal 6540 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