157 lines
4 KiB
C
157 lines
4 KiB
C
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <malloc.h>
|
|
|
|
#include <coreinit/screen.h>
|
|
#include <coreinit/cache.h>
|
|
#include <vpad/input.h>
|
|
#include <whb/proc.h>
|
|
|
|
void quit(void);
|
|
void drawScreen(OSScreenID screen, VPADTouchData gamepad, int color);
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
|
|
WHBProcInit();
|
|
OSScreenInit();
|
|
|
|
size_t tvBufferSize = OSScreenGetBufferSizeEx(SCREEN_TV);
|
|
size_t drcBufferSize = OSScreenGetBufferSizeEx(SCREEN_DRC);
|
|
void *tvBuffer = memalign(0x100, tvBufferSize);
|
|
void *drcBuffer = memalign(0x100, drcBufferSize);
|
|
|
|
void quit(void)
|
|
{
|
|
if (tvBuffer)
|
|
free(tvBuffer);
|
|
if (drcBuffer)
|
|
free(drcBuffer);
|
|
OSScreenShutdown();
|
|
WHBProcShutdown();
|
|
};
|
|
|
|
if (!tvBuffer || !drcBuffer)
|
|
{
|
|
quit();
|
|
return 1;
|
|
}
|
|
|
|
OSScreenSetBufferEx(SCREEN_TV, tvBuffer);
|
|
OSScreenSetBufferEx(SCREEN_DRC, drcBuffer);
|
|
|
|
OSScreenEnableEx(SCREEN_TV, true);
|
|
OSScreenEnableEx(SCREEN_DRC, true);
|
|
|
|
VPADStatus status;
|
|
VPADReadError error;
|
|
VPADTouchData gamepadTouchScreen;
|
|
|
|
bool vpad_fatal = false;
|
|
uint32_t penColor = 0xFFFFFF00;
|
|
|
|
OSScreenPutFontEx(SCREEN_TV, 0, 0, "SimpleDrawU (TV).");
|
|
OSScreenPutFontEx(SCREEN_DRC, 0, 0, "SimpleDrawU (Gamepad).");
|
|
|
|
enum penColor
|
|
{
|
|
white = 0xFFFFFF00,
|
|
black = 0x00000000,
|
|
red = 0xBF5B5B00,
|
|
yellow = 0xC6B95500,
|
|
blue = 0x3C8D8800,
|
|
green = 0x86B46000,
|
|
};
|
|
|
|
void drawScreen(OSScreenID screen, VPADTouchData gamepad, int color)
|
|
{
|
|
OSScreenPutPixelEx(screen, gamepad.x - 1, gamepad.y - 1, color);
|
|
OSScreenPutPixelEx(screen, gamepad.x + 1, gamepad.y + 1, color);
|
|
OSScreenPutPixelEx(screen, gamepad.x + 1, gamepad.y, color);
|
|
OSScreenPutPixelEx(screen, gamepad.x - 1, gamepad.y, color);
|
|
OSScreenPutPixelEx(screen, gamepad.x, gamepad.y, color);
|
|
OSScreenPutPixelEx(screen, gamepad.x, gamepad.y + 1, color);
|
|
OSScreenPutPixelEx(screen, gamepad.x, gamepad.y - 1, color);
|
|
OSScreenPutPixelEx(screen, gamepad.x - 1, gamepad.y + 1, color);
|
|
OSScreenPutPixelEx(screen, gamepad.x + 1, gamepad.y - 1, color);
|
|
};
|
|
|
|
while (WHBProcIsRunning())
|
|
{
|
|
VPADRead(VPAD_CHAN_0, &status, 1, &error);
|
|
switch (error)
|
|
{
|
|
case VPAD_READ_SUCCESS:
|
|
{
|
|
VPADGetTPCalibratedPoint(VPAD_CHAN_0, &gamepadTouchScreen, &status.tpNormal);
|
|
break;
|
|
}
|
|
case VPAD_READ_NO_SAMPLES:
|
|
{
|
|
continue;
|
|
}
|
|
case VPAD_READ_INVALID_CONTROLLER:
|
|
{
|
|
vpad_fatal = true;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
vpad_fatal = true;
|
|
break;
|
|
}
|
|
}
|
|
if (vpad_fatal)
|
|
break;
|
|
|
|
// clear screen
|
|
if ((status.hold & VPAD_BUTTON_PLUS) && (status.hold & VPAD_BUTTON_MINUS))
|
|
{
|
|
OSScreenClearBufferEx(SCREEN_TV, 0x00000000);
|
|
OSScreenClearBufferEx(SCREEN_DRC, 0x00000000);
|
|
}
|
|
|
|
// select color
|
|
if (status.hold & VPAD_BUTTON_PLUS)
|
|
{
|
|
penColor = white;
|
|
}
|
|
if (status.hold & VPAD_BUTTON_MINUS)
|
|
{
|
|
penColor = black;
|
|
}
|
|
if (status.hold & VPAD_BUTTON_A)
|
|
{
|
|
penColor = red;
|
|
}
|
|
if (status.hold & VPAD_BUTTON_B)
|
|
{
|
|
penColor = yellow;
|
|
}
|
|
if (status.hold & VPAD_BUTTON_X)
|
|
{
|
|
penColor = blue;
|
|
}
|
|
if (status.hold & VPAD_BUTTON_Y)
|
|
{
|
|
penColor = green;
|
|
}
|
|
|
|
// draw on screen
|
|
if (gamepadTouchScreen.touched)
|
|
{
|
|
drawScreen(SCREEN_TV, gamepadTouchScreen, penColor);
|
|
drawScreen(SCREEN_DRC, gamepadTouchScreen, penColor);
|
|
}
|
|
|
|
DCFlushRange(tvBuffer, tvBufferSize);
|
|
DCFlushRange(drcBuffer, drcBufferSize);
|
|
|
|
OSScreenFlipBuffersEx(SCREEN_TV);
|
|
OSScreenFlipBuffersEx(SCREEN_DRC);
|
|
}
|
|
|
|
quit();
|
|
|
|
return 0;
|
|
}
|