Merge branch 'master' of gitler.moe:suwako/mivfx into io

このコミットが含まれているのは:
守矢諏訪子 2023-10-25 02:39:59 +09:00
コミット a78deac04d
4個のファイルの変更66行の追加2行の削除

ファイルの表示

@ -3,9 +3,9 @@ VERSION=0.1.0
# Linux、Haiku、かIllumos = /usr、FreeBSDかOpenBSD = /usr/local、NetBSD = /usr/pkg
PREFIX=/usr
CC=cc
FILES=main.c format/png.c
FILES=main.c format/png.c format/webp.c
CFLAGS=-Wall -Wextra -g
LDFLAGS=-lX11 -lpng
LDFLAGS=-lX11 -lpng -lwebp
all:
${CC} ${CFLAGS} -o ${NAME} ${FILES} ${LDFLAGS}

50
format/webp.c ノーマルファイル
ファイルの表示

@ -0,0 +1,50 @@
#include "webp.h"
XImage* read_webp(Display *d, const char *filename) {
FILE *fp = fopen(filename, "rb");
if (!fp) {
perror("ファイルを開けられません。");
return NULL;
}
fseek(fp, 0, SEEK_END);
size_t filesize = ftell(fp);
fseek(fp, 0, SEEK_SET);
uint8_t *data = malloc(filesize);
fread(data, filesize, 1, fp);
fclose(fp);
int width, height;
uint8_t *imgdata = WebPDecodeRGBA(data, filesize, &width, &height);
free(data);
if (imgdata == NULL) {
fprintf(stderr, "WEBP画像を逆符号化に失敗しました。\n");
return NULL;
}
// RGBAからARGBに交換(X11の為)
uint32_t *argbdata = malloc(4 * width * height);
uint32_t *dest = argbdata;
uint8_t *src = imgdata;
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
uint8_t r = *src++;
uint8_t g = *src++;
uint8_t b = *src++;
uint8_t a = *src++;
*dest++ = (a << 24) | (r << 16) | (g << 8) | b;
}
}
free(imgdata);
XImage* img = XCreateImage(d, CopyFromParent, 24, ZPixmap, 0, (char*)argbdata, width, height, 32, 0);
if (img == NULL) {
free(argbdata);
fprintf(stderr, "WEBPのXImageを創作に失敗しました。\n");
return NULL;
}
return img;
}

11
format/webp.h ノーマルファイル
ファイルの表示

@ -0,0 +1,11 @@
#ifndef _WEBP_H
#define _WEBP_H
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <webp/decode.h>
XImage* read_webp(Display *d, const char *filename);
#endif

3
main.c
ファイルの表示

@ -8,6 +8,7 @@
#include <X11/keysym.h>
#include "format/png.h"
#include "format/webp.h"
int XErrorHandlerd(Display *d, XErrorEvent *event) {
char error_text[120];
@ -30,6 +31,8 @@ XImage* openimg(Display *d, const char *filename) {
if (memcmp(buf, "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", 8) == 0) { // PNG
return read_png(d, filename);
} else if (memcmp(buf + 8, "WEBP", 4) == 0) { // WEBP
return read_webp(d, filename);
}
fprintf(stderr, "不明なファイル種類。\n");