Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
978137dc
Commit
978137dc
authored
Oct 11, 1998
by
Eric Kohl
Committed by
Alexandre Julliard
Oct 11, 1998
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Some minor improvements.
parent
6ef6825c
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
110 additions
and
76 deletions
+110
-76
imagelist.c
dlls/comctl32/imagelist.c
+109
-75
imagelist.h
include/imagelist.h
+1
-1
No files found.
dlls/comctl32/imagelist.c
View file @
978137dc
...
...
@@ -4,7 +4,7 @@
* Copyright 1998 Eric Kohl
*
* TODO:
* - Fix
xBitmap and yBitmap in ImageList_DrawIndirect
.
* - Fix
ImageList_DrawIndirect (xBitmap, yBitmap, rgbFg, rgbBk, dwRop)
.
* - Fix ImageList_GetIcon.
* - Fix drag functions.
* - Fix ImageList_Read and ImageList_Write.
...
...
@@ -382,9 +382,12 @@ ImageList_Copy (HIMAGELIST himlDst, INT32 iDst, HIMAGELIST himlSrc,
TRACE
(
imagelist
,
"iDst=%d iSrc=%d
\n
"
,
iDst
,
iSrc
);
if
((
himlSrc
==
NULL
)
||
(
himlDst
==
NULL
))
return
(
FALSE
);
if
((
iDst
<
0
)
||
(
iDst
>=
himlDst
->
cCurImage
))
return
(
FALSE
);
if
((
iSrc
<
0
)
||
(
iSrc
>=
himlSrc
->
cCurImage
))
return
(
FALSE
);
if
((
himlSrc
==
NULL
)
||
(
himlDst
==
NULL
))
return
FALSE
;
if
((
iDst
<
0
)
||
(
iDst
>=
himlDst
->
cCurImage
))
return
FALSE
;
if
((
iSrc
<
0
)
||
(
iSrc
>=
himlSrc
->
cCurImage
))
return
FALSE
;
hdcSrc
=
CreateCompatibleDC32
(
0
);
if
(
himlDst
==
himlSrc
)
...
...
@@ -472,14 +475,12 @@ ImageList_Copy (HIMAGELIST himlDst, INT32 iDst, HIMAGELIST himlSrc,
if
(
himlSrc
!=
himlDst
)
DeleteDC32
(
hdcDst
);
return
(
TRUE
)
;
return
TRUE
;
}
/*************************************************************************
* ImageList_Create [COMCTL32.44]
*
* Creates a new image list.
* ImageList_Create [COMCTL32.44] Creates a new image list.
*
* PARAMS
* cx [I] image height
...
...
@@ -489,8 +490,8 @@ ImageList_Copy (HIMAGELIST himlDst, INT32 iDst, HIMAGELIST himlSrc,
* cGrow [I] number of images by which image list grows
*
* RETURNS
* Success: Handle
of
the created image list
* Failure:
0
* Success: Handle
to
the created image list
* Failure:
NULL
*/
HIMAGELIST
WINAPI
...
...
@@ -501,19 +502,18 @@ ImageList_Create (INT32 cx, INT32 cy, UINT32 flags,
HDC32
hdc
;
INT32
nCount
;
HBITMAP32
hbmTemp
;
WORD
aBitBlend25
[
16
]
=
{
0x7777
,
0xDDDD
,
0x7777
,
0xDDDD
,
0x7777
,
0xDDDD
,
0x7777
,
0xDDDD
,
0x7777
,
0xDDDD
,
0x7777
,
0xDDDD
,
0x7777
,
0xDDDD
,
0x7777
,
0xDDDD
};
WORD
aBitBlend50
[
16
]
=
{
0x5555
,
0xAAAA
,
0x5555
,
0xAAAA
,
0x5555
,
0xAAAA
,
0x5555
,
0xAAAA
,
0x5555
,
0xAAAA
,
0x5555
,
0xAAAA
,
0x5555
,
0xAAAA
,
0x5555
,
0xAAAA
};
static
WORD
aBitBlend25
[]
=
{
0xAA
,
0x00
,
0x55
,
0x00
,
0xAA
,
0x00
,
0x55
,
0x00
};
static
WORD
aBitBlend50
[]
=
{
0x55
,
0xAA
,
0x55
,
0xAA
,
0x55
,
0xAA
,
0x55
,
0xAA
};
TRACE
(
imagelist
,
"(%d %d 0x%x %d %d)
\n
"
,
cx
,
cy
,
flags
,
cInitial
,
cGrow
);
himl
=
(
HIMAGELIST
)
LocalAlloc32
(
LMEM_FIXED
|
LMEM_ZEROINIT
,
sizeof
(
struct
_IMAGELIST
));
himl
=
(
HIMAGELIST
)
COMCTL32_Alloc
(
sizeof
(
struct
_IMAGELIST
));
if
(
!
himl
)
return
(
NULL
);
return
NULL
;
himl
->
cx
=
cx
;
himl
->
cy
=
cy
;
himl
->
flags
=
flags
;
...
...
@@ -521,6 +521,7 @@ ImageList_Create (INT32 cx, INT32 cy, UINT32 flags,
himl
->
cInitial
=
cInitial
;
himl
->
cGrow
=
cGrow
;
himl
->
cCurImage
=
0
;
himl
->
clrFg
=
CLR_DEFAULT
;
himl
->
clrBk
=
CLR_NONE
;
/* initialize overlay mask indices */
...
...
@@ -538,7 +539,7 @@ ImageList_Create (INT32 cx, INT32 cy, UINT32 flags,
1
,
himl
->
uBitsPixel
,
NULL
);
if
(
himl
->
hbmImage
==
0
)
{
ERR
(
imagelist
,
"Error creating image bitmap!
\n
"
);
return
(
0
)
;
return
NULL
;
}
if
(
himl
->
flags
&
ILC_MASK
)
{
...
...
@@ -548,22 +549,22 @@ ImageList_Create (INT32 cx, INT32 cy, UINT32 flags,
ERR
(
imagelist
,
"Error creating mask bitmap!
\n
"
);
if
(
himl
->
hbmImage
)
DeleteObject32
(
himl
->
hbmImage
);
return
(
0
)
;
return
NULL
;
}
}
else
himl
->
hbmMask
=
0
;
/* create blending brushes */
hbmTemp
=
CreateBitmap32
(
16
,
16
,
1
,
1
,
&
aBitBlend25
);
hbmTemp
=
CreateBitmap32
(
8
,
8
,
1
,
1
,
&
aBitBlend25
);
himl
->
hbrBlend25
=
CreatePatternBrush32
(
hbmTemp
);
DeleteObject32
(
hbmTemp
);
hbmTemp
=
CreateBitmap32
(
16
,
16
,
1
,
1
,
&
aBitBlend50
);
hbmTemp
=
CreateBitmap32
(
8
,
8
,
1
,
1
,
&
aBitBlend50
);
himl
->
hbrBlend50
=
CreatePatternBrush32
(
hbmTemp
);
DeleteObject32
(
hbmTemp
);
return
(
himl
);
return
himl
;
}
...
...
@@ -583,15 +584,24 @@ ImageList_Create (INT32 cx, INT32 cy, UINT32 flags,
BOOL32
WINAPI
ImageList_Destroy
(
HIMAGELIST
himl
)
{
if
(
himl
==
NULL
)
return
(
FALSE
);
if
(
!
himl
)
return
FALSE
;
/* delete image bitmaps */
if
(
himl
->
hbmImage
)
DeleteObject32
(
himl
->
hbmImage
);
if
(
himl
->
hbmMask
)
DeleteObject32
(
himl
->
hbmMask
);
LocalFree32
((
HLOCAL32
)
himl
);
return
(
TRUE
);
/* delete blending brushes */
if
(
himl
->
hbrBlend25
)
DeleteObject32
(
himl
->
hbrBlend25
);
if
(
himl
->
hbrBlend50
)
DeleteObject32
(
himl
->
hbrBlend50
);
COMCTL32_Free
(
himl
);
return
TRUE
;
}
...
...
@@ -633,7 +643,7 @@ ImageList_DragEnter (HWND32 hwndLock, INT32 x, INT32 y)
ImageList_DragShowNolock
(
TRUE
);
return
(
FALSE
)
;
return
FALSE
;
}
...
...
@@ -878,11 +888,14 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp)
BOOL32
bBlend25
;
BOOL32
bBlend50
;
if
(
pimldp
==
NULL
)
return
(
FALSE
);
if
(
pimldp
->
cbSize
<
sizeof
(
IMAGELISTDRAWPARAMS
))
return
(
FALSE
);
if
(
pimldp
->
himl
==
NULL
)
return
(
FALSE
);
if
((
pimldp
->
i
<
0
)
||
(
pimldp
->
i
>=
pimldp
->
himl
->
cCurImage
))
if
(
pimldp
==
NULL
)
return
FALSE
;
if
(
pimldp
->
cbSize
<
sizeof
(
IMAGELISTDRAWPARAMS
))
return
(
FALSE
);
if
(
pimldp
->
himl
==
NULL
)
return
FALSE
;
if
((
pimldp
->
i
<
0
)
||
(
pimldp
->
i
>=
pimldp
->
himl
->
cCurImage
))
return
FALSE
;
himlLocal
=
pimldp
->
himl
;
...
...
@@ -1197,8 +1210,8 @@ ImageList_GetIcon (HIMAGELIST himl, INT32 i, UINT32 fStyle)
HDC32
hdcSrc
,
hdcDst
;
INT32
nWidth
,
nHeight
;
if
(
himl
==
NULL
)
return
0
;
if
((
i
<
0
)
||
(
i
>=
himl
->
cCurImage
))
return
0
;
if
(
(
himl
==
NULL
)
||
(
i
<
0
)
||
(
i
>=
himl
->
cCurImage
))
return
0
;
nWidth
=
GetSystemMetrics32
(
SM_CXICON
);
nHeight
=
GetSystemMetrics32
(
SM_CYICON
);
...
...
@@ -1207,8 +1220,8 @@ ImageList_GetIcon (HIMAGELIST himl, INT32 i, UINT32 fStyle)
hdcDst
=
CreateCompatibleDC32
(
0
);
ii
.
fIcon
=
TRUE
;
ii
.
xHotspot
=
0
;
ii
.
yHotspot
=
0
;
ii
.
xHotspot
=
nWidth
/
2
;
ii
.
yHotspot
=
nHeight
/
2
;
ii
.
hbmMask
=
CreateCompatibleBitmap32
(
hdcDst
,
nWidth
,
nHeight
);
ii
.
hbmColor
=
CreateCompatibleBitmap32
(
hdcDst
,
nWidth
,
nHeight
);
...
...
@@ -1236,7 +1249,7 @@ ImageList_GetIcon (HIMAGELIST himl, INT32 i, UINT32 fStyle)
DeleteObject32
(
ii
.
hbmMask
);
DeleteObject32
(
ii
.
hbmColor
);
return
(
hIcon
)
;
return
hIcon
;
}
...
...
@@ -1261,15 +1274,17 @@ ImageList_GetIcon (HIMAGELIST himl, INT32 i, UINT32 fStyle)
BOOL32
WINAPI
ImageList_GetIconSize
(
HIMAGELIST
himl
,
INT32
*
cx
,
INT32
*
cy
)
{
if
(
himl
==
NULL
)
return
(
FALSE
);
if
(
himl
==
NULL
)
return
FALSE
;
if
((
himl
->
cx
<=
0
)
||
(
himl
->
cy
<=
0
))
return
FALSE
;
if
(
cx
)
*
cx
=
himl
->
cx
;
if
(
cy
)
*
cy
=
himl
->
cy
;
return
(
TRUE
);
return
TRUE
;
}
...
...
@@ -1292,7 +1307,7 @@ ImageList_GetImageCount (HIMAGELIST himl)
if
(
himl
==
NULL
)
return
0
;
return
(
himl
->
cCurImage
)
;
return
himl
->
cCurImage
;
}
...
...
@@ -1314,8 +1329,10 @@ ImageList_GetImageCount (HIMAGELIST himl)
BOOL32
WINAPI
ImageList_GetImageInfo
(
HIMAGELIST
himl
,
INT32
i
,
IMAGEINFO
*
pImageInfo
)
{
if
((
himl
==
NULL
)
||
(
pImageInfo
==
NULL
))
return
(
FALSE
);
if
((
i
<
0
)
||
(
i
>=
himl
->
cCurImage
))
return
(
FALSE
);
if
((
himl
==
NULL
)
||
(
pImageInfo
==
NULL
))
return
FALSE
;
if
((
i
<
0
)
||
(
i
>=
himl
->
cCurImage
))
return
FALSE
;
pImageInfo
->
hbmImage
=
himl
->
hbmImage
;
pImageInfo
->
hbmMask
=
himl
->
hbmMask
;
...
...
@@ -1325,7 +1342,7 @@ ImageList_GetImageInfo (HIMAGELIST himl, INT32 i, IMAGEINFO *pImageInfo)
pImageInfo
->
rcImage
.
left
=
i
*
himl
->
cx
;
pImageInfo
->
rcImage
.
right
=
(
i
+
1
)
*
himl
->
cx
;
return
(
TRUE
)
;
return
TRUE
;
}
...
...
@@ -1335,7 +1352,7 @@ ImageList_GetImageInfo (HIMAGELIST himl, INT32 i, IMAGEINFO *pImageInfo)
* Retrieves the rectangle of the specified image in an image list.
*
* PARAMS
* himl [I]
image list handle
* himl [I]
handle to the image list
* i [I] image index
* lpRect [O] pointer to the image rectangle
*
...
...
@@ -1350,15 +1367,17 @@ ImageList_GetImageInfo (HIMAGELIST himl, INT32 i, IMAGEINFO *pImageInfo)
BOOL32
WINAPI
ImageList_GetImageRect
(
HIMAGELIST
himl
,
INT32
i
,
LPRECT32
lpRect
)
{
if
((
himl
==
NULL
)
||
(
lpRect
==
NULL
))
return
(
FALSE
);
if
((
i
<
0
)
||
(
i
>=
himl
->
cCurImage
))
return
(
FALSE
);
if
((
himl
==
NULL
)
||
(
lpRect
==
NULL
))
return
FALSE
;
if
((
i
<
0
)
||
(
i
>=
himl
->
cCurImage
))
return
FALSE
;
lpRect
->
left
=
i
*
himl
->
cx
;
lpRect
->
top
=
0
;
lpRect
->
right
=
lpRect
->
left
+
himl
->
cx
;
lpRect
->
bottom
=
himl
->
cy
;
return
(
TRUE
)
;
return
TRUE
;
}
...
...
@@ -1516,17 +1535,18 @@ ImageList_Merge (HIMAGELIST himl1, INT32 i1, HIMAGELIST himl2, INT32 i2,
INT32
xOff1
,
yOff1
,
xOff2
,
yOff2
;
INT32
nX1
,
nX2
;
if
((
himl1
==
NULL
)
||
(
himl2
==
NULL
))
return
(
NULL
);
if
((
himl1
==
NULL
)
||
(
himl2
==
NULL
))
return
NULL
;
/* check indices */
if
((
i1
<
0
)
||
(
i1
>=
himl1
->
cCurImage
))
{
ERR
(
imagelist
,
"Index 1 out of range! %d
\n
"
,
i1
);
return
(
NULL
)
;
return
NULL
;
}
if
((
i2
<
0
)
||
(
i2
>=
himl2
->
cCurImage
))
{
ERR
(
imagelist
,
"Index 2 out of range! %d
\n
"
,
i2
);
return
(
NULL
)
;
return
NULL
;
}
if
(
dx
>
0
)
{
...
...
@@ -1601,7 +1621,7 @@ ImageList_Merge (HIMAGELIST himl1, INT32 i1, HIMAGELIST himl2, INT32 i2,
DeleteDC32
(
hdcDstImage
);
}
return
(
himlDst
)
;
return
himlDst
;
}
...
...
@@ -1619,7 +1639,7 @@ ImageList_Merge (HIMAGELIST himl1, INT32 i1, HIMAGELIST himl2, INT32 i2,
*
* NOTES
* This function can not be implemented yet, because
* IStream32::Read is not implemented.
* IStream32::Read is not implemented
yet
.
*
* BUGS
* empty stub.
...
...
@@ -1655,12 +1675,12 @@ ImageList_Remove (HIMAGELIST himl, INT32 i)
if
((
i
<
-
1
)
||
(
i
>=
himl
->
cCurImage
))
{
ERR
(
imagelist
,
"index out of range! %d
\n
"
,
i
);
return
(
FALSE
)
;
return
FALSE
;
}
if
(
himl
->
cCurImage
==
0
)
{
ERR
(
imagelist
,
"image list is already empty!
\n
"
);
return
(
FALSE
)
;
return
FALSE
;
}
if
(
i
==
-
1
)
{
...
...
@@ -1756,7 +1776,7 @@ ImageList_Remove (HIMAGELIST himl, INT32 i)
himl
->
cMaxImage
=
himl
->
cCurImage
+
himl
->
cGrow
;
}
return
(
TRUE
)
;
return
TRUE
;
}
...
...
@@ -1785,12 +1805,12 @@ ImageList_Replace (HIMAGELIST himl, INT32 i, HBITMAP32 hbmImage,
if
(
himl
==
NULL
)
{
ERR
(
imagelist
,
"Invalid image list handle!
\n
"
);
return
(
FALSE
)
;
return
FALSE
;
}
if
((
i
>=
himl
->
cCurImage
)
||
(
i
<
0
))
{
ERR
(
imagelist
,
"Invalid image index!
\n
"
);
return
(
FALSE
)
;
return
FALSE
;
}
hdcImageList
=
CreateCompatibleDC32
(
0
);
...
...
@@ -1817,7 +1837,7 @@ ImageList_Replace (HIMAGELIST himl, INT32 i, HBITMAP32 hbmImage,
DeleteDC32
(
hdcImage
);
DeleteDC32
(
hdcImageList
);
return
(
TRUE
)
;
return
TRUE
;
}
...
...
@@ -1847,8 +1867,10 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT32 i, HICON32 hIcon)
TRACE
(
imagelist
,
"(0x%lx 0x%x 0x%x)
\n
"
,
(
DWORD
)
himl
,
i
,
hIcon
);
if
(
himl
==
NULL
)
return
(
-
1
);
if
((
i
>=
himl
->
cCurImage
)
||
(
i
<
-
1
))
return
(
-
1
);
if
(
himl
==
NULL
)
return
-
1
;
if
((
i
>=
himl
->
cCurImage
)
||
(
i
<
-
1
))
return
-
1
;
GetIconInfo
(
hIcon
,
&
ii
);
if
(
ii
.
hbmMask
==
0
)
...
...
@@ -1898,15 +1920,12 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT32 i, HICON32 hIcon)
DeleteDC32
(
hdcImageList
);
if
(
hdcImage
)
DeleteDC32
(
hdcImage
);
// FIXME (imagelist, "deleting hbmColor!\n");
if
(
ii
.
hbmColor
)
DeleteObject32
(
ii
.
hbmColor
);
// FIXME (imagelist, "deleted hbmColor!\n");
if
(
ii
.
hbmMask
)
DeleteObject32
(
ii
.
hbmMask
);
return
(
nIndex
)
;
return
nIndex
;
}
...
...
@@ -1930,11 +1949,11 @@ ImageList_SetBkColor (HIMAGELIST himl, COLORREF clrBk)
COLORREF
clrOldBk
;
if
(
himl
==
NULL
)
return
(
CLR_NONE
)
;
return
CLR_NONE
;
clrOldBk
=
himl
->
clrBk
;
himl
->
clrBk
=
clrBk
;
return
(
clrOldBk
)
;
return
clrOldBk
;
}
...
...
@@ -1965,7 +1984,8 @@ ImageList_SetDragCursorImage (HIMAGELIST himlDrag, INT32 iDrag,
FIXME
(
imagelist
,
"semi-stub!
\n
"
);
if
(
himlInternalDrag
==
NULL
)
return
(
FALSE
);
if
(
himlInternalDrag
==
NULL
)
return
FALSE
;
TRACE
(
imagelist
,
" dxH=%d dyH=%d nX=%d nY=%d
\n
"
,
dxHotspot
,
dyHotspot
,
nInternalDragHotspotX
,
nInternalDragHotspotY
);
...
...
@@ -1979,7 +1999,7 @@ ImageList_SetDragCursorImage (HIMAGELIST himlDrag, INT32 iDrag,
nInternalDragHotspotX
=
dxHotspot
;
nInternalDragHotspotY
=
dyHotspot
;
return
(
FALSE
)
;
return
FALSE
;
}
...
...
@@ -2057,7 +2077,7 @@ ImageList_SetIconSize (HIMAGELIST himl, INT32 cx, INT32 cy)
1
,
1
,
NULL
);
}
return
(
TRUE
)
;
return
TRUE
;
}
...
...
@@ -2101,15 +2121,22 @@ ImageList_SetImageCount (HIMAGELIST himl, INT32 iImageCount)
{
SelectObject32
(
hdcImageList
,
himl
->
hbmImage
);
SelectObject32
(
hdcBitmap
,
hbmNewBitmap
);
/* copy images */
BitBlt32
(
hdcBitmap
,
0
,
0
,
nCopyCount
*
himl
->
cx
,
himl
->
cy
,
hdcImageList
,
0
,
0
,
SRCCOPY
);
/* delete 'empty' image space */
SetBkColor32
(
hdcBitmap
,
RGB
(
255
,
255
,
255
));
SetTextColor32
(
hdcBitmap
,
RGB
(
0
,
0
,
0
));
PatBlt32
(
hdcBitmap
,
nCopyCount
*
himl
->
cx
,
0
,
(
nNewCount
-
nCopyCount
)
*
himl
->
cx
,
himl
->
cy
,
BLACKNESS
);
DeleteObject32
(
himl
->
hbmImage
);
himl
->
hbmImage
=
hbmNewBitmap
;
}
else
{
ERR
(
imagelist
,
"Could not create new image bitmap !
\n
"
);
}
if
(
himl
->
hbmMask
)
{
...
...
@@ -2119,16 +2146,23 @@ ImageList_SetImageCount (HIMAGELIST himl, INT32 iImageCount)
{
SelectObject32
(
hdcImageList
,
himl
->
hbmMask
);
SelectObject32
(
hdcBitmap
,
hbmNewBitmap
);
/* copy images */
BitBlt32
(
hdcBitmap
,
0
,
0
,
nCopyCount
*
himl
->
cx
,
himl
->
cy
,
hdcImageList
,
0
,
0
,
SRCCOPY
);
/* delete 'empty' image space */
SetBkColor32
(
hdcBitmap
,
RGB
(
255
,
255
,
255
));
SetTextColor32
(
hdcBitmap
,
RGB
(
0
,
0
,
0
));
PatBlt32
(
hdcBitmap
,
nCopyCount
*
himl
->
cx
,
0
,
(
nNewCount
-
nCopyCount
)
*
himl
->
cx
,
himl
->
cy
,
BLACKNESS
);
DeleteObject32
(
himl
->
hbmMask
);
himl
->
hbmMask
=
hbmNewBitmap
;
}
else
{
ERR
(
imagelist
,
"Could not create new mask bitmap!
\n
"
);
}
}
DeleteDC32
(
hdcImageList
);
DeleteDC32
(
hdcBitmap
);
...
...
include/imagelist.h
View file @
978137dc
...
...
@@ -14,6 +14,7 @@ struct _IMAGELIST
HBRUSH32
hbrBlend25
;
HBRUSH32
hbrBlend50
;
COLORREF
clrBk
;
COLORREF
clrFg
;
INT32
cInitial
;
INT32
cGrow
;
INT32
cMaxImage
;
...
...
@@ -27,6 +28,5 @@ struct _IMAGELIST
typedef
struct
_IMAGELIST
*
HIMAGELIST
;
#endif
/* __WINE_IMAGELIST_H */
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