code move

SVN revision: 6445
This commit is contained in:
Carsten Haitzler 2002-11-08 08:02:15 +00:00
parent 5c82257464
commit 56b5e15f26
177 changed files with 59661 additions and 0 deletions

BIN
legacy/evas/data/arial.ttf Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
legacy/evas/data/bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 KiB

BIN
legacy/evas/data/e_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
legacy/evas/data/grunge.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
legacy/evas/data/panel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

BIN
legacy/evas/data/sphere.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
legacy/evas/data/t1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1002 B

BIN
legacy/evas/data/t2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,2 @@
usr/bin/evas_*
usr/share/evas/data/*.png

View File

@ -0,0 +1,5 @@
usr/bin/evas-config
usr/include/*
usr/lib/lib*.a
usr/lib/lib*.so
usr/lib/lib*.la

View File

@ -0,0 +1,2 @@
usr/lib/lib*.so.*
usr/share/evas/data/*.ttf

55
legacy/evas/doc/evas.css Normal file
View File

@ -0,0 +1,55 @@
H1 { text-align: center; color: #333333}
CAPTION { font-weight: bold }
A:link { text-decoration: none; color: #444444; }
A:visited { text-decoration: none; color: #666666; }
A:hover { text-decoration: none; color: #ffffff; }
A.qindex { text-decoration: none; }
A.qindexRef { text-decoration: none; }
A.el { text-decoration: none; color: #555555; }
A.elRef { text-decoration: none; color: #555555; }
A.code { text-decoration: none; font-weight: normal; color: #555555; }
A.codeRef { text-decoration: none; font-weight: normal; color: #555555; }
DL.el { margin-left: -1cm }
DIV.fragment { width: 100%; border: none; background-color: #dddddd }
DIV.ah { background-color: black; color: #eeeeee; margin-bottom: 3px; margin-top: 3px }
TD.md { background-color: #aaaaaa; color: #000088; }
TD.mdname1 { color: #880000; }
TD.mdname { color: #880000; width: 600px; }
DIV.groupHeader { margin-left: 10px; margin-top: 10px; margin-bottom: 10px; font-weight: bold }
DIV.groupText { margin-left: 10px; font-style: italic; font-size: smaller }
BODY {
background: #999999;
color: #222222;
font-family: times;
}
TD.indexkey {
background-color: #99aaaa;
font-weight: bold;
padding-right : 10px;
padding-top : 2px;
padding-left : 10px;
padding-bottom : 2px;
margin-left : 0px;
margin-right : 0px;
margin-top : 2px;
margin-bottom : 2px
}
TD.indexvalue {
background-color: #aa99aa;
font-style: italic;
padding-right : 10px;
padding-top : 2px;
padding-left : 10px;
padding-bottom : 2px;
margin-left : 0px;
margin-right : 0px;
margin-top : 2px;
margin-bottom : 2px
}
span.keyword { color: #008000 }
span.keywordtype { color: #604020 }
span.keywordflow { color: #e08000 }
span.comment { color: #800000 }
span.preprocessor { color: #806020 }
span.stringliteral { color: #002080 }
span.charliteral { color: #008080 }

View File

@ -0,0 +1,2 @@
</body>
</html>

16
legacy/evas/doc/head.html Normal file
View File

@ -0,0 +1,16 @@
<html>
<head>
<title>$title</title>
<link href=evas.css rel=stylesheet type=text/css>
</head>
<body>
<table border=0 cellpadding=4 cellspacing=0 width=100%>
<tr>
<td><img src=evas_small.png width=48 height=48 alt=E></td>
<td width=100% align=center valign=middle><font face=helvetica size=2 color=#000000>E : V : A : S</font></td>
</tr>
</table>

View File

@ -0,0 +1,149 @@
%!PS-Adobe-2.0 EPSF-2.0
%%Title: evas.eps
%%Creator: fig2dev Version 3.2 Patchlevel 3c
%%CreationDate: Wed Oct 23 16:18:00 2002
%%For: raster@dugong.fluffyspider.com.au (The Rasterman)
%%BoundingBox: 0 0 404 396
%%Magnification: 1.0000
%%EndComments
/$F2psDict 200 dict def
$F2psDict begin
$F2psDict /mtrx matrix put
/col-1 {0 setgray} bind def
/col0 {0.000 0.000 0.000 srgb} bind def
/col1 {0.000 0.000 1.000 srgb} bind def
/col2 {0.000 1.000 0.000 srgb} bind def
/col3 {0.000 1.000 1.000 srgb} bind def
/col4 {1.000 0.000 0.000 srgb} bind def
/col5 {1.000 0.000 1.000 srgb} bind def
/col6 {1.000 1.000 0.000 srgb} bind def
/col7 {1.000 1.000 1.000 srgb} bind def
/col8 {0.000 0.000 0.560 srgb} bind def
/col9 {0.000 0.000 0.690 srgb} bind def
/col10 {0.000 0.000 0.820 srgb} bind def
/col11 {0.530 0.810 1.000 srgb} bind def
/col12 {0.000 0.560 0.000 srgb} bind def
/col13 {0.000 0.690 0.000 srgb} bind def
/col14 {0.000 0.820 0.000 srgb} bind def
/col15 {0.000 0.560 0.560 srgb} bind def
/col16 {0.000 0.690 0.690 srgb} bind def
/col17 {0.000 0.820 0.820 srgb} bind def
/col18 {0.560 0.000 0.000 srgb} bind def
/col19 {0.690 0.000 0.000 srgb} bind def
/col20 {0.820 0.000 0.000 srgb} bind def
/col21 {0.560 0.000 0.560 srgb} bind def
/col22 {0.690 0.000 0.690 srgb} bind def
/col23 {0.820 0.000 0.820 srgb} bind def
/col24 {0.500 0.190 0.000 srgb} bind def
/col25 {0.630 0.250 0.000 srgb} bind def
/col26 {0.750 0.380 0.000 srgb} bind def
/col27 {1.000 0.500 0.500 srgb} bind def
/col28 {1.000 0.630 0.630 srgb} bind def
/col29 {1.000 0.750 0.750 srgb} bind def
/col30 {1.000 0.880 0.880 srgb} bind def
/col31 {1.000 0.840 0.000 srgb} bind def
end
save
newpath 0 396 moveto 0 0 lineto 404 0 lineto 404 396 lineto closepath clip newpath
-8.0 450.0 translate
1 -1 scale
/cp {closepath} bind def
/ef {eofill} bind def
/gr {grestore} bind def
/gs {gsave} bind def
/sa {save} bind def
/rs {restore} bind def
/l {lineto} bind def
/m {moveto} bind def
/rm {rmoveto} bind def
/n {newpath} bind def
/s {stroke} bind def
/sh {show} bind def
/slc {setlinecap} bind def
/slj {setlinejoin} bind def
/slw {setlinewidth} bind def
/srgb {setrgbcolor} bind def
/rot {rotate} bind def
/sc {scale} bind def
/sd {setdash} bind def
/ff {findfont} bind def
/sf {setfont} bind def
/scf {scalefont} bind def
/sw {stringwidth} bind def
/tr {translate} bind def
/tnt {dup dup currentrgbcolor
4 -2 roll dup 1 exch sub 3 -1 roll mul add
4 -2 roll dup 1 exch sub 3 -1 roll mul add
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
bind def
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
4 -2 roll mul srgb} bind def
/DrawEllipse {
/endangle exch def
/startangle exch def
/yrad exch def
/xrad exch def
/y exch def
/x exch def
/savematrix mtrx currentmatrix def
x y tr xrad yrad sc 0 0 1 startangle endangle arc
closepath
savematrix setmatrix
} def
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
/$F2psEnd {$F2psEnteredState restore end} def
$F2psBegin
%%Page: 1 1
10 setmiterlimit
0.06000 0.06000 sc
%
% Fig objects follow
%
% Ellipse
n 3450 4200 3300 3300 0 360 DrawEllipse gs 0.00 setgray ef gr
% Ellipse
n 3825 4200 3000 3000 0 360 DrawEllipse gs col7 1.00 shd ef gr
% Ellipse
n 1725 4200 600 600 0 360 DrawEllipse gs 0.00 setgray ef gr
% Ellipse
n 6238 4200 600 600 0 360 DrawEllipse gs 0.00 setgray ef gr
% Rotated Ellipse
gs
3225 4200 tr
-90.000 rot
n 0 0 600 600 0 360 DrawEllipse 90.000 rot
gs 0.00 setgray ef gr gr
% Rotated Ellipse
gs
4725 4200 tr
-270.001 rot
n 0 0 600 600 0 360 DrawEllipse 270.001 rot
gs 0.00 setgray ef gr gr
% Rotated Ellipse
gs
3225 4132 tr
-90.000 rot
n 0 0 545 545 0 360 DrawEllipse 90.000 rot
gs col7 1.00 shd ef gr gr
% Rotated Ellipse
gs
4725 4268 tr
-270.001 rot
n 0 0 545 545 0 360 DrawEllipse 270.001 rot
gs col7 1.00 shd ef gr gr
% Arc
n 6306.0 4200.0 545.0 180.0 0.0 arc
6306.0 4200.0 l 5761.0 4200.0 l gs col7 1.00 shd ef gr
% Arc
n 6170.0 4200.0 545.0 180.0 0.0 arcn
6170.0 4200.0 l 5625.0 4200.0 l gs col7 1.00 shd ef gr
$F2psEnd
rs

View File

@ -0,0 +1,25 @@
#FIG 3.2
Landscape
Center
Inches
Letter
500.00
Single
-2
1200 2
6 150 900 6825 7500
1 4 0 0 0 0 48 0 20 0.000 1 0.0000 1725 4200 600 600 1125 4200 2325 4200
1 4 0 0 0 0 50 0 20 0.000 1 0.0000 3450 4200 3300 3300 150 4200 6750 4200
1 4 0 0 0 7 49 0 20 0.000 1 0.0000 3825 4200 3000 3000 825 4200 6825 4200
-6
6 5625 3600 6900 4800
6 5625 3600 6900 4800
5 2 0 0 0 7 30 0 20 0.000 0 0 0 0 6306.000 4200.000 5761 4200 6306 3655 6851 4200
5 2 0 0 0 7 30 0 20 0.000 0 1 0 0 6170.000 4200.000 5625 4200 6170 4745 6715 4200
-6
1 4 0 0 0 0 40 0 20 0.000 1 0.0000 6238 4200 600 600 5638 4200 6838 4200
-6
1 4 0 0 0 0 40 0 20 0.000 1 1.5708 3225 4200 600 600 3225 4800 3225 3600
1 4 0 0 0 7 39 0 20 0.000 1 1.5708 3225 4132 545 545 3225 4677 3225 3587
1 4 0 0 0 0 40 0 20 0.000 1 4.7124 4725 4200 600 600 4725 3600 4725 4800
1 4 0 0 0 7 39 0 20 0.000 1 4.7124 4725 4268 545 545 4725 3723 4725 4813

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,3 @@
## Process this file with automake to produce Makefile.in
SUBDIRS = win32_gdi

View File

@ -0,0 +1,11 @@
EXTRA_DIST = \
evaslib.vcb \
evaslib.vcl \
evaslib.vco \
evaslib.vcp \
evaslib.vcw \
evas_software_win32.vcb \
evas_software_win32.vcl \
evas_software_win32.vco \
evas_software_win32.vcp \
evas_software_win32.vcw

Binary file not shown.

View File

@ -0,0 +1,130 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: evas_software_win32 - Win32 (WCE emulator) Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating command line "rc.exe /l 0x409 /fo"emulatorDbg/evas_software_win32.res" /i "\Projects\mbed\evas\src\bin\evas_software_win32" /d "WCE_PLATFORM_STANDARDSDK" /d UNDER_CE=400 /d _WIN32_WCE=400 /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "_X86_" /d "x86" /d "_i386_" /r "C:\Projects\mbed\evas\src\bin\evas_software_win32\evas_software_win32.rc""
Creating temporary file "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP1E8.tmp" with contents
[
/nologo /W3 /Zi /Od /I "..\..\\" /I "..\..\src\bin" /I "..\..\src\lib" /D "DEBUG" /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /D UNDER_CE=400 /D _WIN32_WCE=400 /D "WCE_PLATFORM_STANDARDSDK" /D "UNICODE" /D "_UNICODE" /FR"emulatorDbg/" /Fo"emulatorDbg/" /Fd"emulatorDbg/" /Gs8192 /GF /c
"C:\Projects\mbed\evas\src\bin\evas_software_win32\evas_software_win32.cpp"
]
Creating command line "cl.exe @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP1E8.tmp"
Creating temporary file "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP1E9.tmp" with contents
[
/nologo /W3 /Zi /Od /I "..\..\\" /I "..\..\src\bin" /I "..\..\src\lib" /D "DEBUG" /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /D UNDER_CE=400 /D _WIN32_WCE=400 /D "WCE_PLATFORM_STANDARDSDK" /D "MBCS" /D "_MBCS" /FR"emulatorDbg/" /Fo"emulatorDbg/" /Fd"emulatorDbg/" /Gs8192 /GF /c
"C:\Projects\mbed\evas\src\bin\evas_test_main.c"
"C:\Projects\mbed\evas\src\bin\evas_software_win32\StdAfx.cpp"
]
Creating command line "cl.exe @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP1E9.tmp"
Creating temporary file "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP1EA.tmp" with contents
[
commctrl.lib coredll.lib corelibc.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /incremental:yes /pdb:"emulatorDbg/evas_software_win32.pdb" /debug /nodefaultlib:"OLDNAMES.lib" /nodefaultlib:libc.lib /nodefaultlib:libcd.lib /nodefaultlib:libcmt.lib /nodefaultlib:libcmtd.lib /nodefaultlib:msvcrt.lib /nodefaultlib:msvcrtd.lib /out:"emulatorDbg/evas_software_win32.exe" /subsystem:windowsce,4.00 /MACHINE:IX86
.\emulatorDbg\evas_software_win32.obj
.\emulatorDbg\evas_test_main.obj
.\emulatorDbg\StdAfx.obj
.\emulatorDbg\evas_software_win32.res
.\emulatorDbg\evaslib.lib
]
Creating command line "link.exe @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP1EA.tmp"
<h3>Output Window</h3>
Compiling resources...
Compiling...
evas_software_win32.cpp
C:\Projects\mbed\evas\src\bin\evas_software_win32\evas_software_win32.cpp(195) : warning C4101: 'szHello' : unreferenced local variable
Compiling...
evas_test_main.c
C:\Projects\mbed\evas\src\bin\evas_test_main.c(91) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\bin\evas_test_main.c(324) : warning C4101: 'iw' : unreferenced local variable
C:\Projects\mbed\evas\src\bin\evas_test_main.c(324) : warning C4101: 'ih' : unreferenced local variable
C:\Projects\mbed\evas\src\bin\evas_test_main.c(358) : warning C4101: 'iw' : unreferenced local variable
C:\Projects\mbed\evas\src\bin\evas_test_main.c(358) : warning C4101: 'ih' : unreferenced local variable
C:\Projects\mbed\evas\src\bin\evas_test_main.c(394) : warning C4101: 'iw' : unreferenced local variable
C:\Projects\mbed\evas\src\bin\evas_test_main.c(394) : warning C4101: 'ih' : unreferenced local variable
Generating Code...
Compiling...
StdAfx.cpp
C:\Projects\mbed\evas\src\bin\evas_test_main.c(91) : warning C4761: integral size mismatch in argument; conversion supplied
Generating Code...
Linking...
evaslib.lib(evas_callbacks.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_clip.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_events.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_layer.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_name.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_object_gradient.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_object_image.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_object_line.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_object_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_object_polygon.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_object_rectangle.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_object_text.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_rectangle.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_render.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_stack.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_hash.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_list.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_object_list.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_blend_alpha_color_pixel.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_blend_color_pixel.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_blend_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_blend_pixel_cmod_pixel.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_blend_pixel_mul_pixel.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_blend_pixel_pixel.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_blit_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_convert_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_convert_rgb_16.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_convert_rgb_32.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_cpu.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_draw_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_font_draw.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_font_load.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_font_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_font_query.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_gradient_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_image_load.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_image_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_line_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_polygon_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_rectangle_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_scale_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_scale_sample.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_scale_smooth.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_tiler.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_engine.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_outbuf.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_win32_buffer.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_win32_main.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(evas_path.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(winfnt.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(type42.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(type1.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(truetype.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(smooth.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(sfnt.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(raster.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(psmodule.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(pshinter.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(psaux.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(pfr.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(pcf.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(type1cid.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(cff.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(bdf.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(ftsystem.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(ftinit.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(ftglyph.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(ftbase.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
evaslib.lib(autohint.obj) : warning LNK4204: 'C:\Projects\mbed\evas\proj\win32_gdi\emulatorDbg\vc60.pdb' is missing debugging information for referencing module; linking object as if no debug info
<h3>Results</h3>
evas_software_win32.exe - 0 error(s), 79 warning(s)
</pre>
</body>
</html>

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,41 @@
Microsoft eMbedded Visual Tools Workspace File, Format Version 4.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "evas_software_win32"=.\evas_software_win32.vcp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "evaslib"=.\evaslib.vcp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

Binary file not shown.

View File

@ -0,0 +1,292 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: evaslib - Win32 (WCE emulator) Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP1E5.tmp" with contents
[
/nologo /W3 /Zi /Od /I "..\..\lib" /I "..\\" /I "..\..\lib\include" /I "..\..\\" /I "..\..\src\bin" /I "..\..\src\lib" /I "..\..\src\lib\include" /I "..\..\..\freetype-2.1.2\include" /I "..\..\..\libpng-1.2.4" /I "..\..\..\zlib" /I "..\..\..\jpeg-6b" /D "DEBUG" /D "_i386_" /D "_X86_" /D "x86" /D _WIN32_WCE=400 /D "WCE_PLATFORM_STANDARDSDK" /D UNDER_CE=400 /D "MBCS" /D "_MBCS" /D "_LIB" /Fo"emulatorDbg/" /Fd"emulatorDbg/" /Gs8192 /GF /c
"C:\Projects\mbed\evas\src\lib\canvas\evas_callbacks.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_clip.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_data.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_events.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_layer.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_main.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_name.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_object_gradient.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_object_image.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_object_line.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_object_main.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_object_polygon.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_object_rectangle.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_rectangle.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_render.c"
"C:\Projects\mbed\evas\src\lib\canvas\evas_stack.c"
"C:\Projects\mbed\evas\src\lib\data\evas_hash.c"
"C:\Projects\mbed\evas\src\lib\data\evas_list.c"
"C:\Projects\mbed\evas\src\lib\data\evas_object_list.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_blend_alpha_color_pixel.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_blend_color_pixel.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_blend_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_blend_pixel_cmod_pixel.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_blend_pixel_mul_pixel.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_blend_pixel_pixel.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_blit_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_color.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_gry_1.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_gry_4.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_gry_8.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_rgb_16.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_rgb_24.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_rgb_32.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_rgb_8.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_cpu.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_font_draw.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_font_load.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_font_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_font_query.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_gradient_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_image_load.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_image_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_line_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_polygon_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_rectangle_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_scale_main.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_scale_sample.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_scale_smooth.c"
"C:\Projects\mbed\evas\src\lib\engines\common\evas_tiler.c"
"C:\Projects\mbed\evas\src\lib\engines\software_win32_gdi\evas_engine.c"
"C:\Projects\mbed\evas\src\lib\engines\software_win32_gdi\evas_outbuf.c"
"C:\Projects\mbed\evas\src\lib\engines\software_win32_gdi\evas_win32_buffer.c"
"C:\Projects\mbed\evas\src\lib\engines\software_win32_gdi\evas_win32_main.c"
"C:\Projects\mbed\evas\src\lib\file\evas_path.c"
]
Creating command line "cl.exe @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP1E5.tmp"
Creating temporary file "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP1E6.tmp" with contents
[
/nologo /out:"emulatorDbg\evaslib.lib"
.\emulatorDbg\evas_callbacks.obj
.\emulatorDbg\evas_clip.obj
.\emulatorDbg\evas_data.obj
.\emulatorDbg\evas_events.obj
.\emulatorDbg\evas_layer.obj
.\emulatorDbg\evas_main.obj
.\emulatorDbg\evas_name.obj
.\emulatorDbg\evas_object_gradient.obj
.\emulatorDbg\evas_object_image.obj
.\emulatorDbg\evas_object_line.obj
.\emulatorDbg\evas_object_main.obj
.\emulatorDbg\evas_object_polygon.obj
.\emulatorDbg\evas_object_rectangle.obj
.\emulatorDbg\evas_object_text.obj
.\emulatorDbg\evas_rectangle.obj
.\emulatorDbg\evas_render.obj
.\emulatorDbg\evas_stack.obj
.\emulatorDbg\evas_hash.obj
.\emulatorDbg\evas_list.obj
.\emulatorDbg\evas_object_list.obj
.\emulatorDbg\evas_blend_alpha_color_pixel.obj
.\emulatorDbg\evas_blend_color_pixel.obj
.\emulatorDbg\evas_blend_main.obj
.\emulatorDbg\evas_blend_pixel_cmod_pixel.obj
.\emulatorDbg\evas_blend_pixel_mul_pixel.obj
.\emulatorDbg\evas_blend_pixel_pixel.obj
.\emulatorDbg\evas_blit_main.obj
.\emulatorDbg\evas_convert_color.obj
.\emulatorDbg\evas_convert_gry_1.obj
.\emulatorDbg\evas_convert_gry_4.obj
.\emulatorDbg\evas_convert_gry_8.obj
.\emulatorDbg\evas_convert_main.obj
.\emulatorDbg\evas_convert_rgb_16.obj
.\emulatorDbg\evas_convert_rgb_24.obj
.\emulatorDbg\evas_convert_rgb_32.obj
.\emulatorDbg\evas_convert_rgb_8.obj
.\emulatorDbg\evas_cpu.obj
.\emulatorDbg\evas_draw_main.obj
.\emulatorDbg\evas_font_draw.obj
.\emulatorDbg\evas_font_load.obj
.\emulatorDbg\evas_font_main.obj
.\emulatorDbg\evas_font_query.obj
.\emulatorDbg\evas_gradient_main.obj
.\emulatorDbg\evas_image_load.obj
.\emulatorDbg\evas_image_main.obj
.\emulatorDbg\evas_line_main.obj
.\emulatorDbg\evas_polygon_main.obj
.\emulatorDbg\evas_rectangle_main.obj
.\emulatorDbg\evas_scale_main.obj
.\emulatorDbg\evas_scale_sample.obj
.\emulatorDbg\evas_scale_smooth.obj
.\emulatorDbg\evas_tiler.obj
.\emulatorDbg\evas_engine.obj
.\emulatorDbg\evas_outbuf.obj
.\emulatorDbg\evas_win32_buffer.obj
.\emulatorDbg\evas_win32_main.obj
.\emulatorDbg\evas_path.obj
"..\..\..\freetype-2.1.2\builds\win32\evisualc\emulatorDbg\freetype212.lib"
"..\..\..\jpeg-6b\wince\libjpeg\emulatorDbg\libjpeg.lib"
"..\..\..\libpng-1.2.4\projects\wince\emulatorDbg\lpngce.lib"
]
Creating command line "link.exe -lib @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP1E6.tmp"
<h3>Output Window</h3>
Compiling...
evas_callbacks.c
evas_clip.c
evas_data.c
evas_events.c
evas_layer.c
evas_main.c
evas_name.c
evas_object_gradient.c
evas_object_image.c
C:\Projects\mbed\evas\src\lib\canvas\evas_object_image.c(706) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_image.c(710) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_image.c(975) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_image.c(979) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
evas_object_line.c
evas_object_main.c
evas_object_polygon.c
evas_object_rectangle.c
evas_object_text.c
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(103) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(119) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(131) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(141) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(159) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(187) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(512) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(512) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(685) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(686) : warning C4244: 'function' : conversion from 'double ' to 'int ', possible loss of data
evas_rectangle.c
evas_render.c
evas_stack.c
evas_hash.c
evas_list.c
evas_object_list.c
Generating Code...
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(103) : warning C4761: integral size mismatch in argument; conversion supplied
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(119) : warning C4761: integral size mismatch in argument; conversion supplied
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(131) : warning C4761: integral size mismatch in argument; conversion supplied
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(141) : warning C4761: integral size mismatch in argument; conversion supplied
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(159) : warning C4761: integral size mismatch in argument; conversion supplied
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(187) : warning C4761: integral size mismatch in argument; conversion supplied
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(514) : warning C4761: integral size mismatch in argument; conversion supplied
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(514) : warning C4761: integral size mismatch in argument; conversion supplied
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(687) : warning C4761: integral size mismatch in argument; conversion supplied
C:\Projects\mbed\evas\src\lib\canvas\evas_object_text.c(687) : warning C4761: integral size mismatch in argument; conversion supplied
Compiling...
evas_blend_alpha_color_pixel.c
evas_blend_color_pixel.c
evas_blend_main.c
evas_blend_pixel_cmod_pixel.c
evas_blend_pixel_mul_pixel.c
evas_blend_pixel_pixel.c
evas_blit_main.c
evas_convert_color.c
evas_convert_gry_1.c
evas_convert_gry_4.c
evas_convert_gry_8.c
evas_convert_main.c
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(206) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(208) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(215) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(217) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(229) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(231) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(238) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(240) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(252) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(254) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(261) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(263) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(275) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(277) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(285) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(287) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(299) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(301) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(309) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(311) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(324) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(328) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(337) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_convert_main.c(341) : warning C4550: expression evaluates to a function which is missing an argument list
evas_convert_rgb_16.c
evas_convert_rgb_24.c
evas_convert_rgb_32.c
evas_convert_rgb_8.c
evas_cpu.c
evas_draw_main.c
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(498) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(512) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(520) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(541) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(545) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(561) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(573) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(581) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(600) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(604) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(620) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(624) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(631) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(635) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(638) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(654) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(666) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(674) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(686) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(690) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(705) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(717) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(721) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(752) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(772) : warning C4550: expression evaluates to a function which is missing an argument list
C:\Projects\mbed\evas\src\lib\engines\common\evas_draw_main.c(776) : warning C4550: expression evaluates to a function which is missing an argument list
evas_font_draw.c
evas_font_load.c
Generating Code...
Compiling...
evas_font_main.c
evas_font_query.c
evas_gradient_main.c
evas_image_load.c
..\..\..\jpeg-6b\jmorecfg.h(161) : warning C4142: benign redefinition of type
..\..\..\jpeg-6b\jmorecfg.h(215) : warning C4005: 'FAR' : macro redefinition
C:\Program Files\Windows CE Tools\wce400\STANDARDSDK\Include\emulator\windef.h(151) : see previous definition of 'FAR'
evas_image_main.c
evas_line_main.c
evas_polygon_main.c
C:\Projects\mbed\evas\src\lib\engines\common\evas_polygon_main.c(209) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\engines\common\evas_polygon_main.c(210) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\engines\common\evas_polygon_main.c(250) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Projects\mbed\evas\src\lib\engines\common\evas_polygon_main.c(252) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
evas_rectangle_main.c
evas_scale_main.c
evas_scale_sample.c
evas_scale_smooth.c
C:\Projects\mbed\evas\src\lib\engines\common\evas_scale_smooth_scaler.c(29) : warning C4101: 'divx' : unreferenced local variable
C:\Projects\mbed\evas\src\lib\engines\common\evas_scale_smooth_scaler.c(29) : warning C4101: 'divy' : unreferenced local variable
C:\Projects\mbed\evas\src\lib\engines\common\evas_scale_smooth_scaler.c(844) : warning C4101: 'dyy' : unreferenced local variable
evas_tiler.c
evas_engine.c
evas_outbuf.c
evas_win32_buffer.c
evas_win32_main.c
evas_path.c
Generating Code...
Creating library...
<h3>Results</h3>
evaslib.lib - 0 error(s), 83 warning(s)
</pre>
</body>
</html>

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
Microsoft eMbedded Visual Tools Workspace File, Format Version 4.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "evaslib"=.\evaslib.vcp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View File

@ -0,0 +1,76 @@
## Process this file with automake to produce Makefile.in
INCLUDES = \
-I. -I$(top_srcdir)/src/lib -I$(includedir) -I$(top_srcdir) \
@DIRECTFB_CFLAGS@ @qt_cflags@ @gl_cflags@
bin_PROGRAMS = \
@ENGINE_SOFTWARE_X11_PRG@ \
@ENGINE_DIRECTFB_PRG@ \
@ENGINE_FB_PRG@ \
@ENGINE_SOFTWARE_QTOPIA_PRG@ \
@ENGINE_GL_X11_PRG@
EXTRA_PROGRAMS = \
evas_software_x11_test \
evas_software_x11_perf_test \
evas_software_x11_perf_load \
evas_directfb_test \
evas_directfb_window \
evas_fb_test \
evas_software_qtopia_test \
evas_gl_x11_test
SUBDIRS = evas_software_win32
evas_software_x11_test_SOURCES = evas_test_main.h evas_test_main.c evas_software_x11_main.c
evas_software_x11_test_LDADD = $(top_builddir)/src/lib/libevas.la -lm @x_libs@
evas_software_x11_test_LDFLAGS = $(LDFLAGS)
evas_software_x11_test_CFLAGS = $(CFLAGS) @x_cflags@
evas_software_x11_test_DEPENDANCIES = $(top_builddir)/src/lib/libevas.la
evas_software_x11_perf_test_SOURCES = evas_software_x11_perf_test.c
evas_software_x11_perf_test_LDADD = $(top_builddir)/src/lib/libevas.la -lm @x_libs@
evas_software_x11_perf_test_LDFLAGS = $(LDFLAGS)
evas_software_x11_perf_test_CFLAGS = $(CFLAGS) @x_cflags@
evas_software_x11_perf_test_DEPENDANCIES = $(top_builddir)/src/lib/libevas.la
evas_software_x11_perf_load_SOURCES = evas_software_x11_perf_load.c
evas_software_x11_perf_load_LDADD = $(top_builddir)/src/lib/libevas.la -lm @x_libs@
evas_software_x11_perf_load_LDFLAGS = $(LDFLAGS)
evas_software_x11_perf_load_CFLAGS = $(CFLAGS) @x_cflags@
evas_software_x11_perf_load_DEPENDANCIES = $(top_builddir)/src/lib/libevas.la
evas_directfb_test_SOURCES = evas_test_main.h evas_test_main.c evas_directfb_main.c
evas_directfb_test_LDADD = $(top_builddir)/src/lib/libevas.la -lm @DIRECTFB_LIBS@
evas_directfb_test_LDFLAGS = $(LDFLAGS)
evas_directfb_test_CFLAGS = $(CFLAGS) @DIRECTFB_CFLAGS@
evas_directfb_test_DEPENDANCIES = $(top_builddir)/src/lib/libevas.la
evas_directfb_window_SOURCES = evas_test_main.h evas_test_main.c evas_directfb_window.c
evas_directfb_window_LDADD = $(top_builddir)/src/lib/libevas.la -lm @DIRECTFB_LIBS@
evas_directfb_window_LDFLAGS = $(LDFLAGS)
evas_directfb_window_CFLAGS = $(CFLAGS) @DIRECTFB_CFLAGS@
evas_directfb_window_DEPENDANCIES = $(top_builddir)/src/lib/libevas.la
evas_fb_test_SOURCES = evas_test_main.h evas_test_main.c evas_fb_main.c
evas_fb_test_LDADD = $(top_builddir)/src/lib/libevas.la -lm
evas_fb_test_LDFLAGS = $(LDFLAGS)
evas_fb_test_CFLAGS = $(CFLAGS)
evas_fb_test_DEPENDANCIES = $(top_builddir)/src/lib/libevas.la
moc_evas_software_qtopia_main.cpp: evas_software_qtopia_main.h
@qt_moc@ evas_software_qtopia_main.h -o moc_evas_software_qtopia_main.cpp
evas_software_qtopia_test_SOURCES = evas_test_main.h evas_test_main.c evas_software_qtopia_main.h evas_software_qtopia_main.cpp moc_evas_software_qtopia_main.cpp
evas_software_qtopia_test_LDADD = $(top_builddir)/src/lib/libevas.la -lm @qt_libs@
evas_software_qtopia_test_LDFLAGS = $(LDFLAGS)
evas_software_qtopia_test_CFLAGS = $(CFLAGS) @qt_cflags@
evas_software_qtopia_test_CXXFLAGS = $(CFLAGS) $(CXXFLAGS) @qt_cflags@
evas_software_qtopia_test_DEPENDANCIES = $(top_builddir)/src/lib/libevas.la
evas_gl_x11_test_SOURCES = evas_test_main.h evas_test_main.c evas_gl_x11_main.c
evas_gl_x11_test_LDADD = $(top_builddir)/src/lib/libevas.la -lm @x_libs@ @gl_libs@
evas_gl_x11_test_LDFLAGS = $(LDFLAGS)
evas_gl_x11_test_CFLAGS = $(CFLAGS) @x_cflags@ @gl_cflags@
evas_gl_x11_test_DEPENDANCIES = $(top_builddir)/src/lib/libevas.la

View File

@ -0,0 +1,132 @@
#include "evas_test_main.h"
#include <directfb.h>
#include "Evas.h"
#include "Evas_Engine_DirectFB.h"
/* macro for a safe call to DirectFB functions */
#define DFBCHECK(x...) \
{ \
err = x; \
if (err != DFB_OK) { \
fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
DirectFBErrorFatal( #x, err ); \
} \
}
int
main(int argc, char *argv[])
{
IDirectFB *dfb = NULL;
IDirectFBSurface *primary;
IDirectFBDisplayLayer *layer;
IDirectFBInputDevice *keyboard;
IDirectFBInputDevice *mouse;
IDirectFBEventBuffer *buffer;
DFBResult err;
DFBSurfaceDescription dsc;
DFBCardCapabilities caps;
DFBDisplayLayerConfig layer_config;
DFBInputEvent evt;
int quit = 0;
int paused = 0;
DFBCHECK(DirectFBInit(&argc, &argv));
/* create the super interface */
DFBCHECK(DirectFBCreate(&dfb));
dfb->SetCooperativeLevel(dfb, DFSCL_FULLSCREEN);
DFBCHECK(dfb->GetDisplayLayer(dfb, DLID_PRIMARY, &layer));
layer->GetConfiguration(layer, &layer_config);
/* get the primary surface, i.e. the surface of the primary layer we have
* exclusive access to */
memset(&dsc, 0, sizeof(DFBSurfaceDescription));
dsc.flags = DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT;
dsc.width = layer_config.width;
dsc.height = layer_config.height;
dsc.caps = DSCAPS_PRIMARY;
DFBCHECK(dfb->CreateSurface(dfb, &dsc, &primary));
DFBCHECK(dfb->GetInputDevice(dfb, DIDID_KEYBOARD, &keyboard));
DFBCHECK(dfb->GetInputDevice(dfb, DIDID_MOUSE, &mouse));
DFBCHECK(dfb->CreateEventBuffer(dfb, DICAPS_ALL, &buffer));
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("directfb"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_DirectFB *einfo;
einfo = (Evas_Engine_Info_DirectFB *) evas_engine_info_get(evas);
einfo->info.dfb = dfb;
einfo->info.surface = primary;
einfo->info.flags = DSDRAW_BLEND;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
setup();
start_time = get_time();
while (!quit)
{
while (buffer->GetEvent(buffer, DFB_EVENT(&evt)) == DFB_OK)
{
switch (evt.type)
{
case DIET_BUTTONPRESS:
switch (evt.button)
{
case DIBI_LEFT:
if (paused == 0)
paused = 1;
else if (paused == 1)
paused = 0;
break;
default:
break;
}
break;
case DIET_KEYPRESS:
switch (evt.key_symbol)
{
case DIKS_ESCAPE:
case DIKS_SMALL_Q:
case DIKS_CAPITAL_Q:
case DIKS_BACK:
case DIKS_STOP:
quit = 1;
break;
default:
break;
}
default:
break;
}
}
if (!paused)
{
loop();
evas_render(evas);
}
}
buffer->Release(buffer);
layer->Release(layer);
primary->Release(primary);
dfb->Release(dfb);
return 42;
}

View File

@ -0,0 +1,382 @@
/*
(c) Copyright 2000-2002 convergence integrated media GmbH.
All rights reserved.
Written by Denis Oliver Kropp <dok@directfb.org>,
Andreas Hundt <andi@fischlustig.de> and
Sven Neumann <neo@directfb.org>.
This file is subject to the terms and conditions of the MIT License:
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <time.h>
#include <directfb.h>
#include "config.h"
#include "Evas.h"
#include "Evas_Engine_DirectFB.h"
#include "evas_test_main.h"
/* macro for a safe call to DirectFB functions */
#define DFBCHECK(x...) \
{ \
err = x; \
if (err != DFB_OK) { \
fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
DirectFBErrorFatal( #x, err ); \
} \
}
static inline long myclock()
{
struct timeval tv;
gettimeofday (&tv, NULL);
return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
}
int main( int argc, char *argv[] )
{
IDirectFB *dfb;
IDirectFBDisplayLayer *layer;
IDirectFBSurface *bgsurface;
IDirectFBImageProvider *provider;
IDirectFBWindow *window1;
IDirectFBWindow *window2;
IDirectFBSurface *window_surface1;
IDirectFBSurface *window_surface2;
IDirectFBEventBuffer *buffer;
DFBDisplayLayerConfig layer_config;
DFBCardCapabilities caps;
IDirectFBWindow* upper;
DFBWindowID id1;
IDirectFBFont *font;
int fontheight;
int err;
int quit = 0;
DFBCHECK(DirectFBInit( &argc, &argv ));
DFBCHECK(DirectFBCreate( &dfb ));
dfb->GetCardCapabilities( dfb, &caps );
dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &layer );
if (!((caps.blitting_flags & DSBLIT_BLEND_ALPHACHANNEL) &&
(caps.blitting_flags & DSBLIT_BLEND_COLORALPHA )))
{
layer_config.flags = DLCONF_BUFFERMODE;
layer_config.buffermode = DLBM_BACKSYSTEM;
layer->SetConfiguration( layer, &layer_config );
}
layer->GetConfiguration( layer, &layer_config );
layer->EnableCursor ( layer, 1 );
{
DFBFontDescription desc;
desc.flags = DFDESC_HEIGHT;
desc.height = layer_config.width/50;
DFBCHECK(dfb->CreateFont( dfb, PACKAGE_DATA_DIR"/data/grunge.ttf", &desc, &font ));
font->GetHeight( font, &fontheight );
}
{
DFBSurfaceDescription desc;
DFBCHECK(dfb->CreateImageProvider( dfb,
PACKAGE_DATA_DIR"/data/bg.png",
&provider ));
desc.flags = DSDESC_WIDTH | DSDESC_HEIGHT;
desc.width = layer_config.width;
desc.height = layer_config.height;
DFBCHECK(dfb->CreateSurface( dfb, &desc, &bgsurface ) );
provider->RenderTo( provider, bgsurface, NULL );
provider->Release( provider );
DFBCHECK(bgsurface->SetFont( bgsurface, font ));
bgsurface->SetColor( bgsurface, 0xCF, 0xCF, 0xFF, 0xFF );
bgsurface->DrawString( bgsurface,
"Move the mouse over a window to activate it.",
-1, 10, 0, DSTF_LEFT | DSTF_TOP );
bgsurface->SetColor( bgsurface, 0xFF, 0xCF, 0xFF, 0xFF );
bgsurface->DrawString( bgsurface,
"You can drag them around, too, if you want.",
-1, 10 , 40, DSTF_LEFT | DSTF_TOP );
bgsurface->SetColor( bgsurface, 0xCF, 0xCF, 0xFF, 0xFF );
bgsurface->DrawString( bgsurface,
"The one with funky stuff happening and things flying around is an evas.",
-1, 10, 80, DSTF_LEFT | DSTF_TOP );
layer->SetBackgroundImage( layer, bgsurface );
layer->SetBackgroundMode( layer, DLBM_IMAGE );
}
{
DFBWindowDescription desc;
desc.flags = ( DWDESC_POSX | DWDESC_POSY |
DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS );
desc.posx = 20;
desc.posy = 120;
desc.width = 200;
desc.height = 200;
desc.caps = DWCAPS_ALPHACHANNEL;
DFBCHECK( layer->CreateWindow( layer, &desc, &window2 ) );
window2->GetSurface( window2, &window_surface2 );
window2->SetOpacity( window2, 0xFF );
window2->CreateEventBuffer( window2, &buffer );
{
window_surface2->SetColor( window_surface2,
0x00, 0x30, 0x10, 0xc0 );
window_surface2->DrawRectangle( window_surface2, 0, 0,
desc.width, desc.height );
window_surface2->SetColor( window_surface2,
0x80, 0xa0, 0x00, 0x90 );
window_surface2->FillRectangle( window_surface2, 1, 1,
desc.width-2, desc.height-2 );
DFBCHECK(window_surface2->SetFont(window_surface2, font ));
window_surface2->SetColor( window_surface2, 0xCF, 0xFF, 0xCF, 0xFF );
window_surface2->DrawString( window_surface2,
"Pants!",
-1,10, fontheight + 5, DSTF_LEFT | DSTF_TOP );
}
window_surface2->Flip( window_surface2, NULL, 0 );
}
{
DFBWindowDescription desc;
desc.flags = ( DWDESC_POSX | DWDESC_POSY |
DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS );
desc.posx = 200;
desc.posy = 200;
desc.width = 240;
desc.height = 320;
desc.caps = DWCAPS_ALPHACHANNEL;
DFBCHECK(layer->CreateWindow( layer, &desc, &window1 ) );
window1->GetSurface( window1, &window_surface1 );
window_surface1->SetColor( window_surface1, 0xFF, 0x20, 0x20, 0x90 );
window_surface1->DrawRectangle( window_surface1, 0, 0,
desc.width, desc.height );
window_surface1->Flip( window_surface1, NULL, 0 );
window1->SetOpacity( window1, 0xFF );
window1->GetID( window1, &id1 );
window1->AttachEventBuffer( window1, buffer );
}
window1->RequestFocus( window1 );
window1->RaiseToTop( window1 );
upper = window1;
{
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("directfb"));
evas_output_size_set(evas, 240, 320);
evas_output_viewport_set(evas, 0, 0, 240, 320);
{
Evas_Engine_Info_DirectFB *einfo;
einfo = (Evas_Engine_Info_DirectFB *) evas_engine_info_get(evas);
einfo->info.dfb = dfb;
einfo->info.surface = window_surface1;
einfo->info.flags = DSDRAW_BLEND;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
setup();
evas_render(evas);
start_time = get_time();
}
while (!quit) {
static IDirectFBWindow* active = NULL;
static int grabbed = 0;
static int startx = 0;
static int starty = 0;
static int endx = 0;
static int endy = 0;
DFBWindowEvent evt;
buffer->WaitForEventWithTimeout( buffer, 0, 10 );
while (buffer->GetEvent( buffer, DFB_EVENT(&evt) ) == DFB_OK) {
IDirectFBWindow* window;
if (evt.window_id == id1)
window = window1;
else
window = window2;
if (active) {
switch (evt.type) {
case DWET_BUTTONDOWN:
if (!grabbed && evt.button == DIBI_LEFT) {
grabbed = 1;
layer->GetCursorPosition( layer,
&startx, &starty );
window->GrabPointer( window );
}
break;
case DWET_BUTTONUP:
switch (evt.button) {
case DIBI_LEFT:
if (grabbed) {
window->UngrabPointer( window );
grabbed = 0;
}
break;
case DIBI_MIDDLE:
upper->LowerToBottom( upper );
upper = (upper == window1) ? window2 : window1;
break;
case DIBI_RIGHT:
quit = DIKS_DOWN;
break;
default:
break;
}
break;
case DWET_KEYDOWN:
if (grabbed)
break;
switch (evt.key_id) {
case DIKI_RIGHT:
active->Move (active, 1, 0);
break;
case DIKI_LEFT:
active->Move (active, -1, 0);
break;
case DIKI_UP:
active->Move (active, 0, -1);
break;
case DIKI_DOWN:
active->Move (active, 0, 1);
break;
default:
break;
}
break;
case DWET_LOSTFOCUS:
if (!grabbed)
active = NULL;
break;
default:
break;
}
}
else if (evt.type == DWET_GOTFOCUS)
active = window;
switch (evt.type) {
case DWET_MOTION:
endx = evt.cx;
endy = evt.cy;
break;
case DWET_KEYDOWN:
switch (evt.key_symbol) {
case DIKS_ESCAPE:
case DIKS_SMALL_Q:
case DIKS_CAPITAL_Q:
case DIKS_BACK:
case DIKS_STOP:
quit = 1;
break;
default:
break;
}
break;
default:
break;
}
}
if (active) {
if (grabbed) {
active->Move( active, endx - startx, endy - starty);
startx = endx;
starty = endy;
}
active->SetOpacity( active,
(sin( myclock()/300.0 ) * 85) + 170 );
}
loop();
evas_render(evas);
}
buffer->Release( buffer );
window_surface2->Release( window_surface2 );
window_surface1->Release( window_surface1 );
window2->Release( window2 );
window1->Release( window1 );
layer->Release( layer );
bgsurface->Release( bgsurface );
dfb->Release( dfb );
return 42;
}

View File

@ -0,0 +1,41 @@
#include "evas_test_main.h"
#include "Evas.h"
#include "Evas_Engine_FB.h"
#include <stdio.h>
#include <string.h>
int
main(int argc, char **argv)
{
int rot = 0;
if ((argc >= 3) && (!strcmp(argv[1], "-rot")))
rot = atoi(argv[2]);
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("fb"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_FB *einfo;
einfo = (Evas_Engine_Info_FB *) evas_engine_info_get(evas);
/* the following is specific to the engine */
einfo->info.virtual_terminal = 0;
einfo->info.device_number = 0;
einfo->info.refresh = 0;
einfo->info.rotation = rot;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
setup();
orig_start_time = start_time = get_time();
for (;;)
{
loop();
evas_render(evas);
}
return 0;
}

View File

@ -0,0 +1,140 @@
#include "evas_test_main.h"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glx.h>
#include "Evas.h"
#include "Evas_Engine_GL_X11.h"
int
main(int argc, char **argv)
{
int pause_me = 0;
Display *disp;
Window win;
XSetWindowAttributes attr;
XClassHint chint;
XSizeHints szhints;
disp = XOpenDisplay(NULL);
if (!disp)
{
printf("Error: cannot open display.\n");
exit(-1);
}
/* test evas_free.... :) */
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("gl_x11"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_GL_X11 *einfo;
einfo = (Evas_Engine_Info_GL_X11 *) evas_engine_info_get(evas);
/* the following is specific to the engine */
attr.backing_store = NotUseful;
attr.colormap = einfo->func.best_colormap_get(disp, DefaultScreen(disp));
attr.border_pixel = 0;
attr.background_pixmap = None;
attr.event_mask =
ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
StructureNotifyMask;
attr.bit_gravity = ForgetGravity;
win = XCreateWindow(disp, DefaultRootWindow(disp), 0, 0, win_w, win_h, 0,
einfo->func.best_depth_get(disp, DefaultScreen(disp)),
InputOutput,
einfo->func.best_visual_get(disp, DefaultScreen(disp)),
CWBackingStore | CWColormap |
CWBackPixmap | CWBorderPixel |
CWBitGravity | CWEventMask, &attr);
einfo->info.display = disp;
einfo->info.visual = einfo->func.best_visual_get(disp, DefaultScreen(disp));
einfo->info.colormap = einfo->func.best_colormap_get(disp, DefaultScreen(disp));
einfo->info.drawable = win;
einfo->info.depth = einfo->func.best_depth_get(disp, DefaultScreen(disp));
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
XStoreName(disp, win, "Evas GL X11 Test");
chint.res_name = "Evas_GL_X11_Test";
chint.res_class = "Main";
XSetClassHint(disp, win, &chint);
#if 0
szhints.flags = PMinSize | PMaxSize | PSize | USSize;
szhints.min_width = szhints.max_width = win_w;
szhints.min_height = szhints.max_height = win_h;
XSetWMNormalHints(disp, win, &szhints);
#endif
XMapWindow(disp, win);
XSync(disp, False);
setup();
orig_start_time = start_time = get_time();
for (;;)
{
XEvent ev;
while (XCheckMaskEvent(disp,
ExposureMask |
StructureNotifyMask |
KeyPressMask |
KeyReleaseMask |
ButtonPressMask |
ButtonReleaseMask | PointerMotionMask, &ev))
{
switch (ev.type)
{
case ButtonPress:
if (ev.xbutton.button == 3)
exit(0);
if (!pause_me)
pause_me = 1;
else if (pause_me == 1)
pause_me = 2;
else
pause_me = 1;
evas_event_feed_mouse_move(evas, ev.xbutton.x, ev.xbutton.y);
evas_event_feed_mouse_down(evas, ev.xbutton.button);
break;
case ButtonRelease:
evas_event_feed_mouse_move(evas, ev.xbutton.x, ev.xbutton.y);
evas_event_feed_mouse_up(evas, ev.xbutton.button);
break;
case MotionNotify:
evas_event_feed_mouse_move(evas, ev.xmotion.x, ev.xmotion.y);
break;
case Expose:
evas_damage_rectangle_add(evas,
ev.xexpose.x,
ev.xexpose.y,
ev.xexpose.width,
ev.xexpose.height);
break;
case ConfigureNotify:
evas_output_size_set(evas,
ev.xconfigure.width,
ev.xconfigure.height);
break;
default:
break;
}
}
if (!(pause_me == 1))
{
loop();
evas_render(evas);
XFlush(disp);
}
if (pause_me == 2)
usleep(100000);
}
return 0;
}

View File

@ -0,0 +1,65 @@
#ifndef EVAS_SOFTWARE_QTOPIA_MAIN_H
#define EVAS_SOFTWARE_QTOPIA_MAIN_H
#ifndef QT_QWS_EBX
#define QT_QWS_EBX
#endif
#ifndef QT_QWS_CUSTOM
#define QT_QWS_CUSTOM
#endif
#ifndef QWS
#define QWS
#endif
#include <unistd.h>
#include <qwidget.h>
#include <qmainwindow.h>
#include <qpe/qlibrary.h>
#include <qtimer.h>
#include <qwidget.h>
#include <qwidgetstack.h>
#include <qpainter.h>
#include <qdirectpainter_qws.h>
class EvasTargetWidget : public QWidget
{
Q_OBJECT
public:
EvasTargetWidget(QWidget *parent=NULL, const char *name=NULL);
QSizePolicy sizePolicy() const;
void enableFullscreen(void);
void disableFullscreen(void);
int fullscreen;
protected:
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void paintEvent(QPaintEvent *);
void resizeEvent(QResizeEvent *);
private slots:
void idleHandler(void);
private:
QTimer *idleTimer;
};
class EvasTestApp : public QMainWindow
{
Q_OBJECT
public:
EvasTestApp(QWidget *parent=0, const char *name=0, int wFlags=0);
~EvasTestApp();
QSizePolicy sizePolicy() const;
protected:
void resizeEvent(QResizeEvent *);
EvasTargetWidget *evas_target_widget;
};
#endif

View File

@ -0,0 +1,10 @@
EXTRA_DIST = \
ReadMe.txt \
StdAfx.cpp \
StdAfx.h \
evas_software_win32.cpp \
evas_software_win32.rc \
evas_software_win32.h \
newres.h \
resource.h

View File

@ -0,0 +1,59 @@
========================================================================
Windows CE APPLICATION : evas_software_win32
========================================================================
AppWizard has created this evas_software_win32 application for you.
This file contains a summary of what you will find in each of the files that
make up your evas_software_win32 application.
evas_software_win32.cpp
This is the main application source file.
evas_software_win32.h
This is the main header file for the application. It includes other
project specific headers (including Resource.h).
evas_software_win32.vcp
This file (the project file) contains information at the project level and
is used to build a single project or subproject. Other users can share the
project (.vcp) file, but they should export the makefiles locally.
/////////////////////////////////////////////////////////////////////////////
AppWizard has created the following resources:
evas_software_win32.rc
This is a listing of all of the Microsoft Windows CE resources that the
program uses. This file can be directly edited in Microsoft
eMbedded Visual C++.
evas_software_win32.ico
This is an icon file, which is used as the application's icon (32x32).
This icon is included by the main resource file evas_software_win32.rc.
/////////////////////////////////////////////////////////////////////////////
Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named evas_software_win32.pch and a precompiled types file named StdAfx.obj.
Resource.h
This is the standard header file, which defines new resource IDs.
Microsoft eMbedded Visual C++ reads and updates this file.
Newres.h
This header file is used to replace the ..\mfc\include\afxres.h.
/////////////////////////////////////////////////////////////////////////////
Other notes:
AppWizard uses "TODO:" to indicate parts of the source code you
should add to or customize.
/////////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,8 @@
// stdafx.cpp : source file that includes just the standard includes
// evas_software_win32.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

View File

@ -0,0 +1,25 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
// Local Header Files
// TODO: reference additional headers your program requires here
//{{AFX_INSERT_LOCATION}}
// Microsoft eMbedded Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)

View File

@ -0,0 +1,323 @@
// evas_software_win32.c : Defines the entry point for the application.
//
#include "stdafx.h"
#include "evas_software_win32.h"
#include <commctrl.h>
#include "Evas.h"
#include "evas_test_main.h"
#include "Evas_Engine_Software_win32_gdi.h"
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst; // The current instance
HWND hwndCB; // The command bar handle
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass (HINSTANCE, LPTSTR);
BOOL InitInstance (HINSTANCE, int);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HACCEL hAccelTable;
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_EVAS_SOFTWARE_WIN32);
setup();
orig_start_time = start_time = get_time();
// Main message loop:
for (;;)
{
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
if(msg.message == WM_QUIT)
return msg.wParam;
loop();
evas_render(evas);
}
return msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// It is important to call this function so that the application
// will get 'well formed' small icons associated with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_EVAS_SOFTWARE_WIN32));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;
return RegisterClass(&wc);
}
//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // The window class name
hInst = hInstance; // Store instance handle in our global variable
// Initialize global strings
LoadString(hInstance, IDC_EVAS_SOFTWARE_WIN32, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance, szWindowClass);
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE|WS_CAPTION|WS_SYSMENU,
0, 0, (int)win_w, (int)win_h+24, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// if (hwndCB)
// CommandBar_Show(hwndCB, TRUE);
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("software_win32_gdi"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_Software_Win32_GDI *einfo;
einfo = (Evas_Engine_Info_Software_Win32_GDI *)evas_engine_info_get(evas);
einfo->info.hwnd = hWnd;
einfo->info.rotation = 0;
{
HDC hdc;
int c;
hdc = GetDC(hWnd);
c = GetDeviceCaps(hdc,BITSPIXEL);
einfo->info.depth = c;
c = GetDeviceCaps(hdc,RASTERCAPS);
ReleaseDC(hWnd,hdc);
}
evas_engine_info_set(evas, (Evas_Engine_Info *)einfo);
}
return TRUE;
}
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
int wmId, wmEvent;
PAINTSTRUCT ps;
TCHAR szHello[MAX_LOADSTRING];
RECT rect;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_HELP_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_FILE_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
// hwndCB = CommandBar_Create(hInst, hWnd, 1);
// CommandBar_InsertMenubar(hwndCB, hInst, IDM_MENU, 0);
// CommandBar_AddAdornments(hwndCB, 0, 0);
break;
case WM_LBUTTONDOWN:
evas_event_feed_mouse_move(evas, LOWORD(lParam), HIWORD(lParam));
evas_event_feed_mouse_down(evas, 1);
break;
case WM_LBUTTONUP:
evas_event_feed_mouse_move(evas, LOWORD(lParam), HIWORD(lParam));
evas_event_feed_mouse_up(evas, 1);
break;
case WM_MOVE:
evas_event_feed_mouse_move(evas, LOWORD(lParam), HIWORD(lParam));
break;
case WM_SIZE:
evas_output_size_set(evas, LOWORD(lParam), HIWORD(lParam));
break;
/*
case WM_ERASEBKGND:
// Get window coordinates, and normalize.
GetWindowRect(hWnd, &rect);
rect.right = rect.right - rect.left; // Get width.
rect.bottom = rect.bottom - rect.top; // Get height.
rect.left = rect.top = 0;
evas_damage_rectangle_add(evas,
rect.left,
rect.top,
rect.right,
rect.bottom);
return 1;
break;
*/
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
rect.right = ps.rcPaint.right - ps.rcPaint.left; // Get width.
rect.bottom = ps.rcPaint.bottom - ps.rcPaint.top; // Get height.
rect.left = ps.rcPaint.left;
rect.top = ps.rcPaint.top;
ps.fErase = TRUE;
evas_damage_rectangle_add(evas,
rect.left,
rect.top,
rect.right,
rect.bottom);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
CommandBar_Destroy(hwndCB);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Mesage handler for the About box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
RECT rt, rt1;
int DlgWidth, DlgHeight; // dialog width and height in pixel units
int NewPosX, NewPosY;
switch (message)
{
case WM_INITDIALOG:
// trying to center the About dialog
if (GetWindowRect(hDlg, &rt1)) {
GetClientRect(GetParent(hDlg), &rt);
DlgWidth = rt1.right - rt1.left;
DlgHeight = rt1.bottom - rt1.top ;
NewPosX = (rt.right - rt.left - DlgWidth)/2;
NewPosY = (rt.bottom - rt.top - DlgHeight)/2;
// if the About box is larger than the physical screen
if (NewPosX < 0) NewPosX = 0;
if (NewPosY < 0) NewPosY = 0;
SetWindowPos(hDlg, 0, NewPosX, NewPosY,
0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
return TRUE;
case WM_COMMAND:
if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}

View File

@ -0,0 +1,12 @@
#if !defined(AFX_EVAS_SOFTWARE_WIN32_H__16C4A65E_CA5A_452B_930E_842EC94AF401__INCLUDED_)
#define AFX_EVAS_SOFTWARE_WIN32_H__16C4A65E_CA5A_452B_930E_842EC94AF401__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "resource.h"
#endif // !defined(AFX_EVAS_SOFTWARE_WIN32_H__16C4A65E_CA5A_452B_930E_842EC94AF401__INCLUDED_)

View File

@ -0,0 +1,152 @@
//Microsoft eMbedded Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "newres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_EVAS_SOFTWARE_WIN32 ICON DISCARDABLE "evas_software_win32.ICO"
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""newres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDM_MENU MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
MENUITEM "E&xit", IDM_FILE_EXIT
END
POPUP "&Help"
BEGIN
MENUITEM "&About", IDM_HELP_ABOUT
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 125, 55
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE 0x80000000L
CAPTION "About evas_software_win32"
FONT 8, "System"
BEGIN
ICON IDI_EVAS_SOFTWARE_WIN32,IDC_STATIC,11,17,20,20
LTEXT "evas_software_win32 Version 1.0",IDC_STATIC,38,10,70,8,
SS_NOPREFIX
LTEXT "Copyright (C) 2002",IDC_STATIC,38,25,70,8
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 118
TOPMARGIN, 7
BOTTOMMARGIN, 48
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//
IDC_EVAS_SOFTWARE_WIN32 ACCELERATORS DISCARDABLE
BEGIN
"/", IDM_HELP_ABOUT, ASCII, ALT, NOINVERT
VK_F4, IDM_FILE_EXIT, VIRTKEY, ALT, NOINVERT
END
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE DISCARDABLE
BEGIN
IDS_APP_TITLE "WinCE EVAS Test"
IDS_HELLO "Hello World!"
IDC_EVAS_SOFTWARE_WIN32 "EVAS_SOFTWARE_WIN32"
END
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@ -0,0 +1,39 @@
#ifndef __NEWRES_H__
#define __NEWRES_H__
#if !defined(UNDER_CE)
#define UNDER_CE _WIN32_WCE
#endif
#if defined(_WIN32_WCE)
#if !defined(WCEOLE_ENABLE_DIALOGEX)
#define DIALOGEX DIALOG DISCARDABLE
#endif
#include <commctrl.h>
#define SHMENUBAR RCDATA
#if defined(WIN32_PLATFORM_PSPC) && (_WIN32_WCE >= 300)
#include <aygshell.h>
#else
#define I_IMAGENONE (-2)
#define NOMENU 0xFFFF
#define IDS_SHNEW 1
#define IDM_SHAREDNEW 10
#define IDM_SHAREDNEWDEFAULT 11
#endif
#endif // _WIN32_WCE
#ifdef RC_INVOKED
#ifndef _INC_WINDOWS
#define _INC_WINDOWS
#include "winuser.h" // extract from windows header
#endif
#endif
#ifdef IDC_STATIC
#undef IDC_STATIC
#endif
#define IDC_STATIC (-1)
#endif //__NEWRES_H__

View File

@ -0,0 +1,23 @@
//{{NO_DEPENDENCIES}}
// Microsoft eMbedded Visual C++ generated include file.
// Used by EVAS_SOFTWARE_WIN32.RC
//
#define IDS_APP_TITLE 1
#define IDS_HELLO 2
#define IDC_EVAS_SOFTWARE_WIN32 3
#define IDI_EVAS_SOFTWARE_WIN32 101
#define IDM_MENU 102
#define IDD_ABOUTBOX 103
#define IDM_FILE_EXIT 40002
#define IDM_HELP_ABOUT 40003
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 104
#define _APS_NEXT_COMMAND_VALUE 40004
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@ -0,0 +1,229 @@
#include "evas_test_main.h"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "Evas.h"
#include "Evas_Engine_Software_X11.h"
int
main(int argc, char **argv)
{
int pause_me = 0;
Display *disp;
Window win;
XSetWindowAttributes attr;
XClassHint chint;
XSizeHints szhints;
disp = XOpenDisplay(NULL);
if (!disp)
{
printf("Error: cannot open display.\n");
exit(-1);
}
attr.backing_store = NotUseful;
attr.colormap = DefaultColormap(disp, DefaultScreen(disp));
attr.border_pixel = 0;
attr.background_pixmap = None;
attr.event_mask =
ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
StructureNotifyMask;
attr.bit_gravity = ForgetGravity;
win = XCreateWindow(disp, DefaultRootWindow(disp), 0, 0, win_w, win_h, 0,
DefaultDepth(disp, DefaultScreen(disp)), InputOutput,
DefaultVisual(disp, DefaultScreen(disp)),
CWBackingStore | CWColormap |
CWBackPixmap | CWBorderPixel |
CWBitGravity | CWEventMask, &attr);
XStoreName(disp, win, "Evas Software X11 Test");
chint.res_name = "Evas_Software_X11_Test";
chint.res_class = "Main";
XSetClassHint(disp, win, &chint);
#if 0
szhints.flags = PMinSize | PMaxSize | PSize | USSize;
szhints.min_width = szhints.max_width = win_w;
szhints.min_height = szhints.max_height = win_h;
XSetWMNormalHints(disp, win, &szhints);
#endif
XMapWindow(disp, win);
XSync(disp, False);
/* test evas_free.... :) */
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_Software_X11 *einfo;
einfo = (Evas_Engine_Info_Software_X11 *) evas_engine_info_get(evas);
/* the following is specific to the engine */
einfo->info.display = disp;
einfo->info.visual = DefaultVisual(disp, DefaultScreen(disp));
einfo->info.colormap = DefaultColormap(disp, DefaultScreen(disp));
einfo->info.drawable = win;
einfo->info.depth = DefaultDepth(disp, DefaultScreen(disp));
einfo->info.rotation = 0;
einfo->info.debug = 0;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
setup();
printf("################ evas free\n");
evas_free(evas);
printf("evas freed. DONE\n");
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_Software_X11 *einfo;
einfo = (Evas_Engine_Info_Software_X11 *) evas_engine_info_get(evas);
/* the following is specific to the engine */
einfo->info.display = disp;
einfo->info.visual = DefaultVisual(disp, DefaultScreen(disp));
einfo->info.colormap = DefaultColormap(disp, DefaultScreen(disp));
einfo->info.drawable = win;
einfo->info.depth = DefaultDepth(disp, DefaultScreen(disp));
einfo->info.rotation = 0;
einfo->info.debug = 0;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
setup();
printf("################ evas free\n");
evas_free(evas);
printf("evas freed. DONE\n");
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_Software_X11 *einfo;
einfo = (Evas_Engine_Info_Software_X11 *) evas_engine_info_get(evas);
/* the following is specific to the engine */
einfo->info.display = disp;
einfo->info.visual = DefaultVisual(disp, DefaultScreen(disp));
einfo->info.colormap = DefaultColormap(disp, DefaultScreen(disp));
einfo->info.drawable = win;
einfo->info.depth = DefaultDepth(disp, DefaultScreen(disp));
einfo->info.rotation = 0;
einfo->info.debug = 0;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
setup();
printf("################ evas free\n");
evas_free(evas);
printf("evas freed. DONE\n");
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_Software_X11 *einfo;
einfo = (Evas_Engine_Info_Software_X11 *) evas_engine_info_get(evas);
/* the following is specific to the engine */
einfo->info.display = disp;
einfo->info.visual = DefaultVisual(disp, DefaultScreen(disp));
einfo->info.colormap = DefaultColormap(disp, DefaultScreen(disp));
einfo->info.drawable = win;
einfo->info.depth = DefaultDepth(disp, DefaultScreen(disp));
einfo->info.rotation = 0;
einfo->info.debug = 0;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
setup();
printf("################ evas free\n");
evas_free(evas);
printf("evas freed. DONE\n");
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_Software_X11 *einfo;
einfo = (Evas_Engine_Info_Software_X11 *) evas_engine_info_get(evas);
/* the following is specific to the engine */
einfo->info.display = disp;
einfo->info.visual = DefaultVisual(disp, DefaultScreen(disp));
einfo->info.colormap = DefaultColormap(disp, DefaultScreen(disp));
einfo->info.drawable = win;
einfo->info.depth = DefaultDepth(disp, DefaultScreen(disp));
einfo->info.rotation = 0;
einfo->info.debug = 0;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
setup();
orig_start_time = start_time = get_time();
for (;;)
{
XEvent ev;
while (XCheckMaskEvent(disp,
ExposureMask |
StructureNotifyMask |
KeyPressMask |
KeyReleaseMask |
ButtonPressMask |
ButtonReleaseMask | PointerMotionMask, &ev))
{
switch (ev.type)
{
case ButtonPress:
if (ev.xbutton.button == 3)
exit(0);
if (!pause_me)
pause_me = 1;
else if (pause_me == 1)
pause_me = 2;
else
pause_me = 1;
evas_event_feed_mouse_move(evas, ev.xbutton.x, ev.xbutton.y);
evas_event_feed_mouse_down(evas, ev.xbutton.button);
break;
case ButtonRelease:
evas_event_feed_mouse_move(evas, ev.xbutton.x, ev.xbutton.y);
evas_event_feed_mouse_up(evas, ev.xbutton.button);
break;
case MotionNotify:
evas_event_feed_mouse_move(evas, ev.xmotion.x, ev.xmotion.y);
break;
case Expose:
evas_damage_rectangle_add(evas,
ev.xexpose.x,
ev.xexpose.y,
ev.xexpose.width,
ev.xexpose.height);
break;
case ConfigureNotify:
evas_output_size_set(evas,
ev.xconfigure.width,
ev.xconfigure.height);
break;
default:
break;
}
}
if (!(pause_me == 1))
{
loop();
evas_render(evas);
XFlush(disp);
}
if (pause_me == 2)
usleep(100000);
}
return 0;
}

View File

@ -0,0 +1,181 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "Evas.h"
#include "Evas_Engine_Software_X11.h"
Display *disp = NULL;
Window win = 0;
Evas *evas = NULL;
int win_w = 240;
int win_h = 240;
int
main(int argc, char **argv)
{
int exposed = 0;
XSetWindowAttributes attr;
XClassHint chint;
XSizeHints szhints;
disp = XOpenDisplay(NULL);
if (!disp)
{
printf("Error: cannot open display.\n");
exit(-1);
}
attr.backing_store = NotUseful;
attr.colormap = DefaultColormap(disp, DefaultScreen(disp));
attr.border_pixel = 0;
attr.background_pixmap = None;
attr.event_mask =
ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask;
attr.bit_gravity = ForgetGravity;
win = XCreateWindow(disp, DefaultRootWindow(disp), 0, 0, win_w, win_h, 0,
DefaultDepth(disp, DefaultScreen(disp)), InputOutput,
DefaultVisual(disp, DefaultScreen(disp)),
CWBackingStore | CWColormap |
CWBackPixmap | CWBorderPixel |
CWBitGravity | CWEventMask, &attr);
XStoreName(disp, win, "Evas Performance Test");
chint.res_name = "Evas_Test";
chint.res_class = "Main";
XSetClassHint(disp, win, &chint);
szhints.flags = PMinSize | PMaxSize | PSize | USSize;
szhints.max_width = win_w;
szhints.max_height = win_h;
szhints.min_width = win_w;
szhints.min_height = win_h;
XSetWMNormalHints(disp, win, &szhints);
XMapWindow(disp, win);
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_Software_X11 *einfo;
einfo = (Evas_Engine_Info_Software_X11 *) evas_engine_info_get(evas);
/* the following is specific to the engine */
einfo->info.display = disp;
einfo->info.visual = DefaultVisual(disp, DefaultScreen(disp));
einfo->info.colormap = DefaultColormap(disp, DefaultScreen(disp));
einfo->info.drawable = win;
einfo->info.depth = DefaultDepth(disp, DefaultScreen(disp));
einfo->info.rotation = 0;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
for (;;)
{
XEvent ev;
while (XCheckMaskEvent(disp,
ExposureMask |
StructureNotifyMask |
KeyPressMask |
KeyReleaseMask |
ButtonPressMask |
ButtonReleaseMask | PointerMotionMask, &ev))
{
switch (ev.type)
{
case ButtonPress:
/* evas_event_button_down(evas, ev.xbutton.x, ev.xbutton.y, ev.xbutton.button);*/
break;
case ButtonRelease:
/* evas_event_button_up(evas, ev.xbutton.x, ev.xbutton.y, ev.xbutton.button);*/
break;
case MotionNotify:
/* evas_event_move(evas, ev.xmotion.x, ev.xmotion.y);*/
break;
case Expose:
exposed = 1;
evas_damage_rectangle_add(evas,
ev.xexpose.x,
ev.xexpose.y,
ev.xexpose.width,
ev.xexpose.height);
break;
default:
break;
}
}
evas_render(evas);
XFlush(disp);
if (exposed)
{
Evas_Engine_Info_Software_X11 *einfo;
Evas_Performance *perf;
char buf[4096];
char *data, *key;
static mode_t default_mode =
S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH |
S_IXOTH;
FILE *f;
data = NULL;
einfo =
(Evas_Engine_Info_Software_X11 *) evas_engine_info_get(evas);
perf =
einfo->func.performance_new(evas, disp,
DefaultVisual(disp,
DefaultScreen(disp)),
DefaultColormap(disp,
DefaultScreen
(disp)), win,
DefaultDepth(disp,
DefaultScreen(disp)));
key = einfo->func.performance_key_get(perf);
snprintf(buf, sizeof(buf), "%s/.evas/%s", getenv("HOME"), key);
free(key);
f = fopen(buf, "r");
if (f)
{
char buf[4096];
size_t sz;
sz = fread(buf, 1, 4000, f);
if (sz > 0)
{
data = malloc(sz + 1);
if (data)
{
strncpy(data, buf, sz);
data[sz] = 0;
}
}
fclose(f);
}
if (data)
{
einfo->func.performance_build(perf, data);
einfo->func.performance_device_store(perf);
free(data);
}
else
{
printf("No cached performance values for your display.\n");
printf("Please run evas_perf_test to generate them.\n");
einfo->func.performance_free(perf);
exit(-1);
}
einfo->func.performance_free(perf);
exit(0);
}
}
return 0;
}

View File

@ -0,0 +1,162 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "Evas.h"
#include "Evas_Engine_Software_X11.h"
Display *disp = NULL;
Window win = 0;
Evas *evas = NULL;
int win_w = 240;
int win_h = 240;
int
main(int argc, char **argv)
{
int exposed = 0;
XSetWindowAttributes attr;
XClassHint chint;
XSizeHints szhints;
disp = XOpenDisplay(NULL);
if (!disp)
{
printf("Error: cannot open display.\n");
exit(-1);
}
attr.backing_store = NotUseful;
attr.colormap = DefaultColormap(disp, DefaultScreen(disp));
attr.border_pixel = 0;
attr.background_pixmap = None;
attr.event_mask =
ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask;
attr.bit_gravity = ForgetGravity;
win = XCreateWindow(disp, DefaultRootWindow(disp), 0, 0, win_w, win_h, 0,
DefaultDepth(disp, DefaultScreen(disp)), InputOutput,
DefaultVisual(disp, DefaultScreen(disp)),
CWBackingStore | CWColormap |
CWBackPixmap | CWBorderPixel |
CWBitGravity | CWEventMask, &attr);
XStoreName(disp, win, "Evas Performance Test");
chint.res_name = "Evas_Test";
chint.res_class = "Main";
XSetClassHint(disp, win, &chint);
szhints.flags = PMinSize | PMaxSize | PSize | USSize;
szhints.max_width = win_w;
szhints.max_height = win_h;
szhints.min_width = win_w;
szhints.min_height = win_h;
XSetWMNormalHints(disp, win, &szhints);
XMapWindow(disp, win);
XSync(disp, False);
sleep(1);
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_Software_X11 *einfo;
einfo = (Evas_Engine_Info_Software_X11 *) evas_engine_info_get(evas);
/* the following is specific to the engine */
einfo->info.display = disp;
einfo->info.visual = DefaultVisual(disp, DefaultScreen(disp));
einfo->info.colormap = DefaultColormap(disp, DefaultScreen(disp));
einfo->info.drawable = win;
einfo->info.depth = DefaultDepth(disp, DefaultScreen(disp));
einfo->info.rotation = 0;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
for (;;)
{
XEvent ev;
while (XCheckMaskEvent(disp,
ExposureMask |
StructureNotifyMask |
KeyPressMask |
KeyReleaseMask |
ButtonPressMask |
ButtonReleaseMask | PointerMotionMask, &ev))
{
switch (ev.type)
{
case ButtonPress:
/* evas_event_button_down(evas, ev.xbutton.x, ev.xbutton.y, ev.xbutton.button);*/
break;
case ButtonRelease:
/* evas_event_button_up(evas, ev.xbutton.x, ev.xbutton.y, ev.xbutton.button);*/
break;
case MotionNotify:
/* evas_event_move(evas, ev.xmotion.x, ev.xmotion.y);*/
break;
case Expose:
exposed = 1;
evas_damage_rectangle_add(evas,
ev.xexpose.x,
ev.xexpose.y,
ev.xexpose.width,
ev.xexpose.height);
break;
default:
break;
}
}
evas_render(evas);
XFlush(disp);
if (exposed)
{
Evas_Engine_Info_Software_X11 *einfo;
Evas_Performance *perf;
char buf[4096];
char *data, *key;
static mode_t default_mode =
S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH |
S_IXOTH;
FILE *f;
einfo =
(Evas_Engine_Info_Software_X11 *) evas_engine_info_get(evas);
perf =
einfo->func.performance_test(evas, disp,
DefaultVisual(disp,
DefaultScreen(disp)),
DefaultColormap(disp,
DefaultScreen
(disp)), win,
DefaultDepth(disp,
DefaultScreen(disp)));
einfo->func.performance_device_store(perf);
data = einfo->func.performance_data_get(perf);
key = einfo->func.performance_key_get(perf);
snprintf(buf, sizeof(buf), "%s/.evas", getenv("HOME"));
mkdir(buf, default_mode);
snprintf(buf, sizeof(buf), "%s/.evas/%s", getenv("HOME"), key);
free(key);
f = fopen(buf, "w");
if (f)
{
fprintf(f, "%s", data);
free(data);
fclose(f);
}
einfo->func.performance_free(perf);
exit(0);
}
}
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,43 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#ifndef _WIN32_WCE
# include <sys/time.h>
#else
# include <time.h>
# include <windows.h>
#endif
#include "Evas.h"
//_WIN32_WCE
#ifdef __cplusplus
extern "C" {
#endif
/*****************************************************************************/
extern Evas *evas;
extern int win_w;
extern int win_h;
extern int loop_count;
extern int orig_loop_count;
extern double start_time;
extern double orig_start_time;
extern Evas_Object *r1, *r2, *r3, *g1, *g2, *c1, *l1, *p1;
/*****************************************************************************/
double get_time(void);
void loop(void);
void setup(void);
#ifdef __cplusplus
}
#endif

449
legacy/evas/src/lib/Evas.h Normal file
View File

@ -0,0 +1,449 @@
#ifndef _EVAS_H
#define _EVAS_H
#ifndef EVAS_COMMON_H
#ifndef EVAS_PRIVATE_H
enum _Evas_Callback_Type
{
EVAS_CALLBACK_MOUSE_IN, /**< Mouse In Event */
EVAS_CALLBACK_MOUSE_OUT, /**< Mouse Out Event */
EVAS_CALLBACK_MOUSE_DOWN, /**< Mouse Button Down Event */
EVAS_CALLBACK_MOUSE_UP, /**< Mouse Button Up Event */
EVAS_CALLBACK_MOUSE_MOVE, /**< Mouse Move Event */
EVAS_CALLBACK_FREE, /**< Object Being Freed */
EVAS_CALLBACK_KEY_DOWN, /**< Key Press Event */
EVAS_CALLBACK_KEY_UP, /**< Key Release Event */
EVAS_CALLBACK_FOCUS_IN, /**< Focus In Event */
EVAS_CALLBACK_FOCUS_OUT /**< Focus Out Event */
};
/**
* The type of event to trigger the callback
*/
typedef enum _Evas_Callback_Type Evas_Callback_Type;
/**
* A generic linked list node handle
*/
typedef struct _Evas_List Evas_List;
/**
* A generic rectangle handle
*/
typedef struct _Evas_Rectangle Evas_Rectangle;
struct _Evas_List
{
void *data; /**< Pointer to list element payload */
Evas_List *next; /**< Next member in the list */
Evas_List *prev; /**< Previous member in the list */
Evas_List *last; /**< Private member. Don't use this */
int count; /**< Private member. Don't use this */
};
struct _Evas_Rectangle
{
int x, y, w, h; /**< the co-ordinates of the rectangle, starting top-left and width and height */
};
/** A Hash table handle */
typedef void Evas_Hash;
/** An Evas canvas handle */
typedef void Evas;
/** An Evas Object handle */
typedef void Evas_Object;
/** An Evas Performance handle */
typedef void Evas_Performance;
/** An Evas Key */
typedef void Evas_Key;
/** An Evas Modifier */
typedef void Evas_Modifier;
/** An Evas Lock */
typedef void Evas_Lock;
/** An Evas Smart Object handle */
typedef void Evas_Smart;
#endif
#endif
/** A generic Evas Engine information structure */
typedef struct _Evas_Engine_Info Evas_Engine_Info;
/** Event structure for #EVAS_CALLBACK_MOUSE_DOWN event callbacks */
typedef struct _Evas_Event_Mouse_Down Evas_Event_Mouse_Down;
/** Event structure for #EVAS_CALLBACK_MOUSE_UP event callbacks */
typedef struct _Evas_Event_Mouse_Up Evas_Event_Mouse_Up;
/** Event structure for #EVAS_CALLBACK_MOUSE_IN event callbacks */
typedef struct _Evas_Event_Mouse_In Evas_Event_Mouse_In;
/** Event structure for #EVAS_CALLBACK_MOUSE_OUT event callbacks */
typedef struct _Evas_Event_Mouse_Out Evas_Event_Mouse_Out;
/** Event structure for #EVAS_CALLBACK_MOUSE_MOVE event callbacks */
typedef struct _Evas_Event_Mouse_Move Evas_Event_Mouse_Move;
/** Event structure for #EVAS_CALLBACK_KEY_DOWN event callbacks */
typedef struct _Evas_Event_Key_Down Evas_Event_Key_Down;
/** Event structure for #EVAS_CALLBACK_KEY_UP event callbacks */
typedef struct _Evas_Event_Key_Up Evas_Event_Key_Up;
#define EVAS_LOAD_ERROR_NONE 0
#define EVAS_LOAD_ERROR_GENERIC 1
#define EVAS_LOAD_ERROR_DOES_NOT_EXIST 2
#define EVAS_LOAD_ERROR_PERMISSION_DENIED 3
#define EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED 4
#define EVAS_LOAD_ERROR_CORRUPT_FILE 5
#define EVAS_LOAD_ERROR_UNKNOWN_FORMAT 6
struct _Evas_Engine_Info
{
int magic;
};
struct _Evas_Event_Mouse_Down
{
int button;
struct {
int x, y;
} output;
struct {
double x, y;
} canvas;
void *data;
Evas_Modifier *modifiers;
Evas_Lock *locks;
};
struct _Evas_Event_Mouse_Up
{
int button;
struct {
int x, y;
} output;
struct {
double x, y;
} canvas;
void *data;
Evas_Modifier *modifiers;
Evas_Lock *locks;
};
struct _Evas_Event_Mouse_In
{
int buttons;
struct {
int x, y;
} output;
struct {
double x, y;
} canvas;
void *data;
Evas_Modifier *modifiers;
Evas_Lock *locks;
};
struct _Evas_Event_Mouse_Out
{
int buttons;
struct {
int x, y;
} output;
struct {
double x, y;
} canvas;
void *data;
Evas_Modifier *modifiers;
Evas_Lock *locks;
};
struct _Evas_Event_Mouse_Move
{
int buttons;
struct {
struct {
int x, y;
} output;
struct {
double x, y;
} canvas;
} cur, prev;
void *data;
Evas_Modifier *modifiers;
Evas_Lock *locks;
};
struct _Evas_Event_Key_Down
{
Evas_Key *key;
void *data;
Evas_Modifier *modifiers;
Evas_Lock *locks;
};
struct _Evas_Event_Key_Up
{
Evas_Key *key;
void *data;
Evas_Modifier *modifiers;
Evas_Lock *locks;
};
#ifdef __cplusplus
extern "C" {
#endif
Evas_List *evas_list_append (Evas_List *list, void *data);
Evas_List *evas_list_prepend (Evas_List *list, void *data);
Evas_List *evas_list_append_relative (Evas_List *list, void *data, void *relative);
Evas_List *evas_list_prepend_relative (Evas_List *list, void *data, void *relative);
Evas_List *evas_list_remove (Evas_List *list, void *data);
Evas_List *evas_list_remove_list (Evas_List *list, Evas_List *remove_list);
void *evas_list_find (Evas_List *list, void *data);
Evas_List *evas_list_free (Evas_List *list);
Evas_List *evas_list_last (Evas_List *list);
Evas_List *evas_list_next (Evas_List *list);
Evas_List *evas_list_prev (Evas_List *list);
void *evas_list_data (Evas_List *list);
int evas_list_count (Evas_List *list);
void *evas_list_nth (Evas_List *list, int n);
Evas_List *evas_list_reverse (Evas_List *list);
/* FIXME: add:
* api to add find, del members by data, size not just string and also
* provide hash generation functions settable by the app
*
* do we really need this? hmmm - let me think... there may be a better way
*/
Evas_Hash *evas_hash_add (Evas_Hash *hash, const char *key, void *data);
Evas_Hash *evas_hash_del (Evas_Hash *hash, const char *key, void *data);
void *evas_hash_find (Evas_Hash *hash, const char *key);
int evas_hash_size (Evas_Hash *hash);
void evas_hash_free (Evas_Hash *hash);
void evas_hash_foreach (Evas_Hash *hash, int (*func) (Evas_Hash *hash, const char *key, void *data, void *fdata), void *fdata);
Evas *evas_new (void);
void evas_free (Evas *e);
int evas_render_method_lookup (const char *name);
Evas_List *evas_render_method_list (void);
void evas_render_method_list_free (Evas_List *list);
void evas_output_method_set (Evas *e, int render_method);
int evas_output_method_get (Evas *e);
Evas_Engine_Info *evas_engine_info_get (Evas *e);
void evas_engine_info_set (Evas *e, Evas_Engine_Info *info);
void evas_output_size_set (Evas *e, int w, int h);
void evas_output_size_get (Evas *e, int *w, int *h);
void evas_output_viewport_set (Evas *e, double x, double y, double w, double h);
void evas_output_viewport_get (Evas *e, double *x, double *y, double *w, double *h);
double evas_coord_screen_x_to_world (Evas *e, int x);
double evas_coord_screen_y_to_world (Evas *e, int y);
int evas_coord_world_x_to_screen (Evas *e, double x);
int evas_coord_world_y_to_screen (Evas *e, double y);
void evas_damage_rectangle_add (Evas *e, int x, int y, int w, int h);
void evas_obscured_rectangle_add (Evas *e, int x, int y, int w, int h);
void evas_obscured_clear (Evas *e);
Evas_List *evas_render_updates (Evas *e);
void evas_render_updates_free (Evas_List *updates);
void evas_render (Evas *e);
Evas_Object *evas_object_rectangle_add (Evas *e);
Evas_Object *evas_object_line_add (Evas *e);
void evas_object_line_xy_set (Evas_Object *obj, double x1, double y1, double x2, double y2);
void evas_object_line_xy_get (Evas_Object *obj, double *x1, double *y1, double *x2, double *y2);
Evas_Object *evas_object_gradient_add (Evas *e);
void evas_object_gradient_color_add (Evas_Object *obj, int r, int g, int b, int a, int distance);
void evas_object_gradient_colors_clear (Evas_Object *obj);
void evas_object_gradient_angle_set (Evas_Object *obj, double angle);
double evas_object_gradient_angle_get (Evas_Object *obj);
Evas_Object *evas_object_polygon_add (Evas *e);
void evas_object_polygon_point_add (Evas_Object *obj, double x, double y);
void evas_object_polygon_points_clear (Evas_Object *obj);
Evas_Object *evas_object_image_add (Evas *e);
void evas_object_image_file_set (Evas_Object *obj, char *file, char *key);
void evas_object_image_file_get (Evas_Object *obj, char **file, char **key);
void evas_object_image_border_set (Evas_Object *obj, int l, int r, int t, int b);
void evas_object_image_border_get (Evas_Object *obj, int *l, int *r, int *t, int *b);
void evas_object_image_fill_set (Evas_Object *obj, double x, double y, double w, double h);
void evas_object_image_fill_get (Evas_Object *obj, double *x, double *y, double *w, double *h);
void evas_object_image_size_set (Evas_Object *obj, int w, int h);
void evas_object_image_size_get (Evas_Object *obj, int *w, int *h);
int evas_object_image_load_error_get (Evas_Object *obj);
void evas_object_image_data_set (Evas_Object *obj, int *data);
int *evas_object_image_data_get (Evas_Object *obj, int for_writing);
void evas_object_image_data_copy_set (Evas_Object *obj, int *data);
void evas_object_image_data_update_add (Evas_Object *obj, int x, int y, int w, int h);
void evas_object_image_alpha_set (Evas_Object *obj, int has_alpha);
int evas_object_image_alpha_get (Evas_Object *obj);
void evas_object_image_smooth_scale_set(Evas_Object *obj, int smooth_scale);
int evas_object_image_smooth_scale_get(Evas_Object *obj);
void evas_object_image_reload (Evas_Object *obj);
void evas_object_image_cache_flush (Evas *e);
void evas_object_image_cache_reload (Evas *e);
void evas_object_image_cache_set (Evas *e, int size);
int evas_object_image_cache_get (Evas *e);
/* FIXME: add:
* multiple image format handler code (clean internal api)
* image loader (provided by app) code (callbacks)
* loadable image loader module query etc. code
*/
Evas_Object *evas_object_text_add (Evas *e);
void evas_object_text_font_set (Evas_Object *obj, char *font, double size);
void evas_object_text_font_get (Evas_Object *obj, char **font, double *size);
void evas_object_text_text_set (Evas_Object *obj, char *text);
char *evas_object_text_text_get (Evas_Object *obj);
double evas_object_text_ascent_get (Evas_Object *obj);
double evas_object_text_descent_get (Evas_Object *obj);
double evas_object_text_max_ascent_get (Evas_Object *obj);
double evas_object_text_max_descent_get (Evas_Object *obj);
double evas_object_text_horiz_advance_get(Evas_Object *obj);
double evas_object_text_vert_advance_get (Evas_Object *obj);
double evas_object_text_inset_get (Evas_Object *obj);
double evas_object_text_horiz_advance_get(Evas_Object *obj);
double evas_object_text_vert_advance_get (Evas_Object *obj);
int evas_object_text_char_pos_get (Evas_Object *obj, int pos, double *cx, double *cy, double *cw, double *ch);
int evas_object_text_char_coords_get (Evas_Object *obj, double x, double y, double *cx, double *cy, double *cw, double *ch);
/* FIXME: add:
* text outline & shadowing code
*/
void evas_object_font_path_clear (Evas *e);
void evas_object_font_path_append (Evas *e, char *path);
void evas_object_font_path_prepend (Evas *e, char *path);
Evas_List *evas_object_font_path_list (Evas *e);
void evas_object_font_cache_flush (Evas *e);
void evas_object_font_cache_set (Evas *e, int size);
int evas_object_font_cache_get (Evas *e);
void evas_object_del (Evas_Object *obj);
const char *evas_object_type_get (Evas_Object *obj);
void evas_object_layer_set (Evas_Object *obj, int l);
int evas_object_layer_get (Evas_Object *obj);
void evas_object_raise (Evas_Object *obj);
void evas_object_lower (Evas_Object *obj);
void evas_object_stack_above (Evas_Object *obj, Evas_Object *above);
void evas_object_stack_below (Evas_Object *obj, Evas_Object *below);
Evas_Object *evas_object_above_get (Evas_Object *obj);
Evas_Object *evas_object_below_get (Evas_Object *obj);
Evas_Object *evas_object_bottom_get (Evas *e);
Evas_Object *evas_object_top_get (Evas *e);
void evas_object_move (Evas_Object *obj, double x, double y);
void evas_object_resize (Evas_Object *obj, double w, double h);
void evas_object_geometry_get (Evas_Object *obj, double *x, double *y, double *w, double *h);
void evas_object_show (Evas_Object *obj);
void evas_object_hide (Evas_Object *obj);
int evas_object_visible_get (Evas_Object *obj);
void evas_object_color_set (Evas_Object *obj, int r, int g, int b, int a);
void evas_object_color_get (Evas_Object *obj, int *r, int *g, int *b, int *a);
void evas_object_clip_set (Evas_Object *obj, Evas_Object *clip);
Evas_Object *evas_object_clip_get (Evas_Object *obj);
void evas_object_clip_unset (Evas_Object *obj);
Evas_List *evas_object_clipees_get (Evas_Object *obj);
void evas_object_data_set (Evas_Object *obj, const char *key, void *data);
void *evas_object_data_get (Evas_Object *obj, const char *key);
void *evas_object_data_del (Evas_Object *obj, const char *key);
void evas_object_name_set (Evas_Object *obj, const char *name);
char *evas_object_name_get (Evas_Object *obj);
Evas_Object *evas_object_name_find (Evas *e, const char *name);
Evas *evas_object_evas_get (Evas_Object *obj);
Evas_Object *evas_object_top_at_xy_get (Evas *e, double x, double y, int include_pass_events_objects, int include_hidden_objects);
Evas_Object *evas_object_top_at_pointer_get (Evas *e);
Evas_Object *evas_object_top_in_rectangle_get (Evas *e, double x, double y, double w, double h, int include_pass_events_objects, int include_hidden_objects);
Evas_List *evas_objects_at_xy_get (Evas *e, double x, double y, int include_pass_events_objects, int include_hidden_objects);
Evas_List *evas_objects_in_rectangle_get (Evas *e, double x, double y, double w, double h, int include_pass_events_objects, int include_hidden_objects);
Evas_Smart *evas_smart_new (char *name, void (*func_add) (Evas_Object *o), void (*func_del) (Evas_Object *o), void (*func_layer_set) (Evas_Object *o, int l), void (*func_raise) (Evas_Object *o), void (*func_lower) (Evas_Object *o), void (*func_stack_above) (Evas_Object *o, Evas_Object *above), void (*func_stack_below) (Evas_Object *o, Evas_Object *below), void (*func_move) (Evas_Object *o, double x, double y), void (*func_resize) (Evas_Object *o, double w, double h), void (*func_show) (Evas_Object *o), void (*func_hide) (Evas_Object *o), void (*func_color_set) (Evas_Object *o, int r, int g, int b, int a), void (*func_clip_set) (Evas_Object *o, Evas_Object *clip), void (*func_clip_unset) (Evas_Object *o), void *data);
void evas_smart_free (Evas_Smart *s);
void *evas_smart_data_get (Evas_Smart *s);
Evas_Object *evas_object_smart_add (Evas *e, Evas_Smart *s);
void evas_object_smart_member_add (Evas_Object *obj, Evas_Object *smart_obj);
void evas_object_smart_member_del (Evas_Object *obj);
Evas_Smart *evas_object_smart_smart_get (Evas_Object *obj);
void *evas_object_smart_data_get (Evas_Object *obj);
void evas_object_smart_data_set (Evas_Object *obj, void *data);
void evas_object_smart_callback_add (Evas_Object *obj, char *event, void (*func) (void *data, Evas_Object *obj, void *event_info), void *data);
void *evas_object_smart_callback_del (Evas_Object *obj, char *event, void (*func) (void *data, Evas_Object *obj, void *event_info));
void evas_object_smart_callback_call (Evas_Object *obj, char *event, void *event_info);
void evas_pointer_output_xy_get (Evas *e, int *x, int *y);
void evas_pointer_canvas_xy_get (Evas *e, double *x, double *y);
int evas_pointer_button_down_mask_get (Evas *e);
int evas_pointer_inside_get (Evas *e);
void evas_event_freeze (Evas *e);
void evas_event_thaw (Evas *e);
int evas_event_freeze_get (Evas *e);
void evas_event_feed_mouse_down_data (Evas *e, int b, void *data);
void evas_event_feed_mouse_up_data (Evas *e, int b, void *data);
void evas_event_feed_mouse_move_data (Evas *e, int x, int y, void *data);
void evas_event_feed_mouse_in_data (Evas *e, void *data);
void evas_event_feed_mouse_out_data (Evas *e, void *data);
/* FIXME: implement...
void evas_event_feed_key_down_data (Evas *e, char *keyname, void *data);
void evas_event_feed_key_up_data (Evas *e, char *keyname, void *data);
...end implement */
void evas_event_feed_mouse_down (Evas *e, int b);
void evas_event_feed_mouse_up (Evas *e, int b);
void evas_event_feed_mouse_move (Evas *e, int x, int y);
void evas_event_feed_mouse_in (Evas *e);
void evas_event_feed_mouse_out (Evas *e);
/* FIXME: implement...
void evas_event_feed_key_down (Evas *e, char *keyname);
void evas_event_feed_key_up (Evas *e, char *keyname);
void evas_object_focus (Evas_Object *o);
char *evas_key_name_get (Evas_Key *k);
int evas_key_modifier_is_set_get (Evas_Modifier *m, char *keyname);
int evas_key_lock_is_set_get (Evas_Lock *l, char *keyname);
void evas_key_modifier_add (Evas *e, char *keyname);
void evas_key_modifier_del (Evas *e, char *keyname);
void evas_key_lock_add (Evas *e, char *keyname);
void evas_key_lock_del (Evas *e, char *keyname);
void evas_key_modifier_on (Evas *e, char *keyname);
void evas_key_modifier_off (Evas *e, char *keyname);
void evas_key_lock_on (Evas *e, char *keyname);
void evas_key_lock_off (Evas *e, char *keyname);
...end implement */
void evas_object_pass_events_set (Evas_Object *obj, int pass);
int evas_object_pass_events_get (Evas_Object *obj);
void evas_object_repeat_events_set (Evas_Object *obj, int repeat);
int evas_object_repeat_events_get (Evas_Object *obj);
void evas_object_event_callback_add (Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info), void *data);
void *evas_object_event_callback_del (Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info));
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,23 @@
#ifndef _EVAS_ENGINE_DIRECTFB_H
#define _EVAS_ENGINE_DIRECTFB_H
#include <Evas.h>
#include <directfb.h>
typedef struct _Evas_Engine_Info_DirectFB Evas_Engine_Info_DirectFB;
struct _Evas_Engine_Info_DirectFB
{
/* PRIVATE - don't mess with this baby or evas will poke its tongue out */
/* at you and make nasty noises */
Evas_Engine_Info magic;
struct {
IDirectFB *dfb;
IDirectFBSurface *surface;
DFBSurfaceDrawingFlags flags;
} info;
};
#endif

View File

@ -0,0 +1,22 @@
#ifndef _EVAS_ENGINE_FB_H
#define _EVAS_ENGINE_FB_H
typedef struct _Evas_Engine_Info_FB Evas_Engine_Info_FB;
struct _Evas_Engine_Info_FB
{
/* PRIVATE - don't mess with this baby or evas will poke its tongue out */
/* at you and make nasty noises */
Evas_Engine_Info magic;
struct {
int virtual_terminal;
int device_number;
int refresh;
int rotation;
} info;
};
#endif

View File

@ -0,0 +1,35 @@
#ifndef _EVAS_ENGINE_GL_X11_H
#define _EVAS_ENGINE_GL_X11_H
#include <X11/Xlib.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glx.h>
typedef struct _Evas_Engine_Info_GL_X11 Evas_Engine_Info_GL_X11;
struct _Evas_Engine_Info_GL_X11
{
/* PRIVATE - don't mess with this baby or evas will poke its tongue out */
/* at you and make nasty noises */
Evas_Engine_Info magic;
/* engine specific data & parameters it needs to set up */
struct {
Display *display;
Drawable drawable;
Visual *visual;
Colormap colormap;
int depth;
} info;
/* engine specific function calls to query stuff about the destination */
/* engine (what visual & colormap & depth to use, performance info etc. */
struct {
Visual * (*best_visual_get) (Display *disp, int screen);
Colormap (*best_colormap_get) (Display *disp, int screen);
int (*best_depth_get) (Display *disp, int screen);
} func;
};
#endif

View File

@ -0,0 +1,31 @@
#ifndef _EVAS_ENGINE_SOFTWARE_QTOPIA_H
#define _EVAS_ENGINE_SOFTWARE_QTOPIA_H
#ifdef EVAS_COMMON_H
#ifdef EVAS_PRIVATE_H
typedef void QWidget;
#endif
#endif
#ifndef EVAS_COMMON_H
#ifndef EVAS_PRIVATE_H
#include <qwidget.h>
#endif
#endif
typedef struct _Evas_Engine_Info_Software_Qtopia Evas_Engine_Info_Software_Qtopia;
struct _Evas_Engine_Info_Software_Qtopia
{
/* PRIVATE - don't mess with this baby or evas will poke its tongue out */
/* at you and make nasty noises */
Evas_Engine_Info magic;
struct {
QWidget *target;
int rotation;
} info;
};
#endif

View File

@ -0,0 +1,29 @@
#ifndef _EVAS_ENGINE_SOFTWARE_WIN32_GDI_H
#define _EVAS_ENGINE_SOFTWARE_WIN32_GDI_H
typedef struct _Evas_Engine_Info_Software_Win32_GDI Evas_Engine_Info_Software_Win32_GDI;
struct _Evas_Engine_Info_Software_Win32_GDI
{
/* PRIVATE - don't mess with this baby or evas will poke its tongue out */
/* at you and make nasty noises */
Evas_Engine_Info magic;
/* engine specific data & parameters it needs to set up */
struct {
HWND hwnd;
/*
Colormap colormap;
*/
int depth;
int rotation;
} info;
/* engine specific function calls to query stuff about the destination */
/* engine (what visual & colormap & depth to use, performance info etc. */
};
#endif

View File

@ -0,0 +1,48 @@
#ifndef _EVAS_ENGINE_SOFTWARE_X11_H
#define _EVAS_ENGINE_SOFTWARE_X11_H
#include <X11/Xlib.h>
typedef struct _Evas_Engine_Info_Software_X11 Evas_Engine_Info_Software_X11;
struct _Evas_Engine_Info_Software_X11
{
/* PRIVATE - don't mess with this baby or evas will poke its tongue out */
/* at you and make nasty noises */
Evas_Engine_Info magic;
/* engine specific data & parameters it needs to set up */
struct {
Display *display;
Drawable drawable;
Pixmap mask;
Visual *visual;
Colormap colormap;
int depth;
int rotation;
int alloc_grayscale : 1;
int debug : 1;
int shape_dither : 1;
int alloc_colors_max;
} info;
/* engine specific function calls to query stuff about the destination */
/* engine (what visual & colormap & depth to use, performance info etc. */
struct {
Visual * (*best_visual_get) (Display *disp, int screen);
Colormap (*best_colormap_get) (Display *disp, int screen);
int (*best_depth_get) (Display *disp, int screen);
Evas_Performance *(*performance_test) (Evas *e, Display *disp, Visual *vis, Colormap cmap, Drawable draw, int depth);
void (*performance_free) (Evas_Performance *perf);
char * (*performance_data_get) (Evas_Performance *perf);
char * (*performance_key_get) (Evas_Performance *perf);
Evas_Performance *(*performance_new) (Evas *e, Display *disp, Visual *vis, Colormap cmap, Drawable draw, int depth);
void (*performance_build) (Evas_Performance *perf, const char *data);
void (*performance_device_store) (Evas_Performance *perf);
} func;
};
#endif

View File

@ -0,0 +1,104 @@
## Process this file with automake to produce Makefile.in
SUBDIRS = canvas data file engines include
AUTOMAKE_OPTIONS = 1.4 foreign
# A list of all the files in the current directory which can be regenerated
MAINTAINERCLEANFILES = Makefile.in
LDFLAGS = -L/usr/local/lib
INCLUDES = -I/usr/local/include \
-I$(top_srcdir)/src/lib/include \
-I$(includedir) \
-I/usr/local/include \
@freetype_cflags@ @x_cflags@ @qt_cflags@ @DIRECTFB_CFLAGS@ @gl_cflags@
lib_LTLIBRARIES = libevas.la
EXTRA_DIST = \
Evas_Engine_Software_X11.h \
Evas_Engine_DirectFB.h \
Evas_Engine_FB.h \
Evas_Engine_Software_Win32_GDI.h \
Evas_Engine_Software_Qtopia.h \
Evas_Engine_GL_X11.h
if BUILD_ENGINE_SOFTWARE_X11
ENGINE_SOFTWARE_X11 = engines/software_x11/libevas_engine_software_x11.la
ENGINE_SOFTWARE_X11_INC = Evas_Engine_Software_X11.h
else
ENGINE_SOFTWARE_X11 =
ENGINE_SOFTWARE_X11_INC =
endif
if BUILD_ENGINE_DIRECTFB
ENGINE_DIRECTFB = engines/directfb/libevas_engine_directfb.la
ENGINE_DIRECTFB_INC = Evas_Engine_DirectFB.h
else
ENGINE_DIRECTFB =
ENGINE_DIRECTFB_INC =
endif
if BUILD_ENGINE_FB
ENGINE_FB = engines/fb/libevas_engine_fb.la
ENGINE_FB_INC = Evas_Engine_FB.h
else
ENGINE_FB =
ENGINE_FB_INC =
endif
if BUILD_ENGINE_SOFTWARE_QTOPIA
ENGINE_SOFTWARE_QTOPIA = engines/software_qtopia/libevas_engine_software_qtopia.la
ENGINE_SOFTWARE_QTOPIA_INC = Evas_Engine_Software_Qtopia.h
else
ENGINE_SOFTWARE_QTOPIA =
ENGINE_SOFTWARE_QTOPIA_INC =
endif
if BUILD_ENGINE_GL_X11
ENGINE_GL_X11 = engines/gl_x11/libevas_engine_gl_x11.la
ENGINE_GL_X11_INC = Evas_Engine_GL_X11.h
else
ENGINE_GL_X11 =
ENGINE_GL_X11_INC =
endif
include_HEADERS = \
Evas.h \
$(ENGINE_SOFTWARE_X11_INC) \
$(ENGINE_DIRECTFB_INC) \
$(ENGINE_FB_INC) \
$(ENGINE_SOFTWARE_QTOPIA_INC) \
$(ENGINE_GL_X11_INC)
libevas_la_SOURCES = \
main.c
libevas_la_LIBADD = $(LDFLAGS) \
canvas/libevas_canvas.la \
data/libevas_data.la \
file/libevas_file.la \
engines/common/libevas_engine_common.la \
@freetype_libs@ \
@png_libs@ @jpeg_libs@ @eet_libs@ @edb_libs@ \
$(ENGINE_SOFTWARE_X11) \
$(ENGINE_DIRECTFB) \
$(ENGINE_FB) \
$(ENGINE_SOFTWARE_QTOPIA) \
$(ENGINE_GL_X11)
libevas_la_DEPENDENCIES = \
$(top_builddir)/config.h \
canvas/libevas_canvas.la \
data/libevas_data.la \
file/libevas_file.la \
engines/common/libevas_engine_common.la \
$(ENGINE_SOFTWARE_X11) \
$(ENGINE_DIRECTFB) \
$(ENGINE_FB) \
$(ENGINE_SOFTWARE_QTOPIA) \
$(ENGINE_GL_X11)
libevas_la_LDFLAGS = -version-info 1:0:0

View File

@ -0,0 +1,40 @@
## Process this file with automake to produce Makefile.in
AUTOMAKE_OPTIONS = 1.4 foreign
# A list of all the files in the current directory which can be regenerated
MAINTAINERCLEANFILES = Makefile.in
LDFLAGS = -L/usr/local/lib
INCLUDES = \
-I. \
-I$(top_srcdir)/src/lib \
-I$(top_srcdir)/src/lib/include \
-I$(includedir) \
-I/usr/local/include \
@freetype_cflags@ @x_cflags@ @DIRECTFB_CFLAGS@
noinst_LTLIBRARIES = libevas_canvas.la
libevas_canvas_la_SOURCES = \
evas_callbacks.c \
evas_clip.c \
evas_data.c \
evas_events.c \
evas_layer.c \
evas_main.c \
evas_name.c \
evas_object_gradient.c \
evas_object_image.c \
evas_object_main.c \
evas_object_line.c \
evas_object_polygon.c \
evas_object_rectangle.c \
evas_object_smart.c \
evas_object_text.c \
evas_rectangle.c \
evas_render.c \
evas_smart.c \
evas_stack.c
libevas_canvas_la_LIBADD = $(LDFLAGS)
libevas_canvas_la_DEPENDENCIES = $(top_builddir)/config.h

View File

@ -0,0 +1,139 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
void
evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void *event_info)
{
Evas_Object_List **l_mod, *l;
switch (type)
{
case EVAS_CALLBACK_MOUSE_IN:
l_mod = &(obj->callbacks.in);
break;
case EVAS_CALLBACK_MOUSE_OUT:
l_mod = &(obj->callbacks.out);
break;
case EVAS_CALLBACK_MOUSE_DOWN:
l_mod = &(obj->callbacks.down);
break;
case EVAS_CALLBACK_MOUSE_UP:
l_mod = &(obj->callbacks.up);
break;
case EVAS_CALLBACK_MOUSE_MOVE:
l_mod = &(obj->callbacks.move);
break;
case EVAS_CALLBACK_FREE:
l_mod = &(obj->callbacks.free);
break;
default:
return;
break;
}
for (l = *l_mod; l; l = l->next)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)l;
fn->func(fn->data, obj->layer->evas, obj, event_info);
}
}
/* public functions */
void
evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info), void *data)
{
Evas_Func_Node *fn;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!func) return;
if (obj->smart.smart) return;
fn = calloc(1, sizeof(Evas_Func_Node));
if (!fn) return;
fn->func = func;
fn->data = data;
switch (type)
{
case EVAS_CALLBACK_MOUSE_IN:
obj->callbacks.in = evas_object_list_prepend(obj->callbacks.in, fn);
break;
case EVAS_CALLBACK_MOUSE_OUT:
obj->callbacks.out = evas_object_list_prepend(obj->callbacks.out, fn);
break;
case EVAS_CALLBACK_MOUSE_DOWN:
obj->callbacks.down = evas_object_list_prepend(obj->callbacks.down, fn);
break;
case EVAS_CALLBACK_MOUSE_UP:
obj->callbacks.up = evas_object_list_prepend(obj->callbacks.up, fn);
break;
case EVAS_CALLBACK_MOUSE_MOVE:
obj->callbacks.move = evas_object_list_prepend(obj->callbacks.move, fn);
break;
case EVAS_CALLBACK_FREE:
obj->callbacks.free = evas_object_list_prepend(obj->callbacks.free, fn);
break;
default:
return;
break;
}
}
void *
evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info))
{
Evas_Object_List **l_mod, *l;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
if (obj->smart.smart) return NULL;
switch (type)
{
case EVAS_CALLBACK_MOUSE_IN:
l_mod = &(obj->callbacks.in);
break;
case EVAS_CALLBACK_MOUSE_OUT:
l_mod = &(obj->callbacks.out);
break;
case EVAS_CALLBACK_MOUSE_DOWN:
l_mod = &(obj->callbacks.down);
break;
case EVAS_CALLBACK_MOUSE_UP:
l_mod = &(obj->callbacks.up);
break;
case EVAS_CALLBACK_MOUSE_MOVE:
l_mod = &(obj->callbacks.move);
break;
case EVAS_CALLBACK_FREE:
l_mod = &(obj->callbacks.free);
break;
default:
return NULL;
break;
}
for (l = *l_mod; l; l = l->next)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)l;
if (fn->func == func)
{
void *data;
data = fn->data;
*l_mod = evas_object_list_remove(*l_mod, fn);
free(fn);
return data;
}
}
return NULL;
}

