toys/sww/test/image_viewer.c

97 lines
2.4 KiB
C

#include <math.h>
#include <stdio.h>
#include <stdlib.h> /**< rand qsort */
#include "sww/app.h"
#include "sww/color.h"
#include "sww/fps_helper.h"
#include "sww/rate_helper.h"
#include "sww/renderer.h"
#include "sww/texture.h"
#include "sww/util.h"
#include "sww/vmath.h"
#include "sww/window.h"
#define TITLE "SWW Image Viewer"
typedef struct
{
int w;
int h;
swwRenderer* renderer;
} UserData;
void OnKey(swwWindow* o, swwKeycode key, int pressed)
{
if (pressed && key == swwKeycode_ESCAPE) {
swwApp_PostQuitEvent();
}
}
void OnButton(swwWindow* o, swwButton btn, int pressed)
{
if (btn == swwButton_R && pressed) {
// Save to png file
UserData* ud = swwWindow_GetUserData(o);
uint32_t buf_size = swwUtil_PngBufferSize(ud->w, ud->h, 1);
uint8_t* buf = (uint8_t*)malloc(buf_size);
uint8_t* wbuf = swwRenderer_LockBuffer(ud->renderer);
FILE* fp = NULL;
swwUtil_SaveBufferToPngBuffer(buf, buf_size, wbuf, ud->w, ud->h, 1);
fp = fopen("output.png", "wb+");
fwrite(buf, 1, buf_size, fp);
fclose(fp);
free(buf);
}
}
void OnScroll(swwWindow* o, float offset)
{}
int main(int argc, char *argv[])
{
uint32_t img_w, img_h;
swwTexture* qrcode_tex = swwTexture_LoadFromFile("qrcode.png");
swwTexture_GetSize(qrcode_tex, &img_w, &img_h);
swwWindowCallback callback = {OnKey, OnButton, OnScroll};
swwFpsHelper fps;
swwApp_Initialize();
swwWindow* window = swwWindow_Create(TITLE, img_w, img_h);
UserData ud = {img_w, img_h, NULL};
ud.renderer = swwRenderer_CreateAttachWindow(window, kSoftwareRenderer);
swwWindow_SetUserData(window, &ud);
swwWindow_SetCallback(window, &callback);
swwRateHelper rh;
swwRenderer_EnablePerfMonitor(ud.renderer, 1);
swwFpsHelper_Construct(&fps, 1.f);
swwRateHelper_Construct(&rh, 30.f);
while (!swwApp_ShouldExit()) {
swwRenderer_ClearBlack(ud.renderer);
swwRenderer_DrawTexture(ud.renderer, qrcode_tex, (Point2i){0, 0});
if (swwFpsHelper_Update(&fps, ud.renderer)) {
swwFpsHelper_SetTitleWithFps(&fps, window, TITLE);
}
swwRenderer_Present(ud.renderer);
swwApp_PollEvent();
swwRateHelper_Sleep(&rh);
}
swwTexture_Destroy(qrcode_tex);
swwRenderer_Destroy(ud.renderer);
swwWindow_Destroy(window);
swwApp_Cleanup();
return 0;
}