stride doesn't have to be multiples of pixels
This commit is contained in:
parent
32b626859d
commit
5dfa79fb31
@ -792,12 +792,12 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n)
|
|||||||
int type = stbir_info->type;
|
int type = stbir_info->type;
|
||||||
int colorspace = stbir_info->colorspace;
|
int colorspace = stbir_info->colorspace;
|
||||||
int input_w = stbir_info->input_w;
|
int input_w = stbir_info->input_w;
|
||||||
int input_stride = stbir_info->input_stride_bytes / stbir__type_size[stbir_info->type];
|
int input_stride_bytes = stbir_info->input_stride_bytes;
|
||||||
const void* input_data = stbir_info->input_data;
|
|
||||||
float* decode_buffer = stbir__get_decode_buffer(stbir_info);
|
float* decode_buffer = stbir__get_decode_buffer(stbir_info);
|
||||||
stbir_edge edge_horizontal = stbir_info->edge_horizontal;
|
stbir_edge edge_horizontal = stbir_info->edge_horizontal;
|
||||||
stbir_edge edge_vertical = stbir_info->edge_vertical;
|
stbir_edge edge_vertical = stbir_info->edge_vertical;
|
||||||
int in_buffer_row_index = stbir__edge_wrap(edge_vertical, n, stbir_info->input_h) * input_stride;
|
int in_buffer_row_offset = stbir__edge_wrap(edge_vertical, n, stbir_info->input_h) * input_stride_bytes;
|
||||||
|
const void* input_data = (char *) stbir_info->input_data + in_buffer_row_offset;
|
||||||
int max_x = input_w + stbir__get_filter_pixel_margin_horizontal(stbir_info);
|
int max_x = input_w + stbir__get_filter_pixel_margin_horizontal(stbir_info);
|
||||||
int decode = STBIR__DECODE(type, colorspace);
|
int decode = STBIR__DECODE(type, colorspace);
|
||||||
|
|
||||||
@ -809,7 +809,7 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n)
|
|||||||
for (; x < max_x; x++)
|
for (; x < max_x; x++)
|
||||||
{
|
{
|
||||||
int decode_pixel_index = x * channels;
|
int decode_pixel_index = x * channels;
|
||||||
int input_pixel_index = in_buffer_row_index + stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
int input_pixel_index = stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
||||||
for (c = 0; c < channels; c++)
|
for (c = 0; c < channels; c++)
|
||||||
decode_buffer[decode_pixel_index + c] = ((float)((const unsigned char*)input_data)[input_pixel_index + c]) / 255;
|
decode_buffer[decode_pixel_index + c] = ((float)((const unsigned char*)input_data)[input_pixel_index + c]) / 255;
|
||||||
}
|
}
|
||||||
@ -819,7 +819,7 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n)
|
|||||||
for (; x < max_x; x++)
|
for (; x < max_x; x++)
|
||||||
{
|
{
|
||||||
int decode_pixel_index = x * channels;
|
int decode_pixel_index = x * channels;
|
||||||
int input_pixel_index = in_buffer_row_index + stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
int input_pixel_index = stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
||||||
for (c = 0; c < channels; c++)
|
for (c = 0; c < channels; c++)
|
||||||
decode_buffer[decode_pixel_index + c] = stbir__srgb_uchar_to_linear_float[((const unsigned char*)input_data)[input_pixel_index + c]];
|
decode_buffer[decode_pixel_index + c] = stbir__srgb_uchar_to_linear_float[((const unsigned char*)input_data)[input_pixel_index + c]];
|
||||||
|
|
||||||
@ -832,7 +832,7 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n)
|
|||||||
for (; x < max_x; x++)
|
for (; x < max_x; x++)
|
||||||
{
|
{
|
||||||
int decode_pixel_index = x * channels;
|
int decode_pixel_index = x * channels;
|
||||||
int input_pixel_index = in_buffer_row_index + stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
int input_pixel_index = stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
||||||
for (c = 0; c < channels; c++)
|
for (c = 0; c < channels; c++)
|
||||||
decode_buffer[decode_pixel_index + c] = ((float)((const unsigned short*)input_data)[input_pixel_index + c]) / 65535;
|
decode_buffer[decode_pixel_index + c] = ((float)((const unsigned short*)input_data)[input_pixel_index + c]) / 65535;
|
||||||
}
|
}
|
||||||
@ -842,7 +842,7 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n)
|
|||||||
for (; x < max_x; x++)
|
for (; x < max_x; x++)
|
||||||
{
|
{
|
||||||
int decode_pixel_index = x * channels;
|
int decode_pixel_index = x * channels;
|
||||||
int input_pixel_index = in_buffer_row_index + stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
int input_pixel_index = stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
||||||
for (c = 0; c < channels; c++)
|
for (c = 0; c < channels; c++)
|
||||||
decode_buffer[decode_pixel_index + c] = stbir__srgb_to_linear(((float)((const unsigned short*)input_data)[input_pixel_index + c]) / 65535);
|
decode_buffer[decode_pixel_index + c] = stbir__srgb_to_linear(((float)((const unsigned short*)input_data)[input_pixel_index + c]) / 65535);
|
||||||
|
|
||||||
@ -855,7 +855,7 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n)
|
|||||||
for (; x < max_x; x++)
|
for (; x < max_x; x++)
|
||||||
{
|
{
|
||||||
int decode_pixel_index = x * channels;
|
int decode_pixel_index = x * channels;
|
||||||
int input_pixel_index = in_buffer_row_index + stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
int input_pixel_index = stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
||||||
for (c = 0; c < channels; c++)
|
for (c = 0; c < channels; c++)
|
||||||
decode_buffer[decode_pixel_index + c] = (float)(((double)((const unsigned int*)input_data)[input_pixel_index + c]) / 4294967295);
|
decode_buffer[decode_pixel_index + c] = (float)(((double)((const unsigned int*)input_data)[input_pixel_index + c]) / 4294967295);
|
||||||
}
|
}
|
||||||
@ -865,7 +865,7 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n)
|
|||||||
for (; x < max_x; x++)
|
for (; x < max_x; x++)
|
||||||
{
|
{
|
||||||
int decode_pixel_index = x * channels;
|
int decode_pixel_index = x * channels;
|
||||||
int input_pixel_index = in_buffer_row_index + stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
int input_pixel_index = stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
||||||
for (c = 0; c < channels; c++)
|
for (c = 0; c < channels; c++)
|
||||||
decode_buffer[decode_pixel_index + c] = stbir__srgb_to_linear((float)(((double)((const unsigned int*)input_data)[input_pixel_index + c]) / 4294967295));
|
decode_buffer[decode_pixel_index + c] = stbir__srgb_to_linear((float)(((double)((const unsigned int*)input_data)[input_pixel_index + c]) / 4294967295));
|
||||||
|
|
||||||
@ -878,7 +878,7 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n)
|
|||||||
for (; x < max_x; x++)
|
for (; x < max_x; x++)
|
||||||
{
|
{
|
||||||
int decode_pixel_index = x * channels;
|
int decode_pixel_index = x * channels;
|
||||||
int input_pixel_index = in_buffer_row_index + stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
int input_pixel_index = stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
||||||
for (c = 0; c < channels; c++)
|
for (c = 0; c < channels; c++)
|
||||||
decode_buffer[decode_pixel_index + c] = ((const float*)input_data)[input_pixel_index + c];
|
decode_buffer[decode_pixel_index + c] = ((const float*)input_data)[input_pixel_index + c];
|
||||||
}
|
}
|
||||||
@ -888,7 +888,7 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n)
|
|||||||
for (; x < max_x; x++)
|
for (; x < max_x; x++)
|
||||||
{
|
{
|
||||||
int decode_pixel_index = x * channels;
|
int decode_pixel_index = x * channels;
|
||||||
int input_pixel_index = in_buffer_row_index + stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
int input_pixel_index = stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
||||||
for (c = 0; c < channels; c++)
|
for (c = 0; c < channels; c++)
|
||||||
decode_buffer[decode_pixel_index + c] = stbir__srgb_to_linear(((const float*)input_data)[input_pixel_index + c]);
|
decode_buffer[decode_pixel_index + c] = stbir__srgb_to_linear(((const float*)input_data)[input_pixel_index + c]);
|
||||||
|
|
||||||
@ -908,7 +908,6 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n)
|
|||||||
for (x = -stbir__get_filter_pixel_margin_horizontal(stbir_info); x < max_x; x++)
|
for (x = -stbir__get_filter_pixel_margin_horizontal(stbir_info); x < max_x; x++)
|
||||||
{
|
{
|
||||||
int decode_pixel_index = x * channels;
|
int decode_pixel_index = x * channels;
|
||||||
int input_pixel_index = in_buffer_row_index + stbir__edge_wrap(edge_horizontal, x, input_w) * channels;
|
|
||||||
float alpha = decode_buffer[decode_pixel_index + alpha_channel];
|
float alpha = decode_buffer[decode_pixel_index + alpha_channel];
|
||||||
for (c = 0; c < channels; c++)
|
for (c = 0; c < channels; c++)
|
||||||
{
|
{
|
||||||
@ -1146,12 +1145,12 @@ static stbir__inline void stbir__encode_pixel(stbir__info* stbir_info, void* out
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @OPTIMIZE: embed stbir__encode_pixel and move switch out of per-pixel loop
|
// @OPTIMIZE: embed stbir__encode_pixel and move switch out of per-pixel loop
|
||||||
static void stbir__encode_scanline(stbir__info* stbir_info, int num_pixels, void *output_buffer, int output_offset, float *encode_buffer, int channels, int alpha_channel, int decode)
|
static void stbir__encode_scanline(stbir__info* stbir_info, int num_pixels, void *output_buffer, float *encode_buffer, int channels, int alpha_channel, int decode)
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
for (x=0; x < num_pixels; ++x)
|
for (x=0; x < num_pixels; ++x)
|
||||||
{
|
{
|
||||||
stbir__encode_pixel(stbir_info, output_buffer, output_offset+x*channels, encode_buffer, x*channels, channels, alpha_channel, decode);
|
stbir__encode_pixel(stbir_info, output_buffer, x*channels, encode_buffer, x*channels, channels, alpha_channel, decode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1176,14 +1175,14 @@ static void stbir__resample_vertical_upsample(stbir__info* stbir_info, int n, in
|
|||||||
int ring_buffer_last_scanline = stbir_info->ring_buffer_last_scanline;
|
int ring_buffer_last_scanline = stbir_info->ring_buffer_last_scanline;
|
||||||
int ring_buffer_length = stbir_info->ring_buffer_length_bytes/sizeof(float);
|
int ring_buffer_length = stbir_info->ring_buffer_length_bytes/sizeof(float);
|
||||||
|
|
||||||
int n0,n1, output_row_index;
|
int n0,n1, output_row_start;
|
||||||
|
|
||||||
stbir__calculate_coefficients_upsample(stbir_info, in_first_scanline, in_last_scanline, in_center_of_out, vertical_contributors, vertical_coefficients);
|
stbir__calculate_coefficients_upsample(stbir_info, in_first_scanline, in_last_scanline, in_center_of_out, vertical_contributors, vertical_coefficients);
|
||||||
|
|
||||||
n0 = vertical_contributors->n0;
|
n0 = vertical_contributors->n0;
|
||||||
n1 = vertical_contributors->n1;
|
n1 = vertical_contributors->n1;
|
||||||
|
|
||||||
output_row_index = n * stbir_info->output_stride_bytes / stbir__type_size[type];
|
output_row_start = n * stbir_info->output_stride_bytes;
|
||||||
|
|
||||||
STBIR__DEBUG_ASSERT(stbir__use_height_upsampling(stbir_info));
|
STBIR__DEBUG_ASSERT(stbir__use_height_upsampling(stbir_info));
|
||||||
STBIR__DEBUG_ASSERT(n0 >= in_first_scanline);
|
STBIR__DEBUG_ASSERT(n0 >= in_first_scanline);
|
||||||
@ -1194,7 +1193,6 @@ static void stbir__resample_vertical_upsample(stbir__info* stbir_info, int n, in
|
|||||||
for (x = 0; x < output_w; x++)
|
for (x = 0; x < output_w; x++)
|
||||||
{
|
{
|
||||||
int in_pixel_index = x * channels;
|
int in_pixel_index = x * channels;
|
||||||
int out_pixel_index = output_row_index + x * channels;
|
|
||||||
int coefficient_counter = 0;
|
int coefficient_counter = 0;
|
||||||
|
|
||||||
STBIR__DEBUG_ASSERT(n1 >= n0);
|
STBIR__DEBUG_ASSERT(n1 >= n0);
|
||||||
@ -1210,7 +1208,7 @@ static void stbir__resample_vertical_upsample(stbir__info* stbir_info, int n, in
|
|||||||
encode_buffer[x*channels + c] += ring_buffer_entry[in_pixel_index + c] * coefficient;
|
encode_buffer[x*channels + c] += ring_buffer_entry[in_pixel_index + c] * coefficient;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stbir__encode_scanline(stbir_info, output_w, output_data, output_row_index, encode_buffer, channels, alpha_channel, decode);
|
stbir__encode_scanline(stbir_info, output_w, (char *) output_data + output_row_start, encode_buffer, channels, alpha_channel, decode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stbir__resample_vertical_downsample(stbir__info* stbir_info, int n, int in_first_scanline, int in_last_scanline, float in_center_of_out)
|
static void stbir__resample_vertical_downsample(stbir__info* stbir_info, int n, int in_first_scanline, int in_last_scanline, float in_center_of_out)
|
||||||
@ -1315,7 +1313,7 @@ static void stbir__buffer_loop_upsample(stbir__info* stbir_info)
|
|||||||
|
|
||||||
static void stbir__empty_ring_buffer(stbir__info* stbir_info, int first_necessary_scanline)
|
static void stbir__empty_ring_buffer(stbir__info* stbir_info, int first_necessary_scanline)
|
||||||
{
|
{
|
||||||
int output_stride = stbir_info->output_stride_bytes / stbir__type_size[stbir_info->type];
|
int output_stride_bytes = stbir_info->output_stride_bytes;
|
||||||
int channels = stbir_info->channels;
|
int channels = stbir_info->channels;
|
||||||
int alpha_channel = stbir_info->alpha_channel;
|
int alpha_channel = stbir_info->alpha_channel;
|
||||||
int type = stbir_info->type;
|
int type = stbir_info->type;
|
||||||
@ -1334,9 +1332,9 @@ static void stbir__empty_ring_buffer(stbir__info* stbir_info, int first_necessar
|
|||||||
{
|
{
|
||||||
if (stbir_info->ring_buffer_first_scanline >= 0 && stbir_info->ring_buffer_first_scanline < stbir_info->output_h)
|
if (stbir_info->ring_buffer_first_scanline >= 0 && stbir_info->ring_buffer_first_scanline < stbir_info->output_h)
|
||||||
{
|
{
|
||||||
int output_row = stbir_info->ring_buffer_first_scanline * output_stride;
|
int output_row_start = stbir_info->ring_buffer_first_scanline * output_stride_bytes;
|
||||||
float* ring_buffer_entry = stbir__get_ring_buffer_entry(ring_buffer, stbir_info->ring_buffer_begin_index, ring_buffer_length);
|
float* ring_buffer_entry = stbir__get_ring_buffer_entry(ring_buffer, stbir_info->ring_buffer_begin_index, ring_buffer_length);
|
||||||
stbir__encode_scanline(stbir_info, output_w, output_data, output_row, ring_buffer_entry, channels, alpha_channel, decode);
|
stbir__encode_scanline(stbir_info, output_w, (char *) output_data + output_row_start, ring_buffer_entry, channels, alpha_channel, decode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stbir_info->ring_buffer_first_scanline == stbir_info->ring_buffer_last_scanline)
|
if (stbir_info->ring_buffer_first_scanline == stbir_info->ring_buffer_last_scanline)
|
||||||
|
@ -48,8 +48,8 @@ BSC32=bscmake.exe
|
|||||||
# ADD BASE BSC32 /nologo
|
# ADD BASE BSC32 /nologo
|
||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
LINK32=link.exe
|
LINK32=link.exe
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "resize - Win32 Debug"
|
!ELSEIF "$(CFG)" == "resize - Win32 Debug"
|
||||||
|
|
||||||
@ -63,16 +63,16 @@ LINK32=link.exe
|
|||||||
# PROP Output_Dir "Debug"
|
# PROP Output_Dir "Debug"
|
||||||
# PROP Intermediate_Dir "Debug"
|
# PROP Intermediate_Dir "Debug"
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||||
BSC32=bscmake.exe
|
BSC32=bscmake.exe
|
||||||
# ADD BASE BSC32 /nologo
|
# ADD BASE BSC32 /nologo
|
||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
LINK32=link.exe
|
LINK32=link.exe
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||||
|
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ LINK32=link.exe
|
|||||||
# Name "resize - Win32 Debug"
|
# Name "resize - Win32 Debug"
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\resample_test.cpp
|
SOURCE=.\resample_test.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# End Target
|
# End Target
|
||||||
# End Project
|
# End Project
|
||||||
|
Loading…
Reference in New Issue
Block a user