View File

@ -0,0 +1,174 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
void
evas_object_clip_recalc(Evas_Object *obj)
{
int cx, cy, cw, ch, cvis, cr, cg, cb, ca;
int nx, ny, nw, nh, nvis, nr, ng, nb, na;
evas_object_coords_recalc(obj);
cx = obj->cur.cache.geometry.x; cy = obj->cur.cache.geometry.y;
cw = obj->cur.cache.geometry.w; ch = obj->cur.cache.geometry.h;
if (obj->cur.color.a == 0) cvis = 0;
else cvis = obj->cur.visible;
cr = obj->cur.color.r; cg = obj->cur.color.g;
cb = obj->cur.color.b; ca = obj->cur.color.a;
if (obj->cur.clipper)
{
evas_object_clip_recalc(obj->cur.clipper);
nx = obj->cur.clipper->cur.cache.clip.x;
ny = obj->cur.clipper->cur.cache.clip.y;
nw = obj->cur.clipper->cur.cache.clip.w;
nh = obj->cur.clipper->cur.cache.clip.h;
nvis = obj->cur.clipper->cur.cache.clip.visible;
nr = obj->cur.clipper->cur.cache.clip.r;
ng = obj->cur.clipper->cur.cache.clip.g;
nb = obj->cur.clipper->cur.cache.clip.b;
na = obj->cur.clipper->cur.cache.clip.a;
RECTS_CLIP_TO_RECT(cx, cy, cw, ch, nx, ny, nw, nh);
cvis = cvis * nvis;
cr = (cr * (nr + 1)) >> 8;
cg = (cg * (ng + 1)) >> 8;
cb = (cb * (nb + 1)) >> 8;
ca = (ca * (na + 1)) >> 8;
}
if ((ca == 0) || (cw <= 0) || (ch <= 0)) cvis = 0;
obj->cur.cache.clip.x = cx;
obj->cur.cache.clip.y = cy;
obj->cur.cache.clip.w = cw;
obj->cur.cache.clip.h = ch;
obj->cur.cache.clip.visible = cvis;
obj->cur.cache.clip.r = cr;
obj->cur.cache.clip.g = cg;
obj->cur.cache.clip.b = cb;
obj->cur.cache.clip.a = ca;
}
void
evas_object_recalc_clippees(Evas_Object *obj)
{
Evas_List *l;
evas_object_clip_recalc(obj);
for (l = obj->clip.clipees; l; l = l->next)
{
evas_object_recalc_clippees(l->data);
}
}
int
evas_object_clippers_is_visible(Evas_Object *obj)
{
if (obj->cur.visible)
{
if (obj->cur.clipper)
return evas_object_clippers_is_visible(obj->cur.clipper);
return 1;
}
return 0;
}
int
evas_object_clippers_was_visible(Evas_Object *obj)
{
if (obj->prev.visible)
{
if (obj->prev.clipper)
return evas_object_clippers_is_visible(obj->prev.clipper);
return 1;
}
return 0;
}
/* public functions */
void
evas_object_clip_set(Evas_Object *obj, Evas_Object *clip)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!clip)
{
evas_object_clip_unset(obj);
return;
}
MAGIC_CHECK(clip, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (obj->cur.clipper == clip) return;
if (obj->smart.smart)
{
if (obj->smart.smart->func_clip_set)
obj->smart.smart->func_clip_set(obj, clip);
}
if (obj->cur.clipper)
{
/* unclip */
obj->cur.clipper->clip.clipees = evas_list_remove(obj->cur.clipper->clip.clipees, obj);
evas_object_change(obj);
obj->cur.clipper = NULL;
}
/* clip me */
obj->cur.clipper = clip;
clip->clip.clipees = evas_list_append(clip->clip.clipees, obj);
evas_object_change(obj);
evas_object_recalc_clippees(obj);
if (!obj->smart.smart)
{
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1))
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
}
Evas_Object *
evas_object_clip_get(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
return obj->cur.clipper;
}
void
evas_object_clip_unset(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!obj->cur.clipper) return;
/* unclip */
if (obj->smart.smart)
{
if (obj->smart.smart->func_clip_unset)
obj->smart.smart->func_clip_unset(obj);
}
obj->cur.clipper->clip.clipees = evas_list_remove(obj->cur.clipper->clip.clipees, obj);
obj->cur.clipper = NULL;
evas_object_change(obj);
evas_object_recalc_clippees(obj);
if (!obj->smart.smart)
{
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1))
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
}
Evas_List *
evas_object_clipees_get(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
return obj->clip.clipees;
}

