Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
ygopro-2pick
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
ygopro-2pick
Commits
90e14db2
Commit
90e14db2
authored
Aug 29, 2017
by
mercury233
Committed by
GitHub
Aug 29, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add nearest-neighbor anti-aliasing scaling for card pictures (#2027)
parent
79d7fd1e
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
144 additions
and
37 deletions
+144
-37
gframe/drawing.cpp
gframe/drawing.cpp
+12
-14
gframe/game.cpp
gframe/game.cpp
+9
-4
gframe/game.h
gframe/game.h
+6
-0
gframe/image_manager.cpp
gframe/image_manager.cpp
+116
-19
gframe/image_manager.h
gframe/image_manager.h
+1
-0
No files found.
gframe/drawing.cpp
View file @
90e14db2
...
@@ -746,10 +746,10 @@ void Game::DrawSpec() {
...
@@ -746,10 +746,10 @@ void Game::DrawSpec() {
switch
(
showcard
)
{
switch
(
showcard
)
{
case
1
:
{
case
1
:
{
driver
->
draw2DImage
(
imageManager
.
GetTexture
(
showcardcode
),
position2di
(
574
,
150
));
driver
->
draw2DImage
(
imageManager
.
GetTexture
(
showcardcode
),
position2di
(
574
,
150
));
driver
->
draw2DImage
(
imageManager
.
tMask
,
recti
(
574
,
150
,
574
+
(
showcarddif
>
177
?
177
:
showcarddif
),
404
),
driver
->
draw2DImage
(
imageManager
.
tMask
,
recti
(
574
,
150
,
574
+
(
showcarddif
>
CARD_IMG_WIDTH
?
CARD_IMG_WIDTH
:
showcarddif
),
404
),
recti
(
254
-
showcarddif
,
0
,
254
-
(
showcarddif
>
177
?
showcarddif
-
177
:
0
),
254
),
0
,
0
,
true
);
recti
(
CARD_IMG_HEIGHT
-
showcarddif
,
0
,
CARD_IMG_HEIGHT
-
(
showcarddif
>
CARD_IMG_WIDTH
?
showcarddif
-
CARD_IMG_WIDTH
:
0
),
CARD_IMG_HEIGHT
),
0
,
0
,
true
);
showcarddif
+=
15
;
showcarddif
+=
15
;
if
(
showcarddif
>=
254
)
{
if
(
showcarddif
>=
CARD_IMG_HEIGHT
)
{
showcard
=
2
;
showcard
=
2
;
showcarddif
=
0
;
showcarddif
=
0
;
}
}
...
@@ -757,9 +757,9 @@ void Game::DrawSpec() {
...
@@ -757,9 +757,9 @@ void Game::DrawSpec() {
}
}
case
2
:
{
case
2
:
{
driver
->
draw2DImage
(
imageManager
.
GetTexture
(
showcardcode
),
position2di
(
574
,
150
));
driver
->
draw2DImage
(
imageManager
.
GetTexture
(
showcardcode
),
position2di
(
574
,
150
));
driver
->
draw2DImage
(
imageManager
.
tMask
,
recti
(
574
+
showcarddif
,
150
,
761
,
404
),
recti
(
0
,
0
,
177
-
showcarddif
,
254
),
0
,
0
,
true
);
driver
->
draw2DImage
(
imageManager
.
tMask
,
recti
(
574
+
showcarddif
,
150
,
761
,
404
),
recti
(
0
,
0
,
CARD_IMG_WIDTH
-
showcarddif
,
CARD_IMG_HEIGHT
),
0
,
0
,
true
);
showcarddif
+=
15
;
showcarddif
+=
15
;
if
(
showcarddif
>=
177
)
{
if
(
showcarddif
>=
CARD_IMG_WIDTH
)
{
showcard
=
0
;
showcard
=
0
;
}
}
break
;
break
;
...
@@ -777,7 +777,7 @@ void Game::DrawSpec() {
...
@@ -777,7 +777,7 @@ void Game::DrawSpec() {
matManager
.
c2d
[
2
]
=
(
showcarddif
<<
24
)
|
0xffffff
;
matManager
.
c2d
[
2
]
=
(
showcarddif
<<
24
)
|
0xffffff
;
matManager
.
c2d
[
3
]
=
(
showcarddif
<<
24
)
|
0xffffff
;
matManager
.
c2d
[
3
]
=
(
showcarddif
<<
24
)
|
0xffffff
;
driver
->
draw2DImage
(
imageManager
.
GetTexture
(
showcardcode
),
recti
(
574
,
154
,
751
,
404
),
driver
->
draw2DImage
(
imageManager
.
GetTexture
(
showcardcode
),
recti
(
574
,
154
,
751
,
404
),
recti
(
0
,
0
,
177
,
254
),
0
,
matManager
.
c2d
,
true
);
recti
(
0
,
0
,
CARD_IMG_WIDTH
,
CARD_IMG_HEIGHT
),
0
,
matManager
.
c2d
,
true
);
if
(
showcarddif
<
255
)
if
(
showcarddif
<
255
)
showcarddif
+=
17
;
showcarddif
+=
17
;
break
;
break
;
...
@@ -788,7 +788,7 @@ void Game::DrawSpec() {
...
@@ -788,7 +788,7 @@ void Game::DrawSpec() {
matManager
.
c2d
[
2
]
=
(
showcarddif
<<
25
)
|
0xffffff
;
matManager
.
c2d
[
2
]
=
(
showcarddif
<<
25
)
|
0xffffff
;
matManager
.
c2d
[
3
]
=
(
showcarddif
<<
25
)
|
0xffffff
;
matManager
.
c2d
[
3
]
=
(
showcarddif
<<
25
)
|
0xffffff
;
driver
->
draw2DImage
(
imageManager
.
GetTexture
(
showcardcode
),
recti
(
662
-
showcarddif
*
0.69685
f
,
277
-
showcarddif
,
662
+
showcarddif
*
0.69685
f
,
277
+
showcarddif
),
driver
->
draw2DImage
(
imageManager
.
GetTexture
(
showcardcode
),
recti
(
662
-
showcarddif
*
0.69685
f
,
277
-
showcarddif
,
662
+
showcarddif
*
0.69685
f
,
277
+
showcarddif
),
recti
(
0
,
0
,
177
,
254
),
0
,
matManager
.
c2d
,
true
);
recti
(
0
,
0
,
CARD_IMG_WIDTH
,
CARD_IMG_HEIGHT
),
0
,
matManager
.
c2d
,
true
);
if
(
showcarddif
<
127
)
if
(
showcarddif
<
127
)
showcarddif
+=
9
;
showcarddif
+=
9
;
break
;
break
;
...
@@ -803,12 +803,12 @@ void Game::DrawSpec() {
...
@@ -803,12 +803,12 @@ void Game::DrawSpec() {
}
}
case
7
:
{
case
7
:
{
core
::
position2d
<
s32
>
corner
[
4
];
core
::
position2d
<
s32
>
corner
[
4
];
float
y
=
sin
(
showcarddif
*
3.1415926
f
/
180.0
f
)
*
254
;
float
y
=
sin
(
showcarddif
*
3.1415926
f
/
180.0
f
)
*
CARD_IMG_HEIGHT
;
corner
[
0
]
=
core
::
position2d
<
s32
>
(
574
-
(
254
-
y
)
*
0.3
f
,
404
-
y
);
corner
[
0
]
=
core
::
position2d
<
s32
>
(
574
-
(
CARD_IMG_HEIGHT
-
y
)
*
0.3
f
,
404
-
y
);
corner
[
1
]
=
core
::
position2d
<
s32
>
(
751
+
(
254
-
y
)
*
0.3
f
,
404
-
y
);
corner
[
1
]
=
core
::
position2d
<
s32
>
(
751
+
(
CARD_IMG_HEIGHT
-
y
)
*
0.3
f
,
404
-
y
);
corner
[
2
]
=
core
::
position2d
<
s32
>
(
574
,
404
);
corner
[
2
]
=
core
::
position2d
<
s32
>
(
574
,
404
);
corner
[
3
]
=
core
::
position2d
<
s32
>
(
751
,
404
);
corner
[
3
]
=
core
::
position2d
<
s32
>
(
751
,
404
);
irr
::
gui
::
Draw2DImageQuad
(
driver
,
imageManager
.
GetTexture
(
showcardcode
),
rect
<
s32
>
(
0
,
0
,
177
,
254
),
corner
);
irr
::
gui
::
Draw2DImageQuad
(
driver
,
imageManager
.
GetTexture
(
showcardcode
),
rect
<
s32
>
(
0
,
0
,
CARD_IMG_WIDTH
,
CARD_IMG_HEIGHT
),
corner
);
showcardp
++
;
showcardp
++
;
showcarddif
+=
9
;
showcarddif
+=
9
;
if
(
showcarddif
>=
90
)
if
(
showcarddif
>=
90
)
...
@@ -1022,8 +1022,6 @@ void Game::WaitFrameSignal(int frame) {
...
@@ -1022,8 +1022,6 @@ void Game::WaitFrameSignal(int frame) {
frameSignal
.
Wait
();
frameSignal
.
Wait
();
}
}
void
Game
::
DrawThumb
(
code_pointer
cp
,
position2di
pos
,
std
::
unordered_map
<
int
,
int
>*
lflist
)
{
void
Game
::
DrawThumb
(
code_pointer
cp
,
position2di
pos
,
std
::
unordered_map
<
int
,
int
>*
lflist
)
{
const
int
width
=
44
;
//standard pic size, maybe it should be defined in game.h
const
int
height
=
64
;
int
code
=
cp
->
first
;
int
code
=
cp
->
first
;
int
lcode
=
cp
->
second
.
alias
;
int
lcode
=
cp
->
second
.
alias
;
if
(
lcode
==
0
)
if
(
lcode
==
0
)
...
@@ -1032,7 +1030,7 @@ void Game::DrawThumb(code_pointer cp, position2di pos, std::unordered_map<int, i
...
@@ -1032,7 +1030,7 @@ void Game::DrawThumb(code_pointer cp, position2di pos, std::unordered_map<int, i
if
(
img
==
NULL
)
if
(
img
==
NULL
)
return
;
//NULL->getSize() will cause a crash
return
;
//NULL->getSize() will cause a crash
dimension2d
<
u32
>
size
=
img
->
getOriginalSize
();
dimension2d
<
u32
>
size
=
img
->
getOriginalSize
();
driver
->
draw2DImage
(
img
,
rect
<
s32
>
(
pos
.
X
,
pos
.
Y
,
pos
.
X
+
width
,
pos
.
Y
+
height
),
rect
<
s32
>
(
0
,
0
,
size
.
Width
,
size
.
Height
));
driver
->
draw2DImage
(
img
,
rect
<
s32
>
(
pos
.
X
,
pos
.
Y
,
pos
.
X
+
CARD_THUMB_WIDTH
,
pos
.
Y
+
CARD_THUMB_HEIGHT
),
rect
<
s32
>
(
0
,
0
,
size
.
Width
,
size
.
Height
));
if
(
lflist
->
count
(
lcode
))
{
if
(
lflist
->
count
(
lcode
))
{
switch
((
*
lflist
)[
lcode
])
{
switch
((
*
lflist
)[
lcode
])
{
...
...
gframe/game.cpp
View file @
90e14db2
...
@@ -197,10 +197,10 @@ bool Game::Initialize() {
...
@@ -197,10 +197,10 @@ bool Game::Initialize() {
btnHostPrepStart
=
env
->
addButton
(
rect
<
s32
>
(
230
,
280
,
340
,
305
),
wHostPrepare
,
BUTTON_HP_START
,
dataManager
.
GetSysString
(
1215
));
btnHostPrepStart
=
env
->
addButton
(
rect
<
s32
>
(
230
,
280
,
340
,
305
),
wHostPrepare
,
BUTTON_HP_START
,
dataManager
.
GetSysString
(
1215
));
btnHostPrepCancel
=
env
->
addButton
(
rect
<
s32
>
(
350
,
280
,
460
,
305
),
wHostPrepare
,
BUTTON_HP_CANCEL
,
dataManager
.
GetSysString
(
1210
));
btnHostPrepCancel
=
env
->
addButton
(
rect
<
s32
>
(
350
,
280
,
460
,
305
),
wHostPrepare
,
BUTTON_HP_CANCEL
,
dataManager
.
GetSysString
(
1210
));
//img
//img
wCardImg
=
env
->
addStaticText
(
L""
,
rect
<
s32
>
(
1
,
1
,
1
99
,
273
),
true
,
false
,
0
,
-
1
,
true
);
wCardImg
=
env
->
addStaticText
(
L""
,
rect
<
s32
>
(
1
,
1
,
1
+
CARD_IMG_WIDTH
+
20
,
1
+
CARD_IMG_HEIGHT
+
18
),
true
,
false
,
0
,
-
1
,
true
);
wCardImg
->
setBackgroundColor
(
0xc0c0c0c0
);
wCardImg
->
setBackgroundColor
(
0xc0c0c0c0
);
wCardImg
->
setVisible
(
false
);
wCardImg
->
setVisible
(
false
);
imgCard
=
env
->
addImage
(
rect
<
s32
>
(
10
,
9
,
1
87
,
263
),
wCardImg
);
imgCard
=
env
->
addImage
(
rect
<
s32
>
(
10
,
9
,
1
0
+
CARD_IMG_WIDTH
,
9
+
CARD_IMG_HEIGHT
),
wCardImg
);
imgCard
->
setImage
(
imageManager
.
tCover
[
0
]);
imgCard
->
setImage
(
imageManager
.
tCover
[
0
]);
imgCard
->
setUseAlphaChannel
(
true
);
imgCard
->
setUseAlphaChannel
(
true
);
//phase
//phase
...
@@ -334,14 +334,14 @@ bool Game::Initialize() {
...
@@ -334,14 +334,14 @@ bool Game::Initialize() {
btnPSAU
->
setImageScale
(
core
::
vector2df
(
0.5
,
0.5
));
btnPSAU
->
setImageScale
(
core
::
vector2df
(
0.5
,
0.5
));
btnPSAD
=
irr
::
gui
::
CGUIImageButton
::
addImageButton
(
env
,
rect
<
s32
>
(
155
,
45
,
295
,
185
),
wPosSelect
,
BUTTON_POS_AD
);
btnPSAD
=
irr
::
gui
::
CGUIImageButton
::
addImageButton
(
env
,
rect
<
s32
>
(
155
,
45
,
295
,
185
),
wPosSelect
,
BUTTON_POS_AD
);
btnPSAD
->
setImageScale
(
core
::
vector2df
(
0.5
,
0.5
));
btnPSAD
->
setImageScale
(
core
::
vector2df
(
0.5
,
0.5
));
btnPSAD
->
setImage
(
imageManager
.
tCover
[
0
],
rect
<
s32
>
(
0
,
0
,
177
,
254
));
btnPSAD
->
setImage
(
imageManager
.
tCover
[
0
],
rect
<
s32
>
(
0
,
0
,
CARD_IMG_WIDTH
,
CARD_IMG_HEIGHT
));
btnPSDU
=
irr
::
gui
::
CGUIImageButton
::
addImageButton
(
env
,
rect
<
s32
>
(
300
,
45
,
440
,
185
),
wPosSelect
,
BUTTON_POS_DU
);
btnPSDU
=
irr
::
gui
::
CGUIImageButton
::
addImageButton
(
env
,
rect
<
s32
>
(
300
,
45
,
440
,
185
),
wPosSelect
,
BUTTON_POS_DU
);
btnPSDU
->
setImageScale
(
core
::
vector2df
(
0.5
,
0.5
));
btnPSDU
->
setImageScale
(
core
::
vector2df
(
0.5
,
0.5
));
btnPSDU
->
setImageRotation
(
270
);
btnPSDU
->
setImageRotation
(
270
);
btnPSDD
=
irr
::
gui
::
CGUIImageButton
::
addImageButton
(
env
,
rect
<
s32
>
(
445
,
45
,
585
,
185
),
wPosSelect
,
BUTTON_POS_DD
);
btnPSDD
=
irr
::
gui
::
CGUIImageButton
::
addImageButton
(
env
,
rect
<
s32
>
(
445
,
45
,
585
,
185
),
wPosSelect
,
BUTTON_POS_DD
);
btnPSDD
->
setImageScale
(
core
::
vector2df
(
0.5
,
0.5
));
btnPSDD
->
setImageScale
(
core
::
vector2df
(
0.5
,
0.5
));
btnPSDD
->
setImageRotation
(
270
);
btnPSDD
->
setImageRotation
(
270
);
btnPSDD
->
setImage
(
imageManager
.
tCover
[
0
],
rect
<
s32
>
(
0
,
0
,
177
,
254
));
btnPSDD
->
setImage
(
imageManager
.
tCover
[
0
],
rect
<
s32
>
(
0
,
0
,
CARD_IMG_WIDTH
,
CARD_IMG_HEIGHT
));
//card select
//card select
wCardSelect
=
env
->
addWindow
(
rect
<
s32
>
(
320
,
100
,
1000
,
400
),
false
,
L""
);
wCardSelect
=
env
->
addWindow
(
rect
<
s32
>
(
320
,
100
,
1000
,
400
),
false
,
L""
);
wCardSelect
->
getCloseButton
()
->
setVisible
(
false
);
wCardSelect
->
getCloseButton
()
->
setVisible
(
false
);
...
@@ -901,6 +901,8 @@ void Game::LoadConfig() {
...
@@ -901,6 +901,8 @@ void Game::LoadConfig() {
char
strbuf
[
32
];
char
strbuf
[
32
];
char
valbuf
[
256
];
char
valbuf
[
256
];
wchar_t
wstr
[
256
];
wchar_t
wstr
[
256
];
gameConf
.
use_d3d
=
0
;
gameConf
.
use_image_scale
=
1
;
gameConf
.
antialias
=
0
;
gameConf
.
antialias
=
0
;
gameConf
.
serverport
=
7911
;
gameConf
.
serverport
=
7911
;
gameConf
.
textfontsize
=
12
;
gameConf
.
textfontsize
=
12
;
...
@@ -933,6 +935,8 @@ void Game::LoadConfig() {
...
@@ -933,6 +935,8 @@ void Game::LoadConfig() {
gameConf
.
antialias
=
atoi
(
valbuf
);
gameConf
.
antialias
=
atoi
(
valbuf
);
}
else
if
(
!
strcmp
(
strbuf
,
"use_d3d"
))
{
}
else
if
(
!
strcmp
(
strbuf
,
"use_d3d"
))
{
gameConf
.
use_d3d
=
atoi
(
valbuf
)
>
0
;
gameConf
.
use_d3d
=
atoi
(
valbuf
)
>
0
;
}
else
if
(
!
strcmp
(
strbuf
,
"use_image_scale"
))
{
gameConf
.
use_image_scale
=
atoi
(
valbuf
)
>
0
;
}
else
if
(
!
strcmp
(
strbuf
,
"errorlog"
))
{
}
else
if
(
!
strcmp
(
strbuf
,
"errorlog"
))
{
enable_log
=
atoi
(
valbuf
);
enable_log
=
atoi
(
valbuf
);
}
else
if
(
!
strcmp
(
strbuf
,
"textfont"
))
{
}
else
if
(
!
strcmp
(
strbuf
,
"textfont"
))
{
...
@@ -1005,6 +1009,7 @@ void Game::SaveConfig() {
...
@@ -1005,6 +1009,7 @@ void Game::SaveConfig() {
fprintf
(
fp
,
"#config file
\n
#nickname & gamename should be less than 20 characters
\n
"
);
fprintf
(
fp
,
"#config file
\n
#nickname & gamename should be less than 20 characters
\n
"
);
char
linebuf
[
256
];
char
linebuf
[
256
];
fprintf
(
fp
,
"use_d3d = %d
\n
"
,
gameConf
.
use_d3d
?
1
:
0
);
fprintf
(
fp
,
"use_d3d = %d
\n
"
,
gameConf
.
use_d3d
?
1
:
0
);
fprintf
(
fp
,
"use_image_scale = %d
\n
"
,
gameConf
.
use_image_scale
?
1
:
0
);
fprintf
(
fp
,
"antialias = %d
\n
"
,
gameConf
.
antialias
);
fprintf
(
fp
,
"antialias = %d
\n
"
,
gameConf
.
antialias
);
fprintf
(
fp
,
"errorlog = %d
\n
"
,
enable_log
);
fprintf
(
fp
,
"errorlog = %d
\n
"
,
enable_log
);
BufferIO
::
CopyWStr
(
ebNickName
->
getText
(),
gameConf
.
nickname
,
20
);
BufferIO
::
CopyWStr
(
ebNickName
->
getText
(),
gameConf
.
nickname
,
20
);
...
...
gframe/game.h
View file @
90e14db2
...
@@ -13,6 +13,7 @@ namespace ygo {
...
@@ -13,6 +13,7 @@ namespace ygo {
struct
Config
{
struct
Config
{
bool
use_d3d
;
bool
use_d3d
;
bool
use_image_scale
;
unsigned
short
antialias
;
unsigned
short
antialias
;
unsigned
short
serverport
;
unsigned
short
serverport
;
unsigned
char
textfontsize
;
unsigned
char
textfontsize
;
...
@@ -429,6 +430,11 @@ extern Game* mainGame;
...
@@ -429,6 +430,11 @@ extern Game* mainGame;
}
}
#define CARD_IMG_WIDTH 177
#define CARD_IMG_HEIGHT 254
#define CARD_THUMB_WIDTH 44
#define CARD_THUMB_HEIGHT 64
#define UEVENT_EXIT 0x1
#define UEVENT_EXIT 0x1
#define UEVENT_TOWINDOW 0x2
#define UEVENT_TOWINDOW 0x2
...
...
gframe/image_manager.cpp
View file @
90e14db2
#include "image_manager.h"
#include "image_manager.h"
#include "game.h"
namespace
ygo
{
namespace
ygo
{
...
@@ -63,6 +64,100 @@ void ImageManager::RemoveTexture(int code) {
...
@@ -63,6 +64,100 @@ void ImageManager::RemoveTexture(int code) {
tMap
.
erase
(
tit
);
tMap
.
erase
(
tit
);
}
}
}
}
// function by Warr1024, from https://github.com/minetest/minetest/issues/2419 , modified
void
imageScaleNNAA
(
irr
::
video
::
IImage
*
src
,
irr
::
video
::
IImage
*
dest
)
{
double
sx
,
sy
,
minsx
,
maxsx
,
minsy
,
maxsy
,
area
,
ra
,
ga
,
ba
,
aa
,
pw
,
ph
,
pa
;
u32
dy
,
dx
;
irr
::
video
::
SColor
pxl
;
// Cache rectsngle boundaries.
double
sw
=
src
->
getDimension
().
Width
*
1.0
;
double
sh
=
src
->
getDimension
().
Height
*
1.0
;
// Walk each destination image pixel.
// Note: loop y around x for better cache locality.
irr
::
core
::
dimension2d
<
u32
>
dim
=
dest
->
getDimension
();
for
(
dy
=
0
;
dy
<
dim
.
Height
;
dy
++
)
for
(
dx
=
0
;
dx
<
dim
.
Width
;
dx
++
)
{
// Calculate floating-point source rectangle bounds.
minsx
=
dx
*
sw
/
dim
.
Width
;
maxsx
=
minsx
+
sw
/
dim
.
Width
;
minsy
=
dy
*
sh
/
dim
.
Height
;
maxsy
=
minsy
+
sh
/
dim
.
Height
;
// Total area, and integral of r, g, b values over that area,
// initialized to zero, to be summed up in next loops.
area
=
0
;
ra
=
0
;
ga
=
0
;
ba
=
0
;
aa
=
0
;
// Loop over the integral pixel positions described by those bounds.
for
(
sy
=
floor
(
minsy
);
sy
<
maxsy
;
sy
++
)
for
(
sx
=
floor
(
minsx
);
sx
<
maxsx
;
sx
++
)
{
// Calculate width, height, then area of dest pixel
// that's covered by this source pixel.
pw
=
1
;
if
(
minsx
>
sx
)
pw
+=
sx
-
minsx
;
if
(
maxsx
<
(
sx
+
1
))
pw
+=
maxsx
-
sx
-
1
;
ph
=
1
;
if
(
minsy
>
sy
)
ph
+=
sy
-
minsy
;
if
(
maxsy
<
(
sy
+
1
))
ph
+=
maxsy
-
sy
-
1
;
pa
=
pw
*
ph
;
// Get source pixel and add it to totals, weighted
// by covered area and alpha.
pxl
=
src
->
getPixel
((
u32
)
sx
,
(
u32
)
sy
);
area
+=
pa
;
ra
+=
pa
*
pxl
.
getRed
();
ga
+=
pa
*
pxl
.
getGreen
();
ba
+=
pa
*
pxl
.
getBlue
();
aa
+=
pa
*
pxl
.
getAlpha
();
}
// Set the destination image pixel to the average color.
if
(
area
>
0
)
{
pxl
.
setRed
(
ra
/
area
+
0.5
);
pxl
.
setGreen
(
ga
/
area
+
0.5
);
pxl
.
setBlue
(
ba
/
area
+
0.5
);
pxl
.
setAlpha
(
aa
/
area
+
0.5
);
}
else
{
pxl
.
setRed
(
0
);
pxl
.
setGreen
(
0
);
pxl
.
setBlue
(
0
);
pxl
.
setAlpha
(
0
);
}
dest
->
setPixel
(
dx
,
dy
,
pxl
);
}
}
irr
::
video
::
ITexture
*
ImageManager
::
GetTextureFromFile
(
char
*
file
,
s32
width
,
s32
height
)
{
if
(
mainGame
->
gameConf
.
use_image_scale
)
{
irr
::
video
::
ITexture
*
texture
;
irr
::
video
::
IImage
*
srcimg
=
driver
->
createImageFromFile
(
file
);
if
(
srcimg
==
NULL
)
return
NULL
;
if
(
srcimg
->
getDimension
()
==
irr
::
core
::
dimension2d
<
u32
>
(
width
,
height
))
{
texture
=
driver
->
addTexture
(
file
,
srcimg
);
}
else
{
video
::
IImage
*
destimg
=
driver
->
createImage
(
srcimg
->
getColorFormat
(),
irr
::
core
::
dimension2d
<
u32
>
(
width
,
height
));
imageScaleNNAA
(
srcimg
,
destimg
);
texture
=
driver
->
addTexture
(
file
,
destimg
);
destimg
->
drop
();
}
srcimg
->
drop
();
return
texture
;
}
else
{
return
driver
->
getTexture
(
file
);
}
}
irr
::
video
::
ITexture
*
ImageManager
::
GetTexture
(
int
code
)
{
irr
::
video
::
ITexture
*
ImageManager
::
GetTexture
(
int
code
)
{
if
(
code
==
0
)
if
(
code
==
0
)
return
tUnknown
;
return
tUnknown
;
...
@@ -70,23 +165,22 @@ irr::video::ITexture* ImageManager::GetTexture(int code) {
...
@@ -70,23 +165,22 @@ irr::video::ITexture* ImageManager::GetTexture(int code) {
if
(
tit
==
tMap
.
end
())
{
if
(
tit
==
tMap
.
end
())
{
char
file
[
256
];
char
file
[
256
];
sprintf
(
file
,
"expansions/pics/%d.jpg"
,
code
);
sprintf
(
file
,
"expansions/pics/%d.jpg"
,
code
);
irr
::
video
::
ITexture
*
img
=
driver
->
getTexture
(
file
);
irr
::
video
::
ITexture
*
img
=
GetTextureFromFile
(
file
,
CARD_IMG_WIDTH
,
CARD_IMG_HEIGHT
);
if
(
img
==
NULL
)
{
if
(
img
==
NULL
)
{
sprintf
(
file
,
"pics/%d.jpg"
,
code
);
sprintf
(
file
,
"pics/%d.jpg"
,
code
);
img
=
driver
->
getTexture
(
file
);
img
=
GetTextureFromFile
(
file
,
CARD_IMG_WIDTH
,
CARD_IMG_HEIGHT
);
}
}
if
(
img
==
NULL
)
{
if
(
img
==
NULL
&&
!
mainGame
->
gameConf
.
use_image_scale
)
{
tMap
[
code
]
=
NULL
;
tMap
[
code
]
=
NULL
;
return
GetTextureThumb
(
code
);
return
GetTextureThumb
(
code
);
}
else
{
tMap
[
code
]
=
img
;
return
img
;
}
}
tMap
[
code
]
=
img
;
return
(
img
==
NULL
)
?
tUnknown
:
img
;
}
}
if
(
tit
->
second
)
if
(
tit
->
second
)
return
tit
->
second
;
return
tit
->
second
;
else
else
return
GetTextureThumb
(
code
);
return
mainGame
->
gameConf
.
use_image_scale
?
tUnknown
:
GetTextureThumb
(
code
);
}
}
irr
::
video
::
ITexture
*
ImageManager
::
GetTextureThumb
(
int
code
)
{
irr
::
video
::
ITexture
*
ImageManager
::
GetTextureThumb
(
int
code
)
{
if
(
code
==
0
)
if
(
code
==
0
)
...
@@ -95,18 +189,21 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
...
@@ -95,18 +189,21 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
if
(
tit
==
tThumb
.
end
())
{
if
(
tit
==
tThumb
.
end
())
{
char
file
[
256
];
char
file
[
256
];
sprintf
(
file
,
"expansions/pics/thumbnail/%d.jpg"
,
code
);
sprintf
(
file
,
"expansions/pics/thumbnail/%d.jpg"
,
code
);
irr
::
video
::
ITexture
*
img
=
driver
->
getTexture
(
file
);
irr
::
video
::
ITexture
*
img
=
GetTextureFromFile
(
file
,
CARD_THUMB_WIDTH
,
CARD_THUMB_HEIGHT
);
if
(
img
==
NULL
)
{
if
(
img
==
NULL
)
{
sprintf
(
file
,
"pics/thumbnail/%d.jpg"
,
code
);
sprintf
(
file
,
"pics/thumbnail/%d.jpg"
,
code
);
img
=
driver
->
getTexture
(
file
);
img
=
GetTextureFromFile
(
file
,
CARD_THUMB_WIDTH
,
CARD_THUMB_HEIGHT
);
}
}
if
(
img
==
NULL
)
{
if
(
img
==
NULL
&&
mainGame
->
gameConf
.
use_image_scale
)
{
tThumb
[
code
]
=
NULL
;
sprintf
(
file
,
"expansions/pics/%d.jpg"
,
code
);
return
tUnknown
;
img
=
GetTextureFromFile
(
file
,
CARD_THUMB_WIDTH
,
CARD_THUMB_HEIGHT
);
}
else
{
if
(
img
==
NULL
)
{
tThumb
[
code
]
=
img
;
sprintf
(
file
,
"pics/%d.jpg"
,
code
);
return
img
;
img
=
GetTextureFromFile
(
file
,
CARD_THUMB_WIDTH
,
CARD_THUMB_HEIGHT
);
}
}
}
tThumb
[
code
]
=
img
;
return
(
img
==
NULL
)
?
tUnknown
:
img
;
}
}
if
(
tit
->
second
)
if
(
tit
->
second
)
return
tit
->
second
;
return
tit
->
second
;
...
@@ -120,18 +217,18 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) {
...
@@ -120,18 +217,18 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) {
if
(
tit
==
tFields
.
end
())
{
if
(
tit
==
tFields
.
end
())
{
char
file
[
256
];
char
file
[
256
];
sprintf
(
file
,
"expansions/pics/field/%d.png"
,
code
);
sprintf
(
file
,
"expansions/pics/field/%d.png"
,
code
);
irr
::
video
::
ITexture
*
img
=
driver
->
getTexture
(
file
);
irr
::
video
::
ITexture
*
img
=
GetTextureFromFile
(
file
,
512
,
512
);
if
(
img
==
NULL
)
{
if
(
img
==
NULL
)
{
sprintf
(
file
,
"expansions/pics/field/%d.jpg"
,
code
);
sprintf
(
file
,
"expansions/pics/field/%d.jpg"
,
code
);
img
=
driver
->
getTexture
(
file
);
img
=
GetTextureFromFile
(
file
,
512
,
512
);
}
}
if
(
img
==
NULL
)
{
if
(
img
==
NULL
)
{
sprintf
(
file
,
"pics/field/%d.png"
,
code
);
sprintf
(
file
,
"pics/field/%d.png"
,
code
);
img
=
driver
->
getTexture
(
file
);
img
=
GetTextureFromFile
(
file
,
512
,
512
);
}
}
if
(
img
==
NULL
)
{
if
(
img
==
NULL
)
{
sprintf
(
file
,
"pics/field/%d.jpg"
,
code
);
sprintf
(
file
,
"pics/field/%d.jpg"
,
code
);
img
=
driver
->
getTexture
(
file
);
img
=
GetTextureFromFile
(
file
,
512
,
512
);
if
(
img
==
NULL
)
{
if
(
img
==
NULL
)
{
tFields
[
code
]
=
NULL
;
tFields
[
code
]
=
NULL
;
return
NULL
;
return
NULL
;
...
...
gframe/image_manager.h
View file @
90e14db2
...
@@ -13,6 +13,7 @@ public:
...
@@ -13,6 +13,7 @@ public:
void
SetDevice
(
irr
::
IrrlichtDevice
*
dev
);
void
SetDevice
(
irr
::
IrrlichtDevice
*
dev
);
void
ClearTexture
();
void
ClearTexture
();
void
RemoveTexture
(
int
code
);
void
RemoveTexture
(
int
code
);
irr
::
video
::
ITexture
*
GetTextureFromFile
(
char
*
file
,
s32
width
,
s32
height
);
irr
::
video
::
ITexture
*
GetTexture
(
int
code
);
irr
::
video
::
ITexture
*
GetTexture
(
int
code
);
irr
::
video
::
ITexture
*
GetTextureThumb
(
int
code
);
irr
::
video
::
ITexture
*
GetTextureThumb
(
int
code
);
irr
::
video
::
ITexture
*
GetTextureField
(
int
code
);
irr
::
video
::
ITexture
*
GetTextureField
(
int
code
);
...
...
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