summaryrefslogtreecommitdiff
path: root/arm9/src/brightness.c
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src/brightness.c')
-rw-r--r--arm9/src/brightness.c198
1 files changed, 198 insertions, 0 deletions
diff --git a/arm9/src/brightness.c b/arm9/src/brightness.c
new file mode 100644
index 00000000..59e96fd3
--- /dev/null
+++ b/arm9/src/brightness.c
@@ -0,0 +1,198 @@
+#include "global.h"
+#include "brightness.h"
+#include "GX_g2.h"
+#include "MI_memory.h"
+
+struct BrightnessData mainScreenBrightnessData;
+
+struct BrightnessData subScreenBrightnessData;
+
+THUMB_FUNC void DoBrightnessTransitionStep(struct BrightnessData *brightness)
+{
+ BOOL transitionFinished = FALSE;
+
+ if (brightness->target_brightness !=
+ brightness->current_brightness +
+ brightness->transition_direction * brightness->step_size_integer &&
+ brightness->current_brightness != brightness->target_brightness)
+ {
+ brightness->current_brightness +=
+ brightness->transition_direction * brightness->step_size_integer;
+ brightness->fractional_count += brightness->step_size_fractional;
+
+ if (brightness->fractional_count >= brightness->step_count)
+ {
+ brightness->current_brightness += brightness->transition_direction;
+ if (brightness->current_brightness != brightness->target_brightness)
+ {
+ brightness->fractional_count -= brightness->step_count;
+ }
+ else
+ {
+ transitionFinished = TRUE;
+ }
+ }
+ }
+ else
+ {
+ brightness->current_brightness = brightness->target_brightness;
+ transitionFinished = TRUE;
+ }
+
+ if ((brightness->screenMask & 1) != 0)
+ {
+ G2x_SetBlendBrightness_(
+ &reg_G2_BLDCNT, brightness->surfaceMask, brightness->current_brightness);
+ }
+ else if ((brightness->screenMask & 2) != 0)
+ {
+ G2x_SetBlendBrightness_(
+ &reg_G2S_DB_BLDCNT, brightness->surfaceMask, brightness->current_brightness);
+ }
+
+ if (transitionFinished == TRUE)
+ {
+ brightness->transitionActive = FALSE;
+ }
+}
+
+THUMB_FUNC void InitBrightnessTransition(struct BrightnessData *brightnessData,
+ u16 step_count,
+ s16 target_brightness,
+ s16 start_brightness,
+ fx32 surfaceMask,
+ u32 screenMask)
+{
+ GF_ASSERT(!brightnessData->transitionActive);
+
+ brightnessData->transitionActive = TRUE;
+ brightnessData->surfaceMask = (u8)surfaceMask;
+ brightnessData->screenMask = (u8)screenMask;
+ brightnessData->step_count = step_count;
+ brightnessData->target_brightness = target_brightness;
+ brightnessData->current_brightness = start_brightness;
+ brightnessData->brightness_diff = (s16)(start_brightness - target_brightness);
+
+ if (brightnessData->brightness_diff > 0)
+ {
+ brightnessData->transition_direction = -1;
+ }
+ else
+ {
+ brightnessData->transition_direction = 1;
+ brightnessData->brightness_diff *= -1;
+ }
+
+ brightnessData->step_size_integer = (s16)(brightnessData->brightness_diff / step_count);
+ brightnessData->step_size_fractional = (u16)(brightnessData->brightness_diff % step_count);
+ brightnessData->fractional_count = 0;
+}
+
+THUMB_FUNC void StartBrightnessTransition(
+ u16 step_count, s16 target_brightness, s16 start_brightness, fx32 surfaceMask, u32 screenMask)
+{
+ if (step_count != 0)
+ {
+ if ((screenMask & 1) != 0)
+ {
+ G2x_SetBlendBrightness_(&reg_G2_BLDCNT, surfaceMask, start_brightness);
+ InitBrightnessTransition(&mainScreenBrightnessData,
+ step_count,
+ target_brightness,
+ start_brightness,
+ surfaceMask,
+ 1);
+ }
+
+ if ((screenMask & 2) != 0)
+ {
+ G2x_SetBlendBrightness_(&reg_G2S_DB_BLDCNT, surfaceMask, start_brightness);
+ InitBrightnessTransition(&subScreenBrightnessData,
+ step_count,
+ target_brightness,
+ start_brightness,
+ surfaceMask,
+ 2);
+ }
+ }
+}
+
+THUMB_FUNC void SetBrightness(fx32 brightness, fx32 surfaceMask, u32 screenMask)
+{
+
+ if ((screenMask & 1) != 0)
+ {
+ G2x_SetBlendBrightness_(&reg_G2_BLDCNT, surfaceMask, brightness);
+ }
+
+ if ((screenMask & 2) != 0)
+ {
+ G2x_SetBlendBrightness_(&reg_G2S_DB_BLDCNT, surfaceMask, brightness);
+ }
+
+ InitScreenBrightnessData(screenMask);
+}
+
+THUMB_FUNC void InitAllScreenBrightnessData(void)
+{
+ MI_CpuFill8(&mainScreenBrightnessData, 0, sizeof(struct BrightnessData));
+ MI_CpuFill8(&subScreenBrightnessData, 0, sizeof(struct BrightnessData));
+
+ mainScreenBrightnessData.transitionActive = FALSE;
+ subScreenBrightnessData.transitionActive = FALSE;
+}
+
+THUMB_FUNC void InitScreenBrightnessData(u32 screenMask)
+{
+ if (screenMask & 1)
+ {
+ MI_CpuFill8(&mainScreenBrightnessData, 0, sizeof(struct BrightnessData));
+ mainScreenBrightnessData.transitionActive = FALSE;
+ }
+
+ if (screenMask & 2)
+ {
+ MI_CpuFill8(&subScreenBrightnessData, 0, sizeof(struct BrightnessData));
+ subScreenBrightnessData.transitionActive = FALSE;
+ }
+}
+
+THUMB_FUNC void DoAllScreenBrightnessTransitionStep(void)
+{
+ if (mainScreenBrightnessData.transitionActive)
+ {
+ DoBrightnessTransitionStep(&mainScreenBrightnessData);
+ }
+
+ if (subScreenBrightnessData.transitionActive)
+ {
+ DoBrightnessTransitionStep(&subScreenBrightnessData);
+ }
+}
+
+THUMB_FUNC BOOL IsBrightnessTransitionActive(u32 screenMask)
+{
+ if (screenMask == 3)
+ {
+ if (!mainScreenBrightnessData.transitionActive && !subScreenBrightnessData.transitionActive)
+ {
+ return TRUE;
+ }
+ }
+ else if (screenMask == 1)
+ {
+ if (!mainScreenBrightnessData.transitionActive)
+ {
+ return TRUE;
+ }
+ }
+ else if (screenMask == 2)
+ {
+ if (!subScreenBrightnessData.transitionActive)
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}