View File

@ -0,0 +1,74 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
void
evas_object_data_set(Evas_Object *obj, const char *key, void *data)
{
Evas_Data_Node *node;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!key) return;
evas_object_data_del(obj, key);
node = malloc(sizeof(Evas_Data_Node));
node->key = strdup(key);
node->data = data;
obj->data.elements = evas_list_prepend(obj->data.elements, node);
}
void *
evas_object_data_get(Evas_Object *obj, const char *key)
{
Evas_List *l;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
if (!key) return NULL;
for (l = obj->data.elements; l; l = l->next)
{
Evas_Data_Node *node;
node = l->data;
if (!strcmp(node->key, key))
{
obj->data.elements = evas_list_remove(obj->data.elements, node);
obj->data.elements = evas_list_prepend(obj->data.elements, node);
return node->data;
}
}
return NULL;
}
void *
evas_object_data_del(Evas_Object *obj, const char *key)
{
Evas_List *l;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
if (!key) return NULL;
for (l = obj->data.elements; l; l = l->next)
{
Evas_Data_Node *node;
node = l->data;
if (!strcmp(node->key, key))
{
void *data;
data = node->data;
obj->data.elements = evas_list_remove(obj->data.elements, node);
free(node->key);
free(node);
return data;
}
}
return NULL;
}

