mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-18 10:21:42 +00:00
Remove dc_destorg and ylookup
This commit is contained in:
parent
ca93d7456a
commit
d91e6ccece
11 changed files with 53 additions and 76 deletions
|
@ -57,7 +57,6 @@ CVAR(Bool, r_dynlights, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG);
|
|||
|
||||
namespace swrenderer
|
||||
{
|
||||
int ylookup[MAXHEIGHT];
|
||||
uint8_t shadetables[NUMCOLORMAPS * 16 * 256];
|
||||
FDynamicColormap ShadeFakeColormap[16];
|
||||
uint8_t identitymap[256];
|
||||
|
|
|
@ -25,7 +25,6 @@ namespace swrenderer
|
|||
class SpanDrawerArgs;
|
||||
class SpriteDrawerArgs;
|
||||
|
||||
extern int ylookup[MAXHEIGHT];
|
||||
extern uint8_t shadetables[/*NUMCOLORMAPS*16*256*/];
|
||||
extern FDynamicColormap ShadeFakeColormap[16];
|
||||
extern uint8_t identitymap[256];
|
||||
|
|
|
@ -1767,7 +1767,7 @@ namespace swrenderer
|
|||
_yl = args.dc_yl;
|
||||
_yh = args.dc_yh;
|
||||
_x = args.dc_x;
|
||||
_destorg = RenderViewport::Instance()->dc_destorg;
|
||||
_destorg = RenderViewport::Instance()->GetDest(0, 0);
|
||||
_pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
_fuzzpos = fuzzpos;
|
||||
_fuzzviewheight = fuzzviewheight;
|
||||
|
@ -1786,7 +1786,7 @@ namespace swrenderer
|
|||
|
||||
uint8_t *map = &NormalLight.Maps[6 * 256];
|
||||
|
||||
uint8_t *dest = thread->dest_for_thread(yl, _pitch, ylookup[yl] + _x + _destorg);
|
||||
uint8_t *dest = thread->dest_for_thread(yl, _pitch, yl * _pitch + _x + _destorg);
|
||||
|
||||
int pitch = _pitch * thread->num_cores;
|
||||
int fuzzstep = thread->num_cores;
|
||||
|
@ -1858,7 +1858,7 @@ namespace swrenderer
|
|||
_y = args.DestY();
|
||||
_x1 = args.DestX1();
|
||||
_x2 = args.DestX2();
|
||||
_destorg = RenderViewport::Instance()->dc_destorg;
|
||||
_dest = RenderViewport::Instance()->GetDest(_x1, _y);
|
||||
_xstep = args.TextureUStep();
|
||||
_ystep = args.TextureVStep();
|
||||
_xbits = args.TextureWidthBits();
|
||||
|
@ -1942,7 +1942,7 @@ namespace swrenderer
|
|||
xfrac = _xfrac;
|
||||
yfrac = _yfrac;
|
||||
|
||||
dest = ylookup[_y] + _x1 + _destorg;
|
||||
dest = _dest;
|
||||
|
||||
count = _x2 - _x1 + 1;
|
||||
|
||||
|
@ -2030,7 +2030,7 @@ namespace swrenderer
|
|||
xfrac = _xfrac;
|
||||
yfrac = _yfrac;
|
||||
|
||||
dest = ylookup[_y] + _x1 + _destorg;
|
||||
dest = _dest;
|
||||
|
||||
count = _x2 - _x1 + 1;
|
||||
|
||||
|
@ -2104,7 +2104,7 @@ namespace swrenderer
|
|||
xfrac = _xfrac;
|
||||
yfrac = _yfrac;
|
||||
|
||||
dest = ylookup[_y] + _x1 + _destorg;
|
||||
dest = _dest;
|
||||
|
||||
count = _x2 - _x1 + 1;
|
||||
|
||||
|
@ -2227,7 +2227,7 @@ namespace swrenderer
|
|||
xfrac = _xfrac;
|
||||
yfrac = _yfrac;
|
||||
|
||||
dest = ylookup[_y] + _x1 + _destorg;
|
||||
dest = _dest;
|
||||
|
||||
count = _x2 - _x1 + 1;
|
||||
|
||||
|
@ -2368,7 +2368,7 @@ namespace swrenderer
|
|||
xfrac = _xfrac;
|
||||
yfrac = _yfrac;
|
||||
|
||||
dest = ylookup[_y] + _x1 + _destorg;
|
||||
dest = _dest;
|
||||
|
||||
count = _x2 - _x1 + 1;
|
||||
|
||||
|
@ -2491,7 +2491,7 @@ namespace swrenderer
|
|||
xfrac = _xfrac;
|
||||
yfrac = _yfrac;
|
||||
|
||||
dest = ylookup[_y] + _x1 + _destorg;
|
||||
dest = _dest;
|
||||
|
||||
count = _x2 - _x1 + 1;
|
||||
|
||||
|
@ -2619,7 +2619,7 @@ namespace swrenderer
|
|||
if (thread->line_skipped_by_thread(_y))
|
||||
return;
|
||||
|
||||
memset(ylookup[_y] + _x1 + _destorg, _color, _x2 - _x1 + 1);
|
||||
memset(_dest, _color, _x2 - _x1 + 1);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
@ -2628,7 +2628,7 @@ namespace swrenderer
|
|||
: y(y), x1(x1), x2(x2), plane_sz(plane_sz), plane_su(plane_su), plane_sv(plane_sv), plane_shade(plane_shade), planeshade(planeshade), planelightfloat(planelightfloat), pviewx(pviewx), pviewy(pviewy)
|
||||
{
|
||||
_colormap = args.Colormap();
|
||||
_destorg = RenderViewport::Instance()->dc_destorg;
|
||||
_dest = RenderViewport::Instance()->GetDest(x1, y);
|
||||
_ybits = args.TextureHeightBits();
|
||||
_xbits = args.TextureWidthBits();
|
||||
_source = args.TexturePixels();
|
||||
|
@ -2668,7 +2668,7 @@ namespace swrenderer
|
|||
uz = plane_su[2] + plane_su[1] * (centery - y) + plane_su[0] * (x1 - centerx);
|
||||
vz = plane_sv[2] + plane_sv[1] * (centery - y) + plane_sv[0] * (x1 - centerx);
|
||||
|
||||
fb = ylookup[y] + x1 + _destorg;
|
||||
fb = _dest;
|
||||
|
||||
uint8_t vshift = 32 - _ybits;
|
||||
uint8_t ushift = vshift - _xbits;
|
||||
|
@ -2873,7 +2873,7 @@ namespace swrenderer
|
|||
DrawColoredSpanPalCommand::DrawColoredSpanPalCommand(const SpanDrawerArgs &args, int y, int x1, int x2) : PalSpanCommand(args), y(y), x1(x1), x2(x2)
|
||||
{
|
||||
color = args.SolidColor();
|
||||
destorg = RenderViewport::Instance()->dc_destorg;
|
||||
dest = RenderViewport::Instance()->GetDest(x1, y);
|
||||
}
|
||||
|
||||
void DrawColoredSpanPalCommand::Execute(DrawerThread *thread)
|
||||
|
@ -2881,7 +2881,7 @@ namespace swrenderer
|
|||
if (thread->line_skipped_by_thread(y))
|
||||
return;
|
||||
|
||||
memset(ylookup[y] + x1 + destorg, color, x2 - x1 + 1);
|
||||
memset(_dest, color, x2 - x1 + 1);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
@ -2889,7 +2889,7 @@ namespace swrenderer
|
|||
DrawFogBoundaryLinePalCommand::DrawFogBoundaryLinePalCommand(const SpanDrawerArgs &args, int y, int x1, int x2) : PalSpanCommand(args), y(y), x1(x1), x2(x2)
|
||||
{
|
||||
_colormap = args.Colormap();
|
||||
_destorg = RenderViewport::Instance()->dc_destorg;
|
||||
_dest = RenderViewport::Instance()->GetDest(x1, y);
|
||||
}
|
||||
|
||||
void DrawFogBoundaryLinePalCommand::Execute(DrawerThread *thread)
|
||||
|
@ -2898,7 +2898,7 @@ namespace swrenderer
|
|||
return;
|
||||
|
||||
const uint8_t *colormap = _colormap;
|
||||
uint8_t *dest = ylookup[y] + _destorg;
|
||||
uint8_t *dest = _dest;
|
||||
int x = x1;
|
||||
do
|
||||
{
|
||||
|
|
|
@ -140,7 +140,7 @@ namespace swrenderer
|
|||
int _y;
|
||||
int _x1;
|
||||
int _x2;
|
||||
uint8_t *_destorg;
|
||||
uint8_t *_dest;
|
||||
dsfixed_t _xstep;
|
||||
dsfixed_t _ystep;
|
||||
int _xbits;
|
||||
|
@ -187,7 +187,7 @@ namespace swrenderer
|
|||
fixed_t pviewy;
|
||||
|
||||
const uint8_t *_colormap;
|
||||
uint8_t *_destorg;
|
||||
uint8_t *_dest;
|
||||
int _ybits;
|
||||
int _xbits;
|
||||
const uint8_t *_source;
|
||||
|
@ -206,7 +206,7 @@ namespace swrenderer
|
|||
int x1;
|
||||
int x2;
|
||||
int color;
|
||||
uint8_t *destorg;
|
||||
uint8_t *dest;
|
||||
};
|
||||
|
||||
class DrawFogBoundaryLinePalCommand : public PalSpanCommand
|
||||
|
@ -218,7 +218,7 @@ namespace swrenderer
|
|||
private:
|
||||
int y, x1, x2;
|
||||
const uint8_t *_colormap;
|
||||
uint8_t *_destorg;
|
||||
uint8_t *_dest;
|
||||
};
|
||||
|
||||
class DrawParticleColumnPalCommand : public DrawerCommand
|
||||
|
|
|
@ -72,7 +72,7 @@ namespace swrenderer
|
|||
args.y = drawerargs.DestY();
|
||||
args.xbits = drawerargs.TextureWidthBits();
|
||||
args.ybits = drawerargs.TextureHeightBits();
|
||||
args.destorg = (uint32_t*)RenderViewport::Instance()->dc_destorg;
|
||||
args.destorg = (uint32_t*)RenderViewport::Instance()->GetDest(0, 0);
|
||||
args.destpitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
args.source = (const uint32_t*)drawerargs.TexturePixels();
|
||||
args.light = LightBgra::calc_light_multiplier(drawerargs.Light());
|
||||
|
@ -331,7 +331,7 @@ namespace swrenderer
|
|||
_x = drawerargs.dc_x;
|
||||
_yl = drawerargs.dc_yl;
|
||||
_yh = drawerargs.dc_yh;
|
||||
_destorg = RenderViewport::Instance()->dc_destorg;
|
||||
_destorg = RenderViewport::Instance()->GetDest(0, 0);
|
||||
_pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
_fuzzpos = fuzzpos;
|
||||
_fuzzviewheight = fuzzviewheight;
|
||||
|
@ -348,7 +348,7 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
uint32_t *dest = thread->dest_for_thread(yl, _pitch, ylookup[yl] + _x + (uint32_t*)_destorg);
|
||||
uint32_t *dest = thread->dest_for_thread(yl, _pitch, _pitch * yl + _x + (uint32_t*)_destorg);
|
||||
|
||||
int pitch = _pitch * thread->num_cores;
|
||||
int fuzzstep = thread->num_cores;
|
||||
|
@ -439,7 +439,7 @@ namespace swrenderer
|
|||
_x1 = drawerargs.DestX1();
|
||||
_x2 = drawerargs.DestX2();
|
||||
_y = drawerargs.DestY();
|
||||
_destorg = RenderViewport::Instance()->dc_destorg;
|
||||
_dest = RenderViewport::Instance()->GetDest(_x1, _y);
|
||||
_light = drawerargs.Light();
|
||||
_color = drawerargs.SolidColor();
|
||||
}
|
||||
|
@ -449,7 +449,7 @@ namespace swrenderer
|
|||
if (thread->line_skipped_by_thread(_y))
|
||||
return;
|
||||
|
||||
uint32_t *dest = ylookup[_y] + _x1 + (uint32_t*)_destorg;
|
||||
uint32_t *dest = (uint32_t*)_dest;
|
||||
int count = (_x2 - _x1 + 1);
|
||||
uint32_t light = LightBgra::calc_light_multiplier(_light);
|
||||
uint32_t color = LightBgra::shade_pal_index_simple(_color, light);
|
||||
|
@ -470,7 +470,7 @@ namespace swrenderer
|
|||
_x = x;
|
||||
_x2 = x2;
|
||||
|
||||
_destorg = RenderViewport::Instance()->dc_destorg;
|
||||
_line = RenderViewport::Instance()->GetDest(0, y);
|
||||
_light = drawerargs.Light();
|
||||
_shade_constants = drawerargs.ColormapConstants();
|
||||
}
|
||||
|
@ -484,7 +484,7 @@ namespace swrenderer
|
|||
int x = _x;
|
||||
int x2 = _x2;
|
||||
|
||||
uint32_t *dest = ylookup[y] + (uint32_t*)_destorg;
|
||||
uint32_t *dest = (uint32_t*)_line;
|
||||
|
||||
uint32_t light = LightBgra::calc_light_multiplier(_light);
|
||||
ShadeConstants constants = _shade_constants;
|
||||
|
@ -537,7 +537,7 @@ namespace swrenderer
|
|||
_x1 = x1;
|
||||
_x2 = x2;
|
||||
_y = y;
|
||||
_destorg = RenderViewport::Instance()->dc_destorg;
|
||||
_dest = RenderViewport::Instance()->GetDest(_x1, _y);
|
||||
_light = drawerargs.Light();
|
||||
_shade_constants = drawerargs.ColormapConstants();
|
||||
_plane_sz = plane_sz;
|
||||
|
@ -568,7 +568,7 @@ namespace swrenderer
|
|||
int source_width = 1 << _xbits;
|
||||
int source_height = 1 << _ybits;
|
||||
|
||||
uint32_t *dest = ylookup[_y] + _x1 + (uint32_t*)_destorg;
|
||||
uint32_t *dest = (uint32_t*)_dest;
|
||||
int count = _x2 - _x1 + 1;
|
||||
|
||||
// Depth (Z) change across the span
|
||||
|
@ -672,7 +672,7 @@ namespace swrenderer
|
|||
_x1 = x1;
|
||||
_x2 = x2;
|
||||
|
||||
_destorg = RenderViewport::Instance()->dc_destorg;
|
||||
_dest = RenderViewport::Instance()->GetDest(_x1, _y);
|
||||
_light = drawerargs.Light();
|
||||
_color = drawerargs.SolidColor();
|
||||
}
|
||||
|
@ -686,7 +686,7 @@ namespace swrenderer
|
|||
int x1 = _x1;
|
||||
int x2 = _x2;
|
||||
|
||||
uint32_t *dest = ylookup[y] + x1 + (uint32_t*)_destorg;
|
||||
uint32_t *dest = (uint32_t*)_dest;
|
||||
int count = (x2 - x1 + 1);
|
||||
uint32_t light = LightBgra::calc_light_multiplier(_light);
|
||||
uint32_t color = LightBgra::shade_pal_index_simple(_color, light);
|
||||
|
@ -709,7 +709,7 @@ namespace swrenderer
|
|||
_color = color;
|
||||
_a = a;
|
||||
|
||||
_destorg = RenderViewport::Instance()->dc_destorg;
|
||||
_destorg = RenderViewport::Instance()->GetDest(0, 0);
|
||||
_pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
}
|
||||
|
||||
|
@ -738,7 +738,7 @@ namespace swrenderer
|
|||
fg_blue *= alpha;
|
||||
|
||||
int spacing = _pitch * thread->num_cores;
|
||||
uint32_t *dest = thread->dest_for_thread(y1, _pitch, ylookup[y1] + x + (uint32_t*)_destorg);
|
||||
uint32_t *dest = thread->dest_for_thread(y1, _pitch, _pitch * y1 + x + (uint32_t*)_destorg);
|
||||
|
||||
for (int y = 0; y < ycount; y++)
|
||||
{
|
||||
|
|
|
@ -211,7 +211,7 @@ namespace swrenderer
|
|||
int _x1;
|
||||
int _x2;
|
||||
int _y;
|
||||
uint8_t * RESTRICT _destorg;
|
||||
uint8_t * RESTRICT _dest;
|
||||
fixed_t _light;
|
||||
int _color;
|
||||
|
||||
|
@ -226,7 +226,7 @@ namespace swrenderer
|
|||
int _y;
|
||||
int _x;
|
||||
int _x2;
|
||||
uint8_t * RESTRICT _destorg;
|
||||
uint8_t * RESTRICT _line;
|
||||
fixed_t _light;
|
||||
ShadeConstants _shade_constants;
|
||||
|
||||
|
@ -241,7 +241,7 @@ namespace swrenderer
|
|||
int _x1;
|
||||
int _x2;
|
||||
int _y;
|
||||
uint8_t * RESTRICT _destorg;
|
||||
uint8_t * RESTRICT _dest;
|
||||
fixed_t _light;
|
||||
ShadeConstants _shade_constants;
|
||||
FVector3 _plane_sz;
|
||||
|
@ -267,7 +267,7 @@ namespace swrenderer
|
|||
int _y;
|
||||
int _x1;
|
||||
int _x2;
|
||||
uint8_t * RESTRICT _destorg;
|
||||
uint8_t * RESTRICT _dest;
|
||||
fixed_t _light;
|
||||
int _color;
|
||||
|
||||
|
|
|
@ -591,8 +591,7 @@ namespace swrenderer
|
|||
void WallDrawerArgs::SetDest(int x, int y)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
int pixelsize = viewport->RenderTarget->IsBgra() ? 4 : 1;
|
||||
dc_dest = viewport->dc_destorg + (ylookup[y] + x) * pixelsize;
|
||||
dc_dest = viewport->GetDest(x, y);
|
||||
dc_dest_y = y;
|
||||
}
|
||||
|
||||
|
@ -726,8 +725,7 @@ namespace swrenderer
|
|||
void SkyDrawerArgs::SetDest(int x, int y)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
int pixelsize = viewport->RenderTarget->IsBgra() ? 4 : 1;
|
||||
dc_dest = viewport->dc_destorg + (ylookup[y] + x) * pixelsize;
|
||||
dc_dest = viewport->GetDest(x, y);
|
||||
dc_dest_y = y;
|
||||
}
|
||||
|
||||
|
@ -772,8 +770,7 @@ namespace swrenderer
|
|||
void SpriteDrawerArgs::SetDest(int x, int y)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
int pixelsize = viewport->RenderTarget->IsBgra() ? 4 : 1;
|
||||
dc_dest = viewport->dc_destorg + (ylookup[y] + x) * pixelsize;
|
||||
dc_dest = viewport->GetDest(x, y);
|
||||
dc_dest_y = y;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -126,19 +126,18 @@ namespace swrenderer
|
|||
|
||||
void RenderViewport::SetupBuffer()
|
||||
{
|
||||
R_InitFuzzTable(RenderTarget->GetPitch());
|
||||
R_InitParticleTexture();
|
||||
}
|
||||
|
||||
uint8_t *RenderViewport::GetDest(int x, int y)
|
||||
{
|
||||
x += viewwindowx;
|
||||
y += viewwindowy;
|
||||
|
||||
int pitch = RenderTarget->GetPitch();
|
||||
int pixelsize = RenderTarget->IsBgra() ? 4 : 1;
|
||||
BYTE *lineptr = RenderTarget->GetBuffer() + (viewwindowy*pitch + viewwindowx) * pixelsize;
|
||||
|
||||
R_InitFuzzTable(pitch);
|
||||
|
||||
dc_destorg = lineptr;
|
||||
for (int i = 0; i < RenderTarget->GetHeight(); i++)
|
||||
{
|
||||
ylookup[i] = i * pitch;
|
||||
}
|
||||
|
||||
R_InitParticleTexture();
|
||||
return RenderTarget->GetBuffer() + (x + y * pitch) * pixelsize;
|
||||
}
|
||||
|
||||
void RenderViewport::InitTextureMapping()
|
||||
|
|
|
@ -44,7 +44,7 @@ namespace swrenderer
|
|||
// from clipangle to -clipangle.
|
||||
angle_t xtoviewangle[MAXWIDTH + 1];
|
||||
|
||||
uint8_t *dc_destorg = nullptr;
|
||||
uint8_t *GetDest(int x, int y);
|
||||
|
||||
bool RenderingToCanvas() const { return RenderTarget != screen; }
|
||||
|
||||
|
|
|
@ -245,7 +245,7 @@ namespace swrenderer
|
|||
{
|
||||
if (translucentPass->ClipSpriteColumnWithPortals(x, vis))
|
||||
continue;
|
||||
uint32_t *dest = ylookup[yl] + x + (uint32_t*)viewport->dc_destorg;
|
||||
uint32_t *dest = (uint32_t*)viewport->GetDest(x, yl);
|
||||
DrawerCommandQueue::QueueCommand<DrawParticleColumnRGBACommand>(dest, yl, spacing, ycount, fg, alpha, fracposx);
|
||||
}
|
||||
}
|
||||
|
@ -255,7 +255,7 @@ namespace swrenderer
|
|||
{
|
||||
if (translucentPass->ClipSpriteColumnWithPortals(x, vis))
|
||||
continue;
|
||||
uint8_t *dest = ylookup[yl] + x + viewport->dc_destorg;
|
||||
uint8_t *dest = viewport->GetDest(x, yl);
|
||||
DrawerCommandQueue::QueueCommand<DrawParticleColumnPalCommand>(dest, yl, spacing, ycount, fg, alpha, fracposx);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -203,13 +203,6 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
|
|||
else
|
||||
visible = drawerargs.SetPatchStyle(parms.style, parms.Alpha, 0, parms.fillcolor, basecolormap);
|
||||
|
||||
BYTE *destorgsave = viewport->dc_destorg;
|
||||
viewport->dc_destorg = screen->GetBuffer();
|
||||
if (viewport->dc_destorg == NULL)
|
||||
{
|
||||
I_FatalError("Attempt to write to buffer of hardware canvas");
|
||||
}
|
||||
|
||||
double x0 = parms.x - parms.left * parms.destwidth / parms.texwidth;
|
||||
double y0 = parms.y - parms.top * parms.destheight / parms.texheight;
|
||||
|
||||
|
@ -295,8 +288,6 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
|
|||
viewport->CenterY = centeryback;
|
||||
}
|
||||
|
||||
viewport->dc_destorg = destorgsave;
|
||||
|
||||
if (ticdup != 0 && menuactive == MENU_Off)
|
||||
{
|
||||
NetUpdate();
|
||||
|
@ -1369,13 +1360,6 @@ void DCanvas::FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
|
|||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
|
||||
BYTE *destorgsave = viewport->dc_destorg;
|
||||
viewport->dc_destorg = screen->GetBuffer();
|
||||
if (viewport->dc_destorg == NULL)
|
||||
{
|
||||
I_FatalError("Attempt to write to buffer of hardware canvas");
|
||||
}
|
||||
|
||||
scalex /= tex->Scale.X;
|
||||
scaley /= tex->Scale.Y;
|
||||
|
||||
|
@ -1498,7 +1482,6 @@ void DCanvas::FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
|
|||
pt1 = pt2;
|
||||
pt2--; if (pt2 < 0) pt2 = npoints;
|
||||
} while (pt1 != botpt);
|
||||
viewport->dc_destorg = destorgsave;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue