diff options
Diffstat (limited to 'arm9/src/brightness.c')
-rw-r--r-- | arm9/src/brightness.c | 198 |
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_( + ®_G2_BLDCNT, brightness->surfaceMask, brightness->current_brightness); + } + else if ((brightness->screenMask & 2) != 0) + { + G2x_SetBlendBrightness_( + ®_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_(®_G2_BLDCNT, surfaceMask, start_brightness); + InitBrightnessTransition(&mainScreenBrightnessData, + step_count, + target_brightness, + start_brightness, + surfaceMask, + 1); + } + + if ((screenMask & 2) != 0) + { + G2x_SetBlendBrightness_(®_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_(®_G2_BLDCNT, surfaceMask, brightness); + } + + if ((screenMask & 2) != 0) + { + G2x_SetBlendBrightness_(®_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; +} |