View File

@ -0,0 +1,470 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
Evas_List *
evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y)
{
Evas_Object_List *l;
Evas_List *in = NULL;
if (!e->layers) return NULL;
for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev)
{
Evas_Object_List *l2;
Evas_Layer *lay;
lay = (Evas_Layer *)l;
for (l2 = ((Evas_Object_List *)(lay->objects))->last; l2; l2 = l2->prev)
{
Evas_Object *obj;
obj = (Evas_Object *)l2;
if (obj == stop) goto done;
if ((!obj->pass_events) && (!obj->smart.smart))
{
evas_object_clip_recalc(obj);
if ((evas_object_is_in_output_rect(obj, x, y, 1, 1)) &&
(obj->cur.visible) &&
(obj->delete_me == 0) &&
(evas_object_clippers_is_visible(obj)) &&
(!obj->clip.clipees))
{
in = evas_list_append(in, obj);
if (!obj->repeat_events) goto done;
}
}
}
}
done:
return in;
}
static Evas_List *evas_event_list_copy(Evas_List *list);
static Evas_List *
evas_event_list_copy(Evas_List *list)
{
Evas_List *l, *new_l = NULL;
for (l = list; l; l = l->next)
new_l = evas_list_append(new_l, l->data);
return new_l;
}
/* public functions */
void
evas_event_freeze(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
e->events_frozen++;
}
void
evas_event_thaw(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
e->events_frozen--;
}
int
evas_event_freeze_get(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
return e->events_frozen;
}
void
evas_event_feed_mouse_down_data(Evas *e, int b, void *data)
{
Evas_List *l, *copy;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if ((b < 1) || (b > 32)) return;
e->pointer.button |= (1 << (b - 1));
if (e->events_frozen > 0) return;
copy = evas_event_list_copy(e->pointer.object.in);
for (l = copy; l; l = l->next)
{
Evas_Object *obj;
Evas_Event_Mouse_Down ev;
obj = l->data;
obj->mouse_grabbed = 1;
e->pointer.mouse_grabbed = 1;
ev.button = b;
ev.output.x = e->pointer.x;
ev.output.y = e->pointer.y;
ev.canvas.x = e->pointer.canvas_x;
ev.canvas.y = e->pointer.canvas_y;
ev.data = data;
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev);
}
if (copy) copy = evas_list_free(copy);
}
void
evas_event_feed_mouse_up_data(Evas *e, int b, void *data)
{
Evas_List *l, *copy;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if ((b < 1) || (b > 32)) return;
e->pointer.button &= ~(1 << (b - 1));
if (e->events_frozen > 0) return;
copy = evas_event_list_copy(e->pointer.object.in);
for (l = copy; l; l = l->next)
{
Evas_Object *obj;
Evas_Event_Mouse_Up ev;
obj = l->data;
if (!e->pointer.button) obj->mouse_grabbed = 0;
ev.button = b;
ev.output.x = e->pointer.x;
ev.output.y = e->pointer.y;
ev.canvas.x = e->pointer.canvas_x;
ev.canvas.y = e->pointer.canvas_y;
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev);
}
if (copy) copy = evas_list_free(copy);
if (!e->pointer.button)
{
Evas_List *ins;
Evas_List *l;
e->pointer.mouse_grabbed = 0;
/* get new list of ins */
ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
/* go thru old list of in objects */
copy = evas_event_list_copy(e->pointer.object.in);
for (l = copy; l; l = l->next)
{
Evas_Object *obj;
obj = l->data;
obj->mouse_grabbed = 0;
if (!evas_list_find(ins, obj))
{
Evas_Event_Mouse_Out ev;
obj->mouse_in = 0;
ev.buttons = e->pointer.button;
ev.output.x = e->pointer.x;
ev.output.y = e->pointer.y;
ev.canvas.x = e->pointer.canvas_x;
ev.canvas.y = e->pointer.canvas_y;
ev.data = data;
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
}
}
if (copy) copy = evas_list_free(copy);
for (l = ins; l; l = l->next)
{
Evas_Object *obj;
obj = l->data;
if (!evas_list_find(e->pointer.object.in, obj))
{
Evas_Event_Mouse_In ev;
obj->mouse_in = 1;
ev.buttons = e->pointer.button;
ev.output.x = e->pointer.x;
ev.output.y = e->pointer.y;
ev.canvas.x = e->pointer.canvas_x;
ev.canvas.y = e->pointer.canvas_y;
ev.data = data;
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev);
}
}
/* free our old list of ins */
e->pointer.object.in = evas_list_free(e->pointer.object.in);
/* and set up the new one */
e->pointer.object.in = ins;
evas_event_feed_mouse_move_data(e, e->pointer.x, e->pointer.y, data);
}
}
void
evas_event_feed_mouse_move_data(Evas *e, int x, int y, void *data)
{
int px, py;
double pcx, pcy;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
px = e->pointer.x;
py = e->pointer.y;
pcx = e->pointer.canvas_x;
pcy = e->pointer.canvas_y;
if (e->events_frozen > 0) return;
e->pointer.x = x;
e->pointer.y = y;
e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x);
e->pointer.canvas_y = evas_coord_screen_x_to_world(e, y);
/* if our mouse button is grabbed to any objects */
if (e->pointer.mouse_grabbed)
{
/* go thru old list of in objects */
Evas_List *outs = NULL;
Evas_List *l, *copy;
copy = evas_event_list_copy(e->pointer.object.in);
for (l = copy; l; l = l->next)
{
Evas_Object *obj;
obj = l->data;
if ((obj->cur.visible) &&
(evas_object_clippers_is_visible(obj)) &&
(!obj->pass_events) &&
(!obj->smart.smart) &&
(!obj->clip.clipees))
{
if ((px != x) || (py != y))
{
Evas_Event_Mouse_Move ev;
ev.buttons = e->pointer.button;
ev.cur.output.x = e->pointer.x;
ev.cur.output.y = e->pointer.y;
ev.cur.canvas.x = e->pointer.canvas_x;
ev.cur.canvas.y = e->pointer.canvas_y;
ev.prev.output.x = px;
ev.prev.output.y = py;
ev.prev.canvas.x = pcx;
ev.prev.canvas.y = pcy;
ev.data = data;
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev);
}
}
else
outs = evas_list_append(outs, obj);
}
if (copy) copy = evas_list_free(copy);
while (outs)
{
Evas_Object *obj;
obj = outs->data;
outs = evas_list_remove(outs, obj);
e->pointer.object.in = evas_list_remove(e->pointer.object.in, obj);
{
Evas_Event_Mouse_Out ev;
obj->mouse_in = 0;
ev.buttons = e->pointer.button;
ev.output.x = e->pointer.x;
ev.output.y = e->pointer.y;
ev.canvas.x = e->pointer.canvas_x;
ev.canvas.y = e->pointer.canvas_y;
ev.data = data;
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
}
}
}
else
{
Evas_List *ins;
Evas_List *l, *copy;
/* get all new in objects */
ins = evas_event_objects_event_list(e, NULL, x, y);
/* go thru old list of in objects */
copy = evas_event_list_copy(e->pointer.object.in);
for (l = copy; l; l = l->next)
{
Evas_Object *obj;
obj = l->data;
/* if its under the pointer and its visible and its in the new */
/* in list */
evas_object_clip_recalc(obj);
if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
(obj->cur.visible) &&
(evas_object_clippers_is_visible(obj)) &&
(evas_list_find(ins, obj)) &&
(!obj->pass_events) &&
(!obj->smart.smart) &&
(!obj->clip.clipees))
{
if ((px != x) || (py != y))
{
Evas_Event_Mouse_Move ev;
ev.buttons = e->pointer.button;
ev.cur.output.x = e->pointer.x;
ev.cur.output.y = e->pointer.y;
ev.cur.canvas.x = e->pointer.canvas_x;
ev.cur.canvas.y = e->pointer.canvas_y;
ev.prev.output.x = px;
ev.prev.output.y = py;
ev.prev.canvas.x = pcx;
ev.prev.canvas.y = pcy;
ev.data = data;
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev);
}
}
/* otherwise it has left the object */
else
{
Evas_Event_Mouse_Out ev;
obj->mouse_in = 0;
ev.buttons = e->pointer.button;
ev.output.x = e->pointer.x;
ev.output.y = e->pointer.y;
ev.canvas.x = e->pointer.canvas_x;
ev.canvas.y = e->pointer.canvas_y;
ev.data = data;
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
}
}
if (copy) copy = evas_list_free(copy);
/* go thru out current list of ins */
for (l = ins; l; l = l->next)
{
Evas_Object *obj;
obj = l->data;
/* if its not in the old list of ins send an enter event */
if (!evas_list_find(e->pointer.object.in, obj))
{
Evas_Event_Mouse_In ev;
obj->mouse_in = 1;
ev.buttons = e->pointer.button;
ev.output.x = e->pointer.x;
ev.output.y = e->pointer.y;
ev.canvas.x = e->pointer.canvas_x;
ev.canvas.y = e->pointer.canvas_y;
ev.data = data;
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev);
}
}
/* free our old list of ins */
e->pointer.object.in = evas_list_free(e->pointer.object.in);
/* and set up the new one */
e->pointer.object.in = ins;
}
}
void
evas_event_feed_mouse_in_data(Evas *e, void *data)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
e->pointer.inside = 1;
}
void
evas_event_feed_mouse_out_data(Evas *e, void *data)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
e->pointer.inside = 0;
}
void
evas_event_feed_mouse_down(Evas *e, int b)
{
evas_event_feed_mouse_down_data(e, b, NULL);
}
void
evas_event_feed_mouse_up(Evas *e, int b)
{
evas_event_feed_mouse_up_data(e, b, NULL);
}
void
evas_event_feed_mouse_move(Evas *e, int x, int y)
{
evas_event_feed_mouse_move_data(e, x, y, NULL);
}
void
evas_event_feed_mouse_in(Evas *e)
{
evas_event_feed_mouse_in_data(e, NULL);
}
void
evas_event_feed_mouse_out(Evas *e)
{
evas_event_feed_mouse_out_data(e, NULL);
}
void
evas_object_pass_events_set(Evas_Object *obj, int pass)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
obj->pass_events = pass;
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1))
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
int
evas_object_pass_events_get(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
return obj->pass_events;
}
void
evas_object_repeat_events_set(Evas_Object *obj, int repeat)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
obj->repeat_events = repeat;
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1))
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
int
evas_object_repeat_events_get(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
return obj->repeat_events;
}

View File

@ -0,0 +1,151 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
void
evas_object_inject(Evas_Object *obj, Evas *e)
{
Evas_Layer *lay;
lay = evas_layer_find(e, obj->cur.layer);
if (!lay)
{
lay = evas_layer_new(e);
lay->layer = obj->cur.layer;
evas_layer_add(lay);
}
lay->objects = evas_object_list_append(lay->objects, obj);
obj->layer = lay;
}
void
evas_object_release(Evas_Object *obj, int clean_layer)
{
obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj);
if (clean_layer)
{
if (!obj->layer->objects)
{
evas_layer_del(obj->layer);
evas_layer_free(obj->layer);
}
}
obj->layer = NULL;
}
Evas_Layer *
evas_layer_new(Evas *e)
{
Evas_Layer *lay;
lay = calloc(1, sizeof(Evas_Layer));
if (!lay) return NULL;
lay->evas = e;
return lay;
}
void
evas_layer_free(Evas_Layer *lay)
{
while (lay->objects)
{
Evas_Object *obj;
obj = (Evas_Object *)lay->objects;
if (obj->smart.smart) evas_object_smart_del(obj);
evas_object_free(obj, 0);
}
free(lay);
}
Evas_Layer *
evas_layer_find(Evas *e, int layer_num)
{
Evas_Object_List *list;
for (list = (Evas_Object_List *)e->layers; list; list = list->next)
{
Evas_Layer *layer;
layer = (Evas_Layer *)list;
if (layer->layer == layer_num) return layer;
}
return NULL;
}
void
evas_layer_add(Evas_Layer *lay)
{
Evas_Object_List *list;
for (list = (Evas_Object_List *)lay->evas->layers; list; list = list->next)
{
Evas_Layer *layer;
layer = (Evas_Layer *)list;
if (layer->layer > lay->layer)
{
lay->evas->layers = evas_object_list_prepend_relative(lay->evas->layers, lay, layer);
return;
}
}
lay->evas->layers = evas_object_list_append(lay->evas->layers, lay);
}
void
evas_layer_del(Evas_Layer *lay)
{
Evas_Object_List *ol;
Evas *e;
ol = (Evas_Object_List *)lay;
e = lay->evas;
e->layers = evas_object_list_remove(e->layers, lay);
}
/* public functions */
void
evas_object_layer_set(Evas_Object *obj, int l)
{
Evas *e;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (obj->cur.layer == l)
{
evas_object_raise(obj);
return;
}
if (obj->smart.smart)
{
if (obj->smart.smart->func_layer_set)
obj->smart.smart->func_layer_set(obj, l);
}
e = obj->layer->evas;
evas_object_release(obj, 1);
obj->cur.layer = l;
evas_object_inject(obj, e);
obj->restack = 1;
if (obj->clip.clipees) return;
if (!obj->smart.smart)
{
evas_object_change(obj);
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1) &&
obj->cur.visible)
if (evas_list_find(obj->layer->evas->pointer.object.in, obj))
evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y);
}
}
int
evas_object_layer_get(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
return obj->cur.layer;
}

View File

@ -0,0 +1,897 @@
#include "evas_common.h"
#include "evas_private.h"
#ifdef BUILD_ENGINE_SOFTWARE_X11
#include "evas_engine_api_software_x11.h"
#endif
#ifdef BUILD_ENGINE_DIRECTFB
#include "evas_engine_api_directfb.h"
#endif
#ifdef BUILD_ENGINE_FB
#include "evas_engine_api_fb.h"
#endif
#ifdef BUILD_ENGINE_SOFTWARE_WIN32_GDI
#include "evas_engine_api_software_win32_gdi.h"
#endif
#ifdef BUILD_ENGINE_SOFTWARE_QTOPIA
#include "evas_engine_api_software_qtopia.h"
#endif
#ifdef BUILD_ENGINE_GL_X11
#include "evas_engine_api_gl_x11.h"
#endif
#include "Evas.h"
/**
* Allocate and new Evas empty canvas.
* @return A zeroed out Evas, or NULL on failure
*
* This function creates a new Evas Canvas object that is completely
* uninitialised. You cannot sensibly use this until it has been initialised.
* You need to set up the rendering engine first for the canvas before you can
* add any objects to the canvas or render it.
*
* This function will always succeed and return a valid canvas pointer unless
* the memory allocation fails, in which case NULL will be returned.
*
* Example:
* @code
* Evas *evas;
*
* evas = evas_new();
* @endcode
*/
Evas *
evas_new(void)
{
Evas *e;
e = calloc(1, sizeof(Evas));
if (!e) return NULL;
e->magic = MAGIC_EVAS;
e->output.render_method = RENDER_METHOD_INVALID;
return e;
}
/**
* Free an Evas.
* @param e The Pointer to the Evas to be freed
*
* When called this function frees the Evas Canvas @p e and All Evas Objects
* created on this canvas. As the objects are freed if they have free callbacks
* set, they will be called during the execution of this function.
*
* Example:
* @code
* extern Evas *evas;
*
* evas_free(evas);
* @endcode
*/
void
evas_free(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
evas_object_font_path_clear(e);
e->pointer.object.in = evas_list_free(e->pointer.object.in);
while (e->layers)
{
Evas_Layer *lay;
lay = e->layers;
evas_layer_del(lay);
evas_layer_free(lay);
}
if (e->name_hash) evas_hash_free(e->name_hash);
while (e->damages)
{
free(e->damages->data);
e->damages = evas_list_remove(e->damages, e->damages->data);
}
while (e->obscures)
{
free(e->obscures->data);
e->obscures = evas_list_remove(e->obscures, e->obscures->data);
}
e->engine.func->info_free(e, e->engine.info);
e->engine.func->context_free(e->engine.data.output, e->engine.data.context);
e->engine.func->output_free(e->engine.data.output);
e->magic = 0;
free(e);
}
/**
* Set the output method (engine) for the Evas.
* @param e The pointer to the Evas Canvas have its engine set
* @param render_method The numeric engine value to use.
*
* This call sets up which engine an Evas Canvas is to use from then on. This
* can only be done once and following calls of this function once called once
* will do nothing. The render method numeric value can be obtained using the
* evas_render_method_lookup() call.
*
* Example:
* @code
* int engine_id;
* Evas *evas;
*
* evas = evas_new();
* engine_id = evas_render_method_lookup("software_x11");
* evas_output_method_set(evas, engine_id);
* @endcode
*/
void
evas_output_method_set(Evas *e, int render_method)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
/* if our engine to set it to is invalid - abort */
if (render_method == RENDER_METHOD_INVALID) return;
/* if the engine is alreayd set up - abort */
if (e->output.render_method != RENDER_METHOD_INVALID) return;
/* set the render method */
e->output.render_method = render_method;
#ifdef BUILD_ENGINE_SOFTWARE_X11
if (e->output.render_method == RENDER_METHOD_SOFTWARE_X11)
e->engine.func = &evas_engine_software_x11_func;
else
#endif
#ifdef BUILD_ENGINE_GL_X11
if (e->output.render_method == RENDER_METHOD_GL_X11)
e->engine.func = &evas_engine_gl_x11_func;
else
#endif
#ifdef BUILD_ENGINE_DIRECTFB
if (e->output.render_method == RENDER_METHOD_DIRECTFB)
e->engine.func = &evas_engine_directfb_func;
else
#endif
#ifdef BUILD_ENGINE_FB
if (e->output.render_method == RENDER_METHOD_FB)
e->engine.func = &evas_engine_fb_func;
else
#endif
#ifdef BUILD_ENGINE_SOFTWARE_WIN32_GDI
if (e->output.render_method == RENDER_METHOD_SOFTWARE_WIN32_GDI)
e->engine.func = &evas_engine_software_win32_gdi_func;
else
#endif
#ifdef BUILD_ENGINE_SOFTWARE_QTOPIA
if (e->output.render_method == RENDER_METHOD_SOFTWARE_QTOPIA)
e->engine.func = &evas_engine_software_qtopia_func;
else
#endif
return;
/* get the engine info struct */
if (e->output.render_method != RENDER_METHOD_INVALID)
{
if (e->engine.func->info) e->engine.info = e->engine.func->info(e);
}
}
/**
* Get the output method (engine) for the Evas.
* @param e The pointer to the Evas Canvas
* @return A numeric engine value
*
* This function returns the rendering engine currently used bu the given Evas
* Canvas passed in. On success the rendering engine used by the Canvas is
* returned. On failue 0 is returned.
*
* Example:
* @code
* extern Evas *evas;
* int engine_id;
*
* engine_id = evas_output_method_get(evas);
*
* @endcode
*/
int
evas_output_method_get(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return RENDER_METHOD_INVALID;
MAGIC_CHECK_END();
return e->output.render_method;
}
/**
* Get the render engine info struct from the canvas.
* @param e The pointer to the Evas Canvas
* @return A pointer to the Engine Info structure
*
* Calling this function returns a pointer to a publicly modifyable structure
* that the rendering engine for the given canvas has set up. Callin this
* function before the rendering engine has been set will result in NULL being
* returned, as will calling this function on an invalid canvas. The caller
* does no need to free this structure and shoudl only assume that the pointer
* tois is valid until evas_engine_info_set() is called or until evas_render()
* is called. After these calls the contents of this structure and the pointer
* to it are not guaranteed to be valid.
*
* With some engines calling this call and modifying structure parameters,
* then calling evas_engine_info_set() is used to modify engine parameters
* whilst the canvas is alive.
*
* Example:
* @code
* Evas *evas;
* Evas_Engine_Info_Software_X11 *einfo;
* extern Display *display;
* extern Window win;
*
* evas = evas_new();
* evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
* evas_output_size_set(evas, 640, 480);
* evas_output_viewport_set(evas, 0, 0, 640, 480);
* einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(evas);
* einfo->info.display = display;
* einfo->info.visual = DefaultVisual(display, DefaultScreen(display));
* einfo->info.colormap = DefaultColormap(display, DefaultScreen(display));
* einfo->info.drawable = win;
* einfo->info.depth = DefaultDepth(display, DefaultScreen(display));
* evas_engine_info_set(evas, (Evas_Engine_Info *)einfo);
* @endcode
*/
Evas_Engine_Info *
evas_engine_info_get(Evas *e)
{
Evas_Engine_Info *info;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
info = e->engine.info;
e->engine.info_magic = info->magic;
return info;
}
/**
* Set up the Engine Info from the info structure.
* @param e The pointer to the Evas Canvas
* @param info The pointer to the Engine Info to use
*
* This function takes any parameters set in the provided info structure and
* applies them to the rendering engine. You need to use the Engine Info
* structure pointer provided by evas_engine_info_get() and not anything else.
*
* You need to set up the Engine Info at least once before doing any rendering
* or creating any objects on the Evas Canvas. Some engines support the
* changing of engine parameters during runtime and so the application
* should call evas_engine_info_get(), modify parameters that need to be
* modified, and then call evas_engine_info_set() again to have those changes
* take effect.
*
* Once evas_engine_info_set() is called the Engine Info structure pointer
* should be considered invalid and should not be used again. Use
* evas_engine_info_get(0 to fetch it again if needed.
*
* Example:
* @code
* Evas *evas;
* Evas_Engine_Info_Software_X11 *einfo;
* extern Display *display;
* extern Window win;
*
* evas = evas_new();
* evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
* evas_output_size_set(evas, 640, 480);
* evas_output_viewport_set(evas, 0, 0, 640, 480);
* einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(evas);
* einfo->info.display = display;
* einfo->info.visual = DefaultVisual(display, DefaultScreen(display));
* einfo->info.colormap = DefaultColormap(display, DefaultScreen(display));
* einfo->info.drawable = win;
* einfo->info.depth = DefaultDepth(display, DefaultScreen(display));
* evas_engine_info_set(evas, (Evas_Engine_Info *)einfo);
* @endcode
*/
void
evas_engine_info_set(Evas *e, Evas_Engine_Info *info)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if (!info) return;
if (info != e->engine.info) return;
if (info->magic != e->engine.info_magic) return;
e->engine.func->setup(e, info);
}
/**
* Set the render engine's output size in output units.
* @param e The pointer to the Evas Canvas
* @param w The width in output units
* @param h The height in output units
*
* This function sets the output display size for the Evas Canvas indicated to
* be the size (for most engines in pixels). The Canvas will render to a
* rectangle of this size on the output target once this call is called. This
* is independant of the viewport (view into the canvas world) and will simply
* stretch the viewport to fill the rectangle indicated by this call.
*
* Example:
* @code
* extern Evas *evas;
*
* evas_output_size_set(evas, 640, 480);
* @endcode
*/
void
evas_output_size_set(Evas *e, int w, int h)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if ((w == e->output.w) && (h == e->output.h)) return;
if (w < 1) w = 1;
if (h < 1) h = 1;
e->output.w = w;
e->output.h = h;
e->output.changed = 1;
e->output_validity++;
e->changed = 1;
}
/**
* Get the render engine's output size in output units.
* @param e The pointer to the Evas Canvas
* @param w The pointer to a width variable to be filled in
* @param h The pointer to a height variable to be filled in
*
* Calling this function writes the current canvas output size values into the
* variables pointed to by @p w and @p h. On success the variables have the
* output size values written to them in output units. If either @p w or @p h
* is NULL, it will not be written to. If @p e is invalid, the results are
* undefined.
*
* Example:
* @code
* extern Evas *evas;
* int width, height;
*
* evas_output_size_get(evas, &width, &height);
* @endcode
*/
void
evas_output_size_get(Evas *e, int *w, int *h)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
if (w) *w = 0;
if (h) *h = 0;
return;
MAGIC_CHECK_END();
if (w) *w = e->output.w;
if (h) *h = e->output.h;
}
/**
* Set the render engine's output viewport in canvas units.
* @param e The pointer to the Evas Canvas
* @param x The top-left corner x value of the viewport
* @param y The top-left corner y value of the viewport
* @param w The width of the viewport
* @param h The height of the viewport
*
* This function sets the viewport (in canvas co-ordinate space) that will
* be visible in the canvas ouput. The width and height of the viewport must
* both be greater than 0. The rectangle described by the co-ordinates is the
* rectangular region of the canvas co-ordinate space that is visibly mapped
* and stretched to fill the output target of the canvas when rendering is
* performed.
*
* Co-ordinates do not have to map 1 to 1, but it is generally advised for
* ease of use that canvas co-ordinates to match output target units for
* better control, but this is not required.
*
* Example:
* @code
* extern Evas *evas;
*
* evas_output_viewport_set(evas, 0, 0, 640, 480);
* @endcode
*/
void
evas_output_viewport_set(Evas *e, double x, double y, double w, double h)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if ((x == e->viewport.x) && (y == e->viewport.y) &&
(w == e->viewport.w) && (h == e->viewport.h)) return;
if (w <= 0) return;
if (h <= 0) return;
e->viewport.x = x;
e->viewport.y = y;
e->viewport.w = w;
e->viewport.h = h;
e->viewport.changed = 1;
e->output_validity++;
e->changed = 1;
}
/**
* Get the render engine's output viewport co-ordinates in canvas units.
* @param e The pointer to the Evas Canvas
* @param x The pointer to a x variable to be filled in
* @param y The pointer to a y variable to be filled in
* @param w The pointer to a width variable to be filled in
* @param h The pointer to a height variable to be filled in
*
* Calling this function writes the current canvas output viewport size and
* location values into the variables pointed to by @p x, @p y, @p w and @p h.
* On success the variables have the output location and size values written
* to them in canvas units. If either @p x, @p y, @p w or @p h are NULL, it
* they will not be written to. If @p e is invalid, the results are
* undefined.
*
* Example:
* @code
* extern Evas *evas;
* double x, y, width, height;
*
* evas_output_viewport_get(evas, &x, &y, &w, &h);
* @endcode
*/
void
evas_output_viewport_get(Evas *e, double *x, double *y, double *w, double *h)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
if (x) *x = 0;
if (y) *y = 0;
if (w) *w = 0;
if (h) *h = 0;
return;
MAGIC_CHECK_END();
if (x) *x = e->viewport.x;
if (y) *y = e->viewport.y;
if (w) *w = e->viewport.w;
if (h) *h = e->viewport.h;
}
/**
* Convert/scale an ouput screen co-ordinate into canvas co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param x The screen/output x co-ordinate
* @return The screen co-ordinate translated to canvas unit co-ordinates
*
* This function takes in a horizontal co-ordinate as the @p x parameter and
* converts it into canvas units, accounting for output size, viewport size
* and location, returning it as the function return value. If @p e is
* invalid, the results are undefined.
*
* Example:
* @code
* extern Evas *evas;
* extern int screen_x;
* double canvas_x;
*
* canvas_x = evas_coord_screen_x_to_world(evas, screen_x);
* @endcode
*/
double
evas_coord_screen_x_to_world(Evas *e, int x)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
return e->viewport.x + (((double)x * e->viewport.w) / (double)e->output.w);
}
/**
* Convert/scale an ouput screen co-ordinate into canvas co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param y The screen/output y co-ordinate
* @return The screen co-ordinate translated to canvas unit co-ordinates
*
* This function takes in a vertical co-ordinate as the @p y parameter and
* converts it into canvas units, accounting for output size, viewport size
* and location, returning it as the function return value. If @p e is
* invalid, the results are undefined.
*
* Example:
* @code
* extern Evas *evas;
* extern int screen_y;
* double canvas_y;
*
* canvas_y = evas_coord_screen_y_to_world(evas, screen_y);
* @endcode
*/
double
evas_coord_screen_y_to_world(Evas *e, int y)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
return e->viewport.y + (((double)y * e->viewport.h) / (double)e->output.h);
}
/**
* Convert/scale a canvas co-ordinate into output screen co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param x The canvas x co-ordinate
* @return The output/screen co-ordinate translated to output co-ordinates
*
* This function takes in a horizontal co-ordinate as the @p x parameter and
* converts it into output units, accounting for output size, viewport size
* and location, returning it as the function return value. If @p e is
* invalid, the results are undefined.
*
* Example:
* @code
* extern Evas *evas;
* int screen_x;
* extern double canvas_x;
*
* screen_x = evas_coord_world_x_to_screen(evas, canvas_x);
* @endcode
*/
int
evas_coord_world_x_to_screen(Evas *e, double x)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
return (int)(((x - e->viewport.x) * (double)e->output.w) / e->viewport.w);
}
/**
* Convert/scale a canvas co-ordinate into output screen co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param y The canvas y co-ordinate
* @return The output/screen co-ordinate translated to output co-ordinates
*
* This function takes in a vertical co-ordinate as the @p x parameter and
* converts it into output units, accounting for output size, viewport size
* and location, returning it as the function return value. If @p e is
* invalid, the results are undefined.
*
* Example:
* @code
* extern Evas *evas;
* int screen_y;
* extern double canvas_y;
*
* screen_y = evas_coord_world_y_to_screen(evas, canvas_y);
* @endcode
*/
int
evas_coord_world_y_to_screen(Evas *e, double y)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
return (int)(((y - e->viewport.y) * (double)e->output.h) / e->viewport.h);
}
/**
* Look up a numeric ID from a string name of a rendering engine.
*
* @param name The string name of an engine
* @return A numeric (opaque) ID for the rendering engine
*
* This function looks up a numeric return value for the named engine in the
* string @p name. This is a normal C string, NUL byte terminated. The name
* is case sensitive. If the rendering engine is available, a numeric ID for
* that engine is returned that is no 0, if the engine is not available, 0
* is returned, indicating an invalid engine.
*
* The programmer should NEVER rely on the numeric ID an engine unless it is
* returned by this function. Programs should NOT be written accessing render
* method ID's directly, without first obtaining it from this function.
*
* Example:
* @code
* int engine_id;
* Evas *evas;
*
* evas = evas_new();
* if (!evas)
* {
* fprintf(stderr, "ERROR: Canvas creation failed. Fatal error.\n");
* exit(-1);
* }
* engine_id = evas_render_method_lookup("software_x11");
* if (!engine_id)
* {
* fprintf(stderr, "ERROR: Requested rendering engine is absent.\n");
* exit(-1);
* }
* evas_output_method_set(evas, engine_id);
* @endcode
*/
int
evas_render_method_lookup(const char *name)
{
if (!name) return RENDER_METHOD_INVALID;
#ifdef BUILD_ENGINE_SOFTWARE_X11
if (!strcmp(name, "software_x11")) return RENDER_METHOD_SOFTWARE_X11;
#endif
#ifdef BUILD_ENGINE_GL_X11
if (!strcmp(name, "gl_x11")) return RENDER_METHOD_GL_X11;
#endif
#ifdef BUILD_ENGINE_DIRECTFB
if (!strcmp(name, "directfb")) return RENDER_METHOD_DIRECTFB;
#endif
#ifdef BUILD_ENGINE_FB
if (!strcmp(name, "fb")) return RENDER_METHOD_FB;
#endif
#ifdef BUILD_ENGINE_SOFTWARE_WIN32_GDI
if (!strcmp(name, "software_win32_gdi")) return RENDER_METHOD_SOFTWARE_WIN32_GDI;
#endif
#ifdef BUILD_ENGINE_SOFTWARE_QTOPIA
if (!strcmp(name, "software_qtopia")) return RENDER_METHOD_SOFTWARE_QTOPIA;
#endif
return RENDER_METHOD_INVALID;
}
/**
* List all the rendering engines compiled into the copy of the Evas library
*
* @return A linked lst whose data members are C strings of engine names
*
* Calling this will return the program a handle (pointer) to an Evas linked
* list. Each node in the linked lists will have the data pointer be a char *
* pointer to the string name of the rendering engine available. The strings
* should never be modified, neither should the list be modified. This list
* should be cleaned up as soon as the program no longer needs it using
* evas_render_method_list_free(). If no engines are available from Evas, NULL
* will be returned.
*
* Example:
* @code
* Evas_List *engine_list, *l;
*
* engine_list = evas_render_method_list();
* if (!engine_list)
* {
* fprintf(stderr, "ERROR: Evas supports no engines! Exit.\n");
* exit(-1);
* }
* printf("Availible Evas Engines:\n");
* for (l = engine_list; l; l = l->next)
* {
* char *engine_name;
*
* engine_name = l->data;
* printf("%s\n", engine_name);
* }
* evas_render_method_list_free(engine_list);
* @endcode
*/
Evas_List *
evas_render_method_list(void)
{
Evas_List *methods = NULL;
#ifdef BUILD_ENGINE_SOFTWARE_X11
methods = evas_list_append(methods, strdup("software_x11"));
#endif
#ifdef BUILD_ENGINE_GL_X11
methods = evas_list_append(methods, strdup("gl_x11"));
#endif
#ifdef BUILD_ENGINE_DIRECTFB
methods = evas_list_append(methods, strdup("directfb"));
#endif
#ifdef BUILD_ENGINE_FB
methods = evas_list_append(methods, strdup("fb"));
#endif
#ifdef BBUILD_ENGINE_SOFTWARE_WIN32_GDI
methods = evas_list_append(methods, strdup("software_win32_gdi"));
#endif
#ifdef BBUILD_ENGINE_SOFTWARE_QTOPIA
methods = evas_list_append(methods, strdup("software_qtopia"));
#endif
return NULL;
}
/**
* This function should be called to free a list of engine names
*
* @param list The Evas_List base pointer for the engine list to be freed
*
* When this function is called it will free the engine list passed in as
* @p list. The list should only be a list of engines generated by calling
* evas_render_method_list(). If @p list is NULL, nothing will happen.
*
* Example:
* @code
* Evas_List *engine_list, *l;
*
* engine_list = evas_render_method_list();
* if (!engine_list)
* {
* fprintf(stderr, "ERROR: Evas supports no engines! Exit.\n");
* exit(-1);
* }
* printf("Availible Evas Engines:\n");
* for (l = engine_list; l; l = l->next)
* {
* char *engine_name;
*
* engine_name = l->data;
* printf("%s\n", engine_name);
* }
* evas_render_method_list_free(engine_list);
* @endcode
*/
void
evas_render_method_list_free(Evas_List *list)
{
while (list)
{
free(list->data);
list = evas_list_remove(list, list->data);
}
}
/**
* This function returns the current known pointer co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param x The pointer to an integer to be filled in
* @param y The pointer to an integer to be filled in
*
* This function returns the current known screen/output co-ordinates of the
* mouse pointer and sets the contents of the integers pointed to by @p x
* and @p y to contain these co-ordinates. If @p e is not a valid canvas the
* results of this function are undefined.
*
* Example:
* @code
* extern Evas *evas;
* int mouse_x, mouse_y;
*
* evas_pointer_output_xy_get(evas, &mouse_x, &mouse_y);
* printf("Mouse is at screen position %i, %i\n", mouse_x, mouse_y);
* @endcode
*/
void
evas_pointer_output_xy_get(Evas *e, int *x, int *y)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
if (x) *x = 0;
if (y) *y = 0;
return;
MAGIC_CHECK_END();
if (x) *x = e->pointer.x;
if (y) *y = e->pointer.y;
}
/**
* This function returns the current known pointer co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param x The pointer to a double to be filled in
* @param y The pointer to a double to be filled in
*
* This function returns the current known canvas unit co-ordinates of the
* mouse pointer and sets the contents of the doubles pointed to by @p x
* and @p y to contain these co-ordinates. If @p e is not a valid canvas the
* results of this function are undefined.
*
* Example:
* @code
* extern Evas *evas;
* double mouse_x, mouse_y;
*
* evas_pointer_output_xy_get(evas, &mouse_x, &mouse_y);
* printf("Mouse is at canvas position %f, %f\n", mouse_x, mouse_y);
* @endcode
*/
void
evas_pointer_canvas_xy_get(Evas *e, double *x, double *y)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
if (x) *x = 0;
if (y) *y = 0;
return;
MAGIC_CHECK_END();
if (x) *x = e->pointer.x;
if (y) *y = e->pointer.y;
}
/**
* Returns a bitmask with the mouse buttons currently pressed, set to 1
*
* @param e The pointer to the Evas Canvas
* @return A bitmask of the currently depressed buttons on the cavas
*
* Calling this function will retunr a 32-bit integer with the appropriate bits
* set to 1 that correspond to a mouse button being depressed. This limits
* Evas to a mouse devices with a maximum of 32 buttons, but that is generally
* in excess of any host systems pointing device abilities.
*
* A canvas by default begins with no mouse buttons being pressed and only
* calls to evas_event_feed_mouse_down(), evas_event_feed_mouse_down_data(),
* evas_event_feed_mouse_up() and evas_event_feed_mouse_up_data() will alter
* that.
*
* The least significant bit corresponds to the first mouse button (button 1)
* and the most significant bit corresponds to the last mouse button
* (button 32).
*
* If @p e is not a valid canvas, the return value is undefined.
*
* Example:
* @code
* extern Evas *evas;
* int button_mask, i;
*
* button_mask = evas_pointer_button_down_mask_get(evas);
* printf("Buttons currently pressed:\n");
* for (i = 0; i < 32; i++)
* {
* if ((button_mask & (1 << i)) != 0) printf("Button %i\n", i + 1);
* }
* @endcode
*/
int
evas_pointer_button_down_mask_get(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
return (int)e->pointer.button;
}
/**
* Returns if the mouse pointer is logically inside the canvas
*
* @param e The pointer to the Evas Canvas
* @return An integer (0 or 1) corresponding to the outside/inside pointer
*
* When this function is called it will return a value of either 0 or 1,
* depending on if evas_event_feed_mouse_in(), evas_event_feed_mouse_in_data(),
* or evas_event_feed_mouse_out(), evas_event_feed_mouse_out_data() have been
* called to feed in a mouse enter event into the canvas.
*
* A return value of 1 indicates the mouse is logically inside the canvas, and
* 0 implies it is logically outside the canvas.
*
* A canvas begins with the mouse being assumed outside (0).
*
* If @p e is not a valid canvas, the return value is undefined.
*
* Example:
* @code
* extern Evas *evas;
*
* if (evas_pointer_inside_get(evas)) printf("Mouse is in!\n");
* else printf("Mouse is out\n");
* @endcode
*/
int
evas_pointer_inside_get(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
return (int)e->pointer.inside;
}

View File

@ -0,0 +1,41 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
void
evas_object_name_set(Evas_Object *obj, const char *name)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (obj->name)
{
obj->layer->evas->name_hash = evas_hash_del(obj->layer->evas->name_hash, obj->name, obj);
free(obj->name);
}
if (!name) obj->name = NULL;
else
{
obj->name = strdup(name);
obj->layer->evas->name_hash = evas_hash_add(obj->layer->evas->name_hash, obj->name, obj);
}
}
char *
evas_object_name_get(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
return obj->name;
}
Evas_Object *
evas_object_name_find(Evas *e, const char *name)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
if (!name) return NULL;
return (Evas_Object *)evas_hash_find(e->name_hash, name);
}

View File

@ -0,0 +1,373 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
/* private magic number for gradient objects */
static const char o_type[] = "gradient";
/* private struct for gradient object internal data */
typedef struct _Evas_Object_Gradient Evas_Object_Gradient;
struct _Evas_Object_Gradient
{
DATA32 magic;
struct {
double angle;
} cur, prev;
int changed : 1;
int gradient_changed : 1;
int gradient_opaque : 1;
void *engine_data;
};
/* private methods for gradient objects */
static void evas_object_gradient_init(Evas_Object *obj);
static void *evas_object_gradient_new(void);
static void evas_object_gradient_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
static void evas_object_gradient_free(Evas_Object *obj);
static void evas_object_gradient_render_pre(Evas_Object *obj);
static void evas_object_gradient_render_post(Evas_Object *obj);
static int evas_object_gradient_is_opaque(Evas_Object *obj);
static int evas_object_gradient_was_opaque(Evas_Object *obj);
static Evas_Object_Func object_func =
{
/* methods (compulsory) */
evas_object_gradient_free,
evas_object_gradient_render,
evas_object_gradient_render_pre,
evas_object_gradient_render_post,
/* these are optional. NULL = nothing */
NULL,
NULL,
NULL,
NULL,
evas_object_gradient_is_opaque,
evas_object_gradient_was_opaque,
NULL,
NULL,
NULL
};
/* the actual api call to add a rect */
/* it has no other api calls as all properties are standard */
Evas_Object *
evas_object_gradient_add(Evas *e)
{
Evas_Object *obj;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
obj = evas_object_new();
evas_object_gradient_init(obj);
evas_object_inject(obj, e);
return obj;
}
void
evas_object_gradient_color_add(Evas_Object *obj, int r, int g, int b, int a, int distance)
{
Evas_Object_Gradient *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Gradient *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
return;
MAGIC_CHECK_END();
o->engine_data = obj->layer->evas->engine.func->gradient_color_add(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context,
o->engine_data,
r, g, b, a,
distance);
o->gradient_changed = 1;
if (a != 255) o->gradient_opaque = 0;
evas_object_change(obj);
}
void
evas_object_gradient_colors_clear(Evas_Object *obj)
{
Evas_Object_Gradient *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Gradient *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
return;
MAGIC_CHECK_END();
o->engine_data = obj->layer->evas->engine.func->gradient_colors_clear(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context,
o->engine_data);
o->gradient_changed = 1;
o->gradient_opaque = 1;
evas_object_change(obj);
}
void
evas_object_gradient_angle_set(Evas_Object *obj, double angle)
{
Evas_Object_Gradient *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Gradient *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
return;
MAGIC_CHECK_END();
if (angle == o->cur.angle) return;
o->cur.angle = angle;
o->changed = 1;
evas_object_change(obj);
}
double
evas_object_gradient_angle_get(Evas_Object *obj)
{
Evas_Object_Gradient *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0.0;
MAGIC_CHECK_END();
o = (Evas_Object_Gradient *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
return 0.0;
MAGIC_CHECK_END();
return o->cur.angle;
evas_object_change(obj);
}
/* all nice and private */
static void
evas_object_gradient_init(Evas_Object *obj)
{
/* alloc image ob, setup methods and default values */
obj->object_data = evas_object_gradient_new();
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0.0;
obj->cur.geometry.y = 0.0;
obj->cur.geometry.w = 32.0;
obj->cur.geometry.h = 32.0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */
obj->func = &object_func;
obj->type = o_type;
}
static void *
evas_object_gradient_new(void)
{
Evas_Object_Gradient *o;
/* alloc obj private data */
o = calloc(1, sizeof(Evas_Object_Gradient));
o->magic = MAGIC_OBJ_GRADIENT;
o->cur.angle = 0.0;
o->prev = o->cur;
o->gradient_opaque = 1;
return o;
}
static void
evas_object_gradient_free(Evas_Object *obj)
{
Evas_Object_Gradient *o;
/* frees private object data. very simple here */
o = (Evas_Object_Gradient *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
return;
MAGIC_CHECK_END();
/* free obj */
o->engine_data = obj->layer->evas->engine.func->gradient_colors_clear(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context,
o->engine_data);
o->magic = 0;
free(o);
}
static void
evas_object_gradient_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
{
Evas_Object_Gradient *o;
/* render object to surface with context, and offxet by x,y */
o = (Evas_Object_Gradient *)(obj->object_data);
obj->layer->evas->engine.func->context_color_set(output,
context,
255, 255, 255, 255);
if ((obj->cur.cache.clip.r == 255) &&
(obj->cur.cache.clip.g == 255) &&
(obj->cur.cache.clip.b == 255) &&
(obj->cur.cache.clip.a == 255))
obj->layer->evas->engine.func->context_multiplier_unset(output,
context);
else
obj->layer->evas->engine.func->context_multiplier_set(output,
context,
obj->cur.cache.clip.r,
obj->cur.cache.clip.g,
obj->cur.cache.clip.b,
obj->cur.cache.clip.a);
if (o->engine_data)
obj->layer->evas->engine.func->gradient_draw(output,
context,
surface,
o->engine_data,
obj->cur.cache.geometry.x + x,
obj->cur.cache.geometry.y + y,
obj->cur.cache.geometry.w,
obj->cur.cache.geometry.h,
o->cur.angle);
}
static void
evas_object_gradient_render_pre(Evas_Object *obj)
{
Evas_List *updates = NULL;
Evas_Object_Gradient *o;
int is_v, was_v;
/* dont pre-render the obj twice! */
if (obj->pre_render_done) return;
obj->pre_render_done = 1;
/* pre-render phase. this does anything an object needs to do just before */
/* rendering. this could mean loading the image data, retrieving it from */
/* elsewhere, decoding video etc. */
/* then when this is done the object needs to figure if it changed and */
/* if so what and where and add thr appropriate redraw rectangles */
o = (Evas_Object_Gradient *)(obj->object_data);
/* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper)
{
evas_object_clip_recalc(obj->cur.clipper);
obj->cur.clipper->func->render_pre(obj->cur.clipper);
}
/* now figure what changed and add draw rects */
/* if it just became visible or invisible */
is_v = evas_object_is_visible(obj);
was_v = evas_object_was_visible(obj);
if (is_v != was_v)
{
updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
goto done;
}
/* its not visible - we accounted for it appearing or not so just abort */
if (!is_v) goto done;
/* clipper changed this is in addition to anything else for obj */
updates = evas_object_render_pre_clipper_change(updates, obj);
/* if we restacked (layer or just within a layer) and dont clip anyone */
if (obj->restack)
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* if it changed color */
if ((obj->cur.color.r != obj->prev.color.r) ||
(obj->cur.color.g != obj->prev.color.g) ||
(obj->cur.color.b != obj->prev.color.b) ||
(obj->cur.color.a != obj->prev.color.a))
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* if it changed geometry - and obviously not visibility or color */
/* caluclate differences since we have a constant color fill */
/* we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h))
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* angle changed */
if ((o->changed) && (o->cur.angle != o->prev.angle))
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* angle changed */
if (o->gradient_changed)
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* it obviously didn't change - add a NO obscure - this "unupdates" this */
/* area so if there were updates for it they get wiped. don't do it if we */
/* arent fully opaque and we are visible */
if (evas_object_is_visible(obj) &&
evas_object_is_opaque(obj))
obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
obj->cur.cache.clip.x,
obj->cur.cache.clip.y,
obj->cur.cache.clip.w,
obj->cur.cache.clip.h);
done:
evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
}
static void
evas_object_gradient_render_post(Evas_Object *obj)
{
Evas_Object_Gradient *o;
/* this moves the current data to the previous state parts of the object */
/* in whatever way is safest for the object. also if we don't need object */
/* data anymore we can free it if the object deems this is a good idea */
o = (Evas_Object_Gradient *)(obj->object_data);
/* remove those pesky changes */
while (obj->clip.changes)
{
Evas_Rectangle *r;
r = (Evas_Rectangle *)obj->clip.changes->data;
obj->clip.changes = evas_list_remove(obj->clip.changes, r);
free(r);
}
/* move cur to prev safely for object data */
obj->prev = obj->cur;
o->prev = o->cur;
o->changed = 0;
o->gradient_changed = 0;
}
static int
evas_object_gradient_is_opaque(Evas_Object *obj)
{
Evas_Object_Gradient *o;
/* this returns 1 if the internal object data implies that the object is */
/* currently fulyl opque over the entire gradient it occupies */
o = (Evas_Object_Gradient *)(obj->object_data);
return o->gradient_opaque;
}
static int
evas_object_gradient_was_opaque(Evas_Object *obj)
{
Evas_Object_Gradient *o;
/* this returns 1 if the internal object data implies that the object was */
/* currently fulyl opque over the entire gradient it occupies */
o = (Evas_Object_Gradient *)(obj->object_data);
return o->gradient_opaque;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,399 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
/* private magic number for line objects */
static const char o_type[] = "line";
/* private struct for line object internal data */
typedef struct _Evas_Object_Line Evas_Object_Line;
struct _Evas_Object_Line
{
DATA32 magic;
struct {
struct {
int x1, y1, x2, y2;
struct {
double w, h;
} object;
} cache;
double x1, y1, x2, y2;
} cur, prev;
int changed : 1;
void *engine_data;
};
/* private methods for line objects */
static void evas_object_line_init(Evas_Object *obj);
static void *evas_object_line_new(void);
static void evas_object_line_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
static void evas_object_line_free(Evas_Object *obj);
static void evas_object_line_render_pre(Evas_Object *obj);
static void evas_object_line_render_post(Evas_Object *obj);
static int evas_object_line_is_opaque(Evas_Object *obj);
static int evas_object_line_was_opaque(Evas_Object *obj);
static int evas_object_line_is_inside(Evas_Object *obj, double x, double y);
static int evas_object_line_was_inside(Evas_Object *obj, double x, double y);
static void evas_object_line_coords_recalc(Evas_Object *obj);
static Evas_Object_Func object_func =
{
/* methods (compulsory) */
evas_object_line_free,
evas_object_line_render,
evas_object_line_render_pre,
evas_object_line_render_post,
/* these are optional. NULL = nothing */
NULL,
NULL,
NULL,
NULL,
evas_object_line_is_opaque,
evas_object_line_was_opaque,
evas_object_line_is_inside,
evas_object_line_was_inside,
evas_object_line_coords_recalc
};
/* the actual api call to add a rect */
/* it has no other api calls as all properties are standard */
Evas_Object *
evas_object_line_add(Evas *e)
{
Evas_Object *obj;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
obj = evas_object_new();
evas_object_line_init(obj);
evas_object_inject(obj, e);
return obj;
}
void
evas_object_line_xy_set(Evas_Object *obj, double x1, double y1, double x2, double y2)
{
Evas_Object_Line *o;
double min_x, max_x, min_y, max_y;
int is, was;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Line *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Line, MAGIC_OBJ_LINE);
return;
MAGIC_CHECK_END();
if ((x1 == o->cur.x1) && (y1 == o->cur.y1) &&
(x2 == o->cur.x2) && (y2 == o->cur.y2)) return;
was = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
if (x1 < x2)
{
min_x = x1;
max_x = x2;
}
else
{
min_x = x2;
max_x = x1;
}
if (y1 < y2)
{
min_y = y1;
max_y = y2;
}
else
{
min_y = y2;
max_y = y1;
}
obj->cur.geometry.x = min_x;
obj->cur.geometry.y = min_y;
obj->cur.geometry.w = max_x - min_x + 2.0;
obj->cur.geometry.h = max_y - min_y + 2.0;
obj->cur.cache.geometry.validity = 0;
o->cur.x1 = x1 - min_x;
o->cur.y1 = y1 - min_y;
o->cur.x2 = x2 - min_x;
o->cur.y2 = y2 - min_y;
o->changed = 1;
evas_object_change(obj);
evas_object_coords_recalc(obj);
is = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
if ((is ^ was) && obj->cur.visible)
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
void
evas_object_line_xy_get(Evas_Object *obj, double *x1, double *y1, double *x2, double *y2)
{
Evas_Object_Line *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
if (x1) *x1 = 0.0;
if (y1) *y1 = 0.0;
if (x2) *x2 = 0.0;
if (y2) *y2 = 0.0;
return;
MAGIC_CHECK_END();
o = (Evas_Object_Line *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Line, MAGIC_OBJ_LINE);
if (x1) *x1 = 0.0;
if (y1) *y1 = 0.0;
if (x2) *x2 = 0.0;
if (y2) *y2 = 0.0;
return;
MAGIC_CHECK_END();
if (x1) *x1 = obj->cur.geometry.x + o->cur.x1;
if (y1) *y1 = obj->cur.geometry.y + o->cur.y1;
if (x2) *x2 = obj->cur.geometry.x + o->cur.x2;
if (y2) *y2 = obj->cur.geometry.y + o->cur.y2;
}
/* all nice and private */
static void
evas_object_line_init(Evas_Object *obj)
{
/* alloc image ob, setup methods and default values */
obj->object_data = evas_object_line_new();
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0.0;
obj->cur.geometry.y = 0.0;
obj->cur.geometry.w = 32.0;
obj->cur.geometry.h = 32.0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */
obj->func = &object_func;
obj->type = o_type;
}
static void *
evas_object_line_new(void)
{
Evas_Object_Line *o;
/* alloc obj private data */
o = calloc(1, sizeof(Evas_Object_Line));
o->magic = MAGIC_OBJ_LINE;
o->cur.x1 = 0.0;
o->cur.y1 = 0.0;
o->cur.x2 = 31.0;
o->cur.y2 = 31.0;
o->prev = o->cur;
return o;
}
static void
evas_object_line_free(Evas_Object *obj)
{
Evas_Object_Line *o;
/* frees private object data. very simple here */
o = (Evas_Object_Line *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Line, MAGIC_OBJ_LINE);
return;
MAGIC_CHECK_END();
/* free obj */
o->magic = 0;
free(o);
}
static void
evas_object_line_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
{
Evas_Object_Line *o;
/* render object to surface with context, and offxet by x,y */
o = (Evas_Object_Line *)(obj->object_data);
obj->layer->evas->engine.func->context_color_set(output,
context,
obj->cur.cache.clip.r,
obj->cur.cache.clip.g,
obj->cur.cache.clip.b,
obj->cur.cache.clip.a);
obj->layer->evas->engine.func->context_multiplier_unset(output,
context);
obj->layer->evas->engine.func->line_draw(output,
context,
surface,
o->cur.cache.x1 + x,
o->cur.cache.y1 + y,
o->cur.cache.x2 + x,
o->cur.cache.y2 + y);
}
static void
evas_object_line_render_pre(Evas_Object *obj)
{
Evas_List *updates = NULL;
Evas_Object_Line *o;
int is_v, was_v;
/* dont pre-render the obj twice! */
if (obj->pre_render_done) return;
obj->pre_render_done = 1;
/* pre-render phase. this does anything an object needs to do just before */
/* rendering. this could mean loading the image data, retrieving it from */
/* elsewhere, decoding video etc. */
/* then when this is done the object needs to figure if it changed and */
/* if so what and where and add thr appropriate redraw lines */
o = (Evas_Object_Line *)(obj->object_data);
/* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper)
{
evas_object_clip_recalc(obj->cur.clipper);
obj->cur.clipper->func->render_pre(obj->cur.clipper);
}
/* now figure what changed and add draw rects */
/* if it just became visible or invisible */
is_v = evas_object_is_visible(obj);
was_v = evas_object_was_visible(obj);
if (is_v != was_v)
{
updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
goto done;
}
/* its not visible - we accounted for it appearing or not so just abort */
if (!is_v) goto done;
/* clipper changed this is in addition to anything else for obj */
updates = evas_object_render_pre_clipper_change(updates, obj);
/* if we restacked (layer or just within a layer) */
if (obj->restack)
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* if it changed color */
if ((obj->cur.color.r != obj->prev.color.r) ||
(obj->cur.color.g != obj->prev.color.g) ||
(obj->cur.color.b != obj->prev.color.b) ||
(obj->cur.color.a != obj->prev.color.a))
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* if it changed geometry - and obviously not visibility or color */
/* caluclate differences since we have a constant color fill */
/* we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h) ||
((o->changed) &&
((o->cur.x1 != o->prev.x1) ||
(o->cur.y1 != o->prev.y1) ||
(o->cur.x2 != o->prev.x2) ||
(o->cur.y2 != o->prev.y2)))
)
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
done:
evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
}
static void
evas_object_line_render_post(Evas_Object *obj)
{
Evas_Object_Line *o;
/* this moves the current data to the previous state parts of the object */
/* in whatever way is safest for the object. also if we don't need object */
/* data anymore we can free it if the object deems this is a good idea */
o = (Evas_Object_Line *)(obj->object_data);
/* remove those pesky changes */
while (obj->clip.changes)
{
Evas_Rectangle *r;
r = (Evas_Rectangle *)obj->clip.changes->data;
obj->clip.changes = evas_list_remove(obj->clip.changes, r);
free(r);
}
/* move cur to prev safely for object data */
obj->prev = obj->cur;
o->prev = o->cur;
o->changed = 0;
}
static int
evas_object_line_is_opaque(Evas_Object *obj)
{
Evas_Object_Line *o;
/* this returns 1 if the internal object data implies that the object is */
/* currently fulyl opque over the entire line it occupies */
o = (Evas_Object_Line *)(obj->object_data);
return 0;
}
static int
evas_object_line_was_opaque(Evas_Object *obj)
{
Evas_Object_Line *o;
/* this returns 1 if the internal object data implies that the object was */
/* currently fulyl opque over the entire line it occupies */
o = (Evas_Object_Line *)(obj->object_data);
return 0;
}
static int
evas_object_line_is_inside(Evas_Object *obj, double x, double y)
{
Evas_Object_Line *o;
/* this returns 1 if the canvas co-ordinates are inside the object based */
/* on object private data. not much use for rects, but for polys images */
/* and other complex objects it might be */
o = (Evas_Object_Line *)(obj->object_data);
return 1;
x = 0;
y = 0;
}
static int
evas_object_line_was_inside(Evas_Object *obj, double x, double y)
{
Evas_Object_Line *o;
/* this returns 1 if the canvas co-ordinates were inside the object based */
/* on object private data. not much use for rects, but for polys images */
/* and other complex objects it might be */
o = (Evas_Object_Line *)(obj->object_data);
return 1;
x = 0;
y = 0;
}
static void
evas_object_line_coords_recalc(Evas_Object *obj)
{
Evas_Object_Line *o;
o = (Evas_Object_Line *)(obj->object_data);
o->cur.cache.x1 = evas_coord_world_x_to_screen(obj->layer->evas, obj->cur.geometry.x + o->cur.x1);
o->cur.cache.y1 = evas_coord_world_y_to_screen(obj->layer->evas, obj->cur.geometry.y + o->cur.y1);
o->cur.cache.x2 = evas_coord_world_x_to_screen(obj->layer->evas, obj->cur.geometry.x + o->cur.x2);
o->cur.cache.y2 = evas_coord_world_y_to_screen(obj->layer->evas, obj->cur.geometry.y + o->cur.y2);
o->cur.cache.object.w = obj->cur.geometry.w;
o->cur.cache.object.h = obj->cur.geometry.h;
}

View File

@ -0,0 +1,833 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
/* evas internal stuff */
Evas_Object *
evas_object_new(void)
{
Evas_Object *obj;
obj = calloc(1, sizeof(Evas_Object));
if (!obj) return NULL;
obj->magic = MAGIC_OBJ;
return obj;
}
void
evas_object_free(Evas_Object *obj, int clean_layer)
{
evas_object_event_callback_call(obj, EVAS_CALLBACK_FREE, NULL);
evas_object_smart_cleanup(obj);
obj->func->free(obj);
if (obj->name)
evas_object_name_set(obj, NULL);
evas_object_release(obj, clean_layer);
if (obj->name)
{
free(obj->name);
obj->name = NULL;
}
if (obj->clip.clipees)
evas_list_free(obj->clip.clipees);
while (obj->clip.changes)
{
Evas_Rectangle *r;
r = (Evas_Rectangle *)obj->clip.changes->data;
obj->clip.changes = evas_list_remove(obj->clip.changes, r);
free(r);
}
while (obj->callbacks.in)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.in;
obj->callbacks.in = evas_object_list_remove(obj->callbacks.in, fn);
free(fn);
}
while (obj->callbacks.out)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.out;
obj->callbacks.out = evas_object_list_remove(obj->callbacks.out, fn);
free(fn);
}
while (obj->callbacks.down)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.down;
obj->callbacks.down = evas_object_list_remove(obj->callbacks.down, fn);
free(fn);
}
while (obj->callbacks.up)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.up;
obj->callbacks.up = evas_object_list_remove(obj->callbacks.up, fn);
free(fn);
}
while (obj->callbacks.move)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.move;
obj->callbacks.move = evas_object_list_remove(obj->callbacks.move, fn);
free(fn);
}
while (obj->callbacks.free)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.free;
obj->callbacks.free = evas_object_list_remove(obj->callbacks.free, fn);
free(fn);
}
while (obj->data.elements)
{
Evas_Data_Node *node;
node = obj->data.elements->data;
obj->data.elements = evas_list_remove(obj->data.elements, node);
free(node->key);
free(node);
}
obj->magic = 0;
free(obj);
}
void
evas_object_change(Evas_Object *obj)
{
Evas_List *l;
if (obj->smart.smart) return;
if (!((obj->cur.visible != obj->prev.visible) || (obj->cur.visible)))
return;
if (obj->changed) return;
obj->changed = 1;
obj->layer->evas->changed = 1;
/* set changed flag on all objects this one clips too */
for (l = obj->clip.clipees; l; l = l->next)
{
Evas_Object *o;
o = (Evas_Object *)l->data;
evas_object_change(o);
}
}
Evas_List *
evas_object_render_pre_visible_change(Evas_List *updates, Evas_Object *obj, int is_v, int was_v)
{
Evas_Rectangle *r;
if (obj->smart.smart) return updates;
if (is_v == was_v) return updates;
if (is_v)
{
NEW_RECT(r,
obj->cur.cache.clip.x,
obj->cur.cache.clip.y,
obj->cur.cache.clip.w,
obj->cur.cache.clip.h);
if (r) updates = evas_list_append(updates, r);
}
else
{
NEW_RECT(r,
obj->prev.cache.clip.x,
obj->prev.cache.clip.y,
obj->prev.cache.clip.w,
obj->prev.cache.clip.h);
if (r) updates = evas_list_append(updates, r);
}
return updates;
}
Evas_List *
evas_object_render_pre_clipper_change(Evas_List *updates, Evas_Object *obj)
{
Evas_Rectangle *r;
Evas_List *rl;
if (obj->smart.smart) return updates;
if (obj->cur.clipper == obj->prev.clipper) return updates;
if ((obj->cur.clipper) && (obj->prev.clipper))
{
/* get difference rects between clippers */
rl = evas_rects_return_difference_rects(obj->cur.clipper->cur.cache.clip.x,
obj->cur.clipper->cur.cache.clip.y,
obj->cur.clipper->cur.cache.clip.w,
obj->cur.clipper->cur.cache.clip.h,
obj->prev.clipper->prev.cache.clip.x,
obj->prev.clipper->prev.cache.clip.y,
obj->prev.clipper->prev.cache.clip.w,
obj->prev.clipper->prev.cache.clip.h);
/* go thru every difference rect */
while (rl)
{
r = rl->data;
rl = evas_list_remove(rl, r);
updates = evas_list_append(updates, r);
}
}
else if (obj->cur.clipper)
{
rl = evas_rects_return_difference_rects(obj->cur.cache.geometry.x,
obj->cur.cache.geometry.y,
obj->cur.cache.geometry.w,
obj->cur.cache.geometry.h,
obj->cur.clipper->cur.cache.clip.x,
obj->cur.clipper->cur.cache.clip.y,
obj->cur.clipper->cur.cache.clip.w,
obj->cur.clipper->cur.cache.clip.h);
while (rl)
{
r = rl->data;
rl = evas_list_remove(rl, r);
updates = evas_list_append(updates, r);
}
}
else if (obj->prev.clipper)
{
rl = evas_rects_return_difference_rects(obj->prev.cache.geometry.x,
obj->prev.cache.geometry.y,
obj->prev.cache.geometry.w,
obj->prev.cache.geometry.h,
obj->prev.clipper->prev.cache.clip.x,
obj->prev.clipper->prev.cache.clip.y,
obj->prev.clipper->prev.cache.clip.w,
obj->prev.clipper->prev.cache.clip.h);
while (rl)
{
r = rl->data;
rl = evas_list_remove(rl, r);
updates = evas_list_append(updates, r);
}
}
return updates;
}
Evas_List *
evas_object_render_pre_prev_cur_add(Evas_List *updates, Evas_Object *obj)
{
Evas_Rectangle *r;
NEW_RECT(r,
obj->cur.cache.geometry.x,
obj->cur.cache.geometry.y,
obj->cur.cache.geometry.w,
obj->cur.cache.geometry.h);
if (r) updates = evas_list_append(updates, r);
NEW_RECT(r,
obj->prev.cache.geometry.x,
obj->prev.cache.geometry.y,
obj->prev.cache.geometry.w,
obj->prev.cache.geometry.h);
if (r) updates = evas_list_append(updates, r);
return updates;
}
void
evas_object_render_pre_effect_updates(Evas_List *updates, Evas_Object *obj, int is_v, int was_v)
{
Evas_Rectangle *r;
int x, y, w, h;
Evas_Object *clipper;
Evas_List *l;
if (obj->smart.smart) return;
/* FIXME: was_v isn't used... why? */
was_v = 0;
if (!obj->clip.clipees)
{
while (updates)
{
r = (Evas_Rectangle *)(updates->data);
updates = evas_list_remove(updates, r);
/* get updates and clip to current clip */
x = r->x; y = r->y; w = r->w; h = r->h;
RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.cache.clip.x,
obj->cur.cache.clip.y,
obj->cur.cache.clip.w,
obj->cur.cache.clip.h);
if ((w > 0) && (h > 0))
obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
x, y, w, h);
/* get updates and clip to previous clip */
x = r->x; y = r->y; w = r->w; h = r->h;
RECTS_CLIP_TO_RECT(x, y, w, h,
obj->prev.cache.clip.x,
obj->prev.cache.clip.y,
obj->prev.cache.clip.w,
obj->prev.cache.clip.h);
if ((w > 0) && (h > 0))
obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
x, y, w, h);
free(r);
r = NULL;
}
/* if the object is actually visible, take any parent clip changes */
if (is_v)
{
clipper = obj->cur.clipper;
while (clipper)
{
for (l = clipper->clip.changes; l; l = l->next)
{
r = (Evas_Rectangle *)(l->data);
/* get updates and clip to current clip */
x = r->x; y = r->y; w = r->w; h = r->h;
RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.cache.clip.x,
obj->cur.cache.clip.y,
obj->cur.cache.clip.w,
obj->cur.cache.clip.h);
if ((w > 0) && (h > 0))
obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
x, y, w, h);
/* get updates and clip to previous clip */
x = r->x; y = r->y; w = r->w; h = r->h;
RECTS_CLIP_TO_RECT(x, y, w, h,
obj->prev.cache.clip.x,
obj->prev.cache.clip.y,
obj->prev.cache.clip.w,
obj->prev.cache.clip.h);
if ((w > 0) && (h > 0))
obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
x, y, w, h);
}
clipper = clipper->cur.clipper;
}
}
}
else
{
while (obj->clip.changes)
{
free(obj->clip.changes->data);
obj->clip.changes = evas_list_remove(obj->clip.changes, obj->clip.changes->data);
}
obj->clip.changes = updates;
}
}
void
evas_object_coords_recalc(Evas_Object *obj)
{
if (obj->smart.smart) return;
if (obj->cur.cache.geometry.validity == obj->layer->evas->output_validity)
return;
obj->cur.cache.geometry.x =
evas_coord_world_x_to_screen(obj->layer->evas, obj->cur.geometry.x);
obj->cur.cache.geometry.y =
evas_coord_world_y_to_screen(obj->layer->evas, obj->cur.geometry.y);
obj->cur.cache.geometry.w =
evas_coord_world_x_to_screen(obj->layer->evas,
obj->cur.geometry.x + obj->cur.geometry.w)
- obj->cur.cache.geometry.x;
obj->cur.cache.geometry.h =
evas_coord_world_x_to_screen(obj->layer->evas,
obj->cur.geometry.y + obj->cur.geometry.h)
- obj->cur.cache.geometry.y;
if (obj->func->coords_recalc) obj->func->coords_recalc(obj);
obj->cur.cache.geometry.validity = obj->layer->evas->output_validity;
}
int
evas_object_is_active(Evas_Object *obj)
{
if (obj->smart.smart) return 0;
if ((evas_object_is_in_output_rect(obj, 0, 0,
obj->layer->evas->output.w,
obj->layer->evas->output.h) ||
evas_object_was_in_output_rect(obj, 0, 0,
obj->layer->evas->output.w,
obj->layer->evas->output.h)) &&
(evas_object_is_visible(obj) ||
evas_object_was_visible(obj)))
return 1;
return 0;
}
int
evas_object_is_in_output_rect(Evas_Object *obj, int x, int y, int w, int h)
{
if (obj->smart.smart) return 0;
/* assumes coords have been recalced */
if ((RECTS_INTERSECT(x, y, w, h,
obj->cur.cache.clip.x,
obj->cur.cache.clip.y,
obj->cur.cache.clip.w,
obj->cur.cache.clip.h)))
return 1;
return 0;
}
int
evas_object_was_in_output_rect(Evas_Object *obj, int x, int y, int w, int h)
{
if (obj->smart.smart) return 0;
/* assumes coords have been recalced */
if ((RECTS_INTERSECT(x, y, w, h,
obj->prev.cache.clip.x,
obj->prev.cache.clip.y,
obj->prev.cache.clip.w,
obj->prev.cache.clip.h)))
return 1;
return 0;
}
int
evas_object_is_visible(Evas_Object *obj)
{
if (obj->smart.smart) return 0;
if ((obj->cur.visible) &&
(obj->cur.cache.clip.visible) &&
(obj->cur.cache.clip.a > 0))
{
if (obj->func->is_visible)
return obj->func->is_visible(obj);
return 1;
}
return 0;
}
int
evas_object_was_visible(Evas_Object *obj)
{
if (obj->smart.smart) return 0;
if ((obj->prev.visible) &&
(obj->prev.cache.clip.visible) &&
(obj->prev.cache.clip.a > 0))
{
if (obj->func->was_visible)
return obj->func->was_visible(obj);
return 1;
}
return 0;
}
int
evas_object_is_opaque(Evas_Object *obj)
{
if (obj->smart.smart) return 0;
if (obj->cur.cache.clip.a == 255)
{
if (obj->func->is_opaque)
return obj->func->is_opaque(obj);
return 1;
}
return 0;
}
int
evas_object_was_opaque(Evas_Object *obj)
{
if (obj->smart.smart) return 0;
if (obj->prev.cache.clip.a == 255)
{
if (obj->func->was_opaque)
return obj->func->was_opaque(obj);
return 1;
}
return 0;
}
/* routines apps will call */
void
evas_object_del(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!obj->layer)
{
evas_object_free(obj, 1);
return;
}
evas_object_hide(obj);
while (obj->clip.clipees) evas_object_clip_unset(obj->clip.clipees->data);
if (obj->cur.clipper) evas_object_clip_unset(obj);
evas_object_change(obj);
obj->delete_me = 1;
if (obj->smart.smart) evas_object_smart_del(obj);
}
void
evas_object_move(Evas_Object *obj, double x, double y)
{
int is, was;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (obj->smart.smart)
{
if (obj->smart.smart->func_move)
obj->smart.smart->func_move(obj, x, y);
}
if ((obj->cur.geometry.x == x) &&
(obj->cur.geometry.y == y)) return;
was = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
obj->cur.geometry.x = x;
obj->cur.geometry.y = y;
obj->cur.cache.geometry.validity = 0;
evas_object_change(obj);
evas_object_recalc_clippees(obj);
if (!obj->smart.smart)
{
is = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
if ((is ^ was) && obj->cur.visible)
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
}
void
evas_object_resize(Evas_Object *obj, double w, double h)
{
int is, was;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (w < 0.0) w = 0.0; if (h < 0.0) h = 0.0;
if (obj->smart.smart)
{
if (obj->smart.smart->func_resize)
obj->smart.smart->func_resize(obj, w, h);
}
if ((obj->cur.geometry.w == w) &&
(obj->cur.geometry.h == h)) return;
was = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
obj->cur.geometry.w = w;
obj->cur.geometry.h = h;
obj->cur.cache.geometry.validity = 0;
evas_object_change(obj);
evas_object_recalc_clippees(obj);
if (!obj->smart.smart)
{
is = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
if ((is ^ was) && (obj->cur.visible))
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
}
void
evas_object_geometry_get(Evas_Object *obj, double *x, double *y, double *w, double *h)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
if (x) *x = 0; if (y) *y = 0; if (w) *w = 0; if (h) *h = 0;
return;
MAGIC_CHECK_END();
if (x) *x = obj->cur.geometry.x;
if (y) *y = obj->cur.geometry.y;
if (w) *w = obj->cur.geometry.w;
if (h) *h = obj->cur.geometry.h;
}
void
evas_object_show(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (obj->smart.smart)
{
if (obj->smart.smart->func_show)
obj->smart.smart->func_show(obj);
}
if (obj->cur.visible) return;
obj->cur.visible = 1;
evas_object_change(obj);
evas_object_recalc_clippees(obj);
if (!obj->smart.smart)
{
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1))
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
}
void
evas_object_hide(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (obj->smart.smart)
{
if (obj->smart.smart->func_hide)
obj->smart.smart->func_hide(obj);
}
if (!obj->cur.visible) return;
obj->cur.visible = 0;
evas_object_change(obj);
evas_object_recalc_clippees(obj);
if (!obj->smart.smart)
{
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1))
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
/* if ((obj->mouse_in) || (obj->mouse_grabbed)) */
{
obj->mouse_in = 0;
obj->mouse_grabbed = 0;
obj->layer->evas->pointer.object.in = evas_list_remove(obj->layer->evas->pointer.object.in, obj);
if (obj->layer->evas->events_frozen > 0) return;
if (obj->mouse_in)
{
Evas_Event_Mouse_Out ev;
ev.buttons = obj->layer->evas->pointer.button;
ev.output.x = obj->layer->evas->pointer.x;
ev.output.y = obj->layer->evas->pointer.y;
ev.canvas.x = obj->layer->evas->pointer.canvas_x;
ev.canvas.y = obj->layer->evas->pointer.canvas_y;
ev.data = NULL;
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
}
}
}
}
int
evas_object_visible_get(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
return obj->cur.visible;
}
void
evas_object_color_set(Evas_Object *obj, int r, int g, int b, int a)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (r > 255) r = 255; if (r < 0) r = 0;
if (g > 255) g = 255; if (g < 0) g = 0;
if (b > 255) b = 255; if (b < 0) b = 0;
if (a > 255) a = 255; if (a < 0) a = 0;
if (obj->smart.smart)
{
if (obj->smart.smart->func_color_set)
obj->smart.smart->func_color_set(obj, r, g, b, a);
}
if ((obj->cur.color.r == r) &&
(obj->cur.color.g == g) &&
(obj->cur.color.b == b) &&
(obj->cur.color.a == a)) return;
obj->cur.color.r = r;
obj->cur.color.g = g;
obj->cur.color.b = b;
obj->cur.color.a = a;
if ((obj->cur.color.a == 0) && (a == 0)) return;
evas_object_change(obj);
}
void
evas_object_color_get(Evas_Object *obj, int *r, int *g, int *b, int *a)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
if (r) *r = 0; if (g) *g = 0; if (b) *b = 0; if (a) *a = 0;
return;
MAGIC_CHECK_END();
if (r) *r = obj->cur.color.r;
if (g) *g = obj->cur.color.g;
if (b) *b = obj->cur.color.b;
if (a) *a = obj->cur.color.a;
}
Evas *
evas_object_evas_get(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
return obj->layer->evas;
}
Evas_Object *
evas_object_top_at_xy_get(Evas *e, double x, double y, int include_pass_events_objects, int include_hidden_objects)
{
Evas_Object_List *l;
int xx, yy;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
xx = evas_coord_world_x_to_screen(e, x);
yy = evas_coord_world_y_to_screen(e, y);
for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev)
{
Evas_Object_List *l2;
Evas_Layer *lay;
lay = (Evas_Layer *)l;
for (l2 = ((Evas_Object_List *)(lay->objects))->last; l2; l2 = l2->prev)
{
Evas_Object *obj;
obj = (Evas_Object *)l2;
if ((!include_pass_events_objects) && (obj->pass_events)) continue;
if ((!include_hidden_objects) && (!obj->cur.visible)) continue;
evas_object_clip_recalc(obj);
if ((evas_object_is_in_output_rect(obj, xx, yy, 1, 1)) &&
(!obj->clip.clipees))
return obj;
}
}
return NULL;
}
Evas_Object *
evas_object_top_at_pointer_get(Evas *e)
{
return evas_object_top_at_xy_get(e, e->pointer.canvas_x, e->pointer.canvas_y, 0, 0);
}
Evas_Object *
evas_object_top_in_rectangle_get(Evas *e, double x, double y, double w, double h, int include_pass_events_objects, int include_hidden_objects)
{
Evas_Object_List *l;
int xx, yy, ww, hh;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
xx = evas_coord_world_x_to_screen(e, x);
yy = evas_coord_world_y_to_screen(e, y);
ww = evas_coord_world_x_to_screen(e, w);
hh = evas_coord_world_y_to_screen(e, h);
if (ww < 1) ww = 1;
if (hh < 1) hh = 1;
for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev)
{
Evas_Object_List *l2;
Evas_Layer *lay;
lay = (Evas_Layer *)l;
for (l2 = ((Evas_Object_List *)(lay->objects))->last; l2; l2 = l2->prev)
{
Evas_Object *obj;
obj = (Evas_Object *)l2;
if ((!include_pass_events_objects) && (obj->pass_events)) continue;
if ((!include_hidden_objects) && (!obj->cur.visible)) continue;
evas_object_clip_recalc(obj);
if ((evas_object_is_in_output_rect(obj, xx, yy, ww, hh)) &&
(!obj->clip.clipees))
return obj;
}
}
return NULL;
}
Evas_List *
evas_objects_at_xy_get(Evas *e, double x, double y, int include_pass_events_objects, int include_hidden_objects)
{
Evas_List *in = NULL;
Evas_Object_List *l;
int xx, yy;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
xx = evas_coord_world_x_to_screen(e, x);
yy = evas_coord_world_y_to_screen(e, y);
for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev)
{
Evas_Object_List *l2;
Evas_Layer *lay;
lay = (Evas_Layer *)l;
for (l2 = ((Evas_Object_List *)(lay->objects))->last; l2; l2 = l2->prev)
{
Evas_Object *obj;
obj = (Evas_Object *)l2;
if ((!include_pass_events_objects) && (obj->pass_events)) continue;
if ((!include_hidden_objects) && (!obj->cur.visible)) continue;
evas_object_clip_recalc(obj);
if ((evas_object_is_in_output_rect(obj, xx, yy, 1, 1)) &&
(!obj->clip.clipees))
in = evas_list_prepend(in, obj);
}
}
return in;
}
Evas_List *
evas_objects_in_rectangle_get(Evas *e, double x, double y, double w, double h, int include_pass_events_objects, int include_hidden_objects)
{
Evas_List *in = NULL;
Evas_Object_List *l;
int xx, yy, ww, hh;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
xx = evas_coord_world_x_to_screen(e, x);
yy = evas_coord_world_y_to_screen(e, y);
ww = evas_coord_world_x_to_screen(e, w);
hh = evas_coord_world_y_to_screen(e, h);
if (ww < 1) ww = 1;
if (hh < 1) hh = 1;
for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev)
{
Evas_Object_List *l2;
Evas_Layer *lay;
lay = (Evas_Layer *)l;
for (l2 = ((Evas_Object_List *)(lay->objects))->last; l2; l2 = l2->prev)
{
Evas_Object *obj;
obj = (Evas_Object *)l2;
if ((!include_pass_events_objects) && (obj->pass_events)) continue;
if ((!include_hidden_objects) && (!obj->cur.visible)) continue;
evas_object_clip_recalc(obj);
if ((evas_object_is_in_output_rect(obj, xx, yy, ww, hh)) &&
(!obj->clip.clipees))
in = evas_list_prepend(in, obj);
}
}
return in;
}
const char *
evas_object_type_get(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
return obj->type;
}

View File

@ -0,0 +1,407 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
/* private magic number for polygon objects */
static const char o_type[] = "polygon";
/* private struct for line object internal data */
typedef struct _Evas_Object_Polygon Evas_Object_Polygon;
typedef struct _Evas_Polygon_Point Evas_Polygon_Point;
struct _Evas_Object_Polygon
{
DATA32 magic;
int changed : 1;
Evas_List *points;
void *engine_data;
};
struct _Evas_Polygon_Point
{
double x, y;
};
/* private methods for polygon objects */
static void evas_object_polygon_init(Evas_Object *obj);
static void *evas_object_polygon_new(void);
static void evas_object_polygon_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
static void evas_object_polygon_free(Evas_Object *obj);
static void evas_object_polygon_render_pre(Evas_Object *obj);
static void evas_object_polygon_render_post(Evas_Object *obj);
static int evas_object_polygon_is_opaque(Evas_Object *obj);
static int evas_object_polygon_was_opaque(Evas_Object *obj);
static int evas_object_polygon_is_inside(Evas_Object *obj, double x, double y);
static int evas_object_polygon_was_inside(Evas_Object *obj, double x, double y);
static Evas_Object_Func object_func =
{
/* methods (compulsory) */
evas_object_polygon_free,
evas_object_polygon_render,
evas_object_polygon_render_pre,
evas_object_polygon_render_post,
/* these are optional. NULL = nothing */
NULL,
NULL,
NULL,
NULL,
evas_object_polygon_is_opaque,
evas_object_polygon_was_opaque,
evas_object_polygon_is_inside,
evas_object_polygon_was_inside,
NULL
};
/* the actual api call to add a rect */
/* it has no other api calls as all properties are standard */
Evas_Object *
evas_object_polygon_add(Evas *e)
{
Evas_Object *obj;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
obj = evas_object_new();
evas_object_polygon_init(obj);
evas_object_inject(obj, e);
return obj;
}
void
evas_object_polygon_point_add(Evas_Object *obj, double x, double y)
{
Evas_Object_Polygon *o;
Evas_Polygon_Point *p;
double min_x, max_x, min_y, max_y;
int is, was;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Polygon *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Polygon, MAGIC_OBJ_POLYGON);
return;
MAGIC_CHECK_END();
was = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
p = malloc(sizeof(Evas_Polygon_Point));
if (!p) return;
p->x = x;
p->y = y;
if (!o->points)
{
obj->cur.geometry.x = p->x;
obj->cur.geometry.y = p->y;
obj->cur.geometry.w = 2.0;
obj->cur.geometry.h = 2.0;
}
else
{
if (x < obj->cur.geometry.x) min_x = x;
else min_x = obj->cur.geometry.x;
if (x > (obj->cur.geometry.x + obj->cur.geometry.w - 2.0)) max_x = x;
else max_x = obj->cur.geometry.x + obj->cur.geometry.w - 2.0;
if (y < obj->cur.geometry.y) min_y = y;
else min_y = obj->cur.geometry.y;
if (y > (obj->cur.geometry.y + obj->cur.geometry.h - 2.0)) max_y = y;
else max_y = obj->cur.geometry.y + obj->cur.geometry.h - 2.0;
obj->cur.geometry.x = min_x;
obj->cur.geometry.y = min_y;
obj->cur.geometry.w = max_x - min_x + 2.0;
obj->cur.geometry.h = max_y - min_y + 2.0;
}
o->points = evas_list_append(o->points, p);
obj->cur.cache.geometry.validity = 0;
o->changed = 1;
evas_object_change(obj);
evas_object_coords_recalc(obj);
is = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
if ((is ^ was) && obj->cur.visible)
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
void
evas_object_polygon_points_clear(Evas_Object *obj)
{
Evas_Object_Polygon *o;
int is, was;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Polygon *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Polygon, MAGIC_OBJ_POLYGON);
return;
MAGIC_CHECK_END();
was = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
while (o->points)
{
free(o->points->data);
o->points = evas_list_remove(o->points, o->points->data);
}
obj->cur.geometry.w = 0;
obj->cur.geometry.h = 0;
obj->cur.cache.geometry.validity = 0;
o->changed = 1;
evas_object_change(obj);
evas_object_coords_recalc(obj);
is = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
if ((is || was) && obj->cur.visible)
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
/* all nice and private */
static void
evas_object_polygon_init(Evas_Object *obj)
{
/* alloc image ob, setup methods and default values */
obj->object_data = evas_object_polygon_new();
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0.0;
obj->cur.geometry.y = 0.0;
obj->cur.geometry.w = 0.0;
obj->cur.geometry.h = 0.0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */
obj->func = &object_func;
obj->type = o_type;
}
static void *
evas_object_polygon_new(void)
{
Evas_Object_Polygon *o;
/* alloc obj private data */
o = calloc(1, sizeof(Evas_Object_Polygon));
o->magic = MAGIC_OBJ_POLYGON;
return o;
}
static void
evas_object_polygon_free(Evas_Object *obj)
{
Evas_Object_Polygon *o;
/* frees private object data. very simple here */
o = (Evas_Object_Polygon *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Polygon, MAGIC_OBJ_POLYGON);
return;
MAGIC_CHECK_END();
/* free obj */
while (o->points)
{
free(o->points->data);
o->points = evas_list_remove(o->points, o->points->data);
}
o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context,
o->engine_data);
o->magic = 0;
free(o);
}
static void
evas_object_polygon_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
{
Evas_Object_Polygon *o;
Evas_List *l;
/* render object to surface with context, and offxet by x,y */
o = (Evas_Object_Polygon *)(obj->object_data);
obj->layer->evas->engine.func->context_color_set(output,
context,
obj->cur.cache.clip.r,
obj->cur.cache.clip.g,
obj->cur.cache.clip.b,
obj->cur.cache.clip.a);
obj->layer->evas->engine.func->context_multiplier_unset(output,
context);
o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context,
o->engine_data);
for (l = o->points; l; l = l->next)
{
Evas_Polygon_Point *p;
int px, py;
p = l->data;
px = evas_coord_world_x_to_screen(obj->layer->evas, p->x);
py = evas_coord_world_y_to_screen(obj->layer->evas, p->y);
o->engine_data = obj->layer->evas->engine.func->polygon_point_add(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context,
o->engine_data,
px + x, py + y);
}
if (o->engine_data)
obj->layer->evas->engine.func->polygon_draw(output,
context,
surface,
o->engine_data);
}
static void
evas_object_polygon_render_pre(Evas_Object *obj)
{
Evas_List *updates = NULL;
Evas_Object_Polygon *o;
int is_v, was_v;
/* dont pre-render the obj twice! */
if (obj->pre_render_done) return;
obj->pre_render_done = 1;
/* pre-render phase. this does anything an object needs to do just before */
/* rendering. this could mean loading the image data, retrieving it from */
/* elsewhere, decoding video etc. */
/* then when this is done the object needs to figure if it changed and */
/* if so what and where and add thr appropriate redraw lines */
o = (Evas_Object_Polygon *)(obj->object_data);
/* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper)
{
evas_object_clip_recalc(obj->cur.clipper);
obj->cur.clipper->func->render_pre(obj->cur.clipper);
}
/* now figure what changed and add draw rects */
/* if it just became visible or invisible */
is_v = evas_object_is_visible(obj);
was_v = evas_object_was_visible(obj);
if (is_v != was_v)
{
updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
goto done;
}
/* its not visible - we accounted for it appearing or not so just abort */
if (!is_v) goto done;
/* clipper changed this is in addition to anything else for obj */
updates = evas_object_render_pre_clipper_change(updates, obj);
/* if we restacked (layer or just within a layer) */
if (obj->restack)
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* if it changed color */
if ((obj->cur.color.r != obj->prev.color.r) ||
(obj->cur.color.g != obj->prev.color.g) ||
(obj->cur.color.b != obj->prev.color.b) ||
(obj->cur.color.a != obj->prev.color.a))
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* if it changed geometry - and obviously not visibility or color */
/* caluclate differences since we have a constant color fill */
/* we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h) ||
(o->changed))
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
done:
evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
}
static void
evas_object_polygon_render_post(Evas_Object *obj)
{
Evas_Object_Polygon *o;
/* this moves the current data to the previous state parts of the object */
/* in whatever way is safest for the object. also if we don't need object */
/* data anymore we can free it if the object deems this is a good idea */
o = (Evas_Object_Polygon *)(obj->object_data);
/* remove those pesky changes */
while (obj->clip.changes)
{
Evas_Rectangle *r;
r = (Evas_Rectangle *)obj->clip.changes->data;
obj->clip.changes = evas_list_remove(obj->clip.changes, r);
free(r);
}
/* move cur to prev safely for object data */
obj->prev = obj->cur;
o->changed = 0;
}
static int
evas_object_polygon_is_opaque(Evas_Object *obj)
{
Evas_Object_Polygon *o;
/* this returns 1 if the internal object data implies that the object is */
/* currently fulyl opque over the entire line it occupies */
o = (Evas_Object_Polygon *)(obj->object_data);
return 0;
}
static int
evas_object_polygon_was_opaque(Evas_Object *obj)
{
Evas_Object_Polygon *o;
/* this returns 1 if the internal object data implies that the object was */
/* currently fulyl opque over the entire line it occupies */
o = (Evas_Object_Polygon *)(obj->object_data);
return 0;
}
static int
evas_object_polygon_is_inside(Evas_Object *obj, double x, double y)
{
Evas_Object_Polygon *o;
/* this returns 1 if the canvas co-ordinates are inside the object based */
/* on object private data. not much use for rects, but for polys images */
/* and other complex objects it might be */
o = (Evas_Object_Polygon *)(obj->object_data);
return 1;
x = 0;
y = 0;
}
static int
evas_object_polygon_was_inside(Evas_Object *obj, double x, double y)
{
Evas_Object_Polygon *o;
/* this returns 1 if the canvas co-ordinates were inside the object based */
/* on object private data. not much use for rects, but for polys images */
/* and other complex objects it might be */
o = (Evas_Object_Polygon *)(obj->object_data);
return 1;
x = 0;
y = 0;
}

View File

@ -0,0 +1,346 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
/* private magic number for rectangle objects */
static const char o_type[] = "rectangle";
/* private struct for rectangle object internal data */
typedef struct _Evas_Object_Rectangle Evas_Object_Rectangle;
struct _Evas_Object_Rectangle
{
DATA32 magic;
void *engine_data;
};
/* private methods for rectangle objects */
static void evas_object_rectangle_init(Evas_Object *obj);
static void *evas_object_rectangle_new(void);
static void evas_object_rectangle_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
static void evas_object_rectangle_free(Evas_Object *obj);
static void evas_object_rectangle_render_pre(Evas_Object *obj);
static void evas_object_rectangle_render_post(Evas_Object *obj);
#if 0 /* usless calls for a rect object. much more useful for images etc. */
static void evas_object_rectangle_store(Evas_Object *obj);
static void evas_object_rectangle_unstore(Evas_Object *obj);
static int evas_object_rectangle_is_visible(Evas_Object *obj);
static int evas_object_rectangle_was_visible(Evas_Object *obj);
static int evas_object_rectangle_is_opaque(Evas_Object *obj);
static int evas_object_rectangle_was_opaque(Evas_Object *obj);
static int evas_object_rectangle_is_inside(Evas_Object *obj, double x, double y);
static int evas_object_rectangle_was_inside(Evas_Object *obj, double x, double y);
#endif
static Evas_Object_Func object_func =
{
/* methods (compulsory) */
evas_object_rectangle_free,
evas_object_rectangle_render,
evas_object_rectangle_render_pre,
evas_object_rectangle_render_post,
/* these are optional. NULL = nothing */
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
};
/* the actual api call to add a rect */
/* it has no other api calls as all properties are standard */
Evas_Object *
evas_object_rectangle_add(Evas *e)
{
Evas_Object *obj;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
obj = evas_object_new();
evas_object_rectangle_init(obj);
evas_object_inject(obj, e);
return obj;
}
/* all nice and private */
static void
evas_object_rectangle_init(Evas_Object *obj)
{
/* alloc image ob, setup methods and default values */
obj->object_data = evas_object_rectangle_new();
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0.0;
obj->cur.geometry.y = 0.0;
obj->cur.geometry.w = 32.0;
obj->cur.geometry.h = 32.0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */
obj->func = &object_func;
obj->type = o_type;
}
static void *
evas_object_rectangle_new(void)
{
Evas_Object_Rectangle *o;
/* alloc obj private data */
o = calloc(1, sizeof(Evas_Object_Rectangle));
o->magic = MAGIC_OBJ_RECTANGLE;
return o;
}
static void
evas_object_rectangle_free(Evas_Object *obj)
{
Evas_Object_Rectangle *o;
/* frees private object data. very simple here */
o = (Evas_Object_Rectangle *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Rectangle, MAGIC_OBJ_RECTANGLE);
return;
MAGIC_CHECK_END();
/* free obj */
o->magic = 0;
free(o);
}
static void
evas_object_rectangle_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
{
Evas_Object_Rectangle *o;
/* render object to surface with context, and offxet by x,y */
o = (Evas_Object_Rectangle *)(obj->object_data);
obj->layer->evas->engine.func->context_color_set(output,
context,
obj->cur.cache.clip.r,
obj->cur.cache.clip.g,
obj->cur.cache.clip.b,
obj->cur.cache.clip.a);
obj->layer->evas->engine.func->context_multiplier_unset(output,
context);
obj->layer->evas->engine.func->rectangle_draw(output,
context,
surface,
obj->cur.cache.geometry.x + x,
obj->cur.cache.geometry.y + y,
obj->cur.cache.geometry.w,
obj->cur.cache.geometry.h);
}
static void
evas_object_rectangle_render_pre(Evas_Object *obj)
{
Evas_List *updates = NULL;
Evas_Object_Rectangle *o;
int is_v, was_v;
/* dont pre-render the obj twice! */
if (obj->pre_render_done) return;
obj->pre_render_done = 1;
/* pre-render phase. this does anything an object needs to do just before */
/* rendering. this could mean loading the image data, retrieving it from */
/* elsewhere, decoding video etc. */
/* then when this is done the object needs to figure if it changed and */
/* if so what and where and add thr appropriate redraw rectangles */
o = (Evas_Object_Rectangle *)(obj->object_data);
/* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper)
{
evas_object_clip_recalc(obj->cur.clipper);
obj->cur.clipper->func->render_pre(obj->cur.clipper);
}
/* now figure what changed and add draw rects */
/* if it just became visible or invisible */
is_v = evas_object_is_visible(obj);
was_v = evas_object_was_visible(obj);
if (is_v != was_v)
{
updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
goto done;
}
/* its not visible - we accounted for it appearing or not so just abort */
if (!is_v) goto done;
/* clipper changed this is in addition to anything else for obj */
updates = evas_object_render_pre_clipper_change(updates, obj);
/* if we restacked (layer or just within a layer) and dont clip anyone */
if ((obj->restack) && (!obj->clip.clipees))
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* if it changed color */
if ((obj->cur.color.r != obj->prev.color.r) ||
(obj->cur.color.g != obj->prev.color.g) ||
(obj->cur.color.b != obj->prev.color.b) ||
(obj->cur.color.a != obj->prev.color.a))
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* if it changed geometry - and obviously not visibility or color */
/* caluclate differences since we have a constant color fill */
/* we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h))
{
Evas_Rectangle *r;
Evas_List *rl;
rl = evas_rects_return_difference_rects(obj->cur.cache.geometry.x,
obj->cur.cache.geometry.y,
obj->cur.cache.geometry.w,
obj->cur.cache.geometry.h,
obj->prev.cache.geometry.x,
obj->prev.cache.geometry.y,
obj->prev.cache.geometry.w,
obj->prev.cache.geometry.h);
while (rl)
{
r = rl->data;
rl = evas_list_remove(rl, r);
updates = evas_list_append(updates, r);
}
goto done;
}
/* it obviously didn't change - add a NO obscure - this "unupdates" this */
/* area so if there were updates for it they get wiped. don't do it if we */
/* arent fully opaque and we are visible */
if (evas_object_is_visible(obj) &&
evas_object_is_opaque(obj) &&
(!obj->clip.clipees))
obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
obj->cur.cache.clip.x,
obj->cur.cache.clip.y,
obj->cur.cache.clip.w,
obj->cur.cache.clip.h);
done:
evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
}
static void
evas_object_rectangle_render_post(Evas_Object *obj)
{
Evas_Object_Rectangle *o;
/* this moves the current data to the previous state parts of the object */
/* in whatever way is safest for the object. also if we don't need object */
/* data anymore we can free it if the object deems this is a good idea */
o = (Evas_Object_Rectangle *)(obj->object_data);
/* remove those pesky changes */
while (obj->clip.changes)
{
Evas_Rectangle *r;
r = (Evas_Rectangle *)obj->clip.changes->data;
obj->clip.changes = evas_list_remove(obj->clip.changes, r);
free(r);
}
/* move cur to prev safely for object data */
obj->prev = obj->cur;
}
#if 0 /* usless calls for a rect object. much more useful for images etc. */
static void
evas_object_rectangle_store(Evas_Object *obj)
{
/* store... nothing for rectangle objects... it's a bit silly */
/* but for others that may have expensive caluclations to do to */
/* generate the object data, hint that they might want to be pre-calced */
/* once and stored */
}
static void
evas_object_rectangle_unstore(Evas_Object *obj)
{
/* store... nothing for rectangle objects... it's a bit silly */
}
static int
evas_object_rectangle_is_visible(Evas_Object *obj)
{
Evas_Object_Rectangle *o;
/* this returns 1 if the internal object data would imply that it is */
/* visible (ie drawing it draws something. this is not to do with events */
o = (Evas_Object_Rectangle *)(obj->object_data);
return 1;
}
static int
evas_object_rectangle_was_visible(Evas_Object *obj)
{
Evas_Object_Rectangle *o;
/* this returns 1 if the internal object data would imply that it was */
/* visible (ie drawing it draws something. this is not to do with events */
o = (Evas_Object_Rectangle *)(obj->object_data);
return 1;
}
static int
evas_object_rectangle_is_opaque(Evas_Object *obj)
{
Evas_Object_Rectangle *o;
/* this returns 1 if the internal object data implies that the object is */
/* currently fulyl opque over the entire rectangle it occupies */
o = (Evas_Object_Rectangle *)(obj->object_data);
return 1;
}
static int
evas_object_rectangle_was_opaque(Evas_Object *obj)
{
Evas_Object_Rectangle *o;
/* this returns 1 if the internal object data implies that the object was */
/* currently fulyl opque over the entire rectangle it occupies */
o = (Evas_Object_Rectangle *)(obj->object_data);
return 1;
}
static int
evas_object_rectangle_is_inside(Evas_Object *obj, double x, double y)
{
Evas_Object_Rectangle *o;
/* this returns 1 if the canvas co-ordinates are inside the object based */
/* on object private data. not much use for rects, but for polys images */
/* and other complex objects it might be */
o = (Evas_Object_Rectangle *)(obj->object_data);
return 1;
}
static int
evas_object_rectangle_was_inside(Evas_Object *obj, double x, double y)
{
Evas_Object_Rectangle *o;
/* this returns 1 if the canvas co-ordinates were inside the object based */
/* on object private data. not much use for rects, but for polys images */
/* and other complex objects it might be */
o = (Evas_Object_Rectangle *)(obj->object_data);
return 1;
}
#endif

View File

@ -0,0 +1,330 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
typedef struct _Evas_Object_Smart Evas_Object_Smart;
typedef struct _Evas_Smart_Callback Evas_Smart_Callback;
struct _Evas_Object_Smart
{
DATA32 magic;
void *engine_data;
};
struct _Evas_Smart_Callback
{
char *event;
void (*func) (void *data, Evas_Object *obj, void *event_info);
void *func_data;
};
/* private methods for smart objects */
static void evas_object_smart_init(Evas_Object *obj);
static void *evas_object_smart_new(void);
static void evas_object_smart_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
static void evas_object_smart_free(Evas_Object *obj);
static void evas_object_smart_render_pre(Evas_Object *obj);
static void evas_object_smart_render_post(Evas_Object *obj);
static Evas_Object_Func object_func =
{
/* methods (compulsory) */
evas_object_smart_free,
evas_object_smart_render,
evas_object_smart_render_pre,
evas_object_smart_render_post,
/* these are optional. NULL = nothing */
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
};
/* public funcs */
void
evas_object_smart_data_set(Evas_Object *obj, void *data)
{
Evas_Object_Smart *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Smart *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
return;
MAGIC_CHECK_END();
obj->smart.data = data;
}
void *
evas_object_smart_data_get(Evas_Object *obj)
{
Evas_Object_Smart *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
o = (Evas_Object_Smart *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
return NULL;
MAGIC_CHECK_END();
return obj->smart.data;
}
Evas_Smart *
evas_object_smart_smart_get(Evas_Object *obj)
{
Evas_Object_Smart *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
o = (Evas_Object_Smart *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
return NULL;
MAGIC_CHECK_END();
return obj->smart.smart;
}
void
evas_object_smart_member_add(Evas_Object *obj, Evas_Object *smart_obj)
{
Evas_Object_Smart *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
MAGIC_CHECK(smart_obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Smart *)(smart_obj->object_data);
MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
return;
MAGIC_CHECK_END();
if (obj->smart.parent) evas_object_smart_member_del(obj);
obj->smart.parent = smart_obj;
smart_obj->smart.contained = evas_list_append(smart_obj->smart.contained, obj);
}
void
evas_object_smart_member_del(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!obj->smart.parent) return;
obj->smart.parent->smart.contained = evas_list_remove(obj->smart.parent->smart.contained, obj);
obj->smart.parent = NULL;
}
Evas_Object *
evas_object_smart_add(Evas *e, Evas_Smart *s)
{
Evas_Object *obj;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
return NULL;
MAGIC_CHECK_END();
obj = evas_object_new();
if (!obj) return NULL;
obj->smart.smart = s;
obj->type = s->name;
evas_object_smart_init(obj);
evas_object_inject(obj, e);
evas_object_smart_use(s);
if (s->func_add) s->func_add(obj);
return obj;
}
void
evas_object_smart_callback_add(Evas_Object *obj, char *event, void (*func) (void *data, Evas_Object *obj, void *event_info), void *data)
{
Evas_Object_Smart *o;
Evas_Smart_Callback *cb;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Smart *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
return;
MAGIC_CHECK_END();
if (!event) return;
if (!func) return;
cb = calloc(1, sizeof(Evas_Smart_Callback));
cb->event = strdup(event);
cb->func = func;
cb->func_data = data;
obj->smart.callbacks = evas_list_prepend(obj->smart.callbacks, cb);
}
void *
evas_object_smart_callback_del(Evas_Object *obj, char *event, void (*func) (void *data, Evas_Object *obj, void *event_info))
{
Evas_Object_Smart *o;
Evas_List *l;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Smart *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
return;
MAGIC_CHECK_END();
if (!event) return;
for (l = obj->smart.callbacks; l; l = l->next)
{
Evas_Smart_Callback *cb;
cb = l->data;
if ((!strcmp(cb->event, event)) && (cb->func == func))
{
void *data;
obj->smart.callbacks = evas_list_remove(obj->smart.callbacks, cb);
data = cb->func_data;
if (cb->event) free(cb->event);
free(cb);
return data;
}
}
return NULL;
}
void
evas_object_smart_callback_call(Evas_Object *obj, char *event, void *event_info)
{
Evas_Object_Smart *o;
Evas_List *l;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Smart *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
return;
MAGIC_CHECK_END();
if (!event) return;
for (l = obj->smart.callbacks; l; l = l->next)
{
Evas_Smart_Callback *cb;
cb = l->data;
if (!strcmp(cb->event, event))
cb->func(cb->func_data, obj, event_info);
}
}
/* internal calls */
void
evas_object_smart_del(Evas_Object *obj)
{
Evas_Smart *s;
s = obj->smart.smart;
if (obj->smart.parent) evas_object_smart_member_del(obj);
if ((s) && (s->func_del)) s->func_del(obj);
if (s) evas_object_smart_unuse(s);
}
void
evas_object_smart_cleanup(Evas_Object *obj)
{
Evas_Smart *s;
s = obj->smart.smart;
while (obj->smart.contained)
obj->smart.contained = evas_list_remove(obj->smart.contained, obj->smart.contained->data);
while (obj->smart.callbacks)
{
Evas_Smart_Callback *cb;
cb = obj->smart.callbacks->data;
obj->smart.callbacks = evas_list_remove(obj->smart.callbacks, cb);
if (cb->event) free (cb->event);
free(cb);
}
if (s) evas_object_smart_unuse(s);
}
/* all nice and private */
static void
evas_object_smart_init(Evas_Object *obj)
{
/* alloc image ob, setup methods and default values */
obj->object_data = evas_object_smart_new();
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0.0;
obj->cur.geometry.y = 0.0;
obj->cur.geometry.w = 32.0;
obj->cur.geometry.h = 32.0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */
obj->func = &object_func;
}
static void *
evas_object_smart_new(void)
{
Evas_Object_Smart *o;
/* alloc obj private data */
o = calloc(1, sizeof(Evas_Object_Smart));
o->magic = MAGIC_OBJ_SMART;
return o;
}
static void
evas_object_smart_free(Evas_Object *obj)
{
Evas_Object_Smart *o;
/* frees private object data. very simple here */
o = (Evas_Object_Smart *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
return;
MAGIC_CHECK_END();
/* free obj */
o->magic = 0;
free(o);
}
static void
evas_object_smart_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
{
}
static void
evas_object_smart_render_pre(Evas_Object *obj)
{
if (obj->pre_render_done) return;
obj->pre_render_done = 1;
}
static void
evas_object_smart_render_post(Evas_Object *obj)
{
obj->prev = obj->cur;
}

View File

@ -0,0 +1,802 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
/* private magic number for text objects */
static const char o_type[] = "text";
/* private struct for text object internal data */
typedef struct _Evas_Object_Text Evas_Object_Text;
struct _Evas_Object_Text
{
DATA32 magic;
struct {
char *text;
char *font;
double size;
} cur, prev;
int changed : 1;
double ascent, descent;
double max_ascent, max_descent;
void *engine_data;
};
/* private methods for text objects */
static void evas_object_text_init(Evas_Object *obj);
static void *evas_object_text_new(void);
static void evas_object_text_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
static void evas_object_text_free(Evas_Object *obj);
static void evas_object_text_render_pre(Evas_Object *obj);
static void evas_object_text_render_post(Evas_Object *obj);
static int evas_object_text_is_opaque(Evas_Object *obj);
static int evas_object_text_was_opaque(Evas_Object *obj);
static Evas_Object_Func object_func =
{
/* methods (compulsory) */
evas_object_text_free,
evas_object_text_render,
evas_object_text_render_pre,
evas_object_text_render_post,
/* these are optional. NULL = nothing */
NULL,
NULL,
NULL,
NULL,
evas_object_text_is_opaque,
evas_object_text_was_opaque,
NULL,
NULL,
NULL
};
/* the actual api call to add a rect */
/* it has no other api calls as all properties are standard */
Evas_Object *
evas_object_text_add(Evas *e)
{
Evas_Object *obj;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
obj = evas_object_new();
evas_object_text_init(obj);
evas_object_inject(obj, e);
return obj;
}
void
evas_object_text_font_set(Evas_Object *obj, char *font, double size)
{
Evas_Object_Text *o;
int is, was;
if (!font) return;
if (size <= 0) return;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return;
MAGIC_CHECK_END();
if ((o->cur.font) && (font) && !strcmp(o->cur.font, font))
{
if (size == o->cur.size) return;
}
was = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
/* DO II */
if (o->engine_data)
obj->layer->evas->engine.func->font_free(obj->layer->evas->engine.data.output,
o->engine_data);
if (evas_file_path_is_full_path(font))
o->engine_data = obj->layer->evas->engine.func->font_load(obj->layer->evas->engine.data.output,
font, size);
else
{
Evas_List *l;
for (l = obj->layer->evas->font_path; l; l = l->next)
{
char *tmp, *font_tmp;
Evas_List *dir;
tmp = evas_file_path_join(l->data, font);
if (tmp)
{
char *tmp2;
o->engine_data = obj->layer->evas->engine.func->font_load(obj->layer->evas->engine.data.output,
tmp, size);
if (o->engine_data)
{
free(tmp);
goto done;
}
tmp2 = malloc(strlen(tmp) + 4 + 1);
if (tmp2)
{
strcpy(tmp2, tmp);
strcat(tmp2, ".ttf");
o->engine_data = obj->layer->evas->engine.func->font_load(obj->layer->evas->engine.data.output,
tmp2, size);
if (o->engine_data)
{
free(tmp);
free(tmp2);
goto done;
}
strcpy(tmp2, tmp);
strcat(tmp2, ".TTF");
o->engine_data = obj->layer->evas->engine.func->font_load(obj->layer->evas->engine.data.output,
tmp2, size);
if (o->engine_data)
{
free(tmp);
free(tmp2);
goto done;
}
free(tmp2);
}
free(tmp);
}
dir = evas_file_path_list(l->data, font, 0);
while (dir)
{
tmp = evas_file_path_join(l->data, dir->data);
if (tmp)
{
o->engine_data = obj->layer->evas->engine.func->font_load(obj->layer->evas->engine.data.output,
tmp, size);
if (o->engine_data)
{
while (dir)
{
free(dir->data);
dir = evas_list_remove(dir, dir->data);
}
free(tmp);
goto done;
}
free(tmp);
}
free(dir->data);
dir = evas_list_remove(dir, dir->data);
}
font_tmp = malloc(strlen(font) + 4 + 1);
if (font_tmp)
{
strcpy(font_tmp, font);
strcat(font_tmp, ".ttf");
dir = evas_file_path_list(l->data, font_tmp, 0);
while (dir)
{
tmp = evas_file_path_join(l->data, dir->data);
if (tmp)
{
o->engine_data = obj->layer->evas->engine.func->font_load(obj->layer->evas->engine.data.output,
tmp, size);
if (o->engine_data)
{
while (dir)
{
free(dir->data);
dir = evas_list_remove(dir, dir->data);
}
free(font_tmp);
free(tmp);
goto done;
}
free(tmp);
}
free(dir->data);
dir = evas_list_remove(dir, dir->data);
}
free(font_tmp);
}
}
//_WIN32_WCE
done: ;
}
if (o->cur.font) free(o->cur.font);
if (font) o->cur.font = strdup(font);
else o->cur.font = NULL;
o->prev.font = NULL;
o->cur.size = size;
if ((o->engine_data) && (o->cur.text))
{
int w, h;
obj->layer->evas->engine.func->font_string_size_get(obj->layer->evas->engine.data.output,
o->engine_data,
o->cur.text,
&w, &h);
obj->cur.geometry.w = w;
obj->cur.geometry.h = h;
obj->cur.cache.geometry.validity = 0;
o->ascent = obj->layer->evas->engine.func->font_ascent_get(obj->layer->evas->engine.data.output,
o->engine_data);
o->descent = obj->layer->evas->engine.func->font_descent_get(obj->layer->evas->engine.data.output,
o->engine_data);
o->max_ascent = obj->layer->evas->engine.func->font_max_ascent_get(obj->layer->evas->engine.data.output,
o->engine_data);
o->max_descent = obj->layer->evas->engine.func->font_max_descent_get(obj->layer->evas->engine.data.output,
o->engine_data);
}
else
{
if (o->engine_data)
{
o->ascent = obj->layer->evas->engine.func->font_ascent_get(obj->layer->evas->engine.data.output,
o->engine_data);
o->descent = obj->layer->evas->engine.func->font_descent_get(obj->layer->evas->engine.data.output,
o->engine_data);
o->max_ascent = obj->layer->evas->engine.func->font_max_ascent_get(obj->layer->evas->engine.data.output,
o->engine_data);
o->max_descent = obj->layer->evas->engine.func->font_max_descent_get(obj->layer->evas->engine.data.output,
o->engine_data);
}
else
{
o->ascent = 0;
o->descent = 0;
o->max_ascent = 0;
o->max_descent = 0;
}
obj->cur.geometry.w = 0;
obj->cur.geometry.h = o->max_ascent + o->max_descent;
obj->cur.cache.geometry.validity = 0;
}
o->changed = 1;
evas_object_change(obj);
evas_object_coords_recalc(obj);
is = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
if ((is || was) && obj->cur.visible)
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
void
evas_object_text_font_get(Evas_Object *obj, char **font, double *size)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
*font = "";
*size = 0;
return;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
*font = "";
*size = 0;
return;
MAGIC_CHECK_END();
*font = o->cur.font;
*size = o->cur.size;
}
void
evas_object_text_text_set(Evas_Object *obj, char *text)
{
Evas_Object_Text *o;
int is, was;
if (!text) text = "";
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return;
MAGIC_CHECK_END();
if ((o->cur.text) && (text) && (!strcmp(o->cur.text, text))) return;
was = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
/* DO II */
if (o->cur.text) free(o->cur.text);
if (text) o->cur.text = strdup(text);
else o->cur.text = NULL;
o->prev.text = NULL;
if ((o->engine_data) && (o->cur.text))
{
int w, h;
obj->layer->evas->engine.func->font_string_size_get(obj->layer->evas->engine.data.output,
o->engine_data,
o->cur.text,
&w, &h);
obj->cur.geometry.w = w;
obj->cur.geometry.h = h;
obj->cur.cache.geometry.validity = 0;
}
else
{
obj->cur.geometry.w = 0;
obj->cur.geometry.h = o->max_ascent + o->max_descent;
obj->cur.cache.geometry.validity = 0;
}
o->changed = 1;
evas_object_change(obj);
evas_object_coords_recalc(obj);
is = evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1);
if ((is || was) && obj->cur.visible)
evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y);
}
char *
evas_object_text_text_get(Evas_Object *obj)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return NULL;
MAGIC_CHECK_END();
return o->cur.text;
}
double
evas_object_text_ascent_get(Evas_Object *obj)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return 0;
MAGIC_CHECK_END();
return o->ascent;
}
double
evas_object_text_descent_get(Evas_Object *obj)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return 0;
MAGIC_CHECK_END();
return o->descent;
}
double
evas_object_text_max_ascent_get(Evas_Object *obj)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return 0;
MAGIC_CHECK_END();
return o->max_ascent;
}
double
evas_object_text_max_descent_get(Evas_Object *obj)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return 0;
MAGIC_CHECK_END();
return o->max_descent;
}
double
evas_object_text_inset_get(Evas_Object *obj)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return 0;
MAGIC_CHECK_END();
return obj->layer->evas->engine.func->font_inset_get(obj->layer->evas->engine.data.output,
o->engine_data,
o->cur.text);
}
double
evas_object_text_horiz_advance_get(Evas_Object *obj)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return 0;
MAGIC_CHECK_END();
return obj->layer->evas->engine.func->font_h_advance_get(obj->layer->evas->engine.data.output,
o->engine_data,
o->cur.text);
}
double
evas_object_text_vert_advance_get(Evas_Object *obj)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return 0;
MAGIC_CHECK_END();
return obj->layer->evas->engine.func->font_v_advance_get(obj->layer->evas->engine.data.output,
o->engine_data,
o->cur.text);
}
int
evas_object_text_char_pos_get(Evas_Object *obj, int pos, double *cx, double *cy, double *cw, double *ch)
{
Evas_Object_Text *o;
int ret, x, y, w, h;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return 0;
MAGIC_CHECK_END();
ret = obj->layer->evas->engine.func->font_char_coords_get(obj->layer->evas->engine.data.output,
o->engine_data,
o->cur.text,
pos,
&x, &y,
&w, &h);
if (cx) *cx = x;
if (cy) *cy = y;
if (cw) *cw = w;
if (ch) *ch = h;
return ret;
}
int
evas_object_text_char_coords_get(Evas_Object *obj, double x, double y, double *cx, double *cy, double *cw, double *ch)
{
Evas_Object_Text *o;
int ret, rx, ry, rw, rh;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return 0;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return 0;
MAGIC_CHECK_END();
ret = obj->layer->evas->engine.func->font_char_at_coords_get(obj->layer->evas->engine.data.output,
o->engine_data,
o->cur.text,
x, y,
&rx, &ry,
&rw, &rh);
if (cx) *cx = rx;
if (cy) *cy = ry;
if (cw) *cw = rw;
if (ch) *ch = rh;
return ret;
}
void
evas_object_font_path_clear(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
while (e->font_path)
{
free(e->font_path->data);
e->font_path = evas_list_remove(e->font_path, e->font_path->data);
}
}
void
evas_object_font_path_append(Evas *e, char *path)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if (!path) return;
e->font_path = evas_list_append(e->font_path, strdup(path));
}
void
evas_object_font_path_prepend(Evas *e, char *path)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if (!path) return;
e->font_path = evas_list_prepend(e->font_path, strdup(path));
}
Evas_List *
evas_object_font_path_list(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
return e->font_path;
}
void
evas_object_font_cache_flush(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
e->engine.func->font_cache_flush(e->engine.data.output);
}
void
evas_object_font_cache_set(Evas *e, int size)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if (size < 0) size = 0;
e->engine.func->font_cache_set(e->engine.data.output, size);
}
int
evas_object_font_cache_get(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
return e->engine.func->font_cache_get(e->engine.data.output);
}
/* all nice and private */
static void
evas_object_text_init(Evas_Object *obj)
{
/* alloc text ob, setup methods and default values */
obj->object_data = evas_object_text_new();
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0.0;
obj->cur.geometry.y = 0.0;
obj->cur.geometry.w = 0.0;
obj->cur.geometry.h = 0.0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */
obj->func = &object_func;
obj->type = o_type;
}
static void *
evas_object_text_new(void)
{
Evas_Object_Text *o;
/* alloc obj private data */
o = calloc(1, sizeof(Evas_Object_Text));
o->magic = MAGIC_OBJ_TEXT;
o->prev = o->cur;
return o;
}
static void
evas_object_text_free(Evas_Object *obj)
{
Evas_Object_Text *o;
/* frees private object data. very simple here */
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return;
MAGIC_CHECK_END();
/* free obj */
if (o->cur.text) free(o->cur.text);
if (o->cur.font) free(o->cur.font);
if (o->engine_data)
obj->layer->evas->engine.func->font_free(obj->layer->evas->engine.data.output,
o->engine_data);
o->magic = 0;
free(o);
}
static void
evas_object_text_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
{
Evas_Object_Text *o;
/* render object to surface with context, and offxet by x,y */
o = (Evas_Object_Text *)(obj->object_data);
obj->layer->evas->engine.func->context_multiplier_unset(output,
context);
obj->layer->evas->engine.func->context_color_set(output,
context,
obj->cur.cache.clip.r,
obj->cur.cache.clip.g,
obj->cur.cache.clip.b,
obj->cur.cache.clip.a);
if (o->engine_data)
obj->layer->evas->engine.func->font_draw(output,
context,
surface,
o->engine_data,
obj->cur.cache.geometry.x + x,
obj->cur.cache.geometry.y + y +
(int)
((o->max_ascent * obj->cur.cache.geometry.h) / obj->cur.geometry.h),
obj->cur.cache.geometry.w,
obj->cur.cache.geometry.h,
obj->cur.geometry.w,
obj->cur.geometry.h,
o->cur.text);
}
static void
evas_object_text_render_pre(Evas_Object *obj)
{
Evas_List *updates = NULL;
Evas_Object_Text *o;
int is_v, was_v;
/* dont pre-render the obj twice! */
if (obj->pre_render_done) return;
obj->pre_render_done = 1;
/* pre-render phase. this does anything an object needs to do just before */
/* rendering. this could mean loading the image data, retrieving it from */
/* elsewhere, decoding video etc. */
/* then when this is done the object needs to figure if it changed and */
/* if so what and where and add thr appropriate redraw rectangles */
o = (Evas_Object_Text *)(obj->object_data);
/* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper)
{
evas_object_clip_recalc(obj->cur.clipper);
obj->cur.clipper->func->render_pre(obj->cur.clipper);
}
/* now figure what changed and add draw rects */
/* if it just became visible or invisible */
is_v = evas_object_is_visible(obj);
was_v = evas_object_was_visible(obj);
if (is_v != was_v)
{
updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
goto done;
}
/* its not visible - we accounted for it appearing or not so just abort */
if (!is_v) goto done;
/* clipper changed this is in addition to anything else for obj */
updates = evas_object_render_pre_clipper_change(updates, obj);
/* if we restacked (layer or just within a layer) and dont clip anyone */
if (obj->restack)
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* if it changed color */
if ((obj->cur.color.r != obj->prev.color.r) ||
(obj->cur.color.g != obj->prev.color.g) ||
(obj->cur.color.b != obj->prev.color.b) ||
(obj->cur.color.a != obj->prev.color.a))
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
/* if it changed geometry - and obviously not visibility or color */
/* caluclate differences since we have a constant color fill */
/* we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h))
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
goto done;
}
if (o->changed)
{
updates = evas_object_render_pre_prev_cur_add(updates, obj);
}
done:
evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
}
static void
evas_object_text_render_post(Evas_Object *obj)
{
Evas_Object_Text *o;
/* this moves the current data to the previous state parts of the object */
/* in whatever way is safest for the object. also if we don't need object */
/* data anymore we can free it if the object deems this is a good idea */
o = (Evas_Object_Text *)(obj->object_data);
/* remove those pesky changes */
while (obj->clip.changes)
{
Evas_Rectangle *r;
r = (Evas_Rectangle *)obj->clip.changes->data;
obj->clip.changes = evas_list_remove(obj->clip.changes, r);
free(r);
}
/* move cur to prev safely for object data */
obj->prev = obj->cur;
o->prev = o->cur;
o->changed = 0;
}
static int
evas_object_text_is_opaque(Evas_Object *obj)
{
Evas_Object_Text *o;
/* this returns 1 if the internal object data implies that the object is */
/* currently fulyl opque over the entire gradient it occupies */
o = (Evas_Object_Text *)(obj->object_data);
return 0;
}
static int
evas_object_text_was_opaque(Evas_Object *obj)
{
Evas_Object_Text *o;
/* this returns 1 if the internal object data implies that the object was */
/* currently fulyl opque over the entire gradient it occupies */
o = (Evas_Object_Text *)(obj->object_data);
return 0;
}

View File

@ -0,0 +1,95 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
Evas_List *
evas_rects_return_difference_rects(int x, int y, int w, int h, int xx, int yy, int ww, int hh)
{
Evas_List *rects = NULL;
Evas_Rectangle *r;
if (!RECTS_INTERSECT(x, y, w, h, xx, yy, ww, hh))
{
NEW_RECT(r, x, y, w, h);
if (r) rects = evas_list_append(rects, r);
NEW_RECT(r, xx, yy, ww, hh);
if (r) rects = evas_list_append(rects, r);
}
else
{
int x1[4], y1[4], i, j;
Evas_List *rl = NULL, *rll;
if (x < xx)
{
x1[0] = x;
x1[1] = xx;
}
else
{
x1[0] = xx;
x1[1] = x;
}
if ((x + w) < (xx + ww))
{
x1[2] = x + w;
x1[3] = xx + ww;
}
else
{
x1[2] = xx + ww;
x1[3] = x + w;
}
if (y < yy)
{
y1[0] = y;
y1[1] = yy;
}
else
{
y1[0] = yy;
y1[1] = y;
}
if ((y + h) < (yy + hh))
{
y1[2] = y + h;
y1[3] = yy + hh;
}
else
{
y1[2] = yy + hh;
y1[3] = y + h;
}
for (j = 0; j < 3; j++)
{
for (i = 0; i < 3; i++)
{
NEW_RECT(r, x1[i], y1[j], x1[i + 1] - x1[i], y1[j + 1] - y1[j]);
if (r) rl = evas_list_append(rl, r);
}
}
if (rl)
{
for (rll = rl; rll; rll = rll->next)
{
r = rll->data;
if ((r->w > 0) && (r->h > 0))
{
int intsec1, intsec2;
intsec1 = (RECTS_INTERSECT(r->x, r->y, r->w, r->h, x, y, w, h));
intsec2 = (RECTS_INTERSECT(r->x, r->y, r->w, r->h, xx, yy, ww, hh));
if (intsec1 ^ intsec2)
rects = evas_list_append(rects, r);
else
free(r);
}
else
free(r);
}
rl = evas_list_free(rl);
}
}
return rects;
}

View File

@ -0,0 +1,326 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
void
evas_damage_rectangle_add(Evas *e, int x, int y, int w, int h)
{
Evas_Rectangle *r;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
r = malloc(sizeof(Evas_Rectangle));
if (!r) return;
r->x = x; r->y = y; r->w = w; r->h = h;
e->damages = evas_list_append(e->damages, r);
e->changed = 1;
}
void
evas_obscured_rectangle_add(Evas *e, int x, int y, int w, int h)
{
Evas_Rectangle *r;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
r = malloc(sizeof(Evas_Rectangle));
if (!r) return;
r->x = x; r->y = y; r->w = w; r->h = h;
e->obscures = evas_list_append(e->obscures, r);
}
void
evas_obscured_clear(Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
while (e->obscures)
{
Evas_Rectangle *r;
r = (Evas_Rectangle *)e->obscures->data;
e->obscures = evas_list_remove(e->obscures, r);
free(r);
}
}
Evas_List *
evas_render_updates(Evas *e)
{
Evas_List *updates = NULL;
Evas_List *obscuring_objects = NULL;
Evas_List *obscuring_objects_orig = NULL;
Evas_List *active_objects = NULL;
Evas_List *delete_objects = NULL;
Evas_List *restack_objects = NULL;
Evas_List *ll;
Evas_Object_List *l;
void *surface;
int ux, uy, uw, uh;
int cx, cy, cw, ch;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
if (!e->changed) return NULL;
if (e->output.changed)
{
e->engine.func->output_resize(e->engine.data.output,
e->output.w, e->output.h);
e->engine.func->output_redraws_rect_add(e->engine.data.output,
0, 0,
e->output.w, e->output.h);
}
/* phase 1. add extra updates for changed objects */
for (l = (Evas_Object_List *)e->layers; l; l = l->next)
{
Evas_Object_List *l2;
Evas_Layer *lay;
lay = (Evas_Layer *)l;
for (l2 = (Evas_Object_List *)lay->objects; l2; l2 = l2->next)
{
Evas_Object *obj;
obj = (Evas_Object *)l2;
evas_object_clip_recalc(obj);
/* build active object list */
if (evas_object_is_active(obj))
active_objects = evas_list_append(active_objects, obj);
/* something changed... maybe... */
if (obj->changed)
{
if ((obj->restack) &&
(!obj->clip.clipees) &&
evas_object_is_active(obj))
restack_objects = evas_list_append(restack_objects, obj);
else
obj->func->render_pre(obj);
}
/* nothng changed at all */
else
{
if (evas_object_is_opaque(obj) &&
evas_object_is_visible(obj) &&
(!obj->clip.clipees))
e->engine.func->output_redraws_rect_del(e->engine.data.output,
obj->cur.cache.clip.x,
obj->cur.cache.clip.y,
obj->cur.cache.clip.w,
obj->cur.cache.clip.h);
}
}
}
/* phase 2. force updates for restacks */
while (restack_objects)
{
Evas_Object *obj;
obj = restack_objects->data;
restack_objects = evas_list_remove(restack_objects, obj);
obj->func->render_pre(obj);
e->engine.func->output_redraws_rect_add(e->engine.data.output,
obj->prev.cache.clip.x,
obj->prev.cache.clip.y,
obj->prev.cache.clip.w,
obj->prev.cache.clip.h);
e->engine.func->output_redraws_rect_add(e->engine.data.output,
obj->cur.cache.clip.x,
obj->cur.cache.clip.y,
obj->cur.cache.clip.w,
obj->cur.cache.clip.h);
}
/* phase 3. add exposes */
while (e->damages)
{
Evas_Rectangle *r;
r = e->damages->data;
e->damages = evas_list_remove(e->damages, r);
e->engine.func->output_redraws_rect_add(e->engine.data.output,
r->x, r->y, r->w, r->h);
free(r);
}
/* phase 4. add obscures */
for (ll = e->obscures; ll; ll = ll->next)
{
Evas_Rectangle *r;
r = ll->data;
e->engine.func->output_redraws_rect_del(e->engine.data.output,
r->x, r->y, r->w, r->h);
}
/* build obscure objects list of active objects that obscure */
for (ll = active_objects; ll; ll = ll->next)
{
Evas_Object *obj;
obj = (Evas_Object *)(ll->data);
if (evas_object_is_opaque(obj) && evas_object_is_visible(obj) &&
(!obj->clip.clipees) && (obj->cur.color.a >= 255))
obscuring_objects = evas_list_append(obscuring_objects, obj);
}
/* save this list */
obscuring_objects_orig = obscuring_objects;
obscuring_objects = NULL;
/* phase 5. go thu each update rect and render objects in it*/
while ((surface =
e->engine.func->output_redraws_next_update_get(e->engine.data.output,
&ux, &uy, &uw, &uh,
&cx, &cy, &cw, &ch)))
{
Evas_Rectangle *rect;
int off_x, off_y;
rect = malloc(sizeof(Evas_Rectangle));
if (rect)
{
rect->x = ux; rect->y = uy; rect->w = uw; rect->h = uh;
updates = evas_list_append(updates, rect);
}
off_x = cx - ux;
off_y = cy - uy;
/* build obscuring objects list (in order from bottom to top) */
for (ll = obscuring_objects_orig; ll; ll = ll->next)
{
Evas_Object *obj;
obj = (Evas_Object *)(ll->data);
if (evas_object_is_in_output_rect(obj, ux, uy, uw, uh))
obscuring_objects = evas_list_append(obscuring_objects, obj);
}
/* render all object that intersect with rect */
for (ll = active_objects; ll; ll = ll->next)
{
Evas_Object *obj;
Evas_List *l3;
obj = (Evas_Object *)(ll->data);
/* if its in our outpout rect and it doesnt clip anything */
if (evas_object_is_in_output_rect(obj, ux, uy, uw, uh) &&
(!obj->clip.clipees) &&
(obj->cur.visible) &&
(!obj->delete_me) &&
(obj->cur.cache.clip.visible) &&
(obj->cur.color.a > 0))
{
int x, y, w, h;
if ((obscuring_objects) && (obscuring_objects->data == obj))
obscuring_objects = evas_list_remove(obscuring_objects, obj);
x = cx; y = cy; w = cw; h = ch;
RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.cache.clip.x + off_x,
obj->cur.cache.clip.y + off_y,
obj->cur.cache.clip.w,
obj->cur.cache.clip.h);
if ((w > 0) && (h > 0))
{
e->engine.func->context_clip_set(e->engine.data.output,
e->engine.data.context,
x, y, w, h);
#if 1 /* FIXME: this can slow things down... figure out optimum... coverage */
for (l3 = obscuring_objects; l3; l3 = l3->next)
{
Evas_Object *obj2;
obj2 = (Evas_Object *)l3->data;
e->engine.func->context_cutout_add(e->engine.data.output,
e->engine.data.context,
obj2->cur.cache.clip.x + off_x,
obj2->cur.cache.clip.y + off_y,
obj2->cur.cache.clip.w,
obj2->cur.cache.clip.h);
}
#endif
obj->func->render(obj,
e->engine.data.output,
e->engine.data.context,
surface,
off_x, off_y);
e->engine.func->context_cutout_clear(e->engine.data.output,
e->engine.data.context);
}
}
}
/* punch rect out */
e->engine.func->output_redraws_next_update_push(e->engine.data.output,
surface,
ux, uy, uw, uh);
/* free obscuring objects list */
obscuring_objects = evas_list_free(obscuring_objects);
}
/* flush redraws */
e->engine.func->output_flush(e->engine.data.output);
/* clear redraws */
e->engine.func->output_redraws_clear(e->engine.data.output);
/* and do a post render pass */
for (l = (Evas_Object_List *)e->layers; l; l = l->next)
{
Evas_Object_List *l2;
Evas_Layer *lay;
lay = (Evas_Layer *)l;
for (l2 = (Evas_Object_List *)lay->objects; l2; l2 = l2->next)
{
Evas_Object *obj;
obj = (Evas_Object *)l2;
obj->pre_render_done = 0;
if (obj->changed)
{
obj->func->render_post(obj);
obj->restack = 0;
obj->changed = 0;
}
/* if the object is flagged for deletion - note it */
if (obj->delete_me == 2)
delete_objects = evas_list_append(delete_objects, obj);
if (obj->delete_me) obj->delete_me ++;
}
}
/* delete all objects flagged for deletion now */
while (delete_objects)
{
Evas_Object *obj;
obj = (Evas_Object *)(delete_objects->data);
delete_objects = evas_list_remove(delete_objects, obj);
evas_object_free(obj, 1);
}
/* free our obscuring object list */
obscuring_objects_orig = evas_list_free(obscuring_objects_orig);
/* free our active object list */
active_objects = evas_list_free(active_objects);
e->changed = 0;
e->viewport.changed = 0;
e->output.changed = 0;
return updates;
}
void
evas_render_updates_free(Evas_List *updates)
{
while (updates)
{
free(updates->data);
updates = evas_list_remove(updates, updates->data);
}
}
void
evas_render(Evas *e)
{
Evas_List *updates;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
updates = evas_render_updates(e);
if (updates) evas_render_updates_free(updates);
}

View File

@ -0,0 +1,87 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
/* all public */
Evas_Smart *
evas_smart_new(char *name,
void (*func_add) (Evas_Object *o),
void (*func_del) (Evas_Object *o),
void (*func_layer_set) (Evas_Object *o, int l),
void (*func_raise) (Evas_Object *o),
void (*func_lower) (Evas_Object *o),
void (*func_stack_above) (Evas_Object *o, Evas_Object *above),
void (*func_stack_below) (Evas_Object *o, Evas_Object *below),
void (*func_move) (Evas_Object *o, double x, double y),
void (*func_resize) (Evas_Object *o, double w, double h),
void (*func_show) (Evas_Object *o),
void (*func_hide) (Evas_Object *o),
void (*func_color_set) (Evas_Object *o, int r, int g, int b, int a),
void (*func_clip_set) (Evas_Object *o, Evas_Object *clip),
void (*func_clip_unset) (Evas_Object *o),
void *data)
{
Evas_Smart *s;
if (!name) return NULL;
s = calloc(1, sizeof(Evas_Smart));
if (!s) return NULL;
s->magic = MAGIC_SMART;
s->name = strdup(name);
s->func_add = func_add;
s->func_del = func_del;
s->func_layer_set = func_layer_set;
s->func_raise = func_raise;
s->func_lower = func_lower;
s->func_stack_above = func_stack_above;
s->func_stack_below = func_stack_below;
s->func_move = func_move;
s->func_resize = func_resize;
s->func_show = func_show;
s->func_hide = func_hide;
s->func_color_set = func_color_set;
s->func_clip_set = func_clip_set;
s->func_clip_unset = func_clip_unset;
s->data = data;
return s;
}
void
evas_smart_free(Evas_Smart *s)
{
MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
return;
MAGIC_CHECK_END();
s->delete_me = 1;
if (s->usage > 0) return;
if (s->name) free(s->name);
free(s);
}
void *
evas_smart_data_get(Evas_Smart *s)
{
MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
return NULL;
MAGIC_CHECK_END();
return s->data;
}
/* internal funcs */
void
evas_object_smart_use(Evas_Smart *s)
{
s->usage++;
}
void
evas_object_smart_unuse(Evas_Smart *s)
{
s->usage--;
if (s->delete_me) evas_smart_free(s);
}

View File

@ -0,0 +1,216 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
static Evas_Object *evas_object_above_get_internal(Evas_Object *obj);
static Evas_Object *evas_object_below_get_internal(Evas_Object *obj);
static Evas_Object *
evas_object_above_get_internal(Evas_Object *obj)
{
if (((Evas_Object_List *)obj)->next)
return (Evas_Object *)(((Evas_Object_List *)obj)->next);
else
{
if (((Evas_Object_List *)(((Evas_Object *)obj)->layer))->next)
{
Evas_Layer *l;
l = (Evas_Layer *)(((Evas_Object_List *)(((Evas_Object *)obj)->layer))->next);
return l->objects;
}
}
return NULL;
}
static Evas_Object *
evas_object_below_get_internal(Evas_Object *obj)
{
if (((Evas_Object_List *)obj)->prev)
return (Evas_Object *)(((Evas_Object_List *)obj)->prev);
else
{
if (((Evas_Object_List *)(((Evas_Object *)obj)->layer))->prev)
{
Evas_Layer *l;
l = (Evas_Layer *)(((Evas_Object_List *)(((Evas_Object *)obj)->layer))->prev);
return (Evas_Object *)(((Evas_Object_List *)(l->objects))->last);
}
}
return NULL;
}
void
evas_object_raise(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (obj->smart.smart)
{
if (obj->smart.smart->func_raise)
obj->smart.smart->func_raise(obj);
}
if (!(((Evas_Object_List *)obj)->next)) return;
obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj);
obj->layer->objects = evas_object_list_append(obj->layer->objects, obj);
if (obj->clip.clipees) return;
obj->restack = 1;
evas_object_change(obj);
if (!obj->smart.smart)
{
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1) &&
obj->cur.visible)
evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y);
}
}
void
evas_object_lower(Evas_Object *obj)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (obj->smart.smart)
{
if (obj->smart.smart->func_lower)
obj->smart.smart->func_lower(obj);
}
if (!(((Evas_Object_List *)obj)->prev)) return;
obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj);
obj->layer->objects = evas_object_list_prepend(obj->layer->objects, obj);
if (obj->clip.clipees) return;
obj->restack = 1;
evas_object_change(obj);
if (!obj->smart.smart)
{
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1) &&
obj->cur.visible)
evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y);
}
}
void
evas_object_stack_above(Evas_Object *obj, Evas_Object *above)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
MAGIC_CHECK(above, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (obj->smart.smart)
{
if (obj->smart.smart->func_stack_above)
obj->smart.smart->func_stack_above(obj, above);
}
if (above->layer != obj->layer) return;
if (((Evas_Object_List *)obj)->prev == (Evas_Object_List *)above) return;
obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj);
obj->layer->objects = evas_object_list_append_relative(obj->layer->objects, obj, above);
if (obj->clip.clipees) return;
obj->restack = 1;
evas_object_change(obj);
if (!obj->smart.smart)
{
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1) &&
obj->cur.visible)
evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y);
}
}
void
evas_object_stack_below(Evas_Object *obj, Evas_Object *below)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
MAGIC_CHECK(below, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (obj->smart.smart)
{
if (obj->smart.smart->func_stack_below)
obj->smart.smart->func_stack_below(obj, below);
}
if (below->layer != obj->layer) return;
if (((Evas_Object_List *)obj)->next == (Evas_Object_List *)below) return;
obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj);
obj->layer->objects = evas_object_list_prepend_relative(obj->layer->objects, obj, below);
if (obj->clip.clipees) return;
obj->restack = 1;
evas_object_change(obj);
if (!obj->smart.smart)
{
if (evas_object_is_in_output_rect(obj,
obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1) &&
obj->cur.visible)
evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y);
}
}
Evas_Object *
evas_object_above_get(Evas_Object *obj)
{
Evas_Object *obj2;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
obj2 = evas_object_above_get_internal(obj);
while ((obj2) && (obj2->smart.parent))
obj2 = evas_object_above_get_internal(obj2);
return obj2;
}
Evas_Object *
evas_object_below_get(Evas_Object *obj)
{
Evas_Object *obj2;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
obj2 = evas_object_below_get_internal(obj);
while ((obj2) && (obj2->smart.parent))
obj2 = evas_object_below_get_internal(obj2);
return obj2;
}
Evas_Object *
evas_object_bottom_get(Evas *e)
{
Evas_Object *obj2;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
if (e->layers)
obj2 = e->layers->objects;
while ((obj2) && (obj2->smart.parent))
obj2 = evas_object_above_get_internal(obj2);
return obj2;
}
Evas_Object *
evas_object_top_get(Evas *e)
{
Evas_Object *obj2;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
if (e->layers)
obj2 = (Evas_Object *)(((Evas_List *)(((Evas_Layer *)(((Evas_Object_List *)(e->layers))->last))->objects))->last);
while ((obj2) && (obj2->smart.parent))
obj2 = evas_object_below_get_internal(obj2);
return obj2;
}

View File

@ -0,0 +1,24 @@
## Process this file with automake to produce Makefile.in
AUTOMAKE_OPTIONS = 1.4 foreign
# A list of all the files in the current directory which can be regenerated
MAINTAINERCLEANFILES = Makefile.in
LDFLAGS = -L/usr/local/lib
INCLUDES = \
-I. \
-I$(top_srcdir)/src/lib \
-I$(top_srcdir)/src/lib/include \
-I$(includedir) \
-I/usr/local/include \
@freetype_cflags@
noinst_LTLIBRARIES = libevas_data.la
libevas_data_la_SOURCES = \
evas_hash.c \
evas_list.c \
evas_object_list.c
libevas_data_la_LIBADD = $(LDFLAGS)
libevas_data_la_DEPENDENCIES = $(top_builddir)/config.h

View File

@ -0,0 +1,161 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
static int evas_hash_gen(const char *key);
static int
evas_hash_gen(const char *key)
{
unsigned int hash_num = 0;
const unsigned char *ptr;
if (!key) return 0;
for (ptr = (unsigned char *)key; *ptr; ptr++) hash_num ^= (int)(*ptr);
hash_num &= 0xff;
return (int)hash_num;
}
Evas_Hash *
evas_hash_add(Evas_Hash *hash, const char *key, void *data)
{
int hash_num;
Evas_Hash_El *el;
if (!hash)
{
hash = malloc(sizeof(struct _Evas_Hash));
if (!hash) return NULL;
memset(hash, 0, sizeof(struct _Evas_Hash));
}
if (!(el = malloc(sizeof(struct _Evas_Hash_El))))
{
if (hash->population <= 0)
free(hash);
return NULL;
};
if (key)
{
el->key = strdup(key);
hash_num = evas_hash_gen(key);
}
else
{
el->key = NULL;
hash_num = 0;
}
el->data = data;
hash->buckets[hash_num] = evas_object_list_prepend(hash->buckets[hash_num], el);
hash->population++;
return hash;
}
Evas_Hash *
evas_hash_del(Evas_Hash *hash, const char *key, void *data)
{
int hash_num;
Evas_Hash_El *el;
Evas_Object_List *l;
if (!hash) return NULL;
hash_num = evas_hash_gen(key);
for (l = hash->buckets[hash_num]; l; l = l->next)
{
el = (Evas_Hash_El *)l;
if ((((el->key) && (key) && (!strcmp(el->key, key))) ||
((!el->key) && (!key))) && (el->data == data))
{
hash->buckets[hash_num] = evas_object_list_remove(hash->buckets[hash_num], el);
if (el->key) free(el->key);
free(el);
hash->population--;
if (hash->population <= 0)
{
free(hash);
hash = NULL;
}
return hash;
}
}
return hash;
}
void *
evas_hash_find(Evas_Hash *hash, const char *key)
{
int hash_num;
Evas_Hash_El *el;
Evas_Object_List *l;
if (!hash) return NULL;
hash_num = evas_hash_gen(key);
for (l = hash->buckets[hash_num]; l; l = l->next)
{
el = (Evas_Hash_El *)l;
if (((el->key) && (key) && (!strcmp(el->key, key))) ||
((!el->key) && (!key)))
{
if (l != hash->buckets[hash_num])
{
hash->buckets[hash_num] = evas_object_list_remove(hash->buckets[hash_num], el);
hash->buckets[hash_num] = evas_object_list_prepend(hash->buckets[hash_num], el);
}
return el->data;
}
}
return NULL;
}
int
evas_hash_size(Evas_Hash *hash)
{
if (!hash) return 0;
return 256;
}
void
evas_hash_free(Evas_Hash *hash)
{
int i, size;
if (!hash) return;
size = evas_hash_size(hash);
for (i = 0; i < size; i++)
{
while (hash->buckets[i])
{
Evas_Hash_El *el;
el = (Evas_Hash_El *)hash->buckets[i];
if (el->key) free(el->key);
hash->buckets[i] = evas_object_list_remove(hash->buckets[i], el);
free(el);
}
}
free(hash);
}
void
evas_hash_foreach(Evas_Hash *hash, int (*func) (Evas_Hash *hash, const char *key, void *data, void *fdata), void *fdata)
{
int i, size;
if (!hash) return;
size = evas_hash_size(hash);
for (i = 0; i < size; i++)
{
Evas_Object_List *l, *next_l;
for (l = hash->buckets[i]; l;)
{
Evas_Hash_El *el;
next_l = l->next;
el = (Evas_Hash_El *)l;
func(hash, el->key, el->data, fdata);
l = next_l;
}
}
}

View File

@ -0,0 +1,263 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
/* list ops */
Evas_List *
evas_list_append(Evas_List *list, void *data)
{
Evas_List *l, *new_l;
new_l = malloc(sizeof(Evas_List));
new_l->next = NULL;
new_l->prev = NULL;
new_l->data = data;
if (!list)
{
new_l->last = new_l;
new_l->count = 1;
return new_l;
}
if (list->last)
{
l = list->last;
l->next = new_l;
new_l->prev = l;
list->last = new_l;
list->count++;
return list;
}
else
{
for (l = list; l; l = l->next)
{
if (!l->next)
{
l->next = new_l;
new_l->prev = l;
list->last = new_l;
list->count++;
return list;
}
}
}
return list;
}
Evas_List *
evas_list_prepend(Evas_List *list, void *data)
{
Evas_List *new_l;
new_l = malloc(sizeof(Evas_List));
new_l->prev = NULL;
new_l->data = data;
if (!list)
{
new_l->next = NULL;
new_l->last = new_l;
new_l->count = 1;
return new_l;
}
new_l->next = list;
list->prev = new_l;
new_l->last = list->last;
list->last = NULL;
new_l->count = list->count + 1;
return new_l;
}
Evas_List *
evas_list_append_relative(Evas_List *list, void *data, void *relative)
{
Evas_List *l;
for (l = list; l; l = l->next)
{
if (l->data == relative)
{
Evas_List *new_l;
new_l = malloc(sizeof(Evas_List));
new_l->data = data;
if (l->next)
{
new_l->next = l->next;
l->next->prev = new_l;
}
else
new_l->next = NULL;
l->next = new_l;
new_l->prev = l;
if (!new_l->next) list->last = new_l;
list->count++;
return list;
}
}
return evas_list_append(list, data);
}
Evas_List *
evas_list_prepend_relative(Evas_List *list, void *data, void *relative)
{
Evas_List *l;
for (l = list; l; l = l->next)
{
if (l->data == relative)
{
Evas_List *new_l;
new_l = malloc(sizeof(Evas_List));
new_l->data = data;
new_l->prev = l->prev;
new_l->next = l;
if (l->prev) l->prev->next = new_l;
l->prev = new_l;
if (new_l->prev)
{
if (!new_l->next) list->last = new_l;
list->count++;
return list;
}
else
{
new_l->last = list->last;
list->last = NULL;
new_l->count = list->count + 1;
return new_l;
}
}
}
return evas_list_prepend(list, data);
}
Evas_List *
evas_list_remove(Evas_List *list, void *data)
{
Evas_List *l;
for (l = list; l; l = l->next)
{
if (l->data == data)
return evas_list_remove_list(list, l);
}
return list;
}
Evas_List *
evas_list_remove_list(Evas_List *list, Evas_List *remove_list)
{
Evas_List *return_l;
if (!remove_list) return list;
if (remove_list->next) remove_list->next->prev = remove_list->prev;
if (remove_list->prev)
{
remove_list->prev->next = remove_list->next;
return_l = list;
}
else
{
if (remove_list->next)
remove_list->next->count = remove_list->count;
return_l = remove_list->next;
if (return_l) return_l->last = list->last;
}
if (remove_list == list->last) list->last = remove_list->prev;
free(remove_list);
if (return_l) return_l->count--;
return return_l;
}
void *
evas_list_find(Evas_List *list, void *data)
{
Evas_List *l;
for (l = list; l; l = l->next)
{
if (l->data == data) return data;
}
return NULL;
}
Evas_List *
evas_list_free(Evas_List *list)
{
Evas_List *l, *free_l;
for (l = list; l;)
{
free_l = l;
l = l->next;
free(free_l);
}
return NULL;
}
Evas_List *
evas_list_last(Evas_List *list)
{
if (!list) return NULL;
return list->last;
}
Evas_List *
evas_list_next(Evas_List *list)
{
if (!list) return NULL;
return list->next;
}
Evas_List *
evas_list_prev(Evas_List *list)
{
if (!list) return NULL;
return list->prev;
}
void *
evas_list_data(Evas_List *list)
{
if (!list) return NULL;
return list->data;
}
int
evas_list_count(Evas_List *list)
{
if (!list) return 0;
return list->count;
}
void *
evas_list_nth(Evas_List *list, int n)
{
int i;
Evas_List *l;
if (n < 0) return NULL;
for (i = 0, l = list; l; l = l->next, i++)
{
if (i == n) return l->data;
}
return NULL;
}
Evas_List *
evas_list_reverse(Evas_List *list)
{
Evas_List *new_l = NULL;
while (list)
{
void *data;
data = list->data;
list = evas_list_remove_list(list, list);
new_l = evas_list_prepend(new_l, data);
}
return new_l;
}

View File

@ -0,0 +1,172 @@
#include "evas_common.h"
/* list ops */
void *
evas_object_list_append(void *in_list, void *in_item)
{
Evas_Object_List *l, *new_l;
Evas_Object_List *list, *item;
list = in_list;
item = in_item;
new_l = item;
new_l->next = NULL;
if (!list)
{
new_l->prev = NULL;
new_l->last = new_l;
return new_l;
}
if (list->last) l = list->last;
else for (l = list; l; l = l->next);
l->next = new_l;
new_l->prev = l;
list->last = new_l;
return list;
}
void *
evas_object_list_prepend(void *in_list, void *in_item)
{
Evas_Object_List *new_l;
Evas_Object_List *list, *item;
list = in_list;
item = in_item;
new_l = item;
new_l->prev = NULL;
if (!list)
{
new_l->next = NULL;
new_l->last = new_l;
return new_l;
}
new_l->next = list;
list->prev = new_l;
new_l->last = list->last;
list->last = NULL;
return new_l;
}
void *
evas_object_list_append_relative(void *in_list, void *in_item, void *in_relative)
{
Evas_Object_List *l;
Evas_Object_List *list, *item, *relative;
list = in_list;
item = in_item;
relative = in_relative;
for (l = list; l; l = l->next)
{
if (l == relative)
{
Evas_Object_List *new_l;
new_l = item;
if (l->next)
{
new_l->next = l->next;
l->next->prev = new_l;
}
else new_l->next = NULL;
l->next = new_l;
new_l->prev = l;
if (!new_l->next)
list->last = new_l;
return list;
}
}
return evas_object_list_append(list, item);
}
void *
evas_object_list_prepend_relative(void *in_list, void *in_item, void *in_relative)
{
Evas_Object_List *l;
Evas_Object_List *list, *item, *relative;
list = in_list;
item = in_item;
relative = in_relative;
for (l = list; l; l = l->next)
{
if (l == relative)
{
Evas_Object_List *new_l;
new_l = item;
new_l->prev = l->prev;
new_l->next = l;
l->prev = new_l;
if (new_l->prev)
{
new_l->prev->next = new_l;
if (!new_l->next)
list->last = new_l;
return list;
}
else
{
if (!new_l->next)
new_l->last = new_l;
else
{
new_l->last = list->last;
list->last = NULL;
}
return new_l;
}
}
}
return evas_object_list_prepend(list, item);
}
void *
evas_object_list_remove(void *in_list, void *in_item)
{
Evas_Object_List *return_l;
Evas_Object_List *list, *item;
/* checkme */
if(!in_list)
return in_list;
list = in_list;
item = in_item;
if (!item) return list;
if (item->next)
item->next->prev = item->prev;
if (item->prev)
{
item->prev->next = item->next;
return_l = list;
}
else
{
return_l = item->next;
if (return_l)
return_l->last = list->last;
}
if (item == list->last)
list->last = item->prev;
item->next = NULL;
item->prev = NULL;
return return_l;
}
void *
evas_object_list_find(void *in_list, void *in_item)
{
Evas_Object_List *l;
Evas_Object_List *list, *item;
list = in_list;
item = in_item;
for (l = list; l; l = l->next)
{
if (l == item) return item;
}
return NULL;
}

View File

@ -0,0 +1,11 @@
## Process this file with automake to produce Makefile.in
SUBDIRS = \
common \
software_x11 \
fb \
software_win32_gdi \
software_qtopia \
directfb \
gl_common \
gl_x11

View File

@ -0,0 +1,58 @@
## Process this file with automake to produce Makefile.in
AUTOMAKE_OPTIONS = 1.4 foreign
# A list of all the files in the current directory which can be regenerated
MAINTAINERCLEANFILES = Makefile.in
LDFLAGS = -L/usr/local/lib
INCLUDES = \
-I. \
-I$(top_srcdir)/src/lib \
-I$(top_srcdir)/src/lib/include \
-I$(includedir) \
-I/usr/local/include \
@freetype_cflags@
noinst_LTLIBRARIES = libevas_engine_common.la
libevas_engine_common_la_SOURCES = \
evas_blend_alpha_color_pixel.c \
evas_blend_color_pixel.c \
evas_blend_main.c \
evas_blend_pixel_cmod_pixel.c \
evas_blend_pixel_mul_pixel.c \
evas_blend_pixel_pixel.c \
evas_blit_main.c \
evas_convert_color.c \
evas_convert_gry_1.c \
evas_convert_gry_4.c \
evas_convert_gry_8.c \
evas_convert_main.c \
evas_convert_rgb_16.c \
evas_convert_rgb_24.c \
evas_convert_rgb_32.c \
evas_convert_rgb_8.c \
evas_cpu.c \
evas_draw_main.c \
evas_font_draw.c \
evas_font_load.c \
evas_font_main.c \
evas_font_query.c \
evas_gradient_main.c \
evas_image_load.c \
evas_image_main.c \
evas_line_main.c \
evas_polygon_main.c \
evas_rectangle_main.c \
evas_scale_main.c \
evas_scale_sample.c \
evas_scale_smooth.c \
evas_tiler.c
EXTRA_DIST = evas_scale_smooth_scaler.c
libevas_engine_common_la_LIBADD = \
$(LDFLAGS)
libevas_engine_common_la_DEPENDENCIES = \
$(top_builddir)/config.h

View File

@ -0,0 +1,142 @@
#include "evas_common.h"
#ifdef BUILD_MMX
#include "evas_mmx.h"
#endif
extern DATA8 pow_lut[256][256];
extern const DATA16 const_c1[4];
#ifdef BUILD_C
void
blend_alpha_color_rgba_to_rgb_c (DATA8 *src, DATA32 *dst, int len, DATA32 col)
{
DATA8 *src_ptr;
DATA32 *dst_ptr, *dst_end_ptr;
src_ptr = src;
dst_ptr = dst;
dst_end_ptr = dst + len;
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
DATA8 aa;
aa = (((*src_ptr) +1) * A_VAL(&col)) >> 8;
BLEND_COLOR(aa, R_VAL(dst_ptr),
R_VAL(&col), R_VAL(dst_ptr),
tmp);
BLEND_COLOR(aa, G_VAL(dst_ptr),
G_VAL(&col), G_VAL(dst_ptr),
tmp);
BLEND_COLOR(aa, B_VAL(dst_ptr),
B_VAL(&col), B_VAL(dst_ptr),
tmp);
src_ptr++;
dst_ptr++;
}
}
#endif
#ifdef BUILD_MMX
void
blend_alpha_color_rgba_to_rgb_mmx (DATA8 *src, DATA32 *dst, int len, DATA32 col)
{
DATA8 *src_ptr;
DATA32 *dst_ptr, *dst_end_ptr;
src_ptr = src;
dst_ptr = dst;
dst_end_ptr = dst + len;
pxor_r2r(mm6, mm6);
movd_m2r(col, mm1);
punpcklbw_r2r(mm1, mm6);
psrlw_i2r(8, mm6);
movq_m2r(*const_c1, mm5);
paddw_r2r(mm5, mm6);
pxor_r2r(mm4, mm4);
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
tmp = 0xffffff;
A_VAL(&tmp) = *src_ptr;
movd_m2r(tmp, mm1);
/* this could be more optimial.. but it beats the c code by almost */
/* double */
pxor_r2r(mm7, mm7);
punpcklbw_r2r(mm1, mm7);
psrlw_i2r(8, mm7);
pmullw_r2r(mm6, mm7);
psrlw_i2r(8, mm7);
packuswb_r2r(mm7, mm7);
movq_r2r(mm7, mm1);
/* and back to our normal programming... */
movd_m2r(dst_ptr[0], mm2);
movq_r2r(mm1, mm3);
punpcklbw_r2r(mm3, mm3);
punpckhwd_r2r(mm3, mm3);
punpckhdq_r2r(mm3, mm3);
psrlw_i2r(1, mm3);
psrlq_i2r(16, mm3);
punpcklbw_r2r(mm4, mm1);
punpcklbw_r2r(mm4, mm2);
psubw_r2r(mm2, mm1);
psllw_i2r(1, mm1);
paddw_r2r(mm5, mm1);
pmulhw_r2r(mm3, mm1);
paddw_r2r(mm1, mm2);
packuswb_r2r(mm4, mm2);
movd_r2m(mm2, dst_ptr[0]);
src_ptr++;
dst_ptr++;
}
}
#endif
void
blend_alpha_color_rgba_to_rgba_c (DATA8 *src, DATA32 *dst, int len, DATA32 col)
{
DATA8 *src_ptr;
DATA32 *dst_ptr, *dst_end_ptr;
src_ptr = src;
dst_ptr = dst;
dst_end_ptr = dst + len;
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
DATA8 a;
DATA8 aa;
aa = (((*src_ptr) + 1) * A_VAL(&col)) >> 8;
a = pow_lut[aa][A_VAL(dst_ptr)];
BLEND_COLOR(a, R_VAL(dst_ptr),
R_VAL(&col), R_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, G_VAL(dst_ptr),
G_VAL(&col), G_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, B_VAL(dst_ptr),
B_VAL(&col), B_VAL(dst_ptr),
tmp);
A_VAL(dst_ptr) = A_VAL(dst_ptr) + ((aa * (255 - A_VAL(dst_ptr))) / 255);
src_ptr++;
dst_ptr++;
}
}

View File

@ -0,0 +1,215 @@
#include "evas_common.h"
#ifdef BUILD_MMX
#include "evas_mmx.h"
#endif
extern DATA8 pow_lut[256][256];
extern const DATA16 const_c1[4];
#ifdef BUILD_C
void
blend_color_rgba_to_rgb_c(DATA32 src, DATA32 *dst, int len)
{
DATA32 *dst_ptr, *dst_end_ptr;
dst_ptr = dst;
dst_end_ptr = dst + len;
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
BLEND_COLOR(A_VAL(&src), R_VAL(dst_ptr),
R_VAL(&src), R_VAL(dst_ptr),
tmp);
BLEND_COLOR(A_VAL(&src), G_VAL(dst_ptr),
G_VAL(&src), G_VAL(dst_ptr),
tmp);
BLEND_COLOR(A_VAL(&src), B_VAL(dst_ptr),
B_VAL(&src), B_VAL(dst_ptr),
tmp);
dst_ptr++;
}
}
#endif
#ifdef BUILD_MMX
void
blend_color_rgba_to_rgb_mmx(DATA32 src, DATA32 *dst, int len)
{
DATA32 *dst_ptr, *dst_end_ptr;
dst_ptr = dst;
dst_end_ptr = dst + len;
pxor_r2r(mm4, mm4);
movq_m2r(*const_c1, mm5);
movd_m2r(src, mm6);
movq_r2r(mm6, mm3);
punpcklbw_r2r(mm3, mm3);
punpckhwd_r2r(mm3, mm3);
punpckhdq_r2r(mm3, mm3);
psrlw_i2r(1, mm3);
psrlq_i2r(16, mm3);
while (dst_ptr < dst_end_ptr)
{
movq_r2r(mm6, mm1);
movd_m2r(dst_ptr[0], mm2);
punpcklbw_r2r(mm4, mm1);
punpcklbw_r2r(mm4, mm2);
psubw_r2r(mm2, mm1);
psllw_i2r(1, mm1);
paddw_r2r(mm5, mm1);
pmulhw_r2r(mm3, mm1);
paddw_r2r(mm1, mm2);
packuswb_r2r(mm4, mm2);
movd_r2m(mm2, dst_ptr[0]);
dst_ptr++;
}
}
#endif
/****************************************************************************/
void
blend_color_rgba_to_rgba_c(DATA32 src, DATA32 *dst, int len)
{
DATA32 *dst_ptr, *dst_end_ptr;
dst_ptr = dst;
dst_end_ptr = dst + len;
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
DATA8 a;
a = pow_lut[A_VAL(&src)][A_VAL(dst_ptr)];
BLEND_COLOR(a, R_VAL(dst_ptr),
R_VAL(&src), R_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, G_VAL(dst_ptr),
G_VAL(&src), G_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, B_VAL(dst_ptr),
B_VAL(&src), B_VAL(dst_ptr),
tmp);
A_VAL(dst_ptr) = A_VAL(dst_ptr) + ((A_VAL(&src) * (255 - A_VAL(dst_ptr))) / 255);
dst_ptr++;
}
}
/****************************************************************************/
#ifdef BUILD_C
void
copy_color_rgba_to_rgba_c(DATA32 src, DATA32 *dst, int len)
{
DATA32 *dst_ptr, *dst_end_ptr;
dst_ptr = dst;
dst_end_ptr = dst + len;
while (dst_ptr < dst_end_ptr)
{
*dst_ptr = src;
dst_ptr++;
}
}
#endif
#ifdef BUILD_MMX
void
copy_color_rgba_to_rgba_mmx(DATA32 src, DATA32 *dst, int len)
{
DATA32 *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
dst_ptr = dst;
dst_end_ptr = dst + len;
dst_end_ptr_pre = dst + ((len / 10) * 10);
movd_m2r(src, mm0);
movd_m2r(src, mm1);
psllq_i2r(32, mm0);
por_r2r(mm1, mm0);
while (dst_ptr < dst_end_ptr_pre)
{
movq_r2m(mm0, dst_ptr[0]);
movq_r2m(mm0, dst_ptr[2]);
movq_r2m(mm0, dst_ptr[4]);
movq_r2m(mm0, dst_ptr[6]);
movq_r2m(mm0, dst_ptr[8]);
dst_ptr+=10;
}
while (dst_ptr < dst_end_ptr)
{
*dst_ptr = src;
dst_ptr++;
}
}
#endif
#ifdef BUILD_SSE
void
copy_color_rgba_to_rgba_sse(DATA32 src, DATA32 *dst, int len)
{
DATA32 *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
dst_ptr = dst;
dst_end_ptr = dst + len;
dst_end_ptr_pre = dst + ((len / 10) * 10);
movd_m2r(src, mm0);
movd_m2r(src, mm1);
psllq_i2r(32, mm0);
por_r2r(mm1, mm0);
while (dst_ptr < dst_end_ptr_pre)
{
prefetch(&dst_ptr[128]);
movq_r2m(mm0, dst_ptr[0]);
movq_r2m(mm0, dst_ptr[2]);
movq_r2m(mm0, dst_ptr[4]);
movq_r2m(mm0, dst_ptr[6]);
movq_r2m(mm0, dst_ptr[8]);
dst_ptr+=10;
}
while (dst_ptr < dst_end_ptr)
{
*dst_ptr = src;
dst_ptr++;
}
}
#endif
/****************************************************************************/
void
copy_color_rgb_to_rgba_c(DATA32 src, DATA32 *dst, int len)
{
DATA32 *dst_ptr, *dst_end_ptr;
dst_ptr = dst;
dst_end_ptr = dst + len;
src |= PIXEL_SOLID_ALPHA;
while (dst_ptr < dst_end_ptr)
{
*dst_ptr = src;
dst_ptr++;
}
}

View File

@ -0,0 +1,44 @@
#include "evas_common.h"
#ifdef BUILD_MMX
#include "evas_mmx.h"
#endif
static void blend_init_pow_lut(void);
DATA8 pow_lut[256][256];
const DATA16 const_c1[4] = {1, 1, 1, 1};
void
blend_init(void)
{
static int initialised = 0;
static int mmx = 0;
static int sse = 0;
static int sse2 = 0;
if (initialised) return;
initialised = 1;
cpu_can_do(&mmx, &sse, &sse2);
blend_init_pow_lut();
}
void
blend_init_pow_lut(void)
{
int i, j;
for (i = 0; i < 256; i++)
{
for (j = 0; j < 256; j++)
{
int divisor;
divisor = (i + (j * (255 - i)) / 255);
if (divisor > 0) pow_lut[i][j] = (i * 255) / divisor;
else pow_lut[i][j] = 0;
}
}
}

View File

@ -0,0 +1,119 @@
#include "evas_common.h"
#ifdef BUILD_MMX
#include "evas_mmx.h"
#endif
extern DATA8 pow_lut[256][256];
extern const DATA16 const_c1[4];
void
blend_pixels_cmod_rgba_to_rgb_c(DATA32 *src, DATA32 *dst, int len, DATA8 *rmod, DATA8 *gmod, DATA8 *bmod, DATA8 *amod)
{
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
src_ptr = src;
dst_ptr = dst;
dst_end_ptr = dst + len;
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
DATA8 a;
a = amod[A_VAL(src_ptr)];
if (a) /* hmmm - do we need this? */
{
BLEND_COLOR(a, R_VAL(dst_ptr),
rmod[R_VAL(src_ptr)], R_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, G_VAL(dst_ptr),
gmod[G_VAL(src_ptr)], G_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, B_VAL(dst_ptr),
bmod[B_VAL(src_ptr)], B_VAL(dst_ptr),
tmp);
}
src_ptr++;
dst_ptr++;
}
}
/****************************************************************************/
void
blend_pixels_cmod_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len, DATA8 *rmod, DATA8 *gmod, DATA8 *bmod, DATA8 *amod)
{
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
src_ptr = src;
dst_ptr = dst;
dst_end_ptr = dst + len;
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
DATA8 a;
a = pow_lut[amod[A_VAL(src_ptr)]][A_VAL(dst_ptr)];
if (a) /* hmmm - do we need this? */
{
BLEND_COLOR(a, R_VAL(dst_ptr),
rmod[R_VAL(src_ptr)], R_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, G_VAL(dst_ptr),
gmod[G_VAL(src_ptr)], G_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, B_VAL(dst_ptr),
bmod[B_VAL(src_ptr)], B_VAL(dst_ptr),
tmp);
A_VAL(dst_ptr) = A_VAL(dst_ptr) + ((amod[A_VAL(src_ptr)] * (255 - A_VAL(dst_ptr))) / 255);
}
src_ptr++;
dst_ptr++;
}
}
/****************************************************************************/
void
copy_pixels_cmod_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len, DATA8 *rmod, DATA8 *gmod, DATA8 *bmod, DATA8 *amod)
{
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
src_ptr = src;
dst_ptr = dst;
dst_end_ptr = dst + len;
while (dst_ptr < dst_end_ptr)
{
R_VAL(dst_ptr) = rmod[R_VAL(src_ptr)];
G_VAL(dst_ptr) = gmod[G_VAL(src_ptr)];
B_VAL(dst_ptr) = bmod[B_VAL(src_ptr)];
A_VAL(dst_ptr) = amod[A_VAL(src_ptr)];
src_ptr++;
dst_ptr++;
}
}
/****************************************************************************/
void
copy_pixels_cmod_rgb_to_rgba_c(DATA32 *src, DATA32 *dst, int len, DATA8 *rmod, DATA8 *gmod, DATA8 *bmod, DATA8 *amod)
{
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
src_ptr = src;
dst_ptr = dst;
dst_end_ptr = dst + len;
while (dst_ptr < dst_end_ptr)
{
R_VAL(dst_ptr) = rmod[R_VAL(src_ptr)];
G_VAL(dst_ptr) = gmod[G_VAL(src_ptr)];
B_VAL(dst_ptr) = bmod[B_VAL(src_ptr)];
A_VAL(dst_ptr) = amod[255];
src_ptr++;
dst_ptr++;
}
}

View File

@ -0,0 +1,202 @@
#include "evas_common.h"
#ifdef BUILD_MMX
#include "evas_mmx.h"
#endif
extern DATA8 pow_lut[256][256];
extern const DATA16 const_c1[4];
#ifdef BUILD_C
void
blend_pixels_mul_color_rgba_to_rgb_c(DATA32 *src, DATA32 *dst, int len, DATA32 mul_color)
{
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
src_ptr = src;
dst_ptr = dst;
dst_end_ptr = dst + len;
if ((R_VAL(&mul_color) == 255) &&
(G_VAL(&mul_color) == 255) &&
(B_VAL(&mul_color) == 255))
{
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
DATA8 a;
a = (A_VAL(src_ptr) * (A_VAL(&mul_color) + 1)) >> 8;
if (a) /* hmmm - do we need this? */
{
BLEND_COLOR(a, R_VAL(dst_ptr),
R_VAL(src_ptr), R_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, G_VAL(dst_ptr),
G_VAL(src_ptr), G_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, B_VAL(dst_ptr),
B_VAL(src_ptr), B_VAL(dst_ptr),
tmp);
}
src_ptr++;
dst_ptr++;
}
}
else
{
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
DATA8 a;
a = (A_VAL(src_ptr) * (A_VAL(&mul_color) + 1)) >> 8;
if (a) /* hmmm - do we need this? */
{
BLEND_COLOR(a, R_VAL(dst_ptr),
((R_VAL(src_ptr) * (R_VAL(&mul_color) + 1)) >> 8), R_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, G_VAL(dst_ptr),
((G_VAL(src_ptr) * (G_VAL(&mul_color) + 1)) >> 8), G_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, B_VAL(dst_ptr),
((B_VAL(src_ptr) * (B_VAL(&mul_color) + 1)) >> 8), B_VAL(dst_ptr),
tmp);
}
src_ptr++;
dst_ptr++;
}
}
}
#endif
#ifdef BUILD_MMX
void
blend_pixels_mul_color_rgba_to_rgb_mmx(DATA32 *src, DATA32 *dst, int len, DATA32 mul_color)
{
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
src_ptr = src;
dst_ptr = dst;
dst_end_ptr = dst + len;
pxor_r2r(mm6, mm6);
movd_m2r(mul_color, mm1);
punpcklbw_r2r(mm1, mm6);
psrlw_i2r(8, mm6);
movq_m2r(*const_c1, mm5);
paddw_r2r(mm5, mm6);
pxor_r2r(mm4, mm4);
while (dst_ptr < dst_end_ptr)
{
movd_m2r(src_ptr[0], mm1);
/* this could be more optimial.. but it beats the c code by almost */
/* double */
pxor_r2r(mm7, mm7);
punpcklbw_r2r(mm1, mm7);
psrlw_i2r(8, mm7);
pmullw_r2r(mm6, mm7);
psrlw_i2r(8, mm7);
packuswb_r2r(mm7, mm7);
movq_r2r(mm7, mm1);
/* and back to our normal programming... */
movd_m2r(dst_ptr[0], mm2);
movq_r2r(mm1, mm3);
punpcklbw_r2r(mm3, mm3);
punpckhwd_r2r(mm3, mm3);
punpckhdq_r2r(mm3, mm3);
psrlw_i2r(1, mm3);
psrlq_i2r(16, mm3);
punpcklbw_r2r(mm4, mm1);
punpcklbw_r2r(mm4, mm2);
psubw_r2r(mm2, mm1);
psllw_i2r(1, mm1);
paddw_r2r(mm5, mm1);
pmulhw_r2r(mm3, mm1);
paddw_r2r(mm1, mm2);
packuswb_r2r(mm4, mm2);
movd_r2m(mm2, dst_ptr[0]);
src_ptr++;
dst_ptr++;
}
}
#endif
/****************************************************************************/
void
blend_pixels_mul_color_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len, DATA32 mul_color)
{
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
src_ptr = src;
dst_ptr = dst;
dst_end_ptr = dst + len;
if ((R_VAL(&mul_color) == 255) &&
(G_VAL(&mul_color) == 255) &&
(B_VAL(&mul_color) == 255))
{
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
DATA8 a, aa;
aa = (A_VAL(src_ptr) * (A_VAL(&mul_color) + 1)) >> 8;
if (aa) /* hmmm - do we need this? */
{
a = pow_lut[aa][A_VAL(dst_ptr)];
BLEND_COLOR(a, R_VAL(dst_ptr),
R_VAL(src_ptr), R_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, G_VAL(dst_ptr),
G_VAL(src_ptr), G_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, B_VAL(dst_ptr),
B_VAL(src_ptr), B_VAL(dst_ptr),
tmp);
A_VAL(dst_ptr) = A_VAL(dst_ptr) + ((aa * (255 - A_VAL(dst_ptr))) / 255);
}
src_ptr++;
dst_ptr++;
}
}
else
{
while (dst_ptr < dst_end_ptr)
{
DATA32 tmp;
DATA8 a, aa;
aa = (A_VAL(src_ptr) * (A_VAL(&mul_color) + 1)) >> 8;
if (aa) /* hmmm - do we need this? */
{
a = pow_lut[aa][A_VAL(dst_ptr)];
BLEND_COLOR(a, R_VAL(dst_ptr),
((R_VAL(src_ptr) * (R_VAL(&mul_color) + 1)) >> 8), R_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, G_VAL(dst_ptr),
((G_VAL(src_ptr) * (G_VAL(&mul_color) + 1)) >> 8), G_VAL(dst_ptr),
tmp);
BLEND_COLOR(a, B_VAL(dst_ptr),
((B_VAL(src_ptr) * (B_VAL(&mul_color) + 1)) >> 8), B_VAL(dst_ptr),
tmp);
A_VAL(dst_ptr) = A_VAL(dst_ptr) + ((aa * (255 - A_VAL(dst_ptr))) / 255);
}
src_ptr++;
dst_ptr++;
}
}
}

Some files were not shown because too many files have changed in this diff Show More