97 lines
2.4 KiB
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;
|
|
}
|