summaryrefslogtreecommitdiff
path: root/src/image_processing_effects.c
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2021-06-18 14:28:58 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2021-06-18 14:28:58 -0400
commitb6bdaedb77a740893ebb66a85ebecbfa64353ba6 (patch)
tree20bbc335571b8280b72be99a65d478d344c0ceec /src/image_processing_effects.c
parent22d27fa9735dd840434fa7e030005eeccafe8aaf (diff)
Sync image_processing_effects from emerald, 1
Diffstat (limited to 'src/image_processing_effects.c')
-rw-r--r--src/image_processing_effects.c1535
1 files changed, 1535 insertions, 0 deletions
diff --git a/src/image_processing_effects.c b/src/image_processing_effects.c
new file mode 100644
index 000000000..f0f44d6e5
--- /dev/null
+++ b/src/image_processing_effects.c
@@ -0,0 +1,1535 @@
+#include "global.h"
+#include "image_processing_effects.h"
+#include "contest_painting.h"
+
+extern const u8 gUnknown_083E7A50[][3];
+
+u16 (*gUnknown_03005DEC)[][32];
+u8 gUnknown_03005DE8;
+u8 gUnknown_03005DF0;
+u8 gUnknown_03005DFC;
+u8 gUnknown_03005DF8;
+u8 gUnknown_03005DF4;
+u8 gUnknown_03005E00;
+u8 gUnknown_03005E04;
+u16 * gUnknown_03005E08;
+u16 gUnknown_03005E0C;
+
+// this file's functions
+void sub_80FCAA4(void);
+void sub_80FCB5C(void);
+void sub_80FCD54(void);
+void sub_80FCEA4(void);
+void sub_80FCCBC(void);
+void sub_80FD06C(void);
+void sub_80FD114(void);
+void sub_80FCF3C(void);
+void sub_80FCAC4(void);
+void sub_80FCC18(u8);
+void sub_80FC92C(u8);
+void sub_80FC9E4(u8);
+void sub_80FD1C8(u16);
+u16 ConvertColorToGrayscale(u16*);
+u16 sub_80FD68C(u16*, u16*, u16*);
+u16 ConvertCoolColor(u16*, u8);
+u16 ConvertToBlackOrWhite(u16*);
+u16 sub_80FD50C(u16*, u16*);
+u16 InvertColor(u16*);
+u16 sub_80FD7AC(u16*, u16*, u16*);
+u16 sub_80FD568(u16*, u16*);
+u16 GetCoolColorFromPersonality(u8);
+void sub_80FDC18(bool8);
+void sub_80FDAE4(void);
+void sub_80FDF88(void);
+void sub_80FDBE4(void);
+void sub_80FDED8(void);
+void sub_80FDBA8(void);
+void sub_80FDE28(void);
+void sub_80FDB8C(void);
+void sub_80FDD70(void);
+u16 sub_80FE038(u16 *);
+u16 sub_80FE17C(u16 *);
+u16 sub_80FE1B0(u16 *);
+u16 sub_80FE0AC(u16 *);
+
+void sub_80FC7A0(struct ImageProcessingContext* info)
+{
+ gUnknown_03005DEC = info->var_4;
+ gUnknown_03005E00 = info->var_1F;
+ gUnknown_03005DE8 = info->var_19;
+ gUnknown_03005DFC = info->var_1A;
+ gUnknown_03005DF8 = info->var_1B;
+ gUnknown_03005DF0 = info->var_1C;
+ gUnknown_03005E04 = info->var_1D;
+ gUnknown_03005DF4 = info->var_1E;
+ switch (info->var_0)
+ {
+ case 2:
+ sub_80FCAA4();
+ break;
+ case 8:
+ sub_80FCB5C();
+ break;
+ case 9:
+ sub_80FCD54();
+ sub_80FCC18(gUnknown_03005E00);
+ break;
+ case 10:
+ sub_80FCD54();
+ sub_80FCEA4();
+ sub_80FCCBC();
+ case 31:
+ sub_80FCEA4();
+ break;
+ case 11:
+ sub_80FCD54();
+ sub_80FD06C();
+ sub_80FD06C();
+ sub_80FD114();
+ sub_80FCCBC();
+ break;
+ case 13:
+ sub_80FCF3C();
+ break;
+ case 30:
+ sub_80FCD54();
+ break;
+ case 32:
+ sub_80FD06C();
+ break;
+ case 33:
+ sub_80FD114();
+ break;
+ case 6:
+ sub_80FCAC4();
+ sub_80FC92C(3);
+ break;
+ case 36:
+ sub_80FCD54();
+ sub_80FD06C();
+ sub_80FD114();
+ sub_80FCCBC();
+ sub_80FCB5C();
+ sub_80FCB5C();
+ sub_80FC92C(2);
+ sub_80FC9E4(4);
+ break;
+ }
+}
+
+#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r))
+
+void sub_80FC92C(u8 a0) // it changes palette someway somehow... .__.
+{
+ u8 i, j;
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* pal = &var2[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, pal++)
+ {
+ if (!(0x8000 & *pal))
+ {
+ u8 val = (31 & *pal);
+ val += a0;
+ if (val > 31)
+ val = 31;
+
+ *pal = RGB2(val, val, val);
+ }
+ }
+ }
+}
+
+void sub_80FC9E4(u8 a0)
+{
+ u8 i, j;
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* pal = &var2[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, pal++)
+ {
+ if (!(0x8000 & *pal))
+ {
+ u8 val = (31 & *pal);
+ if (val > 31 - a0)
+ val = 31 - (a0 >> 1);
+
+ *pal = RGB2(val, val, val);
+ }
+ }
+ }
+}
+
+void sub_80FCAA4(void)
+{
+ u32 i;
+ for (i = 0; i < 3200; i++)
+ sub_80FD1C8(i);
+}
+
+void sub_80FCAC4(void)
+{
+ u8 i, j;
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* color = &var2[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, color++)
+ {
+ if (!(0x8000 & *color))
+ {
+ *color = ConvertColorToGrayscale(color);
+ }
+ }
+ }
+}
+
+void sub_80FCB5C(void)
+{
+ u8 i, j;
+ for (i = 0; i < gUnknown_03005DF8; i++)
+ {
+ u16* var0 = &(*gUnknown_03005DEC)[0][gUnknown_03005DFC * gUnknown_03005E04];
+ u16* palette = &var0[gUnknown_03005DE8 + i];
+ u16 color = *palette;
+ j = 1;
+ palette += gUnknown_03005E04;
+ while (j < gUnknown_03005DF0 - 1)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = sub_80FD68C(&color, palette, palette + gUnknown_03005E04);
+ color = *palette;
+ }
+
+ j++;
+ palette += gUnknown_03005E04;
+ }
+ }
+}
+
+void sub_80FCC18(u8 arg0)
+{
+ u8 i, j;
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* color = &var0[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, color++)
+ {
+ if (!(0x8000 & *color))
+ {
+ *color = ConvertCoolColor(color, arg0);
+ }
+ }
+ }
+}
+
+void sub_80FCCBC(void)
+{
+ u8 i, j;
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* color = &var0[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, color++)
+ {
+ if (!(0x8000 & *color))
+ {
+ *color = ConvertToBlackOrWhite(color);
+ }
+ }
+ }
+}
+
+void sub_80FCD54(void)
+{
+ u8 i, j;
+ u16 *palette;
+
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ palette = &var0[gUnknown_03005DE8];
+ *palette = sub_80FD50C(palette, palette + 1);
+ for (j = 1, palette = palette + 1; j < gUnknown_03005DF8 - 1; j++, palette++)
+ {
+ *palette = sub_80FD50C(palette, palette + 1);
+ *palette = sub_80FD50C(palette, palette - 1);
+ }
+
+ *palette = sub_80FD50C(palette, palette - 1);
+ }
+
+ for (j = 0; j < gUnknown_03005DF8; j++)
+ {
+ u16* var0 = &(*gUnknown_03005DEC)[0][gUnknown_03005DFC * gUnknown_03005E04];
+ palette = &var0[gUnknown_03005DE8 + j];
+ *palette = sub_80FD50C(palette, palette + gUnknown_03005E04);
+ for (i = 1, palette = palette + gUnknown_03005E04; i < gUnknown_03005DF0 - 1; i++, palette += gUnknown_03005E04)
+ {
+ *palette = sub_80FD50C(palette, palette + gUnknown_03005E04);
+ *palette = sub_80FD50C(palette, palette - gUnknown_03005E04);
+ }
+
+ *palette = sub_80FD50C(palette, palette - gUnknown_03005E04);
+ }
+}
+
+void sub_80FCEA4(void)
+{
+ u8 i, j;
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* color = &var0[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, color++)
+ {
+ if (!(0x8000 & *color))
+ {
+ *color = InvertColor(color);
+ }
+ }
+ }
+}
+
+void sub_80FCF3C(void)
+{
+ u8 i, j;
+ u16 *palette;
+ u16 color;
+
+ palette = (*gUnknown_03005DEC)[0];
+ for (i = 0; i < 64; i++)
+ {
+ for (j = 0; j < 64; j++, palette++)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = InvertColor(palette);
+ }
+ }
+ }
+
+ for (j = 0; j < 64; j++)
+ {
+ palette = &(*gUnknown_03005DEC)[0][j];
+ color = *palette;
+ *palette = 0x8000;
+ for (i = 1, palette += 64; i < 63; i++, palette += 64)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = sub_80FD7AC(&color, palette, palette + 64);
+ color = *palette;
+ }
+ }
+
+ *palette = 0x8000;
+ palette = &(*gUnknown_03005DEC)[0][j];
+ color = *palette;
+ *palette = 0x8000;
+ for (i = 1, palette += 64; i < 63; i++, palette += 64)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = sub_80FD7AC(&color, palette, palette + 64);
+ color = *palette;
+ }
+ }
+
+ *palette = 0x8000;
+ }
+
+ palette = (*gUnknown_03005DEC)[0];
+ for (i = 0; i < 64; i++)
+ {
+ for (j = 0; j < 64; j++, palette++)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = InvertColor(palette);
+ }
+ }
+ }
+}
+
+void sub_80FD06C(void)
+{
+ u8 i, j;
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* palette = &var0[gUnknown_03005DE8];
+ u16 color = *palette;
+ for (j = 1, palette++; j < gUnknown_03005DF8 - 1; j++, palette++)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = sub_80FD568(&color, palette);
+ color = *palette;
+ }
+ }
+ }
+}
+
+void sub_80FD114(void)
+{
+ u8 i, j;
+ for (i = 0; i < gUnknown_03005DF8; i++)
+ {
+ u16* var0 = &(*gUnknown_03005DEC)[0][gUnknown_03005DFC * gUnknown_03005E04];
+ u16* palette = &var0[gUnknown_03005DE8 + i];
+ u16 color = *palette;
+ for (j = 1, palette += gUnknown_03005E04; j < gUnknown_03005DF0 - 1; j++, palette += gUnknown_03005E04)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = sub_80FD568(&color, palette);
+ color = *palette;
+ }
+ }
+ }
+}
+
+NAKED
+void sub_80FD1C8(u16 arg0)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x20\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r10, r0\n\
+ mov r2, sp\n\
+ ldr r3, _080FD234 @ =gUnknown_083E7A50\n\
+ lsls r1, r0, 1\n\
+ add r1, r10\n\
+ adds r0, r1, r3\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2]\n\
+ adds r0, r3, 0x1\n\
+ adds r0, r1, r0\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2, 0x1]\n\
+ mov r5, sp\n\
+ adds r0, r3, 0x2\n\
+ adds r1, r0\n\
+ ldrb r4, [r1]\n\
+ lsls r2, r4, 24\n\
+ lsrs r1, r2, 27\n\
+ movs r0, 0x7\n\
+ ands r1, r0\n\
+ strh r1, [r5, 0x2]\n\
+ lsrs r2, 25\n\
+ mov r9, r2\n\
+ movs r0, 0x3\n\
+ ands r2, r0\n\
+ mov r9, r2\n\
+ movs r5, 0x1\n\
+ ands r5, r4\n\
+ movs r4, 0x1\n\
+ mov r8, r4\n\
+ cmp r8, r1\n\
+ bcs _080FD27A\n\
+ mov r3, sp\n\
+_080FD21A:\n\
+ cmp r5, 0\n\
+ bne _080FD238\n\
+ mov r0, r8\n\
+ lsls r2, r0, 2\n\
+ mov r4, sp\n\
+ adds r1, r4, r2\n\
+ ldrb r0, [r3]\n\
+ mov r4, r8\n\
+ subs r0, r4\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r3, 0x1]\n\
+ add r0, r8\n\
+ b _080FD24A\n\
+ .align 2, 0\n\
+_080FD234: .4byte gUnknown_083E7A50\n\
+_080FD238:\n\
+ mov r0, r8\n\
+ lsls r2, r0, 2\n\
+ mov r4, sp\n\
+ adds r1, r4, r2\n\
+ ldrb r0, [r3]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r3, 0x1]\n\
+ subs r0, 0x1\n\
+_080FD24A:\n\
+ strb r0, [r1, 0x1]\n\
+ add r2, sp\n\
+ ldrb r0, [r2]\n\
+ cmp r0, 0x3F\n\
+ bhi _080FD25A\n\
+ ldrb r0, [r2, 0x1]\n\
+ cmp r0, 0x3F\n\
+ bls _080FD262\n\
+_080FD25A:\n\
+ mov r0, r8\n\
+ subs r0, 0x1\n\
+ strh r0, [r3, 0x2]\n\
+ b _080FD27A\n\
+_080FD262:\n\
+ ldrh r0, [r3, 0x2]\n\
+ mov r1, r8\n\
+ subs r0, r1\n\
+ strh r0, [r2, 0x2]\n\
+ mov r0, r8\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ ldrh r0, [r3, 0x2]\n\
+ cmp r8, r0\n\
+ bcc _080FD21A\n\
+_080FD27A:\n\
+ movs r2, 0\n\
+ mov r8, r2\n\
+ mov r0, sp\n\
+ ldrh r0, [r0, 0x2]\n\
+ cmp r8, r0\n\
+ bcc _080FD288\n\
+ b _080FD38A\n\
+_080FD288:\n\
+ movs r3, 0x1F\n\
+_080FD28A:\n\
+ ldr r1, _080FD2E8 @ =gUnknown_03005DEC\n\
+ mov r4, r8\n\
+ lsls r0, r4, 2\n\
+ mov r2, sp\n\
+ adds r6, r2, r0\n\
+ ldrb r0, [r6, 0x1]\n\
+ lsls r0, 7\n\
+ ldr r1, [r1]\n\
+ adds r1, r0\n\
+ ldrb r0, [r6]\n\
+ lsls r0, 1\n\
+ adds r2, r1, r0\n\
+ ldrh r1, [r2]\n\
+ movs r4, 0x80\n\
+ lsls r4, 8\n\
+ adds r0, r4, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080FD376\n\
+ movs r7, 0x1F\n\
+ ands r7, r1\n\
+ lsls r0, r1, 16\n\
+ lsrs r5, r0, 21\n\
+ ands r5, r3\n\
+ lsrs r4, r0, 26\n\
+ ands r4, r3\n\
+ mov r0, r9\n\
+ cmp r0, 0\n\
+ blt _080FD36C\n\
+ cmp r0, 0x1\n\
+ ble _080FD2EC\n\
+ cmp r0, 0x3\n\
+ bgt _080FD36C\n\
+ ldrh r0, [r6, 0x2]\n\
+ adds r1, r7, r0\n\
+ lsls r1, 16\n\
+ lsrs r7, r1, 16\n\
+ adds r1, r5, r0\n\
+ lsls r1, 16\n\
+ lsrs r5, r1, 16\n\
+ adds r0, r4, r0\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ cmp r7, 0x1F\n\
+ bls _080FD360\n\
+ movs r7, 0x1F\n\
+ b _080FD360\n\
+ .align 2, 0\n\
+_080FD2E8: .4byte gUnknown_03005DEC\n\
+_080FD2EC:\n\
+ mov r1, r10\n\
+ lsls r0, r1, 1\n\
+ add r0, r10\n\
+ ldr r1, _080FD320 @ =gUnknown_083E7A50\n\
+ adds r1, 0x2\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ lsrs r0, 3\n\
+ movs r1, 0x7\n\
+ ands r0, r1\n\
+ movs r1, 0x3\n\
+ str r2, [sp, 0x18]\n\
+ str r3, [sp, 0x1C]\n\
+ bl __umodsi3\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ ldr r2, [sp, 0x18]\n\
+ ldr r3, [sp, 0x1C]\n\
+ cmp r0, 0x1\n\
+ beq _080FD33C\n\
+ cmp r0, 0x1\n\
+ bgt _080FD324\n\
+ cmp r0, 0\n\
+ beq _080FD32A\n\
+ b _080FD36C\n\
+ .align 2, 0\n\
+_080FD320: .4byte gUnknown_083E7A50\n\
+_080FD324:\n\
+ cmp r0, 0x2\n\
+ beq _080FD34E\n\
+ b _080FD36C\n\
+_080FD32A:\n\
+ ldrh r0, [r6, 0x2]\n\
+ cmp r7, r0\n\
+ bcc _080FD338\n\
+ subs r0, r7, r0\n\
+ lsls r0, 16\n\
+ lsrs r7, r0, 16\n\
+ b _080FD36C\n\
+_080FD338:\n\
+ movs r7, 0\n\
+ b _080FD36C\n\
+_080FD33C:\n\
+ ldrh r0, [r6, 0x2]\n\
+ cmp r5, r0\n\
+ bcc _080FD34A\n\
+ subs r0, r5, r0\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ b _080FD36C\n\
+_080FD34A:\n\
+ movs r5, 0\n\
+ b _080FD36C\n\
+_080FD34E:\n\
+ ldrh r0, [r6, 0x2]\n\
+ cmp r4, r0\n\
+ bcc _080FD35C\n\
+ subs r0, r4, r0\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ b _080FD36C\n\
+_080FD35C:\n\
+ movs r4, 0\n\
+ b _080FD36C\n\
+_080FD360:\n\
+ cmp r5, 0x1F\n\
+ bls _080FD366\n\
+ movs r5, 0x1F\n\
+_080FD366:\n\
+ cmp r4, 0x1F\n\
+ bls _080FD36C\n\
+ movs r4, 0x1F\n\
+_080FD36C:\n\
+ lsls r0, r4, 10\n\
+ lsls r1, r5, 5\n\
+ orrs r0, r1\n\
+ orrs r7, r0\n\
+ strh r7, [r2]\n\
+_080FD376:\n\
+ mov r0, r8\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ mov r0, sp\n\
+ ldrh r0, [r0, 0x2]\n\
+ cmp r8, r0\n\
+ bcs _080FD38A\n\
+ b _080FD28A\n\
+_080FD38A:\n\
+ add sp, 0x20\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided\n");
+}
+
+u16 ConvertColorToGrayscale(u16 *color)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+ u16 average = (red + green + blue) / 3;
+ return RGB2(average, average, average);
+}
+
+// The dark colors are the colored edges of the Cool painting effect.
+// Everything else is white.
+u16 ConvertCoolColor(u16 *color, u8 personality)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+ if (red < 17 && green < 17 && blue < 17)
+ return GetCoolColorFromPersonality(personality);
+ else
+ return RGB2(31, 31, 31);
+}
+
+// Based on the given value, which comes from the first 8 bits of
+// the mon's personality value, return a color.
+u16 GetCoolColorFromPersonality(u8 personality)
+{
+ u16 red = 0;
+ u16 green = 0;
+ u16 blue = 0;
+ u8 strength = (personality / 6) % 3;
+ u8 colorType = personality % 6;
+
+ switch (colorType)
+ {
+ case 0:
+ // Teal color
+ green = 21 - strength;
+ blue = green;
+ red = 0;
+ break;
+ case 1:
+ // Yellow color
+ blue = 0;
+ red = 21 - strength;
+ green = red;
+ break;
+ case 2:
+ // Purple color
+ blue = 21 - strength;
+ green = 0;
+ red = blue;
+ break;
+ case 3:
+ // Red color
+ blue = 0;
+ green = 0;
+ red = 23 - strength;
+ break;
+ case 4:
+ // Blue color
+ blue = 23 - strength;
+ green = 0;
+ red = 0;
+ break;
+ case 5:
+ // Green color
+ blue = 0;
+ green = 23 - strength;
+ red = 0;
+ break;
+ }
+
+ return RGB2(red, green, blue);
+}
+
+u16 ConvertToBlackOrWhite(u16 *color)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+ if (red < 17 && green < 17 && blue < 17)
+ return RGB2(0, 0, 0);
+ else
+ return RGB2(31, 31, 31);
+}
+
+u16 sub_80FD50C(u16 *colorA, u16 *colorB)
+{
+ if (*colorA)
+ {
+ if (*colorA & 0x8000)
+ return 0x8000;
+ if (*colorB & 0x8000)
+ return RGB2(0, 0, 0);
+
+ return *colorA;
+ }
+
+ return RGB2(0, 0, 0);
+}
+
+u16 InvertColor(u16 *color)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+ red = 31 - red;
+ green = 31 - green;
+ blue = 31 - blue;
+
+ return RGB2(red, green, blue);
+}
+
+u16 sub_80FD568(u16 *a0, u16 *a1)
+{
+ u16 sp0[2][3];
+ u16 spC[3];
+ u8 r4;
+ u16 r2;
+ u16 r, g, b;
+
+ if (*a0 == *a1)
+ return *a1;
+
+ sp0[0][0] = (*a0 >> 0) & 0x1F;
+ sp0[0][1] = (*a0 >> 5) & 0x1F;
+ sp0[0][2] = (*a0 >> 10) & 0x1F;
+ sp0[1][0] = (*a1 >> 0) & 0x1F;
+ sp0[1][1] = (*a1 >> 5) & 0x1F;
+ sp0[1][2] = (*a1 >> 10) & 0x1F;
+
+ if (sp0[0][0] > 25 && sp0[0][1] > 25 && sp0[0][2] > 25)
+ return *a1;
+ if (sp0[1][0] > 25 && sp0[1][1] > 25 && sp0[1][2] > 25)
+ return *a1;
+
+ for (r4 = 0; r4 < 3; r4++)
+ {
+ if (sp0[0][r4] > sp0[1][r4])
+ spC[r4] = sp0[0][r4] - sp0[1][r4];
+ else
+ spC[r4] = sp0[1][r4] - sp0[0][r4];
+ }
+
+ if (spC[0] >= spC[1])
+ {
+ if (spC[0] >= spC[2])
+ r2 = spC[0];
+ else if (spC[1] >= spC[2])
+ r2 = spC[1];
+ else
+ r2 = spC[2];
+ }
+ else
+ {
+ if (spC[1] >= spC[2])
+ r2 = spC[1];
+ else if (spC[2] >= spC[0])
+ r2 = spC[2];
+ else
+ r2 = spC[0];
+ }
+
+ r = (sp0[1][0] * (31 - r2 / 2)) / 31;
+ g = (sp0[1][1] * (31 - r2 / 2)) / 31;
+ b = (sp0[1][2] * (31 - r2 / 2)) / 31;
+ return RGB2(r, g, b);
+}
+
+u16 sub_80FD68C(u16 * a0, u16 * a1, u16 * a2)
+{
+ u16 red, green, blue;
+ u16 avg0, avg1, avg2;
+ u16 diff1, diff2;
+ u32 minimum;
+ u16 factor;
+
+ if (*a0 == *a1 && *a2 == *a1)
+ return *a1;
+
+ red = (*a1 >> 0) & 0x1F;
+ green = (*a1 >> 5) & 0x1F;
+ blue = (*a1 >> 10) & 0x1F;
+
+ avg0 = (((*a0 >> 0) & 0x1F) + ((*a0 >> 5) & 0x1F) + ((*a0 >> 10) & 0x1F)) / 3;
+ avg1 = (((*a1 >> 0) & 0x1F) + ((*a1 >> 5) & 0x1F) + ((*a1 >> 10) & 0x1F)) / 3;
+ avg2 = (((*a2 >> 0) & 0x1F) + ((*a2 >> 5) & 0x1F) + ((*a2 >> 10) & 0x1F)) / 3;
+
+ if (avg0 == avg1 && avg2 == avg1)
+ return *a1;
+
+ if (avg0 > avg1)
+ diff1 = avg0 - avg1;
+ else
+ diff1 = avg1 - avg0;
+
+ if (avg2 > avg1)
+ diff2 = avg2 - avg1;
+ else
+ diff2 = avg1 - avg2;
+
+ if (diff1 >= diff2)
+ minimum = diff1;
+ else
+ minimum = diff2;
+
+ factor = 31 - minimum / 2;
+ red = red * factor / 31;
+ green = green * factor / 31;
+ blue = blue * factor / 31;
+ return RGB2(red, green, blue);
+}
+
+u16 sub_80FD7AC(u16 *a0, u16 *a1, u16 *a2)
+{
+ u16 red, green, blue;
+ u16 avg0, avg1, avg2;
+ u16 diff1, diff2;
+ u32 minimum;
+ u16 factor;
+
+ if (*a0 == *a1 && *a2 == *a1)
+ return *a1;
+
+ red = (*a1 >> 0) & 0x1F;
+ green = (*a1 >> 5) & 0x1F;
+ blue = (*a1 >> 10) & 0x1F;
+
+ avg0 = (((*a0 >> 0) & 0x1F) + ((*a0 >> 5) & 0x1F) + ((*a0 >> 10) & 0x1F)) / 3;
+ avg1 = (((*a1 >> 0) & 0x1F) + ((*a1 >> 5) & 0x1F) + ((*a1 >> 10) & 0x1F)) / 3;
+ avg2 = (((*a2 >> 0) & 0x1F) + ((*a2 >> 5) & 0x1F) + ((*a2 >> 10) & 0x1F)) / 3;
+
+ if (avg0 == avg1 && avg2 == avg1)
+ return *a1;
+
+ if (avg0 > avg1)
+ diff1 = avg0 - avg1;
+ else
+ diff1 = avg1 - avg0;
+
+ if (avg2 > avg1)
+ diff2 = avg2 - avg1;
+ else
+ diff2 = avg1 - avg2;
+
+ if (diff1 >= diff2)
+ minimum = diff1;
+ else
+ minimum = diff2;
+
+ factor = 31 - minimum;
+ red = red * factor / 31;
+ green = green * factor / 31;
+ blue = blue * factor / 31;
+ return RGB2(red, green, blue);
+}
+
+/*
+void sub_80FD8CC(struct ImageProcessingContext * a0)
+{
+ u16 i, j, k;
+ u8 r5 = a0->var_1D >> 3;
+ u8 sp08 = a0->var_1E >> 3;
+ u16 * sp00 = (u16 *)a0->var_4;
+ u16 * sp04 = (u16 *)a0->var_10;
+ if (a0->var_16 == 2)
+ {
+ for (i = 0; i < sp08; i++)
+ {
+ for (j = 0; j < r5; j++)
+ {
+ for (k = 0; k < 8; k++)
+ {
+ u16 * r3 = &sp04[i * r5 * 32 + 4 * k];
+ u16 * r2 = &sp00[j * 8 + (i * 8 + k) * 8 * r5];
+ r3[0] = r2[0] | (r2[1] << 8);
+ r3[1] = r2[2] | (r2[3] << 8);
+ r3[2] = r2[4] | (r2[5] << 8);
+ r3[3] = r2[6] | (r2[7] << 8);
+ }
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < sp08; i++)
+ {
+ for (j = 0; j < r5; j++)
+ {
+ for (k = 0; k < 8; k++)
+ {
+ u16 * r3 = &sp04[i * r5 * 16 + 2 * k];
+ u16 * r2 = &sp00[j * 8 + (i * 8 + k) * 8 * r5];
+ r3[0] = r2[0] | (r2[1] << 4) | (r2[2] << 8) | (r2[3] << 12);
+ r3[1] = r2[4] | (r2[5] << 4) | (r2[6] << 8) | (r2[7] << 12);
+ }
+ }
+ }
+ }
+}
+*/
+
+NAKED
+void sub_80FD8CC(struct ImageProcessingContext * a0)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tsub sp, 0xC\n"
+ "\tldrb r1, [r0, 0x1D]\n"
+ "\tlsrs r5, r1, 3\n"
+ "\tldrb r1, [r0, 0x1E]\n"
+ "\tlsrs r1, 3\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tldr r1, [r0, 0x4]\n"
+ "\tstr r1, [sp]\n"
+ "\tldr r2, [r0, 0x10]\n"
+ "\tstr r2, [sp, 0x4]\n"
+ "\tldrh r0, [r0, 0x16]\n"
+ "\tcmp r0, 0x2\n"
+ "\tbne _080FD97C\n"
+ "\tmovs r1, 0\n"
+ "\tldr r0, [sp, 0x8]\n"
+ "\tcmp r1, r0\n"
+ "\tbcc _080FD8FA\n"
+ "\tb _080FDA08\n"
+ "_080FD8FA:\n"
+ "\tmovs r0, 0\n"
+ "\tadds r2, r1, 0x1\n"
+ "\tmov r10, r2\n"
+ "\tcmp r0, r5\n"
+ "\tbcs _080FD96E\n"
+ "\tadds r2, r1, 0\n"
+ "\tmuls r2, r5\n"
+ "\tmov r9, r2\n"
+ "\tlsls r1, 3\n"
+ "\tmov r8, r1\n"
+ "_080FD90E:\n"
+ "\tmovs r4, 0\n"
+ "\tlsls r6, r0, 4\n"
+ "\tadds r7, r0, 0x1\n"
+ "\tadd r0, r9\n"
+ "\tlsls r0, 6\n"
+ "\tldr r1, [sp, 0x4]\n"
+ "\tadds r1, r0\n"
+ "\tmov r12, r1\n"
+ "_080FD91E:\n"
+ "\tlsls r0, r4, 3\n"
+ "\tmov r2, r12\n"
+ "\tadds r3, r2, r0\n"
+ "\tmov r1, r8\n"
+ "\tadds r0, r1, r4\n"
+ "\tlsls r0, 3\n"
+ "\tmuls r0, r5\n"
+ "\tlsls r0, 1\n"
+ "\tldr r2, [sp]\n"
+ "\tadds r0, r2, r0\n"
+ "\tadds r2, r0, r6\n"
+ "\tldrh r0, [r2, 0x2]\n"
+ "\tlsls r0, 8\n"
+ "\tldrh r1, [r2]\n"
+ "\torrs r0, r1\n"
+ "\tstrh r0, [r3]\n"
+ "\tldrh r0, [r2, 0x6]\n"
+ "\tlsls r0, 8\n"
+ "\tldrh r1, [r2, 0x4]\n"
+ "\torrs r0, r1\n"
+ "\tstrh r0, [r3, 0x2]\n"
+ "\tldrh r0, [r2, 0xA]\n"
+ "\tlsls r0, 8\n"
+ "\tldrh r1, [r2, 0x8]\n"
+ "\torrs r0, r1\n"
+ "\tstrh r0, [r3, 0x4]\n"
+ "\tldrh r0, [r2, 0xE]\n"
+ "\tlsls r0, 8\n"
+ "\tldrh r1, [r2, 0xC]\n"
+ "\torrs r0, r1\n"
+ "\tstrh r0, [r3, 0x6]\n"
+ "\tadds r0, r4, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r4, r0, 16\n"
+ "\tcmp r4, 0x7\n"
+ "\tbls _080FD91E\n"
+ "\tlsls r0, r7, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, r5\n"
+ "\tbcc _080FD90E\n"
+ "_080FD96E:\n"
+ "\tmov r1, r10\n"
+ "\tlsls r0, r1, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tldr r2, [sp, 0x8]\n"
+ "\tcmp r1, r2\n"
+ "\tbcc _080FD8FA\n"
+ "\tb _080FDA08\n"
+ "_080FD97C:\n"
+ "\tmovs r1, 0\n"
+ "\tldr r0, [sp, 0x8]\n"
+ "\tcmp r1, r0\n"
+ "\tbcs _080FDA08\n"
+ "_080FD984:\n"
+ "\tmovs r0, 0\n"
+ "\tadds r2, r1, 0x1\n"
+ "\tmov r10, r2\n"
+ "\tcmp r0, r5\n"
+ "\tbcs _080FD9FC\n"
+ "\tadds r2, r1, 0\n"
+ "\tmuls r2, r5\n"
+ "\tmov r9, r2\n"
+ "\tlsls r1, 3\n"
+ "\tmov r8, r1\n"
+ "_080FD998:\n"
+ "\tmovs r4, 0\n"
+ "\tlsls r6, r0, 4\n"
+ "\tadds r7, r0, 0x1\n"
+ "\tadd r0, r9\n"
+ "\tlsls r0, 5\n"
+ "\tldr r1, [sp, 0x4]\n"
+ "\tadds r1, r0\n"
+ "\tmov r12, r1\n"
+ "_080FD9A8:\n"
+ "\tlsls r0, r4, 2\n"
+ "\tmov r2, r12\n"
+ "\tadds r3, r2, r0\n"
+ "\tmov r1, r8\n"
+ "\tadds r0, r1, r4\n"
+ "\tlsls r0, 3\n"
+ "\tmuls r0, r5\n"
+ "\tlsls r0, 1\n"
+ "\tldr r2, [sp]\n"
+ "\tadds r0, r2, r0\n"
+ "\tadds r2, r0, r6\n"
+ "\tldrh r1, [r2, 0x2]\n"
+ "\tlsls r1, 4\n"
+ "\tldrh r0, [r2]\n"
+ "\torrs r1, r0\n"
+ "\tldrh r0, [r2, 0x4]\n"
+ "\tlsls r0, 8\n"
+ "\torrs r1, r0\n"
+ "\tldrh r0, [r2, 0x6]\n"
+ "\tlsls r0, 12\n"
+ "\torrs r1, r0\n"
+ "\tstrh r1, [r3]\n"
+ "\tldrh r1, [r2, 0xA]\n"
+ "\tlsls r1, 4\n"
+ "\tldrh r0, [r2, 0x8]\n"
+ "\torrs r1, r0\n"
+ "\tldrh r0, [r2, 0xC]\n"
+ "\tlsls r0, 8\n"
+ "\torrs r1, r0\n"
+ "\tldrh r0, [r2, 0xE]\n"
+ "\tlsls r0, 12\n"
+ "\torrs r1, r0\n"
+ "\tstrh r1, [r3, 0x2]\n"
+ "\tadds r0, r4, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r4, r0, 16\n"
+ "\tcmp r4, 0x7\n"
+ "\tbls _080FD9A8\n"
+ "\tlsls r0, r7, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, r5\n"
+ "\tbcc _080FD998\n"
+ "_080FD9FC:\n"
+ "\tmov r1, r10\n"
+ "\tlsls r0, r1, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tldr r2, [sp, 0x8]\n"
+ "\tcmp r1, r2\n"
+ "\tbcc _080FD984\n"
+ "_080FDA08:\n"
+ "\tadd sp, 0xC\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0");
+}
+
+void sub_80FDA18(struct ImageProcessingContext *arg0)
+{
+ gUnknown_03005E0C = arg0->var_18 * 16;
+ gUnknown_03005E08 = &arg0->var_8[gUnknown_03005E0C];
+ gUnknown_03005DEC = arg0->var_4;
+ gUnknown_03005DE8 = arg0->var_19;
+ gUnknown_03005DFC = arg0->var_1A;
+ gUnknown_03005DF8 = arg0->var_1B;
+ gUnknown_03005DF0 = arg0->var_1C;
+ gUnknown_03005E04 = arg0->var_1D;
+ gUnknown_03005DF4 = arg0->var_1E;
+
+ switch (arg0->var_14)
+ {
+ case 0:
+ sub_80FDC18(FALSE);
+ break;
+ case 1:
+ sub_80FDC18(TRUE);
+ break;
+ case 2:
+ sub_80FDAE4();
+ sub_80FDF88();
+ break;
+ case 3:
+ sub_80FDBE4();
+ sub_80FDED8();
+ break;
+ case 4:
+ sub_80FDBA8();
+ sub_80FDE28();
+ break;
+ case 5:
+ sub_80FDB8C();
+ sub_80FDD70();
+ break;
+ }
+}
+
+void sub_80FDAE4(void)
+{
+ gUnknown_03005E08[0] = RGB2(0, 0, 0);
+ gUnknown_03005E08[1] = RGB2(6, 6, 6);
+ gUnknown_03005E08[2] = RGB2(29, 29, 29);
+ gUnknown_03005E08[3] = RGB2(11, 11, 11);
+ gUnknown_03005E08[4] = RGB2(29, 6, 6);
+ gUnknown_03005E08[5] = RGB2(6, 29, 6);
+ gUnknown_03005E08[6] = RGB2(6, 6, 29);
+ gUnknown_03005E08[7] = RGB2(29, 29, 6);
+ gUnknown_03005E08[8] = RGB2(29, 6, 29);
+ gUnknown_03005E08[9] = RGB2(6, 29, 29);
+ gUnknown_03005E08[10] = RGB2(29, 11, 6);
+ gUnknown_03005E08[11] = RGB2(11, 29, 6);
+ gUnknown_03005E08[12] = RGB2(6, 11, 29);
+ gUnknown_03005E08[13] = RGB2(29, 6, 11);
+ gUnknown_03005E08[14] = RGB2(6, 29, 11);
+ gUnknown_03005E08[15] = RGB2(11, 6, 29);
+}
+
+void sub_80FDB8C(void)
+{
+ gUnknown_03005E08[0] = RGB2(0, 0, 0);
+ gUnknown_03005E08[1] = RGB2(0, 0, 0);
+ gUnknown_03005E08[2] = RGB2(31, 31, 31);
+}
+
+void sub_80FDBA8(void)
+{
+ u8 i;
+
+ gUnknown_03005E08[0] = RGB2(0, 0, 0);
+ gUnknown_03005E08[1] = RGB2(0, 0, 0);
+ for (i = 0; i < 14; i++)
+ gUnknown_03005E08[i + 2] = RGB2(2 * (i + 2), 2 * (i + 2), 2 * (i + 2));
+}
+
+void sub_80FDBE4(void)
+{
+ u8 i;
+
+ gUnknown_03005E08[0] = RGB2(0, 0, 0);
+ for (i = 0; i < 32; i++)
+ gUnknown_03005E08[i + 1] = RGB2(i, i, i);
+}
+
+void sub_80FDC18(bool8 arg0)
+{
+ u8 i, j;
+ u16 maxIndex;
+
+ maxIndex = 0xDF;
+ if (!arg0)
+ maxIndex = 0xFF;
+
+ for (j = 0; j < maxIndex; j++)
+ gUnknown_03005E08[j] = 0;
+
+ gUnknown_03005E08[maxIndex] = RGB2(15, 15, 15);
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* pal = &var2[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, pal++)
+ {
+ if (*pal & 0x8000)
+ {
+ *pal = gUnknown_03005E0C;
+ }
+ else
+ {
+ u16 color = sub_80FE038(pal);
+ u8 curIndex = 1;
+ if (curIndex < maxIndex)
+ {
+ if (gUnknown_03005E08[curIndex] == RGB_BLACK)
+ {
+ gUnknown_03005E08[curIndex] = color;
+ *pal = gUnknown_03005E0C + curIndex;
+ }
+ else
+ {
+ while (curIndex < maxIndex)
+ {
+ if (gUnknown_03005E08[curIndex] == RGB_BLACK)
+ {
+ gUnknown_03005E08[curIndex] = color;
+ *pal = gUnknown_03005E0C + curIndex;
+ break;
+ }
+
+ if (gUnknown_03005E08[curIndex] == color)
+ {
+ *pal = gUnknown_03005E0C + curIndex;
+ break;
+ }
+
+ curIndex++;
+ }
+ }
+ }
+
+ if (curIndex == maxIndex)
+ {
+ curIndex = maxIndex;
+ *pal = curIndex;
+ }
+ }
+ }
+ }
+}
+
+void sub_80FDD70(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* pal = &var2[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, pal++)
+ {
+ if (*pal & 0x8000)
+ {
+ *pal = gUnknown_03005E0C;
+ }
+ else
+ {
+ if (ConvertToBlackOrWhite(pal) == RGB_BLACK)
+ *pal = gUnknown_03005E0C + 1;
+ else
+ *pal = gUnknown_03005E0C + 2;
+ }
+ }
+ }
+}
+
+void sub_80FDE28(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* pal = &var2[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, pal++)
+ {
+ if (*pal & 0x8000)
+ *pal = gUnknown_03005E0C;
+ else
+ *pal = sub_80FE17C(pal) + gUnknown_03005E0C;
+ }
+ }
+}
+
+void sub_80FDED8(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* pal = &var2[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, pal++)
+ {
+ if (*pal & 0x8000)
+ *pal = gUnknown_03005E0C;
+ else
+ *pal = sub_80FE1B0(pal) + gUnknown_03005E0C;
+ }
+ }
+}
+
+void sub_80FDF88(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_03005DF0; i++)
+ {
+ u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04];
+ u16* pal = &var2[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, pal++)
+ {
+ if (*pal & 0x8000)
+ *pal = gUnknown_03005E0C;
+ else
+ *pal = sub_80FE0AC(pal) + gUnknown_03005E0C;
+ }
+ }
+}
+
+u16 sub_80FE038(u16 *color)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+
+ if (red & 3)
+ red = (red & 0x1C) + 4;
+ if (green & 3)
+ green = (green & 0x1C) + 4;
+ if (blue & 3)
+ blue = (blue & 0x1C) + 4;
+
+ if (red < 6)
+ red = 6;
+ if (red > 30)
+ red = 30;
+
+ if (green < 6)
+ green = 6;
+ if (green > 30)
+ green = 30;
+
+ if (blue < 6)
+ blue = 6;
+ if (blue > 30)
+ blue = 30;
+
+ return RGB2(red, green, blue);
+}
+
+u16 sub_80FE0AC(u16* color)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+
+ if (red < 12 && green < 11 && blue < 11)
+ return 1;
+
+ if (red > 19 && green > 19 && blue > 19)
+ return 2;
+
+ if (red > 19)
+ {
+ if (green > 19)
+ {
+ if (blue > 14)
+ return 2;
+ else
+ return 7;
+ }
+ else if (blue > 19)
+ {
+ if (green > 14)
+ return 2;
+ else
+ return 8;
+ }
+ }
+
+ if (green > 19 && blue > 19)
+ {
+ if (red > 14)
+ return 2;
+ else
+ return 9;
+ }
+
+ if (red > 19)
+ {
+ if (green > 11)
+ {
+ if (blue > 11)
+ {
+ if (green < blue)
+ return 8;
+ else
+ return 7;
+ }
+ else
+ {
+ return 10;
+ }
+ }
+ else if (blue > 11)
+ {
+ return 13;
+ }
+ else
+ {
+ return 4;
+ }
+ }
+
+ if (green > 19)
+ {
+ if (red > 11)
+ {
+ if (blue > 11)
+ {
+ if (red < blue)
+ return 9;
+ else
+ return 7;
+ }
+ else
+ {
+ return 11;
+ }
+ }
+ else
+ {
+ if (blue > 11)
+ return 14;
+ else
+ return 5;
+ }
+ }
+
+ if (blue > 19)
+ {
+ if (red > 11)
+ {
+ if (green > 11)
+ {
+ if (red < green)
+ return 9;
+ else
+ return 8;
+ }
+ }
+ else if (green > 11)
+ {
+ return 12;
+ }
+
+ if (blue > 11)
+ return 15;
+ else
+ return 6;
+ }
+
+ return 3;
+}
+
+u16 sub_80FE17C(u16 *color)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+ u16 average = ((red + green + blue) / 3) & 0x1E;
+ if (average == 0)
+ return 1;
+ else
+ return average / 2;
+}
+
+u16 sub_80FE1B0(u16 *color)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+ u16 average = (red + green + blue) / 3;
+ return average + 1;
+}