Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Libretro
snes9x2002
Commits
81822080
Unverified
Commit
81822080
authored
Oct 19, 2020
by
Libretro-Admin
Committed by
GitHub
Oct 19, 2020
Browse files
Merge pull request #42 from jdgleaver/new-color-ops
Backport colour operations from Snes9x 1.60
parents
8b76b530
aac31071
Pipeline
#2649
passed with stages
in 1 minute and 16 seconds
Changes
6
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Makefile
View file @
81822080
DEBUG
=
0
LAGFIX
=
1
DEBUG
=
0
LAGFIX
=
1
USE_OLD_COLOUR_OPS
=
0
TARGET_NAME
=
snes9x2002
ifeq
($(platform),)
...
...
@@ -219,10 +220,9 @@ else ifeq ($(platform), gcw0)
AR
=
/opt/gcw0-toolchain/usr/bin/mipsel-linux-ar
fpic
:=
-fPIC
SHARED
:=
-shared
-Wl
,--version-script
=
libretro/link.T
-Wl
,--no-undefined
DEFINES
+=
-DFRAME_SKIP
CFLAGS
+=
-std
=
c99
-ffast-math
-march
=
mips32
-mtune
=
mips32r2
-mhard-float
CFLAGS
+=
-std
=
c99
-fomit-frame-pointer
-ffast-math
-march
=
mips32
-mtune
=
mips32r2
-mhard-float
CFLAGS
+=
-fno-builtin
-fno-exceptions
CFLAGS
+=
-DPATH_MAX
=
256
CFLAGS
+=
-DPATH_MAX
=
256
-DFAST_LSB_WORD_ACCESS
# Windows MSVC 2010 x86
else
ifeq
($(platform), windows_msvc2010_x86)
...
...
Makefile.common
View file @
81822080
...
...
@@ -124,4 +124,8 @@ DEFINES += -DLAGFIX
endif
endif
ifeq
($(USE_OLD_COLOUR_OPS),1)
FLAGS
+=
-DUSE_OLD_COLOUR_OPS
endif
COMMON_DEFINES
+=
$(CODE_DEFINES)
$(WARNINGS_DEFINES)
$(fpic)
src/gfx.c
View file @
81822080
...
...
@@ -362,6 +362,8 @@ bool8_32 S9xGraphicsInit(void)
DrawHiResClippedTilePtr
=
DrawHiResClippedTile16
;
S9xFixColourBrightness
();
#if defined(USE_OLD_COLOUR_OPS)
/* Pre-1.60 colour operations */
if
(
!
(
GFX
.
X2
=
(
uint16
*
)
malloc
(
sizeof
(
uint16
)
*
0x10000
)))
return
(
FALSE
);
...
...
@@ -476,6 +478,10 @@ bool8_32 S9xGraphicsInit(void)
}
}
#endif
#else
if
(
!
(
GFX
.
ZERO
=
(
uint16_t
*
)
malloc
(
sizeof
(
uint16_t
)
*
0x10000
)))
return
false
;
#endif
// Build a lookup table that if the top bit of the color value is zero
// then the value is zero, otherwise its just the value.
...
...
@@ -514,6 +520,8 @@ bool8_32 S9xGraphicsInit(void)
void
S9xGraphicsDeinit
(
void
)
{
// Free any memory allocated in S9xGraphicsInit
#if defined(USE_OLD_COLOUR_OPS)
/* Pre-1.60 colour operations */
if
(
GFX
.
X2
)
{
free
((
char
*
)
GFX
.
X2
);
...
...
@@ -524,6 +532,7 @@ void S9xGraphicsDeinit(void)
free
((
char
*
)
GFX
.
ZERO_OR_X2
);
GFX
.
ZERO_OR_X2
=
NULL
;
}
#endif
if
(
GFX
.
ZERO
)
{
free
((
char
*
)
GFX
.
ZERO
);
...
...
src/gfx.h
View file @
81822080
...
...
@@ -64,8 +64,11 @@ typedef struct
// Setup in call to S9xGraphicsInit()
int
Delta
;
#if defined(USE_OLD_COLOUR_OPS)
/* Pre-1.60 colour operations */
uint16
*
X2
;
uint16
*
ZERO_OR_X2
;
#endif
uint16
*
ZERO
;
uint8
*
S
;
uint8
*
DB
;
...
...
@@ -202,6 +205,8 @@ extern uint8 mul_brightness [16][32];
#define SUB_SCREEN_DEPTH 0
#define MAIN_SCREEN_DEPTH 32
#if defined(USE_OLD_COLOUR_OPS)
/* Pre-1.60 colour operations */
#if defined(OLD_COLOUR_BLENDING)
#define COLOR_ADD(C1, C2) \
GFX.X2 [((((C1) & RGB_REMOVE_LOW_BITS_MASK) + \
...
...
@@ -214,12 +219,34 @@ GFX.X2 [((((C1) & RGB_REMOVE_LOW_BITS_MASK) + \
((C1) & (C2) & RGB_LOW_BITS_MASK)] | \
(((C1) ^ (C2)) & RGB_LOW_BITS_MASK))
#endif
#else
static
INLINE
uint16_t
COLOR_ADD
(
uint16_t
C1
,
uint16_t
C2
)
{
const
int
RED_MASK
=
0x1F
<<
RED_SHIFT_BITS
;
const
int
GREEN_MASK
=
0x1F
<<
GREEN_SHIFT_BITS
;
const
int
BLUE_MASK
=
0x1F
;
int
rb
=
(
C1
&
(
RED_MASK
|
BLUE_MASK
))
+
(
C2
&
(
RED_MASK
|
BLUE_MASK
));
int
rbcarry
=
rb
&
((
0x20
<<
RED_SHIFT_BITS
)
|
(
0x20
<<
0
));
int
g
=
(
C1
&
(
GREEN_MASK
))
+
(
C2
&
(
GREEN_MASK
));
int
rgbsaturate
=
(((
g
&
(
0x20
<<
GREEN_SHIFT_BITS
))
|
rbcarry
)
>>
5
)
*
0x1f
;
uint16_t
retval
=
(
rb
&
(
RED_MASK
|
BLUE_MASK
))
|
(
g
&
GREEN_MASK
)
|
rgbsaturate
;
#if GREEN_SHIFT_BITS == 6
retval
|=
(
retval
&
0x0400
)
>>
5
;
#endif
return
retval
;
}
#endif
#define COLOR_ADD1_2(C1, C2) \
(((((C1) & RGB_REMOVE_LOW_BITS_MASK) + \
((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1) + \
((C1) & (C2) & RGB_LOW_BITS_MASK) | ALPHA_BITS_MASK)
#if defined(USE_OLD_COLOUR_OPS)
/* Pre-1.60 colour operations */
#if defined(OLD_COLOUR_BLENDING)
#define COLOR_SUB(C1, C2) \
GFX.ZERO_OR_X2 [(((C1) | RGB_HI_BITS_MASKx2) - \
...
...
@@ -230,6 +257,24 @@ GFX.ZERO_OR_X2 [(((C1) | RGB_HI_BITS_MASKx2) - \
((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] + \
((C1) & RGB_LOW_BITS_MASK) - ((C2) & RGB_LOW_BITS_MASK))
#endif
#else
static
INLINE
uint16_t
COLOR_SUB
(
uint16_t
C1
,
uint16_t
C2
)
{
int
rb1
=
(
C1
&
(
THIRD_COLOR_MASK
|
FIRST_COLOR_MASK
))
|
((
0x20
<<
0
)
|
(
0x20
<<
RED_SHIFT_BITS
));
int
rb2
=
C2
&
(
THIRD_COLOR_MASK
|
FIRST_COLOR_MASK
);
int
rb
=
rb1
-
rb2
;
int
rbcarry
=
rb
&
((
0x20
<<
RED_SHIFT_BITS
)
|
(
0x20
<<
0
));
int
g
=
((
C1
&
(
SECOND_COLOR_MASK
))
|
(
0x20
<<
GREEN_SHIFT_BITS
))
-
(
C2
&
(
SECOND_COLOR_MASK
));
int
rgbsaturate
=
(((
g
&
(
0x20
<<
GREEN_SHIFT_BITS
))
|
rbcarry
)
>>
5
)
*
0x1f
;
uint16_t
retval
=
((
rb
&
(
THIRD_COLOR_MASK
|
FIRST_COLOR_MASK
))
|
(
g
&
SECOND_COLOR_MASK
))
&
rgbsaturate
;
#if GREEN_SHIFT_BITS == 6
retval
|=
(
retval
&
0x0400
)
>>
5
;
#endif
return
retval
;
}
#endif
#define COLOR_SUB1_2(C1, C2) \
GFX.ZERO [(((C1) | RGB_HI_BITS_MASKx2) - \
...
...
src/gfx16.c
View file @
81822080
...
...
@@ -249,6 +249,7 @@ void DrawHiResTile16(uint32 Tile, uint32 Offset,
bool8_32
S9xGraphicsInit
()
{
uint32
r
,
g
,
b
;
uint32
PixelOdd
=
1
;
uint32
PixelEven
=
2
;
...
...
@@ -366,6 +367,8 @@ bool8_32 S9xGraphicsInit()
DrawHiResClippedTilePtr
=
DrawHiResClippedTile16
;
S9xFixColourBrightness
();
#if defined(USE_OLD_COLOUR_OPS)
/* Pre-1.60 colour operations */
if
(
!
(
GFX
.
X2
=
(
uint16
*
)
malloc
(
sizeof
(
uint16
)
*
0x10000
)))
return
(
FALSE
);
...
...
@@ -384,7 +387,6 @@ bool8_32 S9xGraphicsInit()
}
return
(
FALSE
);
}
uint32
r
,
g
,
b
;
// Build a lookup table that multiplies a packed RGB value by 2 with
// saturation.
...
...
@@ -481,6 +483,10 @@ bool8_32 S9xGraphicsInit()
}
}
#endif
#else
if
(
!
(
GFX
.
ZERO
=
(
uint16_t
*
)
malloc
(
sizeof
(
uint16_t
)
*
0x10000
)))
return
false
;
#endif
// Build a lookup table that if the top bit of the color value is zero
// then the value is zero, otherwise its just the value.
...
...
@@ -519,6 +525,8 @@ bool8_32 S9xGraphicsInit()
void
S9xGraphicsDeinit
(
void
)
{
// Free any memory allocated in S9xGraphicsInit
#if defined(USE_OLD_COLOUR_OPS)
/* Pre-1.60 colour operations */
if
(
GFX
.
X2
)
{
free
((
char
*
)
GFX
.
X2
);
...
...
@@ -529,6 +537,7 @@ void S9xGraphicsDeinit(void)
free
((
char
*
)
GFX
.
ZERO_OR_X2
);
GFX
.
ZERO_OR_X2
=
NULL
;
}
#endif
if
(
GFX
.
ZERO
)
{
free
((
char
*
)
GFX
.
ZERO
);
...
...
src/pixform.h
View file @
81822080
...
...
@@ -83,9 +83,11 @@ extern uint32 HIGH_BITS_SHIFTED_TWO_MASK;
#define DECOMPOSE_PIXEL_RGB565(PIX,R,G,B) {(R) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (B) = (PIX) & 0x1f; }
#define SPARE_RGB_BIT_MASK_RGB565 (1 << 5)
#define MAX_RED_RGB565 31
#define MAX_GREEN_RGB565 63
#define MAX_BLUE_RGB565 31
#define MAX_RED_RGB565 31
#define MAX_GREEN_RGB565 63
#define MAX_BLUE_RGB565 31
#define RED_SHIFT_BITS_RGB565 11
#define GREEN_SHIFT_BITS_RGB565 6
#define RED_LOW_BIT_MASK_RGB565 0x0800
#define GREEN_LOW_BIT_MASK_RGB565 0x0020
#define BLUE_LOW_BIT_MASK_RGB565 0x0001
...
...
@@ -103,9 +105,11 @@ extern uint32 HIGH_BITS_SHIFTED_TWO_MASK;
#define DECOMPOSE_PIXEL_RGB555(PIX,R,G,B) {(R) = (PIX) >> 10; (G) = ((PIX) >> 5) & 0x1f; (B) = (PIX) & 0x1f; }
#define SPARE_RGB_BIT_MASK_RGB555 (1 << 15)
#define MAX_RED_RGB555 31
#define MAX_GREEN_RGB555 31
#define MAX_BLUE_RGB555 31
#define MAX_RED_RGB555 31
#define MAX_GREEN_RGB555 31
#define MAX_BLUE_RGB555 31
#define RED_SHIFT_BITS_RGB555 10
#define GREEN_SHIFT_BITS_RGB555 5
#define RED_LOW_BIT_MASK_RGB555 0x0400
#define GREEN_LOW_BIT_MASK_RGB555 0x0020
#define BLUE_LOW_BIT_MASK_RGB555 0x0001
...
...
@@ -117,106 +121,6 @@ extern uint32 HIGH_BITS_SHIFTED_TWO_MASK;
#define THIRD_COLOR_MASK_RGB555 0x001F
#define ALPHA_BITS_MASK_RGB555 0x0000
// BGR565 format
#define BUILD_PIXEL_BGR565(R,G,B) (((int) (B) << 11) | ((int) (G) << 6) | (int) (R))
#define BUILD_PIXEL2_BGR565(R,G,B) (((int) (B) << 11) | ((int) (G) << 5) | (int) (R))
#define DECOMPOSE_PIXEL_BGR565(PIX,R,G,B) {(B) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (R) = (PIX) & 0x1f; }
#define SPARE_RGB_BIT_MASK_BGR565 (1 << 5)
#define MAX_RED_BGR565 31
#define MAX_GREEN_BGR565 63
#define MAX_BLUE_BGR565 31
#define RED_LOW_BIT_MASK_BGR565 0x0001
#define GREEN_LOW_BIT_MASK_BGR565 0x0040
#define BLUE_LOW_BIT_MASK_BGR565 0x0800
#define RED_HI_BIT_MASK_BGR565 0x0010
#define GREEN_HI_BIT_MASK_BGR565 0x0400
#define BLUE_HI_BIT_MASK_BGR565 0x8000
#define FIRST_COLOR_MASK_BGR565 0xF800
#define SECOND_COLOR_MASK_BGR565 0x07E0
#define THIRD_COLOR_MASK_BGR565 0x001F
#define ALPHA_BITS_MASK_BGR565 0x0000
// BGR555 format
#define BUILD_PIXEL_BGR555(R,G,B) (((int) (B) << 10) | ((int) (G) << 5) | (int) (R))
#define BUILD_PIXEL2_BGR555(R,G,B) (((int) (B) << 10) | ((int) (G) << 5) | (int) (R))
#define DECOMPOSE_PIXEL_BGR555(PIX,R,G,B) {(B) = (PIX) >> 10; (G) = ((PIX) >> 5) & 0x1f; (R) = (PIX) & 0x1f; }
#define SPARE_RGB_BIT_MASK_BGR555 (1 << 15)
#define MAX_RED_BGR555 31
#define MAX_GREEN_BGR555 31
#define MAX_BLUE_BGR555 31
#define RED_LOW_BIT_MASK_BGR555 0x0001
#define GREEN_LOW_BIT_MASK_BGR555 0x0020
#define BLUE_LOW_BIT_MASK_BGR555 0x0400
#define RED_HI_BIT_MASK_BGR555 0x0010
#define GREEN_HI_BIT_MASK_BGR555 0x0200
#define BLUE_HI_BIT_MASK_BGR555 0x4000
#define FIRST_COLOR_MASK_BGR555 0x7C00
#define SECOND_COLOR_MASK_BGR555 0x03E0
#define THIRD_COLOR_MASK_BGR555 0x001F
#define ALPHA_BITS_MASK_BGR555 0x0000
// GBR565 format
#define BUILD_PIXEL_GBR565(R,G,B) (((int) (G) << 11) | ((int) (B) << 6) | (int) (R))
#define BUILD_PIXEL2_GBR565(R,G,B) (((int) (G) << 11) | ((int) (B) << 5) | (int) (R))
#define DECOMPOSE_PIXEL_GBR565(PIX,R,G,B) {(G) = (PIX) >> 11; (B) = ((PIX) >> 6) & 0x1f; (R) = (PIX) & 0x1f; }
#define SPARE_RGB_BIT_MASK_GBR565 (1 << 5)
#define MAX_RED_GBR565 31
#define MAX_BLUE_GBR565 63
#define MAX_GREEN_GBR565 31
#define RED_LOW_BIT_MASK_GBR565 0x0001
#define BLUE_LOW_BIT_MASK_GBR565 0x0040
#define GREEN_LOW_BIT_MASK_GBR565 0x0800
#define RED_HI_BIT_MASK_GBR565 0x0010
#define BLUE_HI_BIT_MASK_GBR565 0x0400
#define GREEN_HI_BIT_MASK_GBR565 0x8000
#define FIRST_COLOR_MASK_GBR565 0xF800
#define SECOND_COLOR_MASK_GBR565 0x07E0
#define THIRD_COLOR_MASK_GBR565 0x001F
#define ALPHA_BITS_MASK_GBR565 0x0000
// GBR555 format
#define BUILD_PIXEL_GBR555(R,G,B) (((int) (G) << 10) | ((int) (B) << 5) | (int) (R))
#define BUILD_PIXEL2_GBR555(R,G,B) (((int) (G) << 10) | ((int) (B) << 5) | (int) (R))
#define DECOMPOSE_PIXEL_GBR555(PIX,R,G,B) {(G) = (PIX) >> 10; (B) = ((PIX) >> 5) & 0x1f; (R) = (PIX) & 0x1f; }
#define SPARE_RGB_BIT_MASK_GBR555 (1 << 15)
#define MAX_RED_GBR555 31
#define MAX_BLUE_GBR555 31
#define MAX_GREEN_GBR555 31
#define RED_LOW_BIT_MASK_GBR555 0x0001
#define BLUE_LOW_BIT_MASK_GBR555 0x0020
#define GREEN_LOW_BIT_MASK_GBR555 0x0400
#define RED_HI_BIT_MASK_GBR555 0x0010
#define BLUE_HI_BIT_MASK_GBR555 0x0200
#define GREEN_HI_BIT_MASK_GBR555 0x4000
#define FIRST_COLOR_MASK_GBR555 0x7C00
#define SECOND_COLOR_MASK_GBR555 0x03E0
#define THIRD_COLOR_MASK_GBR555 0x001F
#define ALPHA_BITS_MASK_GBR555 0x0000
// RGB5551 format
#define BUILD_PIXEL_RGB5551(R,G,B) (((int) (R) << 11) | ((int) (G) << 6) | (int) ((B) << 1) | 1)
#define BUILD_PIXEL2_RGB5551(R,G,B) (((int) (R) << 11) | ((int) (G) << 6) | (int) ((B) << 1) | 1)
#define DECOMPOSE_PIXEL_RGB5551(PIX,R,G,B) {(R) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (B) = ((PIX) >> 1) & 0x1f; }
#define SPARE_RGB_BIT_MASK_RGB5551 (1)
#define MAX_RED_RGB5551 31
#define MAX_GREEN_RGB5551 31
#define MAX_BLUE_RGB5551 31
#define RED_LOW_BIT_MASK_RGB5551 0x0800
#define GREEN_LOW_BIT_MASK_RGB5551 0x0040
#define BLUE_LOW_BIT_MASK_RGB5551 0x0002
#define RED_HI_BIT_MASK_RGB5551 0x8000
#define GREEN_HI_BIT_MASK_RGB5551 0x0400
#define BLUE_HI_BIT_MASK_RGB5551 0x0020
#define FIRST_COLOR_MASK_RGB5551 0xf800
#define SECOND_COLOR_MASK_RGB5551 0x07c0
#define THIRD_COLOR_MASK_RGB5551 0x003e
#define ALPHA_BITS_MASK_RGB5551 0x0001
#ifndef GFX_MULTI_FORMAT
#define CONCAT(X,Y) X##Y
...
...
@@ -230,24 +134,28 @@ extern uint32 HIGH_BITS_SHIFTED_TWO_MASK;
#define BUILD_PIXEL2(R,G,B) BUILD_PIXEL2_D(PIXEL_FORMAT,R,G,B)
#define DECOMPOSE_PIXEL(PIX,R,G,B) DECOMPOSE_PIXEL_D(PIXEL_FORMAT,PIX,R,G,B)
#define MAX_RED_D(F) CONCAT(MAX_RED_,F)
#define MAX_BLUE_D(F) CONCAT(MAX_BLUE_,F)
#define MAX_GREEN_D(F) CONCAT(MAX_GREEN_,F)
#define RED_LOW_BIT_MASK_D(F) CONCAT(RED_LOW_BIT_MASK_,F)
#define BLUE_LOW_BIT_MASK_D(F) CONCAT(BLUE_LOW_BIT_MASK_,F)
#define GREEN_LOW_BIT_MASK_D(F) CONCAT(GREEN_LOW_BIT_MASK_,F)
#define RED_HI_BIT_MASK_D(F) CONCAT(RED_HI_BIT_MASK_,F)
#define BLUE_HI_BIT_MASK_D(F) CONCAT(BLUE_HI_BIT_MASK_,F)
#define GREEN_HI_BIT_MASK_D(F) CONCAT(GREEN_HI_BIT_MASK_,F)
#define MAX_RED_D(F) CONCAT(MAX_RED_,F)
#define MAX_BLUE_D(F) CONCAT(MAX_BLUE_,F)
#define MAX_GREEN_D(F) CONCAT(MAX_GREEN_,F)
#define RED_SHIFT_BITS_D(F) CONCAT(RED_SHIFT_BITS_, F)
#define GREEN_SHIFT_BITS_D(F) CONCAT(GREEN_SHIFT_BITS_, F)
#define RED_LOW_BIT_MASK_D(F) CONCAT(RED_LOW_BIT_MASK_,F)
#define BLUE_LOW_BIT_MASK_D(F) CONCAT(BLUE_LOW_BIT_MASK_,F)
#define GREEN_LOW_BIT_MASK_D(F) CONCAT(GREEN_LOW_BIT_MASK_,F)
#define RED_HI_BIT_MASK_D(F) CONCAT(RED_HI_BIT_MASK_,F)
#define BLUE_HI_BIT_MASK_D(F) CONCAT(BLUE_HI_BIT_MASK_,F)
#define GREEN_HI_BIT_MASK_D(F) CONCAT(GREEN_HI_BIT_MASK_,F)
#define FIRST_COLOR_MASK_D(F) CONCAT(FIRST_COLOR_MASK_,F)
#define SECOND_COLOR_MASK_D(F) CONCAT(SECOND_COLOR_MASK_,F)
#define THIRD_COLOR_MASK_D(F) CONCAT(THIRD_COLOR_MASK_,F)
#define ALPHA_BITS_MASK_D(F) CONCAT(ALPHA_BITS_MASK_,F)
#define MAX_RED MAX_RED_D(PIXEL_FORMAT)
#define MAX_BLUE MAX_BLUE_D(PIXEL_FORMAT)
#define MAX_GREEN MAX_GREEN_D(PIXEL_FORMAT)
#define RED_LOW_BIT_MASK RED_LOW_BIT_MASK_D(PIXEL_FORMAT)
#define MAX_RED MAX_RED_D(PIXEL_FORMAT)
#define MAX_BLUE MAX_BLUE_D(PIXEL_FORMAT)
#define MAX_GREEN MAX_GREEN_D(PIXEL_FORMAT)
#define RED_SHIFT_BITS RED_SHIFT_BITS_D(PIXEL_FORMAT)
#define GREEN_SHIFT_BITS GREEN_SHIFT_BITS_D(PIXEL_FORMAT)
#define RED_LOW_BIT_MASK RED_LOW_BIT_MASK_D(PIXEL_FORMAT)
#define BLUE_LOW_BIT_MASK BLUE_LOW_BIT_MASK_D(PIXEL_FORMAT)
#define GREEN_LOW_BIT_MASK GREEN_LOW_BIT_MASK_D(PIXEL_FORMAT)
#define RED_HI_BIT_MASK RED_HI_BIT_MASK_D(PIXEL_FORMAT)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment