esdl-1.3.1/0000775000070100000120000000000012200427544011107 5ustar dguduucpesdl-1.3.1/doc/0000775000070100000120000000000012200430005011636 5ustar dguduucpesdl-1.3.1/doc/sdl_video.html0000664000070100000120000003224212200430005014477 0ustar dguduucpsdl_video

Header File

The header file may include additional information sdl_video.hrl

Exports

getSurface(Surface)

getPixelFormat(Surface)

getPalette(Surface)

getPixels(Surface, Size)

setVideoMode(W, H, Bpp, Type)

videoDriverName()

getVideoSurface()

videoModeOK(W, H, Bpp, Type)

listModes({formatp, Ref}, Flags)

displayFormat(Surface)

blitSurface(SSurf, SRect, DSurf, DRect)

fillRect(S, R, C)

updateRect(S, X, Y, W, H)

updateRects(S, R)

flip({surfacep, Ref})

setColors(S, Colors, FirstColor, Ncolors)

setColorKey(Surface, Flag, Key)

mapRGB(Surface, R, G, B)

createRGBsurface(Flags, W, H, D, RM, GM, BM, AM)

createRGBsurfaceFrom(Pixels, W, H, D, P, RM, GM, BM, AM)

freeSurface(Surface)

mustLock(Surface)

lockSurface(Surface)

unlockSurface(Surface)

loadBMP(File)

saveBMP(Surface, File)

setAlpha(Surface, Flag, Alpha)

setClipping(Surface, Top, Left, Botton, Right)

setGamma(Red,Green,Blue)

setGammaRamp(Red,Green,Blue)

getGammaRamp()

wm_setCaption(Title, IconTitle)

wm_getCaption()

wm_setIcon(Icon, Mask)

wm_iconifyWindow()

wm_toggleFullScreen(Surface)

wm_grabInput(GrabMode)

wm_getInfo()

wm_isMaximized()

wm_maximize()

wm_mac_file_dialog(Props)

gl_setAttribute(Attr, Val)

gl_getAttribute(Attr)

gl_swapBuffers()

mapRGBA(Surface, R, G, B, A)

getClipRect(Surface)

setClipRect(Surface, Rect)

displayFormatAlpha(Surface)

esdl-1.3.1/doc/sdl_joystick.html0000664000070100000120000001312312200430005015225 0ustar dguduucpsdl_joystick

Header File

The header file may include additional information sdl_joystick.hrl

Exports

numJoysticks()

name(Index)

open(Index)

opened(Index)

index(Joystick)

numAxes(Joystick)

numBalls(Joystick)

numHats(Joystick)

numButtons(Joystick)

update()

getAxis(Joystick, Axis)

getHat(Joystick, Hat)

getButton(Joystick, Button)

getBall(Joystick, Ball)

close(Joystick)

esdl-1.3.1/doc/sdl_util.html0000664000070100000120000000615312200430005014350 0ustar dguduucpsdl_util

Header File

The header file may include additional information sdl_util.hrl

Exports

alloc(Size0, Type)

getBin(#sdlmem{bin=Bin})

malloc(Size, Type)

free(_Ref)

read(#sdlmem{type=Type,bin=Bin}, Size)

write(#sdlmem{type=Type,size=Size,bin=Dest}, Data)

write(#sdlmem{type=Type,size=Size0,bin=Dest0}, Offset, Data)

term2bin(Bin, _, _)

tuplelist2bin(2,Type,List)

bin2list(undefined, Type, Bin)

copySdlImage2GLArray(Image, Mem, Bpp)

debug(L)

esdl-1.3.1/doc/sdl_keyboard.html0000664000070100000120000000340012200430005015163 0ustar dguduucpsdl_keyboard

Header File

The header file may include additional information
sdl_keyboard.hrl

Exports

getKeyState()

enableUNICODE(Bool)

enableKeyRepeat(Delay, Interval)

getKeyName(Key)

getModState()

setModState(ModState)

esdl-1.3.1/doc/Makefile0000775000070100000120000000067212200143736013322 0ustar dguduucp ESRC = ../src ERLC = erlc DOCG = makedoc.beam DOC = sdl.html sdl_active.html \ sdl_audio.html sdl_events.html sdl_keyboard.html sdl_mouse.html sdl_joystick.html \ sdl_util.html sdl_video.html sdl_ttf.html sdl_img.html target: $(DOCG) $(DOC) %.beam: %.erl $(ERLC) -W -bbeam $(ERL_FLAGS) $(ERL_COMPILE_FLAGS) $< clean: rm -f $(DOCG) $(DOC) rm -f *~ %.html: $(ESRC)/%.erl $(DOCG) erl -noshell -s makedoc start $< -s erlang halt esdl-1.3.1/doc/sdl_mouse.html0000664000070100000120000000436012200430005014521 0ustar dguduucpsdl_mouse

Header File

The header file may include additional information sdl_mouse.hrl

Exports

getMouseState()

getRelativeMouseState()

warpMouse(X, Y)

createCursor(Data, Mask, W, H, HotX, HotY)

setCursor({cursorp,Ref})

getCursor()

freeCursor({cursorp,Ref})

showCursor(Bool)

esdl-1.3.1/doc/sdl_ttf.html0000664000070100000120000004014512200430005014167 0ustar dguduucpsdl_ttf

Header File

The header file may include additional information sdl_ttf.hrl

Exports

linkedVersion()

byteSwappedUNICODE(Int)

init()

openFont(File, PointSize)

openFontIndex(File, PointSize, Index)

openFontRW()

openFontIndexRW()

getFontStyle(Font)

setFontStyle(Font, FontStyle)

fontHeight(Font)

fontAscent(Font)

fontDescent(Font)

fontLineSkip(Font)

fontFaces(Font)

fontFaceIsFixedWidth(Font)

fontFaceFamilyName(Font)

fontFaceStyleName(Font)

glyphMetrics(Font, Ch)

sizeText(Font, Text)

sizeUTF8(Font, Text)

sizeUNICODE(Font, Text)

renderTextSolid(Font, Text, FgColor)

renderUTF8Solid(Font, Text, FgColor)

renderUNICODESolid(Font, Text, FgColor)

renderGlyphSolid(Font, Glyph, FgColor)

renderTextShaded(Font, Text, FgColor, BgColor)

renderUTF8Shaded(Font, Text, FgColor, BgColor)

renderUNICODEShaded(Font, Text, FgColor, BgColor)

renderGlyphShaded(Font, Glyph, FgColor, BgColor)

renderTextBlended(Font, Text, FgColor)

renderUTF8Blended(Font, Text, FgColor)

renderUNICODEBlended(Font, Text, FgColor)

renderGlyphBlended(Font, Glyph, FgColor)

closeFont(Font)

quit()

wasInit()

setError(_Error)

getError()

esdl-1.3.1/doc/index.html0000775000070100000120000000464512200143736013663 0ustar dguduucpESDL - SDL and OpenGL for Erlang

ESDL Introduction

ESDL is an api which invokes corresponding functions in the Sdl and Opengl libraries.

Since most of the functions are 1 to 1 mapping to the original libraries, the descriptions (if any) are brief. For detailed descriptions and manual pages take a look at the SDL and Opengl sites which should be able guide you to the documentation. I have tried to generate link to the descriptions on net, but may have failed in some cases.

With some common sense you should be able to figure out the arguments and return values to the functions. Arguments in the 'C' libraries that are used as out parameters, are often returned as a tuple with values. C functions that take pointer to an array as argument takes a list as argument in erlang (and/or tuple).

The thing that differs are of course the memory handling and memory references, check out the examples.

If you have complaints of non trivial (or errors) arguments or return values, send me an email and I'll try to update the documentation or (the fast way) check the source.

SDL commands

Init and Quit Functions
Video Functions
Audio Functions
General Event Functions
TTF Functions
Image Functions

OpenGL

Opengl functions that uses pointers requires that you use the memory functions in sdl_util to handle the memory references.
GL Functions
GLU Functions

Additions

Memory and Utility functions
esdl-1.3.1/doc/sdl.html0000664000070100000120000000154312200430005013311 0ustar dguduucpsdl

Header File

The header file may include additional information sdl.hrl

Exports

init(Flags)

quit()

getError()

esdl-1.3.1/doc/sdl_img.html0000664000070100000120000001703612200430005014151 0ustar dguduucpsdl_img

Header File

The header file may include additional information sdl_img.hrl

Exports

linkedVersion()

loadTypedRW()

load(File)

loadRW()

invertAlpha()

isBMP()

isPNM()

isXPM()

isXCF()

isPCX()

isGIF()

isJPG()

isTIF()

isPNG()

isLBM()

loadBMPRW()

loadPNMRW()

loadXPMRW()

loadXCFRW()

loadPCXRW()

loadGIFRW()

loadJPGRW()

loadTIFRW()

loadPNGRW()

loadTGARW()

loadLBMRW()

readXPMFromArray()

setError(_Error)

getError()

esdl-1.3.1/doc/sdl_events.html0000664000070100000120000000453112200430005014675 0ustar dguduucpsdl_events

Header File

The header file may include additional information sdl_events.hrl

Exports

pumpEvents()

peepEvents()

peepEvents(NumEvents, Mask)

peepEvents(NumEvents, ?SDL_GETEVENT, Mask)

pollEvent()

waitEvent()

eventState(Type, State)

esdl-1.3.1/doc/makedoc.beam0000664000070100000120000002074012200430004014071 0ustar dguduucpFOR1!ØBEAMAtomæJmakedocstartsdl sdl_active sdl_audio sdl_events sdl_keyboard sdl_mouse sdl_videosdl_ttfsdl_imgglglusdl_utilok../src/glu.erl ../src/gl.erl../src/sdl_video.erl../src/sdl_mouse.erl../src/sdl_keyboard.erl../src/sdl_joystick.erl../src/sdl_events.erl../src/sdl_audio.erl../src/sdl_active.erl../src/sdl.erl../src/sdl_ttf.erl../src/sdl_img.erl../src/sdl_util.erl sdl_joystickmakeerlang atom_to_list++filenamejoinioformatfileopenundefclose create_doc+funcf undefinedargs setelementretdesccapieoferror write_docfalseef write_typeadd_line gen_ext_refget_capi_funcnamelistsreverselc-get_func_clause insert_header insert_footerstripstrip1strip_gl module_infoget_module_info-make/2-fun-0-get_lineCodeo™™" @G@2™  @G@B™0 @G@R™@ @G@b™P @G@r™` @G@‚™p @G@’™€ @G@¢™ @G @²™  @G0@™° @G0@Ò™À @@â™Ð @ò0™à"@85A#45# 0 ;  U e u … • ¥ µ Å Õ å õ    P@G0@Ò™ð = `@G0@™ = p@G@’™ = €@G@‚™ = @G@r™ =  @G@ ™ = °@G@b™ = À@G@R™ = Ð@G@B™ = à@G@2™ = ð@G@¢™ = @G @²™ = @@â™ @ò™J™  P @4@D™@G@@$™ @EEGP™ @@G`@$™  @@EE@Gp™! 0@G€@™" @9 :  BB#+ ò@G@@#™# @9 :  BB#+ ò@#@$@$™$ j@g@™%K@ (C@DS@$3@c@4#@ (s@4Dˆ@™%€ @™& l@ˆ0™'P@™(P0™"H™#H™) *€8 +Aƒ“+ ,ƒ %8 ,“A“£³+ ,£ %8 '³A³ÃÓ+ 'à 8 'ÓAÓãó- 'ã;ã '  F  A  R  D " C $8 'óAó  + '  u8 ' A   + '  n8 ' A   + '  c8 ' A   + '  :+ )C (+ 's ( `@ @c@S$@34@#D@T™* n4 @EE$@G ™+ 0@T™,K™,}`c@ ,C@$S@43@D#@ (s@T€ `@@T™-K™-}`€ FpsG -GG .G .G .G .G .@ ,C@43@$S@D#@c@T€ `8 'óAó  + '  r8 ' A   + '  g8 ' A   + '  s8 ' A   + '  :;C )@ ,  ( ( p@ @s@c$@S4@3D@#T@d™. n4 @d™/K™/}`$c@ /C@4S@D3@T#@s@d€ p@@d™0K™0}`$9 6: 6pB#+ 6# -@$@3@@#@1@3ˆ`™00p@ /C@43@$S@D#@c@T@s@€ `8 'óAó  + '  e8 ' A   + '  t8 ' A   + '  u8 ' A   + '  r8 ' A   + '  n8 ' A   + '  s8 ' A   + '  :;C )@ / ( ( p@ @s@c$@S4@3D@#T@d™1 n4 !@d™2K™2}`$c@ 1C@4S@D3@T#@s@d€ p!@@d™3K™3}`$9 5: 5pB#+ 5# -@$@3@@#@A@3ˆ`™30p@ 1C@43@$S@D#@c@T@s@€ `"8 'óAó  + '  e8 ' A   + '  s8 ' A   + '  c8 ' A   + '  : p@ @s@c$@S4@3D@#T@d™4 n4 #@d™5K™5}`$c@ 2C@4S@D3@T#@s@d€ p#@@d™6K™6}`$9 4: 4pB#+ 4# -@$@3@@#@a@3ˆ`™60p@ 2C@43@$S@D#@c@T@s@€ `$8 'óAó  + '  -8 ' A   + '  A8 ' A   + '  P8 ' A   + '  I8 ' A   + '  8 ' A   + '  f8 ' A   + '  u8 ' A   + '  n8 ' A  !+ ' c8 ' !A ! " #+ ' " :;C )@ 1 % ( (% p$@ #@s@c$@S4@3D@#T@d™7 n4 &@E$E4@G°™8 0@d™9K™9}`$c@ 3C@4S@D3@T#@s@d€ p&@@d™:K™:}`$9 3: 3pB#+ 3# -@$@3@@#@Q@3ˆ`™:0p@ 3C@43@$S@D#@c@T@s@€ `'+ )C ((+ )s ( Pp@@c@S@3$@#4@D™;K™;}`c@ (C@S@$3@4#@ (s@D€ P) €À@³@s@c$@S4@CD@3T@#d@t™< n4 *@t™=K™=}`$c@DC@4S@T3@d#@s@t€ €*@@t™>K™>}`$3@$@D@#@@3ˆp™>0 A@4C@D3@$S@T#@c@d@s@€ p++ , 4@ò,0 0C;C 0` ( - 2 . 3 /-+ 0s ( Pp@@c@S@3$@#4@D™?K™?}`c@ (C@S@$3@4#@ (s@D€ P. `€@s@c@S$@34@#D@T™@ n9 2: 2pB+ 2 -@@#ˆP@q™A0p@$3@C@4#@S@D™A` 8@@D™BK™B}`c@ (C@S@$3@4#@ (s@D€ P/ `€@s@c@S$@34@#D@T™C n9 1: 1pB+ 1 -@@#ˆP@q™D0p@$3@C@4#@S@D™D` 8@@D™EK™E}`c@ (C@S@$3@4#@ (s@D€ P0 P€€@cD@S4@3$@#@EsCECEcES@GÀ™F 0@™GK™G}`Dc@ (C@4S@$3@#@ (s@€ P1@GЙD€2@GЙA€3@GЙ:€4@GЙ6€5@GЙ3€6@GЙ0€7™H 6`89 ;: ;pBcBsB ƒB0“B@£BP³B`Ã+ ;c - °Ð@T@D@@Ã@S@C@3$@#4@³d@£t@“„@ƒ”@s¤™I d+ 9 7dt„”¤@D™JK™J n@T#@ 8T™K0 A@$3@C@4#@S@Dˆ°™K` 8™K}`97 <@T@DD™LK™L n8 :A#+ : e8 :#A#3C+ :3 x8 :CACSc+ :S i8 :cAcsƒ+ :s t8 :ƒAƒ“£+ :“ (8 :£A£³Ã+ :³ n8 :ÃAÃÓã+ :Ó y8 :ãAãó + :ó i8 : A   + :  )`E¤EE@Gà@¤ˆ ™M 0@: E¤#@Gð¤@$™N0 ET#@GT@$™O0@G@#@$™P0@G@”#”@$™Q0 >@G@„#„@$™R0 >@t@4#@4™S0 O@@t#t@$™S0 >@G@d#d@$™T0 >@G@#@$$™U0™V}`°;@GЙI€<™IJ=™W 90>+ ?# .@ò?@0E#3E3#@G™XN0@™Y :0A0 @; @À 3 B 8 C 1 D , E / F 2 GB09 M#: M#pB#B#@3+ M - @@#E @3™Z @@#@Q™Z0pC09 L#: L#pB#B#`3+ L - @@#E @3™[ @@#@q™[0pD09 K#: K#pB#B#03+ K - @@#E @3™\ @@#@A™\0pE09 J#: J#pB#B#3+ J - @@#E @3™] @@#@!™]0pF09 I#: I#pB#B# 3+ I - @@#E @3™^ @@#@1™^0pG09 H#: H#pB#B#P3+ H - @@#E @3™_ @@#@a™_0pH@GЙ_€I@GЙ^€J@GЙ]€K@GЙ\€L@GЙ[€M@GЙZ€N™` ;0O0 T; T€² P¢ QÒ R SP 0@@#™a V@G™a @@G™a @@ˆ™a @@G™a Q 0@@#™b V@G™b @@G™b @@ˆ™b @@G™b R 0@@#™c V@G™c @@ˆ™c @@G™c S 0@@#™d V@G™d @@ˆ™d @@G™d T 0@@#™e V™e _@G™e @@ˆ™e @@G™e U™f <V@G XW™g < X8 \A#3- [#;# [` * Y Y ( ZY@@3 XZ @™h t™i [ @E#@3 X\0 ]+ W .@]4 W^™j ?_8 bA#+ ` _@# _`( a A' a a0™k}0° A™k}0` a@#™k _ Ea 0@#@™l _ Eb4 ^c™m A d8 hA#3- g#;# g@ w e - fe8 g3A3CS+ gC h8 gSAScs+ gc e8 gsAsƒ“+ gƒ n@™nN f8 g3A3CS+ gC >@™oN g @E#@3 dh4 c@ 7i™p B j @@E#@G@™q0@G@#@™r0@E3E3#@Gˆ@™s0@G @#@™t0k™u Cl@#@G!™vN0m™w Dn ™x ™x p™y  po™z Ep8 rA#- r; r€Ñ q¡ q‘ q qq@# nrs™{ Ft8 ‰A#- ‰; ‰À b u i w s y v { d † f ‡u8 ‰#A#3C- ‰3;3 ‰  u v 2 ˆ 3 ˆ 4 ˆ 1 ˆv8 ˆCACSc- ˆS;S ˆ€ 4 … 1 … 2 … 3 …w8 ‰#A#3C- ‰3;3 ‰  u x 2 ˆ 3 ˆ 4 ˆ 1 ˆx8 ˆCACSc- ˆS;S ˆ€ 4 … 1 … 2 … 3 …y8 ‰#A#3C- ‰3;3 ‰  u z 2 ˆ 3 ˆ 4 ˆ 1 ˆz8 ˆCACSc- ˆS;S ˆ€ 4 … 1 … 2 … 3 …{8 ‰#A#3C- ‰3;3 ‰  d | b } i  f s ‚|8 ˆCACSc- ˆS;S ˆ€ 4 … 1 … 2 … 3 …}8 ˆCACSc- ˆS;S ˆ  u ~ 2 … 3 … 4 … 1 …~8 ˆcAcsƒ- ˆs;s ˆ€ 4 „ 1 „ 2 „ 3 „8 ˆCACSc- ˆS;S ˆ  u € 2 … 3 … 4 … 1 …€8 ˆcAcsƒ- ˆs;s ˆ€ 4 „ 1 „ 2 „ 3 „8 ˆCACSc- ˆS;S ˆ€ 4 … 1 … 2 … 3 …‚8 ˆCACSc- ˆS;S ˆ  u ƒ 2 … 3 … 4 … 1 …ƒ8 ˆcAcsƒ- ˆs;s ˆ€ 4 „ 1 „ 2 „ 3 „„@ƒ…@c†8 ‰#A#3C- ‰3;3 ‰€ 4 ˆ 1 ˆ 2 ˆ 3 ˆ‡8 ‰#A#3C- ‰3;3 ‰€ 4 ˆ 1 ˆ 2 ˆ 3 ˆˆ@C‰Š™ G‹@™NÀŒ™ G@@™N ÐŽ™| I@G"™|N àStrTImpT¸ !"#$%&'&)+05$%=>@HH$JExpT4GG‹FunTIú£LitTUàxœ}RÏOÛ0h `ŒM 1 É+hÚ…ø€vXåF+´P¤–N]w˜Ð„Lì$¦‰Ù®:.¹ðïÙMâ°Ò÷½ï{?ý‚ 8 ‚àøq ÌÚ²ñb±sqgX*b¦bƒ3[äø…î>¦v&B©NDé•?zÃ[k§ûºÖÿt¢ )wʯ üò¬²™Ë0V6*± ª9N5-3=ŒK./‡¸ ²„Xã‚×!x5ä:{ì×aˆŽµp-t}ØðnDgB¦¨*Q'rßJóæÑñ+,XÕœ²{°wÏÚB ËëÂ*Ó®Ê6ê¥}@É\ƈq/³|Áa- c\ OUèü¤ûýÊ‹>ƒè¸É¢µÒHHTRíÕ©²¾§º­÷Ù+lÜQ¦y¬4cÁJò"Å5Dˆ¢ÌyÁ¥å ]¥Réå€>…Ÿ™”é¢ëî¨ßiU¦yæ˜=b¬V2…MDp š•’ŸÃ¨ÙaW§¦ ` Àú„Û¹–oÞèÁ ÚäNGÍ ¡¾ÊÀMH^Ç{×[pmµ"¿’6Á4ò“΂§‹ðvÔd'eš'8vÁ±]_Ø“jœ»½ÈºÄŠSôÀøFÓÑ0"ƒ~·‘éÕtØ +¼´öþJ’³qï:»<Ç“NëèÂÿê}€<ûdp àL¸F"çyºdo½™feK6ô^8ÎçŒ#ʘ°BIšƒ+Qº ¡§ánk)®L˜i˜gùïæyöœP°ÿ§TÚšÅë½»-DÍæn&ÐÃï¿KÍýLocTÄIFtEpDnClBjAd?_<X<V;O:A9>68*AttrQƒlhdvsnln.…ä{#!ÙùùFjTB¿jhdauthorlddgud@erix.ericsson.sejjCInf•ƒlhdoptionslhdoutdirk/tmp/esdl-1.3.1/docjhdversionk4.9.1hdtimehbÝaaa aahdsourcek/tmp/esdl-1.3.1/doc/makedoc.erljAbstLine Ë|            ! $ = ; 5 1 / 3 - + ) ' 7 9 ? % E F G H I K L M O P Q R U X Z [ ] ` b e h j m p r u x z { ~ ‚ „ † ‰ Œ ’ “ ” Ž – ˜ š › Ÿ ¡ £ § ¨ © ª « ¬ ­ ® ¯ ³ µ · ¾  ¼ ¸ º À Ä Ë É Ç Å Í Ï Ò Ö × à å ç é ë í ñ ò õ ö ø ú û ý þ ÿ)) Nesdl-1.3.1/doc/makedoc.erl0000775000070100000120000002537712200143736014002 0ustar dguduucp%%%---------------------------------------------------------------------- %%% File : makedoc.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 29 Nov 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(makedoc). -author('dgud@erix.ericsson.se'). %%-compile(export_all). -export([start/0, start/1]). -record(f, {func, args, ret, capi, desc, ef}). -define(sdl_www, "http://www.libsdl.org/docs/html/"). -define(sdl_ttf_www, "http://jcatki.no-ip.org/SDL_ttf/"). -define(sdl_img_www, "http://jcatki.no-ip.org/SDL_image/"). -define(gl_www, "http://www.sun.com/software/graphics/OpenGL/manpages/"). start() -> make(sdl, ?sdl_www), make(sdl_active, ?sdl_www), make(sdl_audio, ?sdl_www), make(sdl_events, ?sdl_www), make(sdl_keyboard, ?sdl_www), make(sdl_mouse, ?sdl_www), make(sdl_video, ?sdl_www), make(sdl_ttf, ?sdl_ttf_www), make(sdl_img, ?sdl_img_www), make(gl, ?gl_www), make(glu, ?gl_www), make(sdl_util, ""), ok. start([File]) -> case File of '../src/sdl.erl' -> make(sdl, ?sdl_www); '../src/sdl_active.erl' -> make(sdl_active, ?sdl_www); '../src/sdl_audio.erl' -> make(sdl_audio, ?sdl_www); '../src/sdl_events.erl' -> make(sdl_events, ?sdl_www); '../src/sdl_keyboard.erl' -> make(sdl_keyboard, ?sdl_www); '../src/sdl_mouse.erl' -> make(sdl_mouse, ?sdl_www); '../src/sdl_joystick.erl' -> make(sdl_joystick, ?sdl_www); '../src/sdl_video.erl' -> make(sdl_video, ?sdl_www); '../src/sdl_ttf.erl' -> make(sdl_ttf, ?sdl_ttf_www); '../src/sdl_img.erl' -> make(sdl_img, ?sdl_img_www); '../src/gl.erl' -> make(gl, ?gl_www); '../src/glu.erl' -> make(glu, ?gl_www); '../src/sdl_util.erl' -> make(sdl_util, "") end, ok. make(Module, WWW) -> Mod = atom_to_list(Module), Infile = filename:join(["../src/", Mod ++ ".erl"]), Outfile = Mod ++ ".html", io:format("Making ~p => ~p ~n", [Infile, Outfile]), {ok, In} = file:open(Infile, [read]), {ok, Out} = file:open(Outfile, [write]), insert_header(Mod, Out), Next = fun() -> io:get_line(In, "[Reading]") end, create_doc(Next(), Next, WWW, Out, undef, Module, 1, undef), insert_footer(Out), file:close(In), file:close(Out). %%create_doc(Line, NextLineFun, WWWRef, OutFile, Acc) create_doc(eof, N, W, O, Acc, M, L, FD) -> ok; create_doc("%% Func:" ++ Func, N, W, O, undef, M, L, undef) -> case strip(Func) of [] -> io:format("~s:~p: Empty func desc ~n", [M, L]), create_doc(N(), N, W, O, func, M, L + 1, undef); F -> create_doc(N(), N, W, O, func, M, L + 1, #f{func = F}) end; create_doc("%% Args:" ++ Arg, N, W, O, func, M, L, FD) -> case strip(Arg) of [] -> create_doc(N(), N, W, O, args, M, L + 1, FD); Args -> %% io:format(O, "Args: ~s ~n", [Args]), create_doc(N(), N, W, O, args, M, L + 1, FD#f{args = Args}) end; create_doc("%% Returns:" ++ Value, N, W, O, args, M, L, FD) -> case strip(Value) of [] -> create_doc(N(), N, W, O, ret, M, L + 1, FD); V -> %% io:format(O, "Returns: ~s ~n", [V]), create_doc(N(), N, W, O, ret, M, L + 1, FD#f{ret = V}) end; create_doc("%% Desc:" ++ Value, N, W, O, State, M, L, FD) -> case strip(Value) of [] -> create_doc(N(), N, W, O, desc, M, L + 1, FD); V -> %% io:format(O, "Description: ~s ~n", [V]), create_doc(N(), N, W, O, desc, M, L + 1, FD#f{desc = V}) end; create_doc("%% C-API func:" ++ Value, N, W, O, ret, M, L, FD) -> case strip(Value) of [] -> io:format("~s:~p: Missing Ref to C-API~n", [M, L]), create_doc(N(), N, W, O, capi, M, L + 1, FD); V -> %% io:format(O, "C_API REF: ~s ~n", [W, V]), create_doc(N(), N, W, O, capi, M, L + 1, FD#f{capi = V}) end; create_doc("%%" ++ Rest, N, W, O, undef, M, L, undef) -> create_doc(N(), N, W, O, undef, M, L + 1, undef); create_doc("%%" ++ Value, N, W, O, State, M, L, FD) -> case strip(Value) of [] -> create_doc(N(), N, W, O, State, M, L + 1, FD); V -> %% io:format(O, "~s ~n", [V]), create_doc(N(), N, W, O, State, M, L + 1, add_line(V, State, FD)) end; create_doc(Else, N, W, O, undef, M, L, undef) -> create_doc(N(), N, W, O, undef, M, L + 1, undef); create_doc(Else, N, W, O, capi, M, L, FD) -> EF = strip(Else), NewL = write_doc(FD#f{ef = EF}, N, W, O, M, L), create_doc(N(), N, W, O, undef, M, NewL + 1, undef); create_doc(Else, N, W, O, desc, M, L, FD) -> EF = strip(Else), NewL = write_doc(FD#f{ef = EF}, N, W, O, M, L), create_doc(N(), N, W, O, undef, M, NewL + 1, undef); create_doc(Else, N, W, O, S, M, L, FD) -> io:format("~s:~p: Error in parsing got ~p ~p ~n", [M, L, Else, FD]), create_doc(N(), N, W, O, undef, M, L + 1, undef). write_doc(FD, N, W, O, M, L) -> case get_func_clause(FD#f.ef, []) of false -> NextLine = strip(N()), % io:format("~s:~p: Incomplete func header ~p ~n", [M, L, FD#f.ef]) 1 + write_doc(add_line(NextLine, ef, FD), N, W, O, M, L); FC when is_list(FC) -> case strip(N()) of "exit(nyi)" ++ _IgnoreRest -> io:format("~s:~p: Not implemented Ignoring ~p~n", [M,L, FD#f.func]), L; Next -> io:format(O, "

~n", [FD#f.func]), io:format(O, " ~s ", [FC]), io:format(O, "

~n", []), L + 1 end end. write_type(O, Desc, undefined) -> ok; write_type(O, Desc, Str) -> io:format(O, "~s ~s
~n", [Desc, Str]). add_line(V, func, FD) -> FD#f{func = FD#f.func ++ [$ | V]}; add_line(V, args, FD) -> FD#f{args = FD#f.args ++ [$ | V]}; add_line(V, ret, FD) -> FD#f{ret = FD#f.ret ++ [$ | V]}; add_line(V, capi, FD) -> FD#f{capi = FD#f.capi ++ [$ | V]}; add_line(V, desc, FD) -> FD#f{desc = FD#f.desc ++ [$ | V]}; add_line(V, ef, FD) -> FD#f{ef = FD#f.ef ++ [$ | V]}. gen_ext_ref(gl, Func, W) -> "
C-API:"; gen_ext_ref(glu, Func, W) -> "C-API:"; gen_ext_ref(sdl_ttf, Func, W) -> "C-API:"; gen_ext_ref(sdl_img, Func, W) -> "C-API:"; gen_ext_ref(_, Func, W) -> "C-API:". get_capi_funcname(Func) -> get_capi_funcname(Func, [$#]). get_capi_funcname([], _)-> []; get_capi_funcname(undefined, _)-> []; get_capi_funcname([$( | Rest], Acc) -> New = strip_gl(Acc), lists:reverse(New); get_capi_funcname([$ | Rest], Acc) -> get_capi_funcname(Rest, []); get_capi_funcname([$* | Rest], Acc) -> get_capi_funcname(Rest, []); get_capi_funcname([H|R], Acc) -> get_capi_funcname(R, [H |Acc]). lc([]) -> []; lc([$_|R]) -> lc(R); lc([A|R]) when A >= $A, A < $a -> [(A - $A + $a) | lc(R)]; lc([A|R]) -> [A|lc(R)]. get_func_clause([], _) -> false; get_func_clause("when" ++ RFunc, Acc) -> lists:reverse(Acc); get_func_clause("->" ++ Rest, Acc) -> lists:reverse(Acc); get_func_clause([H|R], Acc) -> get_func_clause(R, [H|Acc]). insert_header(Mod, Out) -> io:format(Out, "~s~n" "~n", [Mod]), io:format(Out, "

Header File

~n", []), io:format(Out, "The header file may include additional information " "~s.hrl~n", [Mod, Mod]), io:format(Out, "

Exports

~n", []). insert_footer(Out) -> io:format(Out, "", []). strip(String) -> Temp = strip1(lists:reverse(String)), strip1(lists:reverse(Temp)). strip1([$ | Rest]) -> strip(Rest); strip1([$\n |Rest]) -> strip(Rest); strip1([$\t |Rest]) -> strip(Rest); strip1([$\r |Rest]) -> strip(Rest); strip1(Rest) -> Rest. strip_gl("b1" ++ Rest) -> Rest; strip_gl("b2" ++ Rest) -> Rest; strip_gl("b3" ++ Rest) -> Rest; strip_gl("b4" ++ Rest) -> Rest; strip_gl("bu1" ++ Rest) -> Rest; strip_gl("bu2" ++ Rest) -> Rest; strip_gl("bu3" ++ Rest) -> Rest; strip_gl("bu4" ++ Rest) -> Rest; strip_gl("s1" ++ Rest) -> Rest; strip_gl("s2" ++ Rest) -> Rest; strip_gl("s3" ++ Rest) -> Rest; strip_gl("s4" ++ Rest) -> Rest; strip_gl("su1" ++ Rest) -> Rest; strip_gl("su2" ++ Rest) -> Rest; strip_gl("su3" ++ Rest) -> Rest; strip_gl("su4" ++ Rest) -> Rest; strip_gl("i1" ++ Rest) -> Rest; strip_gl("i2" ++ Rest) -> Rest; strip_gl("i3" ++ Rest) -> Rest; strip_gl("i4" ++ Rest) -> Rest; strip_gl("iu1" ++ Rest) -> Rest; strip_gl("iu2" ++ Rest) -> Rest; strip_gl("iu3" ++ Rest) -> Rest; strip_gl("iu4" ++ Rest) -> Rest; strip_gl("f1" ++ Rest) -> Rest; strip_gl("f2" ++ Rest) -> Rest; strip_gl("f3" ++ Rest) -> Rest; strip_gl("f4" ++ Rest) -> Rest; strip_gl("d1" ++ Rest) -> Rest; strip_gl("d2" ++ Rest) -> Rest; strip_gl("d3" ++ Rest) -> Rest; strip_gl("d4" ++ Rest) -> Rest; strip_gl("vb1" ++ Rest) -> Rest; strip_gl("vb2" ++ Rest) -> Rest; strip_gl("vb3" ++ Rest) -> Rest; strip_gl("vb4" ++ Rest) -> Rest; strip_gl("vbu1" ++ Rest) -> Rest; strip_gl("vbu2" ++ Rest) -> Rest; strip_gl("vbu3" ++ Rest) -> Rest; strip_gl("vbu4" ++ Rest) -> Rest; strip_gl("vs1" ++ Rest) -> Rest; strip_gl("vs2" ++ Rest) -> Rest; strip_gl("vs3" ++ Rest) -> Rest; strip_gl("vs4" ++ Rest) -> Rest; strip_gl("vsu1" ++ Rest) -> Rest; strip_gl("vsu2" ++ Rest) -> Rest; strip_gl("vsu3" ++ Rest) -> Rest; strip_gl("vsu4" ++ Rest) -> Rest; strip_gl("vi1" ++ Rest) -> Rest; strip_gl("vi2" ++ Rest) -> Rest; strip_gl("vi3" ++ Rest) -> Rest; strip_gl("vi4" ++ Rest) -> Rest; strip_gl("viu1" ++ Rest) -> Rest; strip_gl("viu2" ++ Rest) -> Rest; strip_gl("viu3" ++ Rest) -> Rest; strip_gl("viu4" ++ Rest) -> Rest; strip_gl("vf1" ++ Rest) -> Rest; strip_gl("vf2" ++ Rest) -> Rest; strip_gl("vf3" ++ Rest) -> Rest; strip_gl("vf4" ++ Rest) -> Rest; strip_gl("vd1" ++ Rest) -> Rest; strip_gl("vd2" ++ Rest) -> Rest; strip_gl("vd3" ++ Rest) -> Rest; strip_gl("vd4" ++ Rest) -> Rest; %strip_gl("b" ++ Rest) -> Rest; strip_gl("bu" ++ Rest) -> Rest; %strip_gl("s" ++ Rest) -> Rest; strip_gl("su" ++ Rest) -> Rest; %strip_gl("i" ++ Rest) -> Rest; strip_gl("iu" ++ Rest) -> Rest; %strip_gl("f" ++ Rest) -> Rest; %strip_gl("d" ++ Rest) -> Rest; strip_gl("vb" ++ Rest) -> Rest; strip_gl("vbu" ++ Rest) -> Rest; strip_gl("vs" ++ Rest) -> Rest; strip_gl("vsu" ++ Rest) -> Rest; strip_gl("vi" ++ Rest) -> Rest; strip_gl("viu" ++ Rest) -> Rest; strip_gl("vf" ++ Rest) -> Rest; strip_gl("vd" ++ Rest) -> Rest; strip_gl(NoStrip) -> NoStrip. esdl-1.3.1/doc/sdl_audio.html0000664000070100000120000000551112200430005014471 0ustar dguduucpsdl_audio

Header File

The header file may include additional information sdl_audio.hrl

Exports

audioDrivername()

openAudio(Desired, ForceFormat)

closeAudio()

getAudioStatus()

pauseAudio(true)

loadWAV(File)

freeWAV(#audiop{ptr=Ptr})

play_audio(#audiop{ptr=Ptr,size=Size}, Repeat)

convertAudio(FromAS, ToAS, #audiop{ptr=Ptr,size=Size})

esdl-1.3.1/doc/sdl_active.html0000664000070100000120000000121612200430005014641 0ustar dguduucpsdl_active

Header File

The header file may include additional information sdl_active.hrl

Exports

quitRequested()

getAppState()

esdl-1.3.1/vsn.mk0000664000070100000120000000002412200143736012240 0ustar dguduucpESDL_VSN=esdl-1.3.1 esdl-1.3.1/ebin/0000775000070100000120000000000012200143736012022 5ustar dguduucpesdl-1.3.1/ebin/.gitignore0000664000070100000120000000000712200143736014007 0ustar dguduucp*.beam esdl-1.3.1/README-SDL.txt0000775000070100000120000000065112200143736013230 0ustar dguduucp Please distribute this file with the SDL runtime environment: The Simple DirectMedia Layer (SDL for short) is a cross-platfrom library designed to make it easy to write multi-media software, such as games and emulators. The Simple DirectMedia Layer library source code is available from: http://www.libsdl.org/ This library is distributed under the terms of the GNU LGPL license: http://www.gnu.org/copyleft/lesser.html esdl-1.3.1/.gitignore0000664000070100000120000000021412200143736013072 0ustar dguduucp# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. *~ .DS_Store *.beam doc/*.html c_src/*.o esdl-1.3.1/Readme0000775000070100000120000000727312200143736012241 0ustar dguduucpESDL by Dan Gudmundsson Currently located at http://esdl.sourceforge.net What is it? =========== Esdl is library for accessing SDL (Simple DirectMedia Layer) and OpenGL through Erlang. Simple DirectMedia Layer is a cross-platform multimedia library designed to provide fast access to the graphics framebuffer and audio device. It also do event handling from mouse, keyboards and joysticks. It is also possible to use TrueType fonts through SDL_ttf (www.libsdl.org/projects/SDL_ttf/) and images through SDL_image (www.libsdl.org/projects/SDL_image/). More information can be found at libsdl.org OpenGL is a cross-platform standard for 3D rendering and 3D hardware acceleration. More information can be found at www.opengl.org News ========= 1.3.1: Throw away Makefiles and use rebar for building 1.3: Builds with otp-r15b 1.2: I have removed the opengl specific part from esdl, now esdl requires that wx is available for opengl usage. This means that this release is not backwards compatible with the old release, some gl functions have been changed in wx gl. This is done to only have one gl.erl in your (erlang) system, and it also more up to date with the standard. Actually only wx/ebin/gl.beam wx/ebin/glu.beam and wx/priv/OS/erl_gl.[so|dll] is required. Also using wx's opengl allowed me to create an opengl thread, if the erlang emulator is multithreaded. So now sdl with opengl works for both smp and single threaded erlang. Compilation and Installation ============================= You need erlang (www.erlang.org). This release has only been tested on R16B, it requires R14B version for opengl to work. You need libsdl (www.libsdl.org) (the development package) version > 1.2.5 For windows grab SDL-devel-1.2.15-VC.zip (which work with both gcc and cl and contains both x86 and x64 libs) On Mac OS X, you also must install XQuartz from: http://xquartz.macosforge.org (Needed for the X11 header files.) And optionally you'll need: * SDL_ttf (www.libsdl.org/projects/SDL_ttf/) version > 2.0.7 * SDL_image (www.libsdl.org/projects/SDL_image/) version > 1.2.4 You need rebar, see: github.com/rebar/rebar Build with: rebar compile On windows: =========== SDL_DIR=/opt/local rebar compile (requires Microsoft's SDK) or CC=gcc SDL_DIR=/opt/local rebar compile (requires mingw) also copy SDL.dll to esdl/priv dir or put SDL.dll somewhere in your path. Note: for x64 and mingw-gcc you (currently) can not link against libraries build with MCL so you will need to recreate the dependency libs, see http://sourceforge.net/apps/trac/mingw-w64/wiki/Answer%2064%20bit%20MSVC-generated%20x64%20.lib ::This is currently not supported:: Optionally you'll also need SDL_ttf for the font support and SDL_image for the image support. Note: SDL_ttf and SDL_image are disabled by default, since they depend on libraries not in the plain vanilla SDL packages. By making them optional one can compile and run esdl without having to bother about getting hold of the SDL_ttf and SDL_image libraries. Enable them in the Makefile: ENABLE_SDL_TTF = yes ENABLE_SDL_IMAGE = yes Testing esdl can be done by building the tests in the test directory and running the test programs, example: cd test erl +S1 -pa ../ebin (werl on windows) Erlang (BEAM) emulator version 5.1.1 [threads:0] Eshell V5.1.1 (abort with ^G) 1> testsprite:go(). %% Escape quits 2> testgl:go(). 3> erldemo:go(). 4> testaudio:go(). 5> testjoy:go(). 6> test_ttf:go("/usr/share/fonts/truetype/freefont/FreeSerif.ttf", 20). 7> test_glfont:go("/usr/share/fonts/truetype/freefont/FreeSans.ttf"). 8> test_glimg:go(). Regards /Dan (d g u d @ users.sf.net) esdl-1.3.1/license.terms0000664000070100000120000000415512200143736013610 0ustar dguduucpThis software is copyrighted by Dan Gudmundsson, and other parties. The following terms apply to all files associated with the software unless explicitly disclaimed in individual files. The authors hereby grant permission to use, copy, modify, distribute, and license this software and its documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply. IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. GOVERNMENT USE: If you are acquiring this software on behalf of the U.S. government, the Government shall have only "Restricted Rights" in the software and related documentation as defined in the Federal Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you are acquiring the software on behalf of the Department of Defense, the software shall be classified as "Commercial Computer Software" and the Government shall have only "Restricted Rights" as defined in Clause 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the authors grant the U.S. Government and others acting in its behalf permission to use and distribute the software in accordance with the terms specified in this license. esdl-1.3.1/priv/0000775000070100000120000000000012200143736012065 5ustar dguduucpesdl-1.3.1/priv/.gitignore0000664000070100000120000000000512200143736014050 0ustar dguduucp*.so esdl-1.3.1/c_src/0000775000070100000120000000000012200143736012176 5ustar dguduucpesdl-1.3.1/c_src/esdl_audio.h0000775000070100000120000000330412200143736014462 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ /* Defines the audio functions */ /* Used for switching */ #ifdef __cplusplus extern "C" { #endif #define SDL_AudioDriverNameFunc AUDIO_H +1 void es_audioDriverName(sdl_data *, int, char *); #define SDL_OpenAudioFunc SDL_AudioDriverNameFunc +1 void es_openAudio(sdl_data *, int, char *); #define SDL_GetAudioStatusFunc SDL_OpenAudioFunc +1 void es_getAudioStatus(sdl_data *, int, char *); #define SDL_PauseAudioFunc SDL_GetAudioStatusFunc +1 void es_pauseAudio(sdl_data *, int, char *); #define SDL_LoadWAVFunc SDL_PauseAudioFunc +1 void es_loadWAV(sdl_data *, int, char *); #define SDL_LoadWAV_RWFunc SDL_LoadWAVFunc +1 void es_loadWAV(sdl_data *, int, char *); #define SDL_FreeWAVFunc SDL_LoadWAV_RWFunc +1 void es_freeWAV(sdl_data *, int, char *); #define SDL_BuildAudioCVTFunc SDL_FreeWAVFunc +1 void es_buildAudioCVT(sdl_data *, int, char *); #define SDL_ConvertAudioFunc SDL_BuildAudioCVTFunc +1 void es_convertAudio(sdl_data *, int, char *); #define SDL_MixAudioFunc SDL_ConvertAudioFunc +1 void es_mixAudio(sdl_data *, int, char *); #define SDL_LockAudioFunc SDL_MixAudioFunc +1 void es_lockAudio(sdl_data *, int, char *); #define SDL_UnlockAudioFunc SDL_LockAudioFunc +1 void es_unlockAudio(sdl_data *, int, char *); #define SDL_CloseAudioFunc SDL_UnlockAudioFunc +1 void es_closeAudio(sdl_data *, int, char *); #define play_audioFunc SDL_CloseAudioFunc +1 void play_audio(sdl_data *, int, char *); #ifdef __cplusplus } #endif esdl-1.3.1/c_src/Makefile.macosx0000775000070100000120000000372012200143736015134 0ustar dguduucp# -*- makefile -*- # # Copyright (c) 2001-2009 Dan Gudmundsson, Bjorn Gustavsson # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # Uncomment the two lines beginning with UNIVERSAL below if you want # to build universal binaries that will work on both Tiger and Leopard. # # You will also need to do # # export MACOSX_DEPLOYMENT_TARGET=10.4 # # in a bash shell before running this Makefile. # #UNIVERSAL_SDK = -isysroot /Developer/SDKs/MacOSX10.4u.sdk #UNIVERSAL_FLAGS = $(UNIVERSAL_SDK) -arch i386 -arch ppc # or UNIVERSAL_FLAGS = -arch i386 CC = cc # # The settings of CFLAGS and LDFLAGS that follows assume # the SDL framework has been installed in /Library/Frameworks. # CFLAGS = -g -O2 -Wall -ObjC -D_THREAD_SAFE -D_REENTRANT -D_OSX_COCOA -I/Library/Frameworks/SDL.framework/Headers -F/Library/Frameworks $(ERLINC) $(UNIVERSAL_FLAGS) LDFLAGS = -F/Library/Frameworks -framework SDL -framework IOKit -framework Carbon -framework Cocoa -L. $(UNIVERSAL_FLAGS) TARGETDIR = ../priv ## The driver part needs erlang includes ERL_DIR := $(shell echo 'io:format("~s~n",[code:root_dir()]),halt().' | erl | sed 's,^[0-9]*> *,,g' | tail +2) ERLINC = -I$(ERL_DIR)/usr/include # Files COMMON = esdl_wrapper esdl_gen esdl_spec esdl_util \ esdl_video esdl_events esdl_audio \ esdl_gl COMMON_OBJ = $(COMMON:%=%.o) # Targets target: $(TARGETDIR)/sdl_driver.so clean: rm -f $(COMMON_OBJ) rm -f ../priv/*.so ../priv/sdlwrapper *.o libsdlmain.a rm -f *~ erl_crash.dump ## ## %.o: %.c $(CC) -c $(CFLAGS) $< %.o: %.m $(CC) -c -I/Library/Frameworks/SDL.framework/Headers $(CFLAGS) $< esdl_driver.o : esdl_driver.c $(CC) -c -ObjC $(CFLAGS) $(ERLINC) $< esdl_video.o : esdl_video.c $(CC) -c -ObjC $(CFLAGS) $(ERLINC) $< ## ## sdl_driver.so $(TARGETDIR)/sdl_driver.so: esdl_driver.o $(COMMON_OBJ) $(CC) $< $(COMMON_OBJ) $(LDFLAGS) -bundle -flat_namespace -undefined suppress -o $@ esdl-1.3.1/c_src/esdl_gl.c0000664000070100000120000002477112200143736013766 0ustar dguduucp/* * Copyright (c) 2010 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ #include #include #ifndef _WIN32 #include #endif #include "esdl.h" #include "esdl_events.h" #ifdef _OSX_COCOA int erl_drv_stolen_main_thread_join(ErlDrvTid tid, void **respp); int erl_drv_steal_main_thread(char *name, ErlDrvTid *dtid, void* (*func)(void*), void* arg, ErlDrvThreadOpts *opts); #endif int esdl_gl_initiated = 0; ErlDrvTid esdl_thread; ErlDrvMutex * esdl_batch_locker_m; ErlDrvCond * esdl_batch_locker_c; void * esdl_result; void * esdl_gl_main_loop(void * ); int es_init_opengl2(ErlDrvPort, ErlDrvTermData, char *bp); typedef struct { ErlDrvTermData caller; int op; char *buff; int no_bins; char *base[3]; ErlDrvBinary *bin[3]; int size[3]; } esdl_q_t; #define MAX_Q 1024 int esdl_q_first, esdl_q_n; esdl_q_t esdl_q[MAX_Q]; /* See wx/c_src/egl_impl.h */ typedef void (*ESDL_GL_DISPATCH) (int, char *, ErlDrvPort, ErlDrvTermData, char **, int *); ESDL_GL_DISPATCH esdl_gl_dispatch; typedef int (*ESDL_GL_INIT) (void *); /*** WIN32 ***/ #ifdef _WIN32 #define RTLD_LAZY 0 typedef HMODULE DL_LIB_P; void * dlsym(HMODULE Lib, const char *func) { void * funcp; funcp = (void *) GetProcAddress(Lib, func); return funcp; } HMODULE dlopen(const char *DLL, int unused) { return LoadLibrary(DLL); } void DisplayErrorMsg() { // Retrieve the system error message for the last-error code LPVOID lpMsgBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK); LocalFree(lpMsgBuf); } #else typedef void * DL_LIB_P; void DisplayErrorMsg() { } #endif /** Initialization code **/ void es_init_opengl(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_init_opengl2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, ESDL_OpenglInitFunc, len, bp); } } int es_init_opengl2(ErlDrvPort port, ErlDrvTermData caller, char *bp) { DL_LIB_P LIBhandle; ESDL_GL_INIT init_opengl; int res = 0; ErlDrvTermData rt[8]; #ifdef _WIN32 void * erlCallbacks = &WinDynDriverCallbacks; #else void * erlCallbacks = NULL; #endif if(esdl_gl_initiated == 0) { if((LIBhandle = dlopen(bp, RTLD_LAZY))) { init_opengl = (ESDL_GL_INIT) dlsym(LIBhandle, "egl_init_opengl"); esdl_gl_dispatch = (ESDL_GL_DISPATCH) dlsym(LIBhandle, "egl_dispatch"); if(init_opengl && esdl_gl_dispatch) { init_opengl(erlCallbacks); esdl_gl_initiated = 1; res = 1; } else { fprintf(stderr, "In lib %s:\r\n", bp); if(!init_opengl) fprintf(stderr, " function not found egl_init_opengl\r\n"); if(!esdl_gl_dispatch) fprintf(stderr, " function not found egl_dispatch\r\n"); fflush(stderr); res = 0; } } else { fprintf(stderr, "Failed locating lib %s:\r\n", bp); DisplayErrorMsg(); fflush(stderr); res = 0; } } else { res = 2; } rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = res; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); return res; } void gl_dispatch(sdl_data *sd, int op, ErlDrvSizeT len, char *bp) { int i; if(!sd->use_smp) { /* Not SMP invoke directly */ char * bs[3]; int bs_sz[3]; for(i=0; i<3; i++) { bs[i] = sd->bin[i].base; bs_sz[i] = (int) sd->bin[i].size; } esdl_gl_dispatch(op, bp, sd->driver_data, driver_caller(sd->driver_data), bs, bs_sz); } else { //printf("Dispatch cmd %d \r\n", op); /* SMP * copy everything and queue request to thread */ int pos; erl_drv_mutex_lock(esdl_batch_locker_m); while(esdl_q_n == MAX_Q) { /* queue is full wait */ //fprintf(stderr, "%d: Wait \r\n", __LINE__); fflush(stderr); erl_drv_cond_wait(esdl_batch_locker_c, esdl_batch_locker_m); //fprintf(stderr, "%d: Wait done\r\n", __LINE__); fflush(stderr); } pos = (esdl_q_first + esdl_q_n) % MAX_Q; esdl_q[pos].op = op; esdl_q[pos].buff = driver_alloc(len); //fprintf(stderr, "%d: Q %d %d %d\r\n", __LINE__, op, pos, esdl_q_n); fflush(stderr); memcpy(esdl_q[pos].buff, bp, len); esdl_q[pos].caller = driver_caller(sd->driver_data); for(i=0; i< sd->next_bin; i++) { esdl_q[pos].base[i] = sd->bin[i].base; esdl_q[pos].bin[i] = sd->bin[i].bin; esdl_q[pos].size[i] = (int) sd->bin[i].size; driver_binary_inc_refc(sd->bin[i].bin); } esdl_q[pos].no_bins = sd->next_bin; esdl_q_n++; erl_drv_cond_signal(esdl_batch_locker_c); erl_drv_mutex_unlock(esdl_batch_locker_m); } } void start_opengl_thread(sdl_data *sd) { int res; esdl_batch_locker_m = erl_drv_mutex_create((char *)"esdl_batch_locker_m"); esdl_batch_locker_c = erl_drv_cond_create((char *)"esdl_batch_locker_c"); esdl_q_first = 0; esdl_q_n = 0; esdl_result = (void *) -1; erl_drv_mutex_lock(esdl_batch_locker_m); #ifdef _OSX_COCOA res = erl_drv_steal_main_thread("ESDL OpenGL dispatcher", &esdl_thread, esdl_gl_main_loop, (void *) sd, NULL); #else res = erl_drv_thread_create("ESDL OpenGL dispatcher", &esdl_thread, esdl_gl_main_loop, (void *) sd, NULL); #endif if(res == 0) { erl_drv_cond_wait(esdl_batch_locker_c, esdl_batch_locker_m); erl_drv_mutex_unlock(esdl_batch_locker_m); } } void stop_opengl_thread() { erl_drv_mutex_lock(esdl_batch_locker_m); esdl_q_n = -(esdl_q_n+1); erl_drv_cond_signal(esdl_batch_locker_c); erl_drv_mutex_unlock(esdl_batch_locker_m); #ifdef _OSX_COCOA erl_drv_stolen_main_thread_join(esdl_thread, NULL); #else erl_drv_thread_join(esdl_thread, NULL); #endif erl_drv_mutex_destroy(esdl_batch_locker_m); erl_drv_cond_destroy(esdl_batch_locker_c); } void * esdl_gl_main_loop(void *sd) { char * bs[3]; int bs_sz[3]; int i,j,pos; ErlDrvPort port = ((sdl_data *)sd)->driver_data; esdl_init_native_gui(); erl_drv_mutex_lock(esdl_batch_locker_m); SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_JOYSTICK ); while(1) { if(esdl_q_n > 0) { for(i=0; i<3; i++) { bs[i] = esdl_q[esdl_q_first].base[i]; bs_sz[i] = (int) esdl_q[esdl_q_first].size[i]; } //fprintf(stderr, "%d: X %d %d %d\r\n", __LINE__, esdl_q[esdl_q_first].op, //esdl_q_first, esdl_q_n); fflush(stderr); if(esdl_q[esdl_q_first].op >= OPENGL_START) { esdl_gl_dispatch(esdl_q[esdl_q_first].op, esdl_q[esdl_q_first].buff, port, esdl_q[esdl_q_first].caller, bs, bs_sz); } else { /* OpenGL must be initilized in the thread */ switch(esdl_q[esdl_q_first].op) { case SDL_GL_SwapBuffersFunc: SDL_GL_SwapBuffers(); break; /* Events must be handled in this thread on windows */ case SDL_PumpEventsFunc: SDL_PumpEvents(); break; case SDL_PeepEventsFunc: es_peepEvents2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_PollEventFunc: es_pollEvent2(port, esdl_q[esdl_q_first].caller); break; case SDL_WaitEventFunc: es_waitEvent2(port, esdl_q[esdl_q_first].caller); break; /* Other gl related functions */ case SDL_SetVideoModeFunc: es_setVideoMode2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_VideoModeOKFunc: es_videoModeOK2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_WM_ToggleFullScreenFunc: es_wm_toggleFullScreen2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case ESDL_OpenglInitFunc: es_init_opengl2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_GL_GetAttributeFunc: es_gl_getAttribute2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_GL_SetAttributeFunc: es_gl_setAttribute2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_ShowCursorFunc: es_showCursor2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_WM_SetCaptionFunc: es_wm_setCaption2(esdl_q[esdl_q_first].buff); break; case SDL_WM_GetInfoFunc: es_wm_getInfo2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_WM_MaximizeFunc: es_wm_maximize2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_WM_MacFileDialog: es_wm_mac_file_dialog2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; } } for(i=0; i < esdl_q[esdl_q_first].no_bins; i++) driver_free_binary(esdl_q[esdl_q_first].bin[i]); driver_free(esdl_q[esdl_q_first].buff); // fprintf(stderr, "%d: Xed %d \r\n", __LINE__, esdl_q[esdl_q_first].op); fflush(stderr); esdl_q_first++; esdl_q_first %= MAX_Q; esdl_q_n--; } else { erl_drv_cond_signal(esdl_batch_locker_c); // fprintf(stderr, "%d: TW\r\n", __LINE__); fflush(stderr); while(esdl_q_n == 0) { erl_drv_cond_wait(esdl_batch_locker_c, esdl_batch_locker_m); } // fprintf(stderr, "%d: TWed\r\n", __LINE__); fflush(stderr); if(esdl_q_n < 0) { /* Time to quit */ // fprintf(stderr, "%d: T Quit\r\n", __LINE__); fflush(stderr); esdl_q_n = -esdl_q_n-1; break; } } } /* Free all unused memory */ for(i=0; i #include #include #ifdef _WIN32 #include #include #else #include #endif #ifdef _OSX_COCOA //#include "CPS.h" //#include "SDLMain.h" #include #include #endif #include #include #include #include "esdl.h" #define TEMP_BINARY_SIZE 512 #if (ERL_DRV_EXTENDED_MAJOR_VERSION < 2) /* R14B or earlier types */ #define ErlDrvSizeT int #define ErlDrvSSizeT int #endif #ifdef _OSX_COCOA # define AUTO_RELEASE_POOL @autoreleasepool #else # define AUTO_RELEASE_POOL #endif static ErlDrvData sdl_driver_start(ErlDrvPort port, char *buff); static void sdl_driver_stop(ErlDrvData handle); static void sdl_driver_finish(void); static ErlDrvSSizeT sdl_driver_control(ErlDrvData handle, unsigned int command, char* buf, ErlDrvSizeT, char** res, ErlDrvSizeT); static ErlDrvSSizeT sdl_driver_debug_control(ErlDrvData handle, unsigned int command, char* buf, ErlDrvSizeT count, char** res, ErlDrvSizeT res_size); static void standard_outputv(ErlDrvData drv_data, ErlIOVec *ev); /* ** The driver struct */ static ErlDrvEntry sdl_driver_entry = { NULL, /* F_PTR init, N/A */ sdl_driver_start, /* L_PTR start, called when port is opened */ sdl_driver_stop, /* F_PTR stop, called when port is closed */ NULL, /* F_PTR output, called when erlang has sent */ NULL, /* F_PTR ready_input, called when input descriptor ready */ NULL, /* F_PTR ready_output, called when output descriptor ready */ "sdl_driver", /* char *driver_name, the argument to open_port */ sdl_driver_finish, /* F_PTR finish, called when unloaded */ NULL, /* void * that is not used (BC) */ sdl_driver_control, /* F_PTR control, port_control callback */ NULL, /* F_PTR timeout, reserved */ standard_outputv, /* F_PTR outputv, reserved */ NULL, /* async */ NULL, /* flush */ NULL, /* call */ NULL, /* Event */ ERL_DRV_EXTENDED_MARKER, ERL_DRV_EXTENDED_MAJOR_VERSION, ERL_DRV_EXTENDED_MINOR_VERSION, ERL_DRV_FLAG_USE_PORT_LOCKING, /* Port lock */ NULL, /* Reserved Handle */ NULL, /* Process Exited */ }; DRIVER_INIT(sdl_driver) { return &sdl_driver_entry; } static ErlDrvData sdl_driver_start(ErlDrvPort port, char *buff) { sdl_data *data; ErlDrvSysInfo info; #ifdef _WIN32 if ( SDL_RegisterApp("Erlang SDL", CS_BYTEALIGNCLIENT, GetModuleHandle(NULL)) < 0 ) { fprintf(stderr, "WinMain() error %s \n", SDL_GetError()); return(ERL_DRV_ERROR_GENERAL); } #endif /* _WIN32 */ data = malloc(sizeof(sdl_data)); if (data == NULL) { fprintf(stderr, " Couldn't alloc mem\r\n"); return(ERL_DRV_ERROR_GENERAL); /* ENOMEM */ } set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); data->driver_data = port; // data->fns = init_fps(); data->op = 0; data->len = 0; data->buff = NULL; data->temp_bin = driver_alloc_binary(TEMP_BINARY_SIZE); data->next_bin = 0; driver_system_info(&info, sizeof(ErlDrvSysInfo)); #ifdef _OSX_COCOA data->use_smp = info.smp_support; #else data->use_smp = info.smp_support && info.scheduler_threads > 1; #endif // fprintf(stderr, "Use smp %d\r\n", data->use_smp); if(data->use_smp) { start_opengl_thread(data); } else { // The following code needs to called from main thread esdl_init_native_gui(); } init_fps(data); return (ErlDrvData) data; } #ifdef _OSX_COCOA extern OSErr CPSSetProcessName (ProcessSerialNumber *psn, char *processname); #endif void esdl_init_native_gui() { #ifdef _OSX_COCOA ProcessSerialNumber psn; NSAutoreleasePool *pool; // [[NSProcessInfo processInfo] setProcessName:@"Erlang"]; // Enable GUI GetCurrentProcess(&psn); CPSSetProcessName(&psn, "Erlang"); // Undocumented function (but above doesn't work) TransformProcessType(&psn, kProcessTransformToForegroundApplication); SetFrontProcess(&psn); // Enable Cocoa calls from Carbon app NSApplicationLoad(); // Setup and enable gui pool = [[NSAutoreleasePool alloc] init]; NSApplication *app = [NSApplication sharedApplication]; // Load and set icon //NSMutableString *file = [[NSMutableString alloc] init]; //[file appendFormat:@"%s/%s", erl_wx_privdir, "erlang-logo64.png"]; //[file appendFormat:@"%s/%s", "/usr/local/lib/erlang/lib/wx-0.98.8/priv", "erlang-logo64.png"]; //NSImage *icon = [[NSImage alloc] initWithContentsOfFile: file]; //[app setApplicationIconImage: icon]; [app activateIgnoringOtherApps: YES]; #endif /* _OSX_COCOA */ } static void sdl_driver_stop(ErlDrvData handle) { sdl_data *sd = ((sdl_data *)handle); if(sd->use_smp) stop_opengl_thread(); else SDL_Quit(); free(sd->fun_tab); free(sd->str_tab); #ifdef _WIN32 UnregisterClass("Erlang SDL", GetModuleHandle(NULL)); #endif /* _WIN32 */ free(handle); } static void sdl_driver_finish(void) { } static ErlDrvSSizeT sdl_driver_control(ErlDrvData handle, unsigned op, char* buf, ErlDrvSizeT count, char** res, ErlDrvSizeT res_size) { sdl_data* sd = (sdl_data *) handle; sdl_fun func; sd->buff = NULL; sd->len = 0; sd->op = op; if(op < OPENGL_START) { // fprintf(stderr, "Command:%d:%s: ", op, sd->str_tab[op]);fflush(stderr); func = sd->fun_tab[op]; AUTO_RELEASE_POOL { func(sd, (int) count, buf); } } else { // fprintf(stderr, "Command:%d:gl_??\r\n", op); fflush(stderr); gl_dispatch(sd, op, (int) count, buf); sdl_free_binaries(sd); } // fprintf(stderr, "%s:%d: Eed %d\r\n", __FILE__,__LINE__,op); fflush(stderr); (*res) = sd->buff; return (ErlDrvSizeT) sd->len; } static ErlDrvSSizeT sdl_driver_debug_control(ErlDrvData handle, unsigned op, char* buf, ErlDrvSizeT count, char** res, ErlDrvSizeT res_size) { sdl_data* sd = (sdl_data *) handle; sdl_fun func; int len; sd->buff = NULL; sd->len = 0; sd->op = op; if(op < OPENGL_START) { fprintf(stderr, "Command:%d:%s: ", op, sd->str_tab[op]);fflush(stderr); func = sd->fun_tab[op]; func(sd, (int) count, buf); if ((len = sd->len) >= 0) { fprintf(stderr, "ok %d %p\r\n", len, sd->buff);fflush(stderr); (*res) = sd->buff; return (ErlDrvSizeT) len; } else { fprintf(stderr, "error\r\n");fflush(stderr); *res = 0; return -1; } } else { fprintf(stderr, "Command:%d ", op);fflush(stderr); gl_dispatch(sd, op, count, buf); sdl_free_binaries(sd); fprintf(stderr, "\r\n");fflush(stderr); return 0; } } void sdl_send(sdl_data *sd, int len) { if (sd->buff == NULL) { fprintf(stderr, "ESDL INTERNAL ERROR: sdl_send in %s sent NULL buffer: %d\r\n", sd->str_tab[sd->op], len); abort(); } if (len > sd->len) { fprintf(stderr, "ESDL INTERNAL ERROR: sdl_send in %s allocated %d sent %d\r\n", sd->str_tab[sd->op], sd->len, len); abort(); } /* Workaround that driver_control doesn't check length */ ((ErlDrvBinary *) sd->buff)->orig_size = len; sd->len = len; } char* sdl_getbuff(sdl_data *sd, int size) { ErlDrvBinary* bin; sd->len = size; bin = driver_alloc_binary(size); sd->buff = bin; /* And return the pointer to the bytes */ return bin->orig_bytes; } char* sdl_get_temp_buff(sdl_data* sd, int size) { if (size > TEMP_BINARY_SIZE) { return sdl_getbuff(sd, size); } else { ErlDrvBinary* bin = (ErlDrvBinary *) sd->temp_bin; driver_binary_inc_refc(bin); sd->buff = bin; sd->len = size; return bin->orig_bytes; } } void sdl_util_debug(sdl_data *sd, int len, char* bp) { if (*bp) { sdl_driver_entry.control = sdl_driver_debug_control; } else { sdl_driver_entry.control = sdl_driver_control; } } static void standard_outputv(ErlDrvData drv_data, ErlIOVec* ev) { sdl_data* sd = (sdl_data *) drv_data; ErlDrvBinary* bin; if (ev->vsize == 2) { int i = sd->next_bin; sd->bin[i].base = ev->iov[1].iov_base; sd->bin[i].size = ev->iov[1].iov_len; bin = ev->binv[1]; driver_binary_inc_refc(bin); /* Otherwise it could get deallocated */ sd->bin[i].bin = bin; sd->next_bin++; } } void sdl_free_binaries(sdl_data* sd) { int i; for (i = sd->next_bin - 1; i >= 0; i--) { driver_free_binary(sd->bin[i].bin); } sd->next_bin = 0; } esdl-1.3.1/c_src/esdl_ttf.c0000664000070100000120000004133612200143736014155 0ustar dguduucp/* * Copyright (c) 2007 Klas Johanssson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* Map erl esdl_ttf calls to C sdl ttf calls */ #include "esdl.h" #include #include #include void es_ttf_linkedVersion(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; const SDL_version *version; version = TTF_Linked_Version(); bp = start = sdl_get_temp_buff(sd, 3); put8(bp, version->major); put8(bp, version->minor); put8(bp, version->patch); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_byteSwappedUNICODE(sdl_data *sd, int len, char *buff) { char *bp; int byteswap; bp = buff; byteswap = get16be(bp); TTF_ByteSwappedUNICODE(byteswap); } void es_ttf_init(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; int result; result = TTF_Init(); bp = start = sdl_get_temp_buff(sd, 2); put16be(bp, result); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_openFont(sdl_data *sd, int len, char *buff) { char *file, *bp, *start; int pointsize; int sendlen; TTF_Font *font; // read filename and pointsize file = buff; bp = file + strlen(file) + 1; pointsize = get16be(bp); // load font font = TTF_OpenFont(file, pointsize); // return a font pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(font, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_openFontIndex(sdl_data *sd, int len, char *buff) { char *file, *bp, *start; int pointsize; long index; int sendlen; TTF_Font *font; // read filename and pointsize file = buff; bp = file + strlen(file) + 1; pointsize = get16be(bp); index = get32be(bp); // load font font = TTF_OpenFontIndex(file, pointsize, index); // return a font pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(font, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_openFontRW(sdl_data *sd, int len, char *buff) { // not implemented } void es_ttf_openFontIndexRW(sdl_data *sd, int len, char *buff) { // not implemented } void es_ttf_getFontStyle(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int fontstyle; bp = buff; POPGLPTR(font, bp); fontstyle = TTF_GetFontStyle(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, fontstyle); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_setFontStyle(sdl_data *sd, int len, char *buff) { char *bp; TTF_Font *font; int fontstyle; bp = buff; POPGLPTR(font, bp); fontstyle = get16be(bp); TTF_SetFontStyle(font, fontstyle); } void es_ttf_fontHeight(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int fontheight; bp = buff; POPGLPTR(font, bp); fontheight = TTF_FontHeight(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, fontheight); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontAscent(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int fontascent; bp = buff; POPGLPTR(font, bp); fontascent = TTF_FontAscent(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, fontascent); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontDescent(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int fontdescent; bp = buff; POPGLPTR(font, bp); fontdescent = TTF_FontDescent(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, fontdescent); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontLineSkip(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int fontlineskip; bp = buff; POPGLPTR(font, bp); fontlineskip = TTF_FontLineSkip(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, fontlineskip); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontFaces(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; long numfaces; bp = buff; POPGLPTR(font, bp); numfaces = TTF_FontFaces(font); start = bp = sdl_get_temp_buff(sd, 4); put32be(bp, numfaces); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontFaceIsFixedWidth(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int isfixed; bp = buff; POPGLPTR(font, bp); isfixed = TTF_FontFaceIsFixedWidth(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, isfixed); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontFaceFamilyName(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen = 0; TTF_Font *font; char *familyname; bp = buff; POPGLPTR(font, bp); familyname = TTF_FontFaceFamilyName(font); if (familyname) { sendlen = strlen(familyname); bp = start = sdl_getbuff(sd, sendlen); while(*familyname != '\0') { put8(bp, *familyname++); } } sdl_send(sd, sendlen); } void es_ttf_fontFaceStyleName(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen = 0; TTF_Font *font; char *stylename; bp = buff; POPGLPTR(font, bp); stylename = TTF_FontFaceStyleName(font); if (stylename) { sendlen = strlen(stylename); bp = start = sdl_getbuff(sd, sendlen); while(*stylename != '\0') { put8(bp, *stylename++); } } sdl_send(sd, sendlen); } void es_ttf_glyphMetrics(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; Uint16 ch; int minx, maxx, miny, maxy, advance; int res; bp = buff; POPGLPTR(font, bp); ch = get16be(bp); res = TTF_GlyphMetrics(font, ch, &minx, &maxx, &miny, &maxy, &advance); bp = start = sdl_get_temp_buff(sd, 12); put16be(bp, res); put16be(bp, minx); put16be(bp, maxx); put16be(bp, miny); put16be(bp, maxy); put16be(bp, advance); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_sizeText(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; int res, w, h; bp = buff; POPGLPTR(font, bp); text = bp; res = TTF_SizeText(font, text, &w, &h); bp = start = sdl_get_temp_buff(sd, 6); put16be(bp, res); put16be(bp, w); put16be(bp, h); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_sizeUTF8(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; int res, w, h; bp = buff; POPGLPTR(font, bp); text = bp; res = TTF_SizeUTF8(font, text, &w, &h); bp = start = sdl_get_temp_buff(sd, 6); put16be(bp, res); put16be(bp, w); put16be(bp, h); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_sizeUNICODE(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 *text; int sendlen; TTF_Font *font; int res, w, h; bp = buff; POPGLPTR(font, bp); text = (Uint16 *) bp; res = TTF_SizeUNICODE(font, text, &w, &h); bp = start = sdl_get_temp_buff(sd, 6); put16be(bp, res); put16be(bp, w); put16be(bp, h); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderTextSolid(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: The order in which the arguments arrive and are passed to // the TTF function differ. We're avoiding a strlen (and the // like) by having the text as the last parameter. POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderText_Solid(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUTF8Solid(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderUTF8_Solid(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUNICODESolid(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 *text; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = (Uint16 *) bp; // render text surface = TTF_RenderUNICODE_Solid(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderGlyphSolid(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 ch; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); ch = get16be(bp); // render glyph surface = TTF_RenderGlyph_Solid(font, ch, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderTextShaded(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor, bgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); bgcolor.r = get8(bp); bgcolor.g = get8(bp); bgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderText_Shaded(font, text, fgcolor, bgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUTF8Shaded(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor, bgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); bgcolor.r = get8(bp); bgcolor.g = get8(bp); bgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderUTF8_Shaded(font, text, fgcolor, bgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUNICODEShaded(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 *text; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor, bgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); bgcolor.r = get8(bp); bgcolor.g = get8(bp); bgcolor.b = get8(bp); text = (Uint16 *) bp; // render text surface = TTF_RenderUNICODE_Shaded(font, text, fgcolor, bgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderGlyphShaded(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 ch; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor, bgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); bgcolor.r = get8(bp); bgcolor.g = get8(bp); bgcolor.b = get8(bp); ch = get16be(bp); // render glyph surface = TTF_RenderGlyph_Shaded(font, ch, fgcolor, bgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderTextBlended(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderText_Blended(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUTF8Blended(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderText_Blended(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUNICODEBlended(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 *text; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = (Uint16 *) bp; // render text surface = TTF_RenderUNICODE_Blended(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderGlyphBlended(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 ch; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); ch = get16be(bp); // render glyph surface = TTF_RenderGlyph_Blended(font, ch, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_closeFont(sdl_data *sd, int len, char *buff) { char *bp; TTF_Font *font; bp = buff; POPGLPTR(font, bp); TTF_CloseFont(font); } void es_ttf_quit(sdl_data *sd, int len, char *buff) { TTF_Quit(); } void es_ttf_wasInit(sdl_data *sd, int len, char *buff) { char *bp, *start; int res; int sendlen; res = TTF_WasInit(); bp = start = sdl_get_temp_buff(sd, 2); put16be(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_setError(sdl_data *sd, int len, char *buff) { // not implemented } void es_ttf_getError(sdl_data *sd, int len, char *buff) { char *err, *bp, *start; int length; err = TTF_GetError(); length = strlen(err); bp = start = sdl_getbuff(sd, length); while(*err != '\0') { put8(bp, *err++); } sdl_send(sd, bp - start); } esdl-1.3.1/c_src/esdl_conv.h0000775000070100000120000000561412200143736014334 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /*************************** Some Macros to the byte conversion between the byte buffer and real types. This code is borrowed from the erl_interface file putget.h ****************************/ #ifdef __cplusplus extern "C" { #endif #ifndef BYTECONV_H #define BYTECONV_H #define put8(s,n) do { \ (s)[0] = (char)((n) & 0xff); \ (s) += 1; \ } while (0) #define put16le(s,n) do { \ (s)[0] = (n) & 0xff; \ (s)[1] = ((n) >> 8) & 0xff; \ (s) += 2; \ } while (0) \ #define put32le(s,n) do { \ (s)[0] = (n) & 0xff; \ (s)[1] = ((n) >> 8) & 0xff; \ (s)[2] = ((n) >> 16) & 0xff; \ (s)[3] = ((n) >> 24) & 0xff; \ (s) += 4; \ } while (0) #define put16be(s,n) do { \ (s)[0] = ((n) >> 8) & 0xff; \ (s)[1] = (n) & 0xff; \ (s) += 2; \ } while (0) #define put32be(s,n) do { \ (s)[0] = ((n) >> 24) & 0xff; \ (s)[1] = ((n) >> 16) & 0xff; \ (s)[2] = ((n) >> 8) & 0xff; \ (s)[3] = (n) & 0xff; \ (s) += 4; \ } while (0) #define get8(s) \ ((s) += 1, \ ((unsigned char *)(s))[-1] & 0xff) #define get16le(s) \ ((s) += 2, \ (((((unsigned char *)(s))[-1] << 8) | \ ((unsigned char *)(s))[-2])) & 0xffff) #define get32le(s) \ ((s) += 4, \ ((((unsigned char *)(s))[-1] << 24) | \ (((unsigned char *)(s))[-2] << 16) | \ (((unsigned char *)(s))[-3] << 8) | \ ((unsigned char *)(s))[-4])) #define get16be(s) \ ((s) += 2, \ (((((unsigned char *)(s))[-2] << 8) | \ ((unsigned char *)(s))[-1])) & 0xffff) #define get32be(s) \ ((s) += 4, \ ((((unsigned char *)(s))[-4] << 24) | \ (((unsigned char *)(s))[-3] << 16) | \ (((unsigned char *)(s))[-2] << 8) | \ ((unsigned char *)(s))[-1])) #if SDL_BYTEORDER == SDL_BIG_ENDIAN #define putFloat32be(s,n) do { \ unsigned char * t = (unsigned char *) &n; \ (s)[0] = t[0]; \ (s)[1] = t[1];\ (s)[2] = t[2];\ (s)[3] = t[3];\ (s) += 4; \ } while (0) #define putFloat64be(s,n) do { \ unsigned char * t = (unsigned char *) &n; \ (s)[0] = t[0]; \ (s)[1] = t[1]; \ (s)[2] = t[2]; \ (s)[3] = t[3]; \ (s)[4] = t[4]; \ (s)[5] = t[5]; \ (s)[6] = t[6]; \ (s)[7] = t[7]; \ (s) += 8; \ } while (0) #else #define putFloat32be(s,n) do { \ unsigned char * t = (unsigned char *) &n; \ (s)[3] = t[0];\ (s)[2] = t[1];\ (s)[1] = t[2];\ (s)[0] = t[3];\ (s) += 4; \ } while (0) #define putFloat64be(s,n) do { \ unsigned char * t = (unsigned char *) &n; \ (s)[7] = t[0]; \ (s)[6] = t[1]; \ (s)[5] = t[2]; \ (s)[4] = t[3]; \ (s)[3] = t[4]; \ (s)[2] = t[5]; \ (s)[1] = t[6]; \ (s)[0] = t[7]; \ (s) += 8; \ } while (0) #endif #endif #ifdef __cplusplus } #endif esdl-1.3.1/c_src/esdl_events.c0000775000070100000120000003764112200143736014673 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ /* * Map erl esdl_events calls to C sdl calls */ #include "esdl.h" #define MAX_EVENT_SIZE 13 /* Foward decls */ static char* encode_event(const SDL_Event * , char *); /* API */ void es_pumpEvents(sdl_data *sd, int len, char *buff) { if(sd->use_smp) gl_dispatch(sd, SDL_PumpEventsFunc, len, buff); else SDL_PumpEvents(); } void es_peepEvents(sdl_data *sd, int len, char *bp) { if(sd->use_smp) gl_dispatch(sd, SDL_PeepEventsFunc, len, bp); else es_peepEvents2(sd->driver_data, driver_caller(sd->driver_data), bp); } void es_peepEvents2(ErlDrvPort port, ErlDrvTermData caller, char *bp) { SDL_Event events[256]; int numevents, res, i, sz; Uint32 mask; char *start; ErlDrvBinary * bin; ErlDrvTermData rt[8]; mask = * (Uint32 *) bp; bp += sizeof(Uint32); numevents = *bp++; SDL_PumpEvents(); res = SDL_PeepEvents(events, numevents, SDL_GETEVENT, mask); bin = driver_alloc_binary(res*MAX_EVENT_SIZE); bp = start = bin->orig_bytes; for (i = 0; i < res; i++) { bp = encode_event(&(events[i]), bp); } sz = (int) (bp-start); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_BINARY; rt[3] = (ErlDrvTermData) bin; rt[4] = sz; rt[5] = 0; rt[6] = ERL_DRV_TUPLE; rt[7] = 2; driver_send_term(port,caller,rt,8); driver_free_binary(bin); } void es_pollEvent(sdl_data *sd, int len, char *buff) { if(sd->use_smp) gl_dispatch(sd, SDL_PollEventFunc, len, buff); else es_pollEvent2(sd->driver_data, driver_caller(sd->driver_data)); } void es_pollEvent2(ErlDrvPort port, ErlDrvTermData caller) { SDL_Event event; ErlDrvTermData rt[8]; ErlDrvBinary * bin; char *bp, *start; int sz; bin = driver_alloc_binary(MAX_EVENT_SIZE); bp = start = bin->orig_bytes; if (SDL_PollEvent(&event)) { bp = encode_event(&event, bp); } sz = (int)(bp-start); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_BINARY; rt[3] = (ErlDrvTermData) bin; rt[4] = sz; rt[5] = 0; rt[6] = ERL_DRV_TUPLE; rt[7] = 2; driver_send_term(port,caller,rt,8); driver_free_binary(bin); } void es_waitEvent(sdl_data *sd, int len,char *buff) { if(sd->use_smp) gl_dispatch(sd, SDL_WaitEventFunc, len, buff); else es_waitEvent2(sd->driver_data, driver_caller(sd->driver_data)); } void es_waitEvent2(ErlDrvPort port, ErlDrvTermData caller) { SDL_Event event; ErlDrvBinary * bin; ErlDrvTermData rt[8]; char *bp, *start; int sz; bin = driver_alloc_binary(MAX_EVENT_SIZE); bp = start = bin->orig_bytes; SDL_WaitEvent(&event); bp = encode_event(&event, bp); sz = (int) (bp-start); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_BINARY; rt[3] = (ErlDrvTermData) bin; rt[4] = sz; rt[5] = 0; rt[6] = ERL_DRV_TUPLE; rt[7] = 2; driver_send_term(port,caller,rt,8); driver_free_binary(bin); } void es_eventState(sdl_data *sd, int len, char *bp) { Uint8 type, res; int sendlen, state; char *start; type = get8(bp); state = get8(bp); res = SDL_EventState(type, state); bp = start = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } /* API from the other files e.g. mouse keyboard active */ void es_getAppState(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; Uint8 state; bp = start = sdl_get_temp_buff(sd, 1); state = SDL_GetAppState(); put8(bp, state); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_enableUNICODE(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; Uint8 enable; bp = buff; enable = get8(bp); bp = start = sdl_get_temp_buff(sd, 1); enable = SDL_EnableUNICODE(enable); put8(bp, enable); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_enableKeyRepeat(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; Uint16 delay, intv, res; bp = buff; delay = get16be(bp); intv = get16be(bp); bp = start = sdl_get_temp_buff(sd, 1); res = SDL_EnableKeyRepeat(delay, intv); put8(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_getKeyName(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start, *name; Uint16 key; bp = buff; key = get16be(bp); bp = start = sdl_get_temp_buff(sd, 128); name = SDL_GetKeyName(key); while(*name != '\0') { put8(bp, *name); name++; } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_getKeyState(sdl_data *sd, int len,char *buff) { Uint8 * keys; char *bp, *start; int length, sendlen, i; keys = SDL_GetKeyState(&length); bp = start = sdl_get_temp_buff(sd, length); for(i=0; iuse_smp) { es_showCursor2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_ShowCursorFunc, len, bp); } } void es_showCursor2(ErlDrvPort port, ErlDrvTermData caller, char *bp) { Uint8 bool; ErlDrvTermData rt[8]; bool = (Uint8) *bp; bool = SDL_ShowCursor(bool); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = bool; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); } void es_numJoysticks(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; int joys; bp = buff; bp = start = sdl_get_temp_buff(sd, 1); joys = SDL_NumJoysticks(); put8(bp, joys); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_name(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; int index; const char * name; bp = buff; index = get8(bp); bp = start = sdl_get_temp_buff(sd, 256); name = SDL_JoystickName(index); index = 0; while(*name != '\0' && index++ < 256) { put8(bp, *name); name++; } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_open(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int index; bp = buff; index = get8(bp); bp = start = sdl_get_temp_buff(sd, 8); if((joy = SDL_JoystickOpen(index)) != NULL) { PUSHGLPTR(joy, bp); } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_opened(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; int index, bool; bp = buff; index = get8(bp); bp = start = sdl_get_temp_buff(sd, 1); bool = SDL_JoystickOpened(index); put8(bp, bool); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_index(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int index; bp = buff; POPGLPTR(joy, bp); bp = start = sdl_get_temp_buff(sd, 1); index = SDL_JoystickIndex(joy); put8(bp,index); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_numAxes(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int axes; bp = buff; POPGLPTR(joy, bp); bp = start = sdl_get_temp_buff(sd, 1); axes = SDL_JoystickNumAxes(joy); put8(bp,axes); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_numBalls(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int balls; bp = buff; POPGLPTR(joy, bp); bp = start = sdl_get_temp_buff(sd, 1); balls = SDL_JoystickNumBalls(joy); put8(bp,balls); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_numHats(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int hats; bp = buff; POPGLPTR(joy, bp); bp = start = sdl_get_temp_buff(sd, 1); hats = SDL_JoystickNumHats(joy); put8(bp,hats); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_numButtons(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int buttons; bp = buff; POPGLPTR(joy, bp); bp = start = sdl_get_temp_buff(sd, 1); buttons = SDL_JoystickNumButtons(joy); put8(bp,buttons); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_update(sdl_data *sd, int len,char *buff) { SDL_JoystickUpdate(); } void es_joystick_eventState(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; int state; bp = buff; state = get32be(bp); bp = start = sdl_get_temp_buff(sd, 4); state = SDL_JoystickEventState(state); put32be(bp, state); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_getAxis(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int state, axis; bp = buff; POPGLPTR(joy, bp); axis = get8(bp); bp = start = sdl_get_temp_buff(sd, 4); state = SDL_JoystickGetAxis(joy, axis); put32be(bp, state); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_getHat(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int state; Uint8 hat; bp = buff; POPGLPTR(joy, bp); hat = get8(bp); bp = start = sdl_get_temp_buff(sd, 1); state = SDL_JoystickGetHat(joy, hat); put8(bp,state); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_getButton(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int state; Uint8 button; bp = buff; POPGLPTR(joy, bp); button = get8(bp); bp = start = sdl_get_temp_buff(sd, 1); state = SDL_JoystickGetButton(joy, button); put8(bp,state); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_getBall(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int dx, dy; Uint8 ball; bp = buff; POPGLPTR(joy, bp); ball = get8(bp); bp = start = sdl_get_temp_buff(sd, 8); if(0 == SDL_JoystickGetBall(joy, ball, &dx, &dy)) { put32be(bp, dx); put32be(bp, dy); } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_joystick_close(sdl_data *sd, int len,char *buff) { char *bp; SDL_Joystick *joy; bp = buff; POPGLPTR(joy, bp); SDL_JoystickClose(joy); } /* Internals */ static char* encode_event(const SDL_Event * ev, char * bp) { switch(ev->type) { case SDL_ACTIVEEVENT: /* Application loses/gains visibility */ put8(bp, SDL_ACTIVEEVENT); put8(bp, ev->active.gain); put8(bp, ev->active.state); break; case SDL_KEYDOWN: /* Keys pressed */ case SDL_KEYUP: /* Keys released */ put8(bp, SDL_KEYDOWN); /* Using same for both */ put8(bp, ev->key.which); put8(bp, ev->key.state); put8(bp, ev->key.keysym.scancode); put16be(bp, ev->key.keysym.sym); put16be(bp, ev->key.keysym.mod); put16be(bp, ev->key.keysym.unicode); break; case SDL_MOUSEMOTION: /* Mouse moved */ put8(bp, SDL_MOUSEMOTION); put8(bp, ev->motion.which); put8(bp, ev->motion.state); put16be(bp, SDL_GetModState()); put16be(bp, ev->motion.x); put16be(bp, ev->motion.y); put16be(bp, ev->motion.xrel); put16be(bp, ev->motion.yrel); break; case SDL_MOUSEBUTTONDOWN:/* Mouse button pressed */ case SDL_MOUSEBUTTONUP:/* Mouse button released */ put8(bp, SDL_MOUSEBUTTONDOWN); put8(bp, ev->button.which); put8(bp, ev->button.button); put8(bp, ev->button.state); put16be(bp, SDL_GetModState()); put16be(bp, ev->button.x); put16be(bp, ev->button.y); break; case SDL_JOYAXISMOTION:/* Joystick axis motion */ put8(bp, SDL_JOYAXISMOTION); put8(bp, ev->jaxis.which); put8(bp, ev->jaxis.axis); put16be(bp, ev->jaxis.value); break; case SDL_JOYBALLMOTION:/* Joystick trackball motion */ put8(bp, SDL_JOYBALLMOTION); put8(bp, ev->jball.which); put8(bp, ev->jball.ball); put16be(bp, ev->jball.xrel); put16be(bp, ev->jball.yrel); break; case SDL_JOYHATMOTION:/* Joystick hat position change */ put8(bp, SDL_JOYHATMOTION); put8(bp, ev->jhat.which); put8(bp, ev->jhat.hat); put8(bp, ev->jhat.value); break; case SDL_JOYBUTTONDOWN:/* Joystick button pressed */ case SDL_JOYBUTTONUP: /* Joystick button released */ put8(bp, SDL_JOYBUTTONDOWN); put8(bp, ev->jbutton.which); put8(bp, ev->jbutton.button); put8(bp, ev->jbutton.state); break; case SDL_QUIT: /* User-requested quit */ put8(bp, SDL_QUIT); break; case SDL_VIDEORESIZE: put8(bp, SDL_VIDEORESIZE); put16be(bp, ev->resize.w); put16be(bp, ev->resize.h); break; case SDL_VIDEOEXPOSE: put8(bp, SDL_VIDEOEXPOSE); break; case SDL_SYSWMEVENT: /* System specific event */ break; default: /* Forward compatible */ fprintf(stderr, "ESDL received unsupported event type %x \n", ev->type); put8(bp, SDL_NOEVENT); break; } return bp; } esdl-1.3.1/c_src/esdl_sdl_fp.h0000775000070100000120000003113212200143736014630 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ * Function pointers for sdl functions */ { SDL_InitFunc, "SDL_InitFunc", es_init }, { SDL_QuitFunc, "SDL_QuitFunc", es_quit }, { SDL_GetErrorFunc, "SDL_GetErrorFunc", es_getError }, { ESDL_OpenglInitFunc, "ESDL_opengl_init", es_init_opengl}, { SDL_SetVideoModeFunc, "SDL_SetVideoModeFunc", es_setVideoMode }, { SDL_VideoDriverNameFunc, "SDL_VideoDriverNameFunc", es_videoDriverName }, { SDL_GetVideoSurfaceFunc, "SDL_GetVideoSurfaceFunc", es_getVideoSurface }, { SDL_GetVideoInfoFunc, "SDL_GetVideoInfoFunc", es_getVideoInfo }, { SDL_VideoModeOKFunc, "SDL_VideoModeOKFunc", es_videoModeOK }, { SDL_ListModesFunc, "SDL_ListModesFunc", es_listModes }, { SDL_SetColorKeyFunc, "SDL_SetColorKeyFunc", es_setColorKey }, { SDL_DisplayFormatFunc, "SDL_DisplayFormatFunc", es_displayFormat }, { SDL_BlitSurfaceFunc, "SDL_BlitSurfaceFunc", es_blitSurface }, { SDL_FillRectFunc, "SDL_FillRectFunc", es_fillRect }, { SDL_UpdateRectsFunc, "SDL_UpdateRectsFunc", es_updateRects }, { SDL_FlipFunc, "SDL_FlipFunc", es_flip }, { SDL_SetColorsFunc, "SDL_SetColorsFunc", es_setColors }, { SDL_MapRGBFunc, "SDL_MapRGBFunc", es_mapRGB }, { SDL_GetRGBFunc, "SDL_GetRGBFunc", es_getRGB }, { SDL_CreateRGBSurfaceFunc, "SDL_CreateRGBSurfaceFunc", es_createRGBSurface }, { SDL_CreateRGBSurfaceFromFunc, "SDL_CreateRGBSurfaceFromFunc", es_createRGBSurfaceFrom }, { SDL_FreeSurfaceFunc, "SDL_FreeSurfaceFunc", es_freeSurface }, { SDL_LockSurfaceFunc, "SDL_LockSurfaceFunc", es_lockSurface }, { SDL_UnlockSurfaceFunc, "SDL_UnlockSurfaceFunc", es_unlockSurface }, { SDL_LoadBMPFunc, "SDL_LoadBMPFunc", es_loadBMP }, { SDL_SaveBMPFunc, "SDL_SaveBMPFunc", es_saveBMP }, { SDL_SetAlphaFunc, "SDL_SetAlphaFunc", es_setAlpha }, /* { SDL_SetClippingFunc, "SDL_SetClippingFunc", es_setClipping }, Removed */ { SDL_SetGammaFunc, "SDL_SetGamma", es_setGamma }, { SDL_SetGammaRampFunc, "SDL_SetGammaRamp", es_setGammaRamp }, { SDL_GetGammaRampFunc, "SDL_GetGamma", es_getGammaRamp }, { SDL_MapRGBAFunc, "SDL_MapRGBAFunc", es_mapRGBA }, { SDL_GetRGBAFunc, "SDL_GetRGBAFunc", es_getRGBA}, { SDL_GetClipRectFunc, "SDL_GetClipRectFunc", es_getClipRect}, { SDL_SetClipRectFunc, "SDL_SetClipRectFunc", es_setClipRect}, { SDL_DisplayFormatAlphaFunc, "SDL_DisplayFormatAlphaFunc", es_displayFormatAlpha}, { SDL_WM_SetCaptionFunc, "SDL_WM_SetCaptionFunc", es_wm_setCaption }, { SDL_WM_GetCaptionFunc, "SDL_WM_GetCaptionFunc", es_wm_getCaption }, { SDL_WM_SetIconFunc, "SDL_WM_SetIconFunc", es_wm_setIcon }, { SDL_WM_IconifyWindowFunc, "SDL_WM_IconifyWindowFunc", es_wm_iconifyWindow }, { SDL_WM_ToggleFullScreenFunc, "SDL_WM_ToggleFullScreenFunc", es_wm_toggleFullScreen }, { SDL_WM_GrabInputFunc, "SDL_WM_GrabInputFunc", es_wm_grabInput }, { SDL_WM_GetInfoFunc, "SDL_WM_GetInfoFunc", es_wm_getInfo }, { SDL_WM_IsMaximizedFunc, "SDL_WM_IsMaximizedFunc", es_wm_isMaximized }, { SDL_WM_MaximizeFunc, "SDL_WM_MaximizeFunc", es_wm_maximize }, { SDL_WM_MacFileDialog, "SDL_WM_MacFileDialog", es_wm_mac_file_dialog }, /** EVENT FUNCTIONS */ { SDL_PumpEventsFunc, "SDL_PumpEventsFunc", es_pumpEvents }, { SDL_PeepEventsFunc, "SDL_PeepEventsFunc", es_peepEvents }, { SDL_PollEventFunc, "SDL_PollEventFunc", es_pollEvent }, { SDL_WaitEventFunc, "SDL_WaitEventFunc", es_waitEvent }, { SDL_EventStateFunc, "SDL_EventStateFunc", es_eventState }, { SDL_GetAppStateFunc, "SDL_GetAppStateFunc", es_getAppState }, { SDL_GetModStateFunc, "SDL_GetModStateFunc", es_getModState }, { SDL_SetModStateFunc, "SDL_SetModStateFunc", es_setModState }, { SDL_GetKeyStateFunc, "SDL_GetKeyStateFunc", es_getKeyState }, { SDL_EnableUNICODEFunc, "SDL_EnableUNICODEFunc", es_enableUNICODE }, { SDL_GetKeyNameFunc, "SDL_GetKeyNameFunc", es_getKeyName }, { SDL_EnableKeyRepeatFunc, "SDL_EnableKeyRepeatFunc", es_enableKeyRepeat }, /* Mouse Functions */ { SDL_GetMouseStateFunc, "SDL_GetMouseStateFunc", es_getMouseState }, { SDL_GetRelativeMouseStateFunc, "SDL_GetRelativeMouseStateFunc", es_getRelativeMouseState }, { SDL_WarpMouseFunc, "SDL_WarpMouseFunc", es_warpMouse }, { SDL_CreateCursorFunc, "SDL_CreateCursorFunc", es_createCursor }, { SDL_SetCursorFunc, "SDL_SetCursorFunc", es_setCursor }, { SDL_GetCursorFunc, "SDL_GetCursorFunc", es_getCursor }, { SDL_FreeCursorFunc, "SDL_FreeCursorFunc", es_freeCursor }, { SDL_ShowCursorFunc, "SDL_ShowCursorFunc", es_showCursor }, /* Joystick functions */ { SDL_NumJoysticksFunc, "SDL_NumJoysticksFunc", es_numJoysticks }, { SDL_JoystickNameFunc, "SDL_JoystickNameFunc", es_joystick_name }, { SDL_JoystickOpenFunc, "SDL_JoystickOpenFunc", es_joystick_open }, { SDL_JoystickOpenedFunc, "SDL_JoystickOpenedFunc", es_joystick_opened }, { SDL_JoystickIndexFunc, "SDL_JoystickIndexFunc", es_joystick_index }, { SDL_JoystickNumAxesFunc, "SDL_JoystickNumAxesFunc", es_joystick_numAxes }, { SDL_JoystickNumBallsFunc, "SDL_JoystickNumBallsFunc", es_joystick_numBalls }, { SDL_JoystickNumHatsFunc, "SDL_JoystickNumHatsFunc", es_joystick_numHats }, { SDL_JoystickNumButtonsFunc, "SDL_JoystickNumButtonsFunc", es_joystick_numButtons }, { SDL_JoystickUpdateFunc, "SDL_JoystickUpdateFunc", es_joystick_update }, { SDL_JoystickEventStateFunc, "SDL_JoystickEventStateFunc", es_joystick_eventState }, { SDL_JoystickGetAxisFunc, "SDL_JoystickGetAxisFunc", es_joystick_getAxis }, { SDL_JoystickGetHatFunc, "SDL_JoystickGetHatFunc", es_joystick_getHat }, { SDL_JoystickGetButtonFunc, "SDL_JoystickGetButtonFunc", es_joystick_getButton }, { SDL_JoystickGetBallFunc, "SDL_JoystickGetBallFunc", es_joystick_getBall }, { SDL_JoystickCloseFunc, "SDL_JoystickCloseFunc", es_joystick_close }, /* SDL open gl support funcs */ { SDL_GL_SetAttributeFunc, "SDL_GL_SetAttributeFunc", es_gl_setAttribute }, { SDL_GL_GetAttributeFunc, "SDL_GL_GetAttributeFunc", es_gl_getAttribute }, { SDL_GL_SwapBuffersFunc, "SDL_GL_SwapBuffersFunc", es_gl_swapBuffers }, /* Erl sdl functions */ { ESDL_getSurfaceFunc, "ESDL_getSurfaceFunc", es_getSurface }, { ESDL_getPixelFormatFunc, "ESDL_getPixelFormatFunc", es_getPixelFormat }, { ESDL_getPaletteFunc, "ESDL_getPaletteFunc", es_getPalette }, { ESDL_getPixelsFunc, "ESDL_getPixelsFunc", es_getPixels }, { SDL_UTIL_copySdlImage2GLArrayFunc, "SDL_UTIL_copySdlImage2GLArrayFunc", copySdlImage2GLArray }, { SDL_UTIL_DebugFunc, "SDL_UTIL_DebugFunc", sdl_util_debug}, /* SDL AUDIO functions */ { SDL_AudioDriverNameFunc, "SDL_AudioDriverNameFunc", es_audioDriverName }, { SDL_OpenAudioFunc, "SDL_OpenAudioFunc", es_openAudio }, { SDL_GetAudioStatusFunc, "SDL_GetAudioStatusFunc", es_getAudioStatus }, { SDL_PauseAudioFunc, "SDL_PauseAudioFunc", es_pauseAudio }, { SDL_LoadWAVFunc, "SDL_LoadWAVFunc", es_loadWAV }, { SDL_FreeWAVFunc, "SDL_FreeWAVFunc", es_freeWAV }, { SDL_BuildAudioCVTFunc, "SDL_BuildAudioCVTFunc", es_buildAudioCVT }, { SDL_ConvertAudioFunc, "SDL_ConvertAudioFunc", es_convertAudio }, { SDL_MixAudioFunc, "SDL_MixAudioFunc", es_mixAudio }, { SDL_LockAudioFunc, "SDL_LockAudioFunc", es_lockAudio }, { SDL_UnlockAudioFunc, "SDL_UnlockAudioFunc", es_unlockAudio }, { SDL_CloseAudioFunc, "SDL_CloseAudioFunc", es_closeAudio }, { play_audioFunc, "play_audioFunc", play_audio }, /* MY GL memory handling funcs */ { mygl_allocFunc, "mygl_allocFunc", mygl_alloc }, { mygl_writeFunc, "mygl_writeFunc", mygl_write }, /* SDL TTF functions */ #ifdef _USE_SDL_TTF { SDL_TTF_Linked_VersionFunc, "SDL_TTF_Linked_VersionFunc", es_ttf_linkedVersion }, { SDL_TTF_ByteSwappedUNICODEFunc, "SDL_TTF_ByteSwappedUNICODEFunc", es_ttf_byteSwappedUNICODE }, { SDL_TTF_InitFunc, "SDL_TTF_InitFunc", es_ttf_init }, { SDL_TTF_OpenFontFunc, "SDL_TTF_OpenFontFunc", es_ttf_openFont }, { SDL_TTF_OpenFontIndexFunc, "SDL_TTF_OpenFontIndexFunc", es_ttf_openFontIndex }, { SDL_TTF_OpenFontRWFunc, "SDL_TTF_OpenFontRWFunc", es_ttf_openFontRW }, { SDL_TTF_OpenFontIndexRWFunc, "SDL_TTF_OpenFontIndexRWFunc", es_ttf_openFontIndexRW }, { SDL_TTF_GetFontStyleFunc, "SDL_TTF_GetFontStyleFunc", es_ttf_getFontStyle }, { SDL_TTF_SetFontStyleFunc, "SDL_TTF_SetFontStyleFunc", es_ttf_setFontStyle }, { SDL_TTF_FontHeightFunc, "SDL_TTF_FontHeightFunc", es_ttf_fontHeight }, { SDL_TTF_FontAscentFunc, "SDL_TTF_FontAscentFunc", es_ttf_fontAscent }, { SDL_TTF_FontDescentFunc, "SDL_TTF_FontDescentFunc", es_ttf_fontDescent }, { SDL_TTF_FontLineSkipFunc, "SDL_TTF_FontLineSkipFunc", es_ttf_fontLineSkip }, { SDL_TTF_FontFacesFunc, "SDL_TTF_FontFacesFunc", es_ttf_fontFaces }, { SDL_TTF_FontFaceIsFixedWidthFunc, "SDL_TTF_FontFaceIsFixedWidthFunc", es_ttf_fontFaceIsFixedWidth }, { SDL_TTF_FontFaceFamilyNameFunc, "SDL_TTF_FontFaceFamilyNameFunc", es_ttf_fontFaceFamilyName }, { SDL_TTF_FontFaceStyleNameFunc, "SDL_TTF_FontFaceStyleNameFunc", es_ttf_fontFaceStyleName }, { SDL_TTF_GlyphMetricsFunc, "SDL_TTF_GlyphMetricsFunc", es_ttf_glyphMetrics }, { SDL_TTF_SizeTextFunc, "SDL_TTF_SizeTextFunc", es_ttf_sizeText }, { SDL_TTF_SizeUTF8Func, "SDL_TTF_SizeUTF8Func", es_ttf_sizeUTF8 }, { SDL_TTF_SizeUNICODEFunc, "SDL_TTF_SizeUNICODEFunc", es_ttf_sizeUNICODE }, { SDL_TTF_RenderText_SolidFunc, "SDL_TTF_RenderText_SolidFunc", es_ttf_renderTextSolid }, { SDL_TTF_RenderUTF8_SolidFunc, "SDL_TTF_RenderUTF8_SolidFunc", es_ttf_renderUTF8Solid }, { SDL_TTF_RenderUNICODE_SolidFunc, "SDL_TTF_RenderUNICODE_SolidFunc", es_ttf_renderUNICODESolid }, { SDL_TTF_RenderGlyph_SolidFunc, "SDL_TTF_RenderGlyph_SolidFunc", es_ttf_renderGlyphSolid }, { SDL_TTF_RenderText_ShadedFunc, "SDL_TTF_RenderText_ShadedFunc", es_ttf_renderTextShaded }, { SDL_TTF_RenderUTF8_ShadedFunc, "SDL_TTF_RenderUTF8_ShadedFunc", es_ttf_renderUTF8Shaded }, { SDL_TTF_RenderUNICODE_ShadedFunc, "SDL_TTF_RenderUNICODE_ShadedFunc", es_ttf_renderUNICODEShaded }, { SDL_TTF_RenderGlyph_ShadedFunc, "SDL_TTF_RenderGlyph_ShadedFunc", es_ttf_renderGlyphShaded }, { SDL_TTF_RenderText_BlendedFunc, "SDL_TTF_RenderText_BlendedFunc", es_ttf_renderTextBlended }, { SDL_TTF_RenderUTF8_BlendedFunc, "SDL_TTF_RenderUTF8_BlendedFunc", es_ttf_renderUTF8Blended }, { SDL_TTF_RenderUNICODE_BlendedFunc, "SDL_TTF_RenderUNICODE_BlendedFunc", es_ttf_renderUNICODEBlended }, { SDL_TTF_RenderGlyph_BlendedFunc, "SDL_TTF_RenderGlyph_BlendedFunc", es_ttf_renderGlyphBlended }, { SDL_TTF_CloseFontFunc, "SDL_TTF_CloseFontFunc", es_ttf_closeFont }, { SDL_TTF_QuitFunc, "SDL_TTF_QuitFunc", es_ttf_quit }, { SDL_TTF_WasInitFunc, "SDL_TTF_WasInitFunc", es_ttf_wasInit }, { SDL_TTF_SetErrorFunc, "SDL_TTF_SetErrorFunc", es_ttf_setError }, { SDL_TTF_GetErrorFunc, "SDL_TTF_GetErrorFunc", es_ttf_getError }, #endif /*_USE_SDL_TTF */ /* SDL image functions */ #ifdef _USE_SDL_IMAGE { SDL_IMG_LinkedVersionFunc, "SDL_IMG_LinkedVersionFunc", es_img_linkedVersion }, { SDL_IMG_LoadTypedRWFunc, "SDL_IMG_LoadTypedRWFunc", es_img_loadTypedRW }, { SDL_IMG_LoadFunc, "SDL_IMG_LoadFunc", es_img_load }, { SDL_IMG_LoadRWFunc, "SDL_IMG_LoadRWFunc", es_img_loadRW }, { SDL_IMG_InvertAlphaFunc, "SDL_IMG_InvertAlphaFunc", es_img_invertAlpha }, { SDL_IMG_isBMPFunc, "SDL_IMG_isBMPFunc", es_img_isBMP }, { SDL_IMG_isPNMFunc, "SDL_IMG_isPNMFunc", es_img_isPNM }, { SDL_IMG_isXPMFunc, "SDL_IMG_isXPMFunc", es_img_isXPM }, { SDL_IMG_isXCFFunc, "SDL_IMG_isXCFFunc", es_img_isXCF }, { SDL_IMG_isPCXFunc, "SDL_IMG_isPCXFunc", es_img_isPCX }, { SDL_IMG_isGIFFunc, "SDL_IMG_isGIFFunc", es_img_isGIF }, { SDL_IMG_isJPGFunc, "SDL_IMG_isJPGFunc", es_img_isJPG }, { SDL_IMG_isTIFFunc, "SDL_IMG_isTIFFunc", es_img_isTIF }, { SDL_IMG_isPNGFunc, "SDL_IMG_isPNGFunc", es_img_isPNG }, { SDL_IMG_isLBMFunc, "SDL_IMG_isLBMFunc", es_img_isLBM }, { SDL_IMG_LoadBMPRWFunc, "SDL_IMG_LoadBMPRWFunc", es_img_loadBMPRW }, { SDL_IMG_LoadPNMRWFunc, "SDL_IMG_LoadPNMRWFunc", es_img_loadPNMRW }, { SDL_IMG_LoadXPMRWFunc, "SDL_IMG_LoadXPMRWFunc", es_img_loadXPMRW }, { SDL_IMG_LoadXCFRWFunc, "SDL_IMG_LoadXCFRWFunc", es_img_loadXCFRW }, { SDL_IMG_LoadPCXRWFunc, "SDL_IMG_LoadPCXRWFunc", es_img_loadPCXRW }, { SDL_IMG_LoadGIFRWFunc, "SDL_IMG_LoadGIFRWFunc", es_img_loadGIFRW }, { SDL_IMG_LoadJPGRWFunc, "SDL_IMG_LoadJPGRWFunc", es_img_loadJPGRW }, { SDL_IMG_LoadTIFRWFunc, "SDL_IMG_LoadTIFRWFunc", es_img_loadTIFRW }, { SDL_IMG_LoadPNGRWFunc, "SDL_IMG_LoadPNGRWFunc", es_img_loadPNGRW }, { SDL_IMG_LoadTGARWFunc, "SDL_IMG_LoadTGARWFunc", es_img_loadTGARW }, { SDL_IMG_LoadLBMRWFunc, "SDL_IMG_LoadLBMRWFunc", es_img_loadLBMRW }, { SDL_IMG_ReadXPMFromArrayFunc, "SDL_IMG_ReadXPMFromArrayFunc", es_img_readXPMFromArray }, { SDL_IMG_SetErrorFunc, "SDL_IMG_SetErrorFunc", es_img_setError }, { SDL_IMG_GetErrorFunc, "SDL_IMG_GetErrorFunc", es_img_getError }, #endif /* _USE_SDL_IMAGE */ esdl-1.3.1/c_src/esdl_gen.c0000775000070100000120000000153012200143736014124 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* * General SDL functions. */ #include "esdl.h" #include void es_init(sdl_data *sd, int len, char *bp) { Uint32 mode; mode = * (Uint32 *) bp; if (SDL_Init(mode) < 0) { char* e = SDL_GetError(); fprintf(stderr, "Couldn't initialize SDL: %s\n\r", e); } } void es_quit(sdl_data *sd, int len, char * buff) { SDL_Quit(); } void es_getError(sdl_data *sd, int len, char *buff) { char * err, *bp, *start; int length; err = SDL_GetError(); length = (int) strlen(err); bp = start = sdl_getbuff(sd, length); while(*err != '\0') { put8(bp, *err++); } sdl_send(sd, (int) (bp - start)); } esdl-1.3.1/c_src/esdl_util.c0000775000070100000120000000513712200143736014337 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* * Some useful extra functions */ #ifdef _WIN32 #include #endif #include #include /* malloc */ #ifdef FLAVOUR_WOGGLE #include #else #include "esdl.h" #endif void mygl_alloc(sdl_data *sd, int len, char *bp) { char *start; unsigned size; size = * (unsigned *) bp; bp = start = sdl_getbuff(sd, size); sdl_send(sd, size); } void mygl_write(sdl_data *sd, int len, char *bp) { if (sd->next_bin == 1) { memcpy(sd->bin[0].base, bp, len); } else if (sd->next_bin == 2) { memcpy(sd->bin[0].base, sd->bin[1].base, sd->bin[1].size); } sdl_free_binaries(sd); } #ifndef FLAVOUR_WOGGLE void copySdlImage2GLArray(sdl_data *sd, int len, char * buff) { Uint8 *rowhi, *rowlo, type; SDL_Surface *image; unsigned char * mem; char *bp, *start; int i, j = 0, k; Uint8 rs,bs,gs,as; bp = buff; POPGLPTR(image, bp); type = *bp; if (sd->next_bin == 1) { mem = (unsigned char *) sd->bin[0].base; #if SDL_BYTEORDER == SDL_BIG_ENDIAN rs = (2 - image->format->Rshift/8); gs = (2 - image->format->Gshift/8); bs = (2 - image->format->Bshift/8); as = (2 - image->format->Ashift/8); #else rs = image->format->Rshift/8; gs = image->format->Gshift/8; bs = image->format->Bshift/8; as = image->format->Ashift/8; #endif /* GL surfaces are upsidedown (according to SDL examples)?? */ k = 0; rowhi = (Uint8 *)image->pixels; rowlo = rowhi + (image->h * image->pitch) - image->pitch; for(i=0; ih; ++i ) { for(j=0; jw; ++j ) { switch(image->format->BytesPerPixel) { case 1: mem[k++] = image->format->palette->colors[rowlo[j]].r; mem[k++] = image->format->palette->colors[rowlo[j]].g; mem[k++] = image->format->palette->colors[rowlo[j]].b; if(type == 4) mem[k++] = 0; break; case 3: mem[k++] = rowlo[j*3 + rs]; mem[k++] = rowlo[j*3 + gs]; mem[k++] = rowlo[j*3 + bs]; if(type == 4) mem[k++] = 0; break; case 4: mem[k++] = rowlo[j*4 + rs]; mem[k++] = rowlo[j*4 + gs]; mem[k++] = rowlo[j*4 + bs]; if(type == 4) mem[k++] = rowlo[j*4 + as]; break; } } rowlo -= image->pitch; } /* fprintf(stderr, "i %d, j %d k%d\n\r", i, j, k); */ start = sdl_get_temp_buff(sd, 2); start[0] = 1; sdl_send(sd, 1); sdl_free_binaries(sd); } } #endif esdl-1.3.1/c_src/esdl_video.c0000775000070100000120000006266612200143736014502 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* * sdl_video functions */ #include #include #include "esdl.h" #ifdef _OSX_COCOA # import #endif static size_t do_mac_file_dialog(char* buf, char* res, size_t res_size); void es_setVideoMode(sdl_data *sd, int len, char* bp) { if(!sd->use_smp) { es_setVideoMode2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { /* opengl initialization must be called from thread */ gl_dispatch(sd, SDL_SetVideoModeFunc, len, bp); } } void es_setVideoMode2(ErlDrvPort port, ErlDrvTermData caller, char* bp) { int w, h, bpp, type; SDL_Surface *screen; ErlDrvTermData rt[8]; w = get16be(bp); h = get16be(bp); bpp = get16be(bp); type = get32be(bp); screen = SDL_SetVideoMode(w, h, bpp, type), rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_UINT; rt[3] = (ErlDrvUInt) screen; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); } void es_videoDriverName(sdl_data *sd, int len, char *buff) { char *bp; int sendlen = 0; bp = sdl_get_temp_buff(sd, 512); if (SDL_VideoDriverName(bp, 512) != NULL) { sendlen = (int) strlen(bp); } sdl_send(sd, sendlen); } void es_getVideoSurface(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; SDL_Surface *ref; bp = start = sdl_get_temp_buff(sd, 8); ref = SDL_GetVideoSurface(); PUSHGLPTR(ref, bp); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_getVideoInfo(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; const SDL_VideoInfo *vi; bp = start = sdl_get_temp_buff(sd, 9+2*8); vi = SDL_GetVideoInfo(); if(vi->hw_available) put8(bp, 1); else put8(bp, 0); if(vi->wm_available) put8(bp, 1); else put8(bp, 0); if(vi->blit_hw) put8(bp, 1); else put8(bp, 0); if(vi->blit_hw_CC) put8(bp, 1); else put8(bp, 0); if(vi->blit_hw_A) put8(bp, 1); else put8(bp, 0); if(vi->blit_sw) put8(bp, 1); else put8(bp, 0); if(vi->blit_sw_CC) put8(bp, 1); else put8(bp, 0); if(vi->blit_sw_A) put8(bp, 1); else put8(bp, 0); if(vi->blit_fill) put8(bp, 1); else put8(bp, 0); put32be(bp, vi->video_mem); PUSHGLPTR(vi->vfmt, bp); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_videoModeOK(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_videoModeOK2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_VideoModeOKFunc, len, bp); } } void es_videoModeOK2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { char *bp; int w, h, bpp, type; int res; ErlDrvTermData rt[8]; bp = buff; w = get16be(bp); h = get16be(bp); bpp = get16be(bp); type = get32be(bp); res = SDL_VideoModeOK(w,h,bpp,type); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = res; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); } void es_listModes(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen, i; Uint32 flags; SDL_PixelFormat *pfp, pf; SDL_Rect ** res; bp = buff; flags = get32be(bp); switch(get8(bp)) { case 0: POPGLPTR(pfp, bp); break; case 1: POPGLPTR(pf.palette, bp); pf.BitsPerPixel = get8(bp); pf.BytesPerPixel = get8(bp); pf.Rloss = get8(bp); pf.Gloss = get8(bp); pf.Bloss = get8(bp); pf.Aloss = get8(bp); pf.Rshift = get8(bp); pf.Gshift = get8(bp); pf.Bshift = get8(bp); pf.Ashift = get8(bp); pf.Rmask = get32be(bp); pf.Gmask = get32be(bp); pf.Bmask = get32be(bp); pf.Amask = get32be(bp); pf.colorkey= get32be(bp); pf.alpha= get8(bp); pfp = &pf; default: error(); } bp = start = sdl_get_temp_buff(sd, 128*2*4+1); res = SDL_ListModes(pfp, flags); switch((size_t) res) { case 0: /* NULL */ put8(bp, 0); break; case -1: put8(bp,-1); break; default: put8(bp,0); /* Wasted byte :- )*/ for(i=0; res[i]; i++) { put16be(bp, res[i]->x); put16be(bp, res[i]->y); put16be(bp, res[i]->w); put16be(bp, res[i]->h); } } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_flip(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen, res; SDL_Surface *ref; bp = buff; POPGLPTR(ref, bp); res = SDL_Flip(ref); start = bp = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_setColors(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen, res = 1, first, length, i, tot =0; SDL_Surface *ref; SDL_Color colors[256]; bp = buff; POPGLPTR(ref, bp); first = get32be(bp); length = get32be(bp); do { for(i = 0; i < length && i < 256; i++) { colors[i].r = get8(bp); colors[i].b = get8(bp); colors[i].g = get8(bp); }; res &= SDL_SetColors(ref, colors, first, i); tot += i; first += i; } while(tot < length); start = bp = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_mapRGB(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; SDL_Surface * sptr; Uint32 res; Uint8 r,g,b; bp = buff; POPGLPTR(sptr, bp); r = get8(bp); g = get8(bp); b = get8(bp); if(sptr == NULL || sptr->format == NULL) error(); res = SDL_MapRGB(sptr->format, r,g,b); bp = start = sdl_get_temp_buff(sd, 4); put32be(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_getRGB(sdl_data *sd, int len, char *buff) { error(); } void es_blitSurface(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; char type, res; SDL_Surface *sptr, *dptr; SDL_Rect s, d, *src, *dest; bp = buff; POPGLPTR(sptr, bp); POPGLPTR(dptr, bp); src = &s; dest = &d; switch get8(bp) { case 0: src = NULL; dest= NULL; type = 0; break; case 1: src->x = get16be(bp); src->y = get16be(bp); src->w = get16be(bp); src->h = get16be(bp); dest = NULL; type = 1; break; case 2: dest->x = get16be(bp); dest->y = get16be(bp); dest->w = get16be(bp); dest->h = get16be(bp); src = NULL; type = 2; break; case 3: src->x = get16be(bp); src->y = get16be(bp); src->w = get16be(bp); src->h = get16be(bp); dest->x = get16be(bp); dest->y = get16be(bp); dest->w = get16be(bp); dest->h = get16be(bp); type = 3; break; default: error(); }; res = SDL_BlitSurface(sptr, src, dptr, dest); bp = start = sdl_get_temp_buff(sd, 9*2); put8(bp, res); put8(bp, type); switch(type) { case 0: break; case 1: put16be(bp, src->x); put16be(bp, src->y); put16be(bp, src->w); put16be(bp, src->h); break; case 2: put16be(bp, dest->x); put16be(bp, dest->y); put16be(bp, dest->w); put16be(bp, dest->h); break; case 3: put16be(bp, src->x); put16be(bp, src->y); put16be(bp, src->w); put16be(bp, src->h); put16be(bp, dest->x); put16be(bp, dest->y); put16be(bp, dest->w); put16be(bp, dest->h); break; default: error(); }; sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void print_rect(SDL_Rect * r) { if(r) fprintf(stderr, "x %d y %d w %d h %d \n\r", r->x, r->y, r->w, r->h); else fprintf(stderr, "Rect is null\n\r"); } void es_fillRect(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; char res; SDL_Surface *sptr; SDL_Rect s, *src; Uint32 color; src = &s; bp = buff; POPGLPTR(sptr, bp); color = get32be(bp); if(get8(bp) == 0) { src = NULL; } else { src->x = get16be(bp); src->y = get16be(bp); src->w = get16be(bp); src->h = get16be(bp); } res = SDL_FillRect(sptr, src, color); bp = start = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_updateRects(sdl_data *sd, int len, char * buff) { char *bp; int length, i, all; SDL_Surface *sptr; SDL_Rect s[64], *sr; bp = buff; POPGLPTR(sptr, bp); length = get16be(bp); all = 0; while(all < length) { sr = s; for(i = 0; i < 64 && all < length; i++, all++) { sr->x = get16be(bp); sr->y = get16be(bp); sr->w = get16be(bp); sr->h = get16be(bp); sr++; } SDL_UpdateRects(sptr, i, s); } } void es_setColorKey(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Surface * sptr; Uint32 flag, key; int res; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); flag = get32be(bp); key = get32be(bp); res = SDL_SetColorKey(sptr, flag, key); bp = start = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_displayFormat(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Surface * sptr, *new; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); new = SDL_DisplayFormat(sptr); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(new, bp); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_createRGBSurface(sdl_data *sd, int len, char *buff){ char *bp, *start; int sendlen; SDL_Surface * sptr; int width, height, depth, def; Uint32 flags, rmask, gmask, bmask, amask; bp = buff; flags = get32be(bp); width = get16be(bp); height = get16be(bp); depth = get8(bp); def = get8(bp); if (def==1) { rmask = get32be(bp); gmask = get32be(bp); bmask = get32be(bp); amask = get32be(bp); } else { #if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */ rmask = 0x000000FF; gmask = 0x0000FF00; bmask = 0x00FF0000; amask = 0xFF000000; #else rmask = 0xFF000000; gmask = 0x00FF0000; bmask = 0x0000FF00; amask = 0x000000FF; #endif }; sptr = SDL_CreateRGBSurface(flags, width, height, depth, rmask, gmask, bmask, amask); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(sptr, bp); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_createRGBSurfaceFrom(sdl_data *sd, int len, char *buff){ char *bp, *start; int sendlen; SDL_Surface * sptr; void * pixels; int width, height, depth, pitch, size; Uint32 rmask, gmask, bmask, amask; bp = buff; width = get16be(bp); height = get16be(bp); depth = get8(bp); pitch = get16be(bp); rmask = get32be(bp); gmask = get32be(bp); bmask = get32be(bp); amask = get16be(bp); size = get32be(bp); if(size == -1) { POPGLPTR(pixels, bp); } else { /* Get Pixels */ if((pixels = malloc(size)) == NULL){ bp = start = sdl_get_temp_buff(sd, 8); sptr = NULL; PUSHGLPTR(sptr, bp); sendlen = (int) (bp - start); sdl_send(sd, sendlen); return; } memcpy(pixels, (void *) bp, size); }; sptr = SDL_CreateRGBSurfaceFrom(pixels, width, height, depth, pitch, rmask, gmask, bmask, amask); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(sptr, bp); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_freeSurface(sdl_data *sd, int len, char * buff) { char *bp; SDL_Surface * sptr; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); SDL_FreeSurface(sptr); } void es_lockSurface(sdl_data *sd, int len, char * buff) { char *bp, *start; SDL_Surface * sptr; int sendlen, res; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); res = SDL_LockSurface(sptr); bp = start = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_unlockSurface(sdl_data *sd, int len, char * buff) { char *bp; SDL_Surface * sptr; bp = buff; POPGLPTR(sptr, bp); SDL_UnlockSurface(sptr); } void es_loadBMP(sdl_data *sd, int len, char* bp) { char *start; SDL_Surface *bmpSurface; int sendlen; bmpSurface = SDL_LoadBMP(bp); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(bmpSurface, bp); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_saveBMP(sdl_data *sd, int len, char* bp) { char *start; SDL_Surface *sptr; int sendlen, res; POPGLPTR(sptr, bp); res = SDL_SaveBMP(sptr, bp); bp = start = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_setAlpha(sdl_data *sd, int len, char *buff) { char *bp, *start; SDL_Surface *sptr; int sendlen, res; Uint32 flag, alpha; bp = buff; POPGLPTR(sptr, bp); flag = get32be(bp); alpha = get32be(bp); res = SDL_SetAlpha(sptr, flag, alpha); bp = start = sdl_get_temp_buff(sd, 4); put32be(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_setClipping(sdl_data *sd, int len, char *buff) { error(); } void es_setGamma(sdl_data *sd, int len, char *bp) { char *start; int sendlen, res; float red, green, blue; red = * (float *) bp; bp += sizeof(float); green = * (float *) bp; bp += sizeof(float); blue = * (float *) bp; bp += sizeof(float); res = SDL_SetGamma(red, green, blue); bp = start = sdl_get_temp_buff(sd, 4); * (float *) bp = (float) res; sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_setGammaRamp(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen, res; Uint16 *red,*green,*blue; bp = buff; red = (Uint16 *) bp; bp += 256*sizeof(Uint16); green = (Uint16 *) bp; bp += 256*sizeof(Uint16); blue = (Uint16 *) bp; bp += 256*sizeof(Uint16); res = SDL_SetGammaRamp(red,green,blue); bp = start = sdl_get_temp_buff(sd, 4); put32be(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_getGammaRamp(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen, res, i; Uint16 red[256], green[256],blue[256]; res = SDL_GetGammaRamp(red,green,blue); bp = start = sdl_getbuff(sd, 4 + 256*2*3); put32be(bp, res); for(i=0; i<256; i++) { put16be(bp, red[i]); } for(i=0; i<256; i++) { put16be(bp, green[i]); } for(i=0; i<256; i++) { put16be(bp, blue[i]); } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_wm_setCaption(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_wm_setCaption2(bp); } else { gl_dispatch(sd, SDL_WM_SetCaptionFunc, len, bp); } } void es_wm_setCaption2(char *bp) { char* title; char* icon; title = bp; icon = title + strlen(title) + 1; SDL_WM_SetCaption(title, icon); } void es_wm_getCaption(sdl_data *sd, int len, char *buff) { char * title, *icon, *bp, *start; int i, titlelen, iconlen, sendlen; SDL_WM_GetCaption(&title, &icon); for(titlelen = 0; title[titlelen] != '\0'; titlelen++); for(iconlen = 0; icon[iconlen] != '\0'; iconlen++); bp = start = sdl_get_temp_buff(sd, 4+titlelen+iconlen); put16be(bp, titlelen); put16be(bp, iconlen); for(i = 0; i < titlelen; i++) put8(bp, title[i]); for(i = 0; i < iconlen; i++) put8(bp, icon[i]); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_wm_setIcon(sdl_data *sd, int len, char *buff) { char *bp; SDL_Surface *sptr; Uint16 size; bp = buff; POPGLPTR(sptr, bp); size = get16be(bp); if (size > 0) { SDL_WM_SetIcon(sptr, (Uint8 *) bp); } else { SDL_WM_SetIcon(sptr, NULL); } } void es_wm_iconifyWindow(sdl_data *sd, int len, char *buff) { SDL_WM_IconifyWindow(); } void es_wm_toggleFullScreen(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_wm_toggleFullScreen2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_WM_ToggleFullScreenFunc, len, bp); } } void es_wm_toggleFullScreen2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { char *bp; SDL_Surface *sptr; int res; ErlDrvTermData rt[8]; bp = buff; POPGLPTR(sptr, bp); res = SDL_WM_ToggleFullScreen(sptr); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = res; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); } void es_wm_grabInput(sdl_data *sd, int len, char *bp) { char *start; SDL_GrabMode mode; int sendlen; mode = (SDL_GrabMode) *bp; mode = SDL_WM_GrabInput(mode); bp = start = sdl_get_temp_buff(sd, 1); *bp++ = mode; sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_wm_getInfo(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_wm_getInfo2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_WM_GetInfoFunc, len, bp); } } void es_wm_getInfo2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { SDL_SysWMinfo info; ErlDrvTermData rt[12]; SDL_VERSION(&info.version); SDL_GetWMInfo(&info); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = info.version.major; rt[4] = ERL_DRV_INT; rt[5] = info.version.minor; rt[6] = ERL_DRV_INT; rt[7] = info.version.patch; #ifdef WIN32 if(sizeof(info.window) == 4) { rt[8] = ERL_DRV_UINT; rt[9] = (unsigned int) (size_t) info.window; } else { rt[8] = ERL_DRV_UINT64; rt[9] = (ErlDrvUInt64) &info.window; } #else rt[8] = ERL_DRV_UINT; rt[9] = 0; #endif rt[10] = ERL_DRV_TUPLE; rt[11] = 5; driver_send_term(port,caller,rt,12); } void es_wm_isMaximized(sdl_data *sd, int len, char *buff) { int sendlen; char *bp, *start; int s; #ifdef _WIN32 { SDL_SysWMinfo info; SDL_VERSION(&info.version); SDL_GetWMInfo(&info); s = IsZoomed(info.window); } #else { /* Workaround for missing functions, window manager dep functions */ /* SDL_Surface *screen; */ /* SDL_Rect **modes; */ s = 0; /* screen = SDL_GetVideoSurface(); */ /* Get available fullscreen modes, I think it gives the max resolution */ /* modes = SDL_ListModes(screen->format, screen->flags | SDL_FULLSCREEN); */ /* Check is there are any modes available */ /* if(modes == (SDL_Rect **)0 || modes == (SDL_Rect **)-1) { */ /* s = 0; */ /* We don't know ?? */ /* } */ /* else { */ /* if ( screen->w >= modes[0]->w && screen->h >= modes[0]->h) */ /* s = 1; */ /* else */ /* s = 0; */ /* } */ } #endif start = bp = sdl_get_temp_buff(sd, 1); put8(bp, s); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_wm_maximize(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_wm_maximize2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_WM_MaximizeFunc, len, bp); } } void es_wm_maximize2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { #ifdef _WIN32 SDL_SysWMinfo info; SDL_VERSION(&info.version); SDL_GetWMInfo(&info); ShowWindow(info.window, SW_SHOWMAXIMIZED); #endif } void es_wm_mac_file_dialog(sdl_data *sd, int len, char *bp) { if (!sd->use_smp) { es_wm_mac_file_dialog2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_WM_MacFileDialog, len, bp); } } void es_wm_mac_file_dialog2(ErlDrvPort port, ErlDrvTermData caller, char *buf) { ErlDrvTermData rt[8]; char res[1024]; size_t res_size; res_size = do_mac_file_dialog(buf, res, sizeof(res)); rt[0] = ERL_DRV_ATOM; rt[1] = driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_STRING; rt[3] = (ErlDrvUInt) res; rt[4] = (ErlDrvUInt) res_size; rt[5] = ERL_DRV_TUPLE; rt[6] = 2; driver_send_term(port, caller, rt, 7); } void es_gl_setAttribute(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_gl_setAttribute2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_GL_SetAttributeFunc, len, bp); } } void es_gl_setAttribute2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { char *bp; int attr, val; bp = buff; attr = get16be(bp); val = get32be(bp); SDL_GL_SetAttribute(attr, val); } void es_gl_getAttribute(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_gl_getAttribute2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_GL_GetAttributeFunc, len, bp); } } void es_gl_getAttribute2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { char *bp; int attr, val; ErlDrvTermData rt[8]; bp = buff; attr = get16be(bp); SDL_GL_GetAttribute(attr, &val); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = val; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); } void es_gl_swapBuffers(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; Uint32 ts; if(!sd->use_smp) SDL_GL_SwapBuffers(); else gl_dispatch(sd, SDL_GL_SwapBuffersFunc, len, buff); /* Timer is removed it a bad idea anyway (works if vsync is on only I believe) */ bp = start = sdl_get_temp_buff(sd, 4); ts = 0; put32be(bp, ts); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_mapRGBA(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; SDL_Surface * sptr; Uint32 res; Uint8 r,g,b,a; bp = buff; POPGLPTR(sptr, bp); r = get8(bp); g = get8(bp); b = get8(bp); a = get8(bp); if(sptr == NULL || sptr->format == NULL) error(); res = SDL_MapRGBA(sptr->format, r,g,b,a); bp = start = sdl_get_temp_buff(sd, 4); put32be(bp, res); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_getRGBA(sdl_data *sd, int len, char *buff) { error(); } void es_getClipRect(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; SDL_Surface * sptr; SDL_Rect rect; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); SDL_GetClipRect(sptr, &rect); bp = start = sdl_get_temp_buff(sd, 8); put16be(bp, rect.x); put16be(bp, rect.y); put16be(bp, rect.w); put16be(bp, rect.h); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_setClipRect(sdl_data *sd, int len, char *buff) { char *bp; SDL_Surface * sptr; SDL_Rect rect; bp = buff; POPGLPTR(sptr, bp); rect.x = get16be(bp); rect.y = get16be(bp); rect.w = get16be(bp); rect.h = get16be(bp); if(sptr == NULL) error(); SDL_SetClipRect(sptr, &rect); } void es_displayFormatAlpha(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Surface * sptr, *new; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); new = SDL_DisplayFormatAlpha(sptr); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(new, bp); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } static size_t do_mac_file_dialog(char* buf, char* res, size_t res_size) { #ifndef _OSX_COCOA return 0; #else int result; char *defdir; char *filter; char *title; char *defname; NSString* defdir1; NSURL* defdir_url; NSString* title1; NSString* defname1; int command; NSSavePanel* Panel; @autoreleasepool { command = *buf++; defdir = buf; /* Default directory */ title = defdir + strlen(defdir) + 1; /* Title of dialog */ defname = title + strlen(title) + 1; /* Default name for file */ filter = defname + strlen(defname) + 1; /* Filters */ defdir1 = [NSString stringWithUTF8String:defdir]; defdir_url = [NSURL fileURLWithPath:defdir1 isDirectory:true]; title1 = [NSString stringWithUTF8String:title]; defname1 = [NSString stringWithUTF8String:defname]; if (command == 0) { /* Open/Import */ NSOpenPanel* oPanel = [NSOpenPanel openPanel]; [oPanel setAllowsMultipleSelection:NO]; Panel = oPanel; } else { /* Save/Export*/ Panel = [NSSavePanel savePanel]; [Panel setNameFieldStringValue:defname1]; } NSMutableArray* fileTypes = [NSMutableArray arrayWithCapacity:10]; while (filter[0] != 0) { NSString* AFilter = [NSString stringWithUTF8String:filter]; [fileTypes addObject:AFilter]; filter += strlen(filter) + 1; } [Panel setTitle:title1]; [Panel setDirectoryURL:defdir_url]; [Panel setAllowedFileTypes:fileTypes]; result = [Panel runModal]; if (result != NSOKButton) { res_size = 0; } else { NSURL* chosenURL = [Panel URL]; NSString *aFile = [chosenURL path]; const char* utf8str = [aFile UTF8String]; res_size = strlcpy(res, utf8str, res_size); } return res_size; } #endif } esdl-1.3.1/c_src/esdl.h0000775000070100000120000000570412200143736013307 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* Define function's */ #ifdef __cplusplus extern "C" { #endif #ifndef SDL_H #include #ifdef WIN32 #include /* needed by Windows' gl.h etc */ #include "SDL.h" #include "SDL_byteorder.h" #include "SDL_events.h" #include "SDL_syswm.h" #else #include "SDL/SDL.h" #include "SDL/SDL_byteorder.h" #include "SDL/SDL_events.h" #include "SDL/SDL_syswm.h" #endif #include "esdl_conv.h" #define MAXBUFF 8000000 /* Covers 1600x1200x4 (32bits) */ #define error() {fprintf(stderr, "Error in %s:%d \n\r", __FILE__, __LINE__); return;} typedef struct sdl_data_def *sdl_data_ptr; typedef void (*sdl_fun)(sdl_data_ptr, int, char*); typedef sdl_fun (*sdl_load_fun)(void); typedef struct { char* base; size_t size; ErlDrvBinary* bin; } EsdlBinRef; typedef struct sdl_data_def { void* driver_data; /* Port or Driver specific data */ int use_smp; /* Use a thread for opengl commands */ sdl_fun* fun_tab; /* Pointers to functions */ char** str_tab; /* Pointers to function names */ int op; /* Current (or last) function */ int len; /* Length of message buffer */ void* buff; /* Pointer to message buffer */ void* temp_bin; /* Temporary binary */ EsdlBinRef bin[3]; /* Argument binaries */ int next_bin; /* Next binary */ #ifdef _OSX_COCOA void* release_pool; void* app; #endif } sdl_data; void sdl_send(sdl_data *, int); char* sdl_getbuff(sdl_data*, int); char* sdl_get_temp_buff(sdl_data*, int); void sdl_free_binaries(sdl_data*); void init_fps(sdl_data*); void gl_dispatch(sdl_data *, int, ErlDrvSizeT, char *); void es_init_opengl(sdl_data *, int, char *); void start_opengl_thread(sdl_data *); void stop_opengl_thread(); void * esdl_gl_sync(); /* These must exactly match those in src/esdl.hrl */ #define SDL_H 20 #define VIDEO_H 30 #define EVENTS_H 100 #define MOUSE_H 110 #define KEYBOARD_H 120 #define ACTIVE_H 130 #define JOYSTICK_H 133 #define AUDIO_H 150 #define SDL_UTIL_H 180 #define TTF_H 200 #define IMG_H 300 #define MAX_FUNCTIONS_H 400 /* Current Max.. Increase if needed */ #define OPENGL_START 5000 /* see wx/c_src/wxe_driver.h */ #define SDL_InitFunc (SDL_H + 1) #define SDL_QuitFunc (SDL_InitFunc + 1) #define SDL_GetErrorFunc (SDL_QuitFunc + 1) #define ESDL_OpenglInitFunc (SDL_GetErrorFunc + 1) #include "esdl_video.h" #include "esdl_events.h" #include "esdl_audio.h" #include "esdl_util.h" #include "esdl_ttf.h" #include "esdl_img.h" void es_init(sdl_data *sd, int len, char * buff); void es_quit(sdl_data *sd, int len, char * buff); void es_getError(sdl_data *sd, int len, char *buff); void esdl_init_native_gui(); #endif #ifdef __cplusplus } #endif esdl-1.3.1/c_src/esdl_video.h0000775000070100000120000001555012200143736014475 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* The video functions */ #ifdef __cplusplus extern "C" { #endif #define SDL_VideoDriverNameFunc (VIDEO_H + 1) void es_videoDriverName(sdl_data *, int, char *); #define SDL_GetVideoSurfaceFunc (SDL_VideoDriverNameFunc + 1) void es_getVideoSurface(sdl_data *, int len, char *buff); #define SDL_GetVideoInfoFunc (SDL_GetVideoSurfaceFunc + 1) void es_getVideoInfo(sdl_data *, int len, char*buff); #define SDL_VideoModeOKFunc (SDL_GetVideoInfoFunc + 1) void es_videoModeOK(sdl_data *, int len, char*buff); void es_videoModeOK2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_ListModesFunc (SDL_VideoModeOKFunc + 1) void es_listModes(sdl_data *, int len, char *buff); #define SDL_SetVideoModeFunc (SDL_ListModesFunc + 1) void es_setVideoMode(sdl_data *, int len, char * buff); void es_setVideoMode2(ErlDrvPort, ErlDrvTermData, char * buff); #define SDL_UpdateRectFunc (SDL_SetVideoModeFunc + 1) /* Done from erlang using UpdateRectsFunc */ #define SDL_UpdateRectsFunc (SDL_UpdateRectFunc + 1) void es_updateRects(sdl_data *, int len, char * buff); #define SDL_FlipFunc (SDL_UpdateRectsFunc + 1) void es_flip(sdl_data *, int len, char *buff); #define SDL_SetColorsFunc (SDL_FlipFunc + 1) void es_setColors(sdl_data *, int, char *); #define SDL_MapRGBFunc (SDL_SetColorsFunc + 1) void es_mapRGB(sdl_data *, int len, char *buff); #define SDL_GetRGBFunc (SDL_MapRGBFunc + 1) void es_getRGB(sdl_data *, int len, char *buff); #define SDL_CreateRGBSurfaceFunc (SDL_GetRGBFunc + 1) void es_createRGBSurface(sdl_data *, int, char *); #define SDL_CreateRGBSurfaceFromFunc (SDL_CreateRGBSurfaceFunc + 1) void es_createRGBSurfaceFrom(sdl_data *, int, char *); #define SDL_FreeSurfaceFunc (SDL_CreateRGBSurfaceFromFunc + 1) void es_freeSurface(sdl_data *, int len, char * buff); #define SDL_MUSTLOCKFunc (0) /* Needed ? */ #define SDL_LockSurfaceFunc (SDL_FreeSurfaceFunc + 1) void es_lockSurface(sdl_data *, int len, char * buff); #define SDL_UnlockSurfaceFunc (SDL_LockSurfaceFunc + 1) void es_unlockSurface(sdl_data *, int len, char * buff); #define SDL_LoadBMP_RWFunc (SDL_UnlockSurfaceFunc + 1) #define SDL_LoadBMPFunc (SDL_LoadBMP_RWFunc + 1) void es_loadBMP(sdl_data *, int len, char * buff); #define SDL_SaveBMP_RWFunc (SDL_LoadBMPFunc + 1) #define SDL_SaveBMPFunc (SDL_SaveBMP_RWFunc + 1) void es_saveBMP(sdl_data *, int len, char * buff); #define SDL_SetColorKeyFunc (SDL_SaveBMPFunc + 1) void es_setColorKey(sdl_data *, int len, char * buff); #define SDL_SetAlphaFunc (SDL_SetColorKeyFunc + 1) void es_setAlpha(sdl_data *, int len, char *buff); #define SDL_SetClippingFunc (SDL_SetAlphaFunc + 1) /* void es_setClipping(sdl_data *, int len, char *buff); removed */ #define SDL_ConvertSurfaceFunc (SDL_SetClippingFunc + 1 ) /* SDL_internal */ #define SDL_BlitSurfaceFunc (SDL_ConvertSurfaceFunc + 1) void es_blitSurface(sdl_data *, int len, char * buff); #define SDL_UpperBlitFunc (SDL_BlitSurfaceFunc + 1) /* blitSurface is just a macro that does upperblit */ #define SDL_LowerBlitFunc (SDL_UpperBlitFunc + 1 ) /* SDL_semi private */ #define SDL_FillRectFunc (SDL_LowerBlitFunc + 1) void es_fillRect(sdl_data *, int len, char * buff); #define SDL_DisplayFormatFunc (SDL_FillRectFunc + 1) void es_displayFormat(sdl_data *, int len, char * buff); #define SDL_WM_SetCaptionFunc (SDL_DisplayFormatFunc +1) void es_wm_setCaption(sdl_data *, int len, char *buff); void es_wm_setCaption2(char *buff); #define SDL_WM_GetCaptionFunc (SDL_WM_SetCaptionFunc +1) void es_wm_getCaption(sdl_data *, int len, char *buff); #define SDL_WM_SetIconFunc (SDL_WM_GetCaptionFunc +1) void es_wm_setIcon(sdl_data *, int len, char *buff); #define SDL_WM_IconifyWindowFunc (SDL_WM_SetIconFunc +1) void es_wm_iconifyWindow(sdl_data *, int len, char *buff); #define SDL_WM_ToggleFullScreenFunc (SDL_WM_IconifyWindowFunc +1) void es_wm_toggleFullScreen(sdl_data *, int len, char *buff); void es_wm_toggleFullScreen2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_WM_GrabInputFunc (SDL_WM_ToggleFullScreenFunc +1) void es_wm_grabInput(sdl_data *, int len, char *buff); #define SDL_WM_GetInfoFunc (SDL_WM_GrabInputFunc +1) void es_wm_getInfo(sdl_data *, int len, char *buff); void es_wm_getInfo2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_GL_SetAttributeFunc (SDL_WM_GetInfoFunc + 1) void es_gl_setAttribute(sdl_data *, int, char *); void es_gl_setAttribute2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_GL_GetAttributeFunc (SDL_GL_SetAttributeFunc + 1) void es_gl_getAttribute(sdl_data *, int, char *); void es_gl_getAttribute2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_GL_SwapBuffersFunc (SDL_GL_GetAttributeFunc + 1) void es_gl_swapBuffers(sdl_data *, int, char *); /* Erl sdl special functions */ #define ESDL_getSurfaceFunc (SDL_GL_SwapBuffersFunc +1) void es_getSurface(sdl_data *, int len, char * buff); #define ESDL_getPaletteFunc (ESDL_getSurfaceFunc + 1) void es_getPalette(sdl_data *, int len, char * buff); #define ESDL_getPixelFormatFunc (ESDL_getPaletteFunc +1) void es_getPixelFormat(sdl_data *, int len, char * buff); #define ESDL_getPixelsFunc (ESDL_getPixelFormatFunc +1) void es_getPixels(sdl_data *, int len, char * buff); #define SDL_WM_IsMaximizedFunc (ESDL_getPixelsFunc +1) void es_wm_isMaximized(sdl_data *, int len, char * buff); /* SDL additions since SDL 1.1 */ #define SDL_SetGammaFunc (SDL_WM_IsMaximizedFunc +1) void es_setGamma(sdl_data *, int len, char * buff); #define SDL_SetGammaRampFunc (SDL_SetGammaFunc +1) void es_setGammaRamp(sdl_data *, int len, char * buff); #define SDL_GetGammaRampFunc (SDL_SetGammaRampFunc +1) void es_getGammaRamp(sdl_data *, int len, char * buff); #define SDL_MapRGBAFunc (SDL_GetGammaRampFunc + 1) void es_mapRGBA(sdl_data *, int len, char *buff); #define SDL_GetRGBAFunc (SDL_MapRGBAFunc + 1) void es_getRGBA(sdl_data *, int len, char *buff); #define SDL_GetClipRectFunc (SDL_GetRGBAFunc + 1) void es_getClipRect(sdl_data *, int len, char *buff); #define SDL_SetClipRectFunc (SDL_GetClipRectFunc + 1) void es_setClipRect(sdl_data *, int len, char *buff); #define SDL_DisplayFormatAlphaFunc (SDL_SetClipRectFunc + 1) void es_displayFormatAlpha(sdl_data *, int len, char * buff); #define SDL_WM_MaximizeFunc (SDL_DisplayFormatAlphaFunc + 1) void es_wm_maximize(sdl_data *, int len, char * buff); void es_wm_maximize2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_WM_MacFileDialog (SDL_WM_MaximizeFunc + 1) void es_wm_mac_file_dialog(sdl_data *, int len, char * buff); void es_wm_mac_file_dialog2(ErlDrvPort, ErlDrvTermData, char *); #ifdef __cplusplus } #endif esdl-1.3.1/c_src/esdl_spec.c0000775000070100000120000001034512200143736014311 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ /* The special functions */ #include "esdl.h" void es_getSurface(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Surface *screen; bp = buff; POPGLPTR(screen, bp); if(screen == NULL) { error(); } bp = start = sdl_getbuff(sd, 4*4+2+8*2); put32be(bp, screen->flags); PUSHGLPTR(screen->format, bp); put32be(bp, screen->w); put32be(bp, screen->h); put16be(bp, screen->pitch); PUSHGLPTR(screen->pixels, bp); put32be(bp, screen->offset); /* put32be(bp, screen->clip_minx); */ /* put32be(bp, screen->clip_maxx); */ /* put32be(bp, screen->clip_miny); */ /* put32be(bp, screen->clip_maxy); */ sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_getPixelFormat(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Surface * sptr; SDL_PixelFormat *format; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); format = sptr->format; if(format == NULL) error(); bp = start = sdl_get_temp_buff(sd, 8+5*4+11); PUSHGLPTR(format->palette, bp); put8(bp, format->BitsPerPixel); put8(bp, format->BytesPerPixel); put8(bp, format->Rloss); put8(bp, format->Gloss); put8(bp, format->Bloss); put8(bp, format->Aloss); put8(bp, format->Rshift); put8(bp, format->Gshift); put8(bp, format->Bshift); put8(bp, format->Ashift); put32be(bp, format->Rmask); put32be(bp, format->Gmask); put32be(bp, format->Bmask); put32be(bp, format->Amask); put32be(bp, format->colorkey); put8(bp, format->alpha); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_getPalette(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Palette *palette; SDL_Surface *sptr; int i; bp = buff; POPGLPTR(sptr, bp); palette = sptr->format->palette; if(palette == NULL) { bp = start = sdl_getbuff(sd, 2); put16be(bp, 0); sendlen = (int) (bp - start); sdl_send(sd, sendlen); return; } bp = start = sdl_getbuff(sd, 2 + palette->ncolors * 3); put16be(bp, palette->ncolors); for(i = 0; i < palette->ncolors; i++) { put8(bp, palette->colors[i].r); put8(bp, palette->colors[i].g); put8(bp, palette->colors[i].b); } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_getPixels(sdl_data *sd, int len, char * buff) { char *bp, *start; SDL_Surface *sptr; int sendlen, x, y, w, h, xi, yi; Uint8 *row; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); x = get16be(bp); y = get16be(bp); w = get16be(bp); h = get16be(bp); if(sptr->pixels == NULL) error(); /* see /usr/local/src/SDL-1.1.3/src/video/SDL_surface.c FillRect */ start = bp = sdl_getbuff(sd, w*h*sptr->format->BytesPerPixel); row = (Uint8 *) sptr->pixels + y * sptr->pitch + x * sptr->format->BytesPerPixel; switch(sptr->format->BytesPerPixel) { case 1: { Uint8 *pixels; for(yi = h; yi; --yi){ pixels = (Uint8 *) row; for(xi = w; xi; --xi){ put8(bp, *pixels); pixels += 1; } row += sptr->pitch; } break; } case 2: { Uint16 *pixels; for(yi = h; yi; --yi){ pixels = (Uint16 *) row; for(xi = w; xi; --xi){ put16be(bp, *pixels); pixels++; } row += sptr->pitch; } } break; case 3: { Uint8 *pixels; for(yi = h; yi; --yi){ pixels = (Uint8 *) row; for(xi = w; xi; --xi){ put8(bp, *pixels); put8(bp, *(pixels+1)); put8(bp, *(pixels+2)); pixels += 3; } row += sptr->pitch; } } break; case 4: { Uint32 *pixels; for(yi = h; yi; --yi){ pixels = (Uint32 *) row; for(xi = w; xi; --xi){ put32be(bp, *pixels); pixels++; } row += sptr->pitch; } } break; } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } esdl-1.3.1/c_src/esdl_events.h0000775000070100000120000001036312200143736014670 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ #ifdef __cplusplus extern "C" { #endif #define SDL_PumpEventsFunc (EVENTS_H + 1) void es_pumpEvents(sdl_data *, int , char *); #define SDL_PeepEventsFunc SDL_PumpEventsFunc+1 void es_peepEvents(sdl_data *, int , char *); void es_peepEvents2(ErlDrvPort port, ErlDrvTermData caller, char *bp); #define SDL_PollEventFunc SDL_PeepEventsFunc+1 void es_pollEvent(sdl_data *, int , char *); void es_pollEvent2(ErlDrvPort port, ErlDrvTermData caller); #define SDL_WaitEventFunc SDL_PollEventFunc +1 void es_waitEvent(sdl_data *, int , char *); void es_waitEvent2(ErlDrvPort port, ErlDrvTermData caller); #define SDL_EventStateFunc SDL_WaitEventFunc +1 void es_eventState(sdl_data *, int , char *); #define SDL_GetMouseStateFunc MOUSE_H +1 void es_getMouseState(sdl_data *, int , char *); #define SDL_GetRelativeMouseStateFunc SDL_GetMouseStateFunc+1 void es_getRelativeMouseState(sdl_data *, int , char *); #define SDL_WarpMouseFunc SDL_GetRelativeMouseStateFunc +1 void es_warpMouse(sdl_data *, int len, char *buff); #define SDL_CreateCursorFunc SDL_WarpMouseFunc +1 void es_createCursor(sdl_data *, int len, char *buff); #define SDL_SetCursorFunc SDL_CreateCursorFunc+1 void es_setCursor(sdl_data *, int len, char *buff); #define SDL_GetCursorFunc SDL_SetCursorFunc+1 void es_getCursor(sdl_data *, int len, char *buff); #define SDL_FreeCursorFunc SDL_GetCursorFunc+1 void es_freeCursor(sdl_data *, int len, char *buff); #define SDL_ShowCursorFunc SDL_FreeCursorFunc+1 void es_showCursor(sdl_data *, int len, char *buff); void es_showCursor2(ErlDrvPort port, ErlDrvTermData caller, char *buff); #define SDL_GetWMInfoFunc SDL_ShowCursorFunc+1 void es_getWMInfo(sdl_data *, int , char *); #define SDL_EnableUNICODEFunc KEYBOARD_H +1 void es_enableUNICODE(sdl_data *, int , char *); #define SDL_EnableKeyRepeatFunc SDL_EnableUNICODEFunc+1 void es_enableKeyRepeat(sdl_data *, int , char *); #define SDL_GetKeyNameFunc SDL_EnableKeyRepeatFunc+1 void es_getKeyName(sdl_data *, int , char *); #define SDL_GetKeyStateFunc SDL_GetKeyNameFunc+1 void es_getKeyState(sdl_data *, int , char *); #define SDL_GetModStateFunc SDL_GetKeyStateFunc+1 void es_getModState(sdl_data *, int , char *); #define SDL_SetModStateFunc SDL_GetModStateFunc+1 void es_setModState(sdl_data *, int , char *); #define SDL_GetAppStateFunc ACTIVE_H +1 void es_getAppState(sdl_data *, int , char *); #define SDL_NumJoysticksFunc JOYSTICK_H +1 void es_numJoysticks(sdl_data *, int , char *); #define SDL_JoystickNameFunc SDL_NumJoysticksFunc + 1 void es_joystick_name(sdl_data *, int , char *); #define SDL_JoystickOpenFunc SDL_JoystickNameFunc + 1 void es_joystick_open(sdl_data *, int , char *); #define SDL_JoystickOpenedFunc SDL_JoystickOpenFunc + 1 void es_joystick_opened(sdl_data *, int , char *); #define SDL_JoystickIndexFunc SDL_JoystickOpenedFunc + 1 void es_joystick_index(sdl_data *, int , char *); #define SDL_JoystickNumAxesFunc SDL_JoystickIndexFunc + 1 void es_joystick_numAxes(sdl_data *, int , char *); #define SDL_JoystickNumBallsFunc SDL_JoystickNumAxesFunc + 1 void es_joystick_numBalls(sdl_data *, int , char *); #define SDL_JoystickNumHatsFunc SDL_JoystickNumBallsFunc + 1 void es_joystick_numHats(sdl_data *, int , char *); #define SDL_JoystickNumButtonsFunc SDL_JoystickNumHatsFunc + 1 void es_joystick_numButtons(sdl_data *, int , char *); #define SDL_JoystickUpdateFunc SDL_JoystickNumButtonsFunc + 1 void es_joystick_update(sdl_data *, int , char *); #define SDL_JoystickEventStateFunc SDL_JoystickUpdateFunc + 1 void es_joystick_eventState(sdl_data *, int , char *); #define SDL_JoystickGetAxisFunc SDL_JoystickEventStateFunc + 1 void es_joystick_getAxis(sdl_data *, int , char *); #define SDL_JoystickGetHatFunc SDL_JoystickGetAxisFunc + 1 void es_joystick_getHat(sdl_data *, int , char *); #define SDL_JoystickGetButtonFunc SDL_JoystickGetHatFunc + 1 void es_joystick_getButton(sdl_data *, int , char *); #define SDL_JoystickGetBallFunc SDL_JoystickGetButtonFunc + 1 void es_joystick_getBall(sdl_data *, int , char *); #define SDL_JoystickCloseFunc SDL_JoystickGetBallFunc + 1 void es_joystick_close(sdl_data *, int , char *); esdl-1.3.1/c_src/esdl_audio.c0000775000070100000120000001375312200143736014466 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* Map erl esdl_events calls to C sdl calls */ #include "esdl.h" #include #include struct { Uint8 *sound; /* Pointer to wave data */ Uint32 soundlen; /* Length of wave data */ int repeat; /* Play sample 'repeat' times */ int soundpos; /* Current play position */ Uint8 silence; } wave; void play_audio(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; void * sbuff; bp = buff; SDL_LockAudio(); POPGLPTR(sbuff, bp); wave.sound = sbuff; wave.soundlen = get32be(bp); wave.repeat = get32be(bp); wave.soundpos = 0; SDL_UnlockAudio(); bp = start = sdl_getbuff(sd, 0); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void myaudiomixer(void *mydata, Uint8 *stream, int len) { Uint8 *waveptr; int waveleft; if(wave.sound != NULL && wave.repeat != 0) { /* Set up the pointers */ waveptr = wave.sound + wave.soundpos; waveleft = wave.soundlen - wave.soundpos; /* fprintf(stderr, "ED1 0x%X %d 0x%X %d repeat %d\n\r", stream, len, waveptr, waveleft, wave.repeat); */ /* Go! */ while( waveleft < len ) { memcpy(stream, waveptr, waveleft); /* SDL_MixAudio(stream, waveptr, waveleft, SDL_MIX_MAXVOLUME); */ stream += waveleft; len -= waveleft; waveptr = wave.sound; waveleft = wave.soundlen; wave.soundpos = 0; if((wave.repeat -= 1) == 0) { memset(stream, wave.silence, len); break; } } if(wave.repeat != 0) { /* fprintf(stderr, "ED2 0x%X %d 0x%X %d repeat %d\n\r", stream, len, waveptr, waveleft, wave.repeat); */ memcpy(stream, waveptr, len); /* SDL_MixAudio(stream, waveptr, len, SDL_MIX_MAXVOLUME); */ wave.soundpos += len; } } else { memset(stream, wave.silence, len); } } /* API */ void es_audioDriverName(sdl_data *sd, int len, char *bp) { int sendlen = 0; bp = sdl_get_temp_buff(sd, 256); if (SDL_AudioDriverName(bp, 256) != NULL) { sendlen = (int) strlen(bp); } sdl_send(sd, sendlen); } void es_openAudio(sdl_data *sd, int len, char *buff) { int sendlen; char *bp, *start; int ff; SDL_AudioSpec desired, obtained, *obptr; bp = buff; ff = get8(bp); desired.freq = get32be(bp); desired.format = get16be(bp); desired.channels = get8(bp); desired.samples = get16be(bp); desired.padding = get16be(bp); desired.callback = myaudiomixer; /* Init the global data structures */ wave.sound = NULL; wave.soundpos = 0; wave.soundlen = 0; if(ff == 1) /* Force the requested format */ obptr = NULL; else obptr = &obtained; bp = start = sdl_getbuff(sd, 16); if( SDL_OpenAudio(&desired, obptr) < 0 ) { fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); } else { if(ff == 1) obptr = &desired; put32be(bp, obptr->freq); put16be(bp, obptr->format); put8(bp, obptr->channels); put8(bp, obptr->silence); put16be(bp, obptr->samples); put16be(bp, obptr->padding); put32be(bp, obptr->size); wave.silence = obptr->silence; } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_getAudioStatus(sdl_data *sd, int len, char *buff) { int sendlen; char *bp, *start; SDL_audiostatus s; s = SDL_GetAudioStatus(); start = bp = sdl_getbuff(sd, 1); put8(bp, s); sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_pauseAudio(sdl_data *sd, int len, char *buff) { char *bp; int pause; bp = buff; pause = get8(bp); SDL_PauseAudio(pause); } void es_loadWAV(sdl_data *sd, int len, char *bp) { int sendlen; char *name, *start; SDL_AudioSpec obtained; Uint8 * ptr; Uint32 blen; name = bp; bp = start = sdl_get_temp_buff(sd, 28); if(NULL != SDL_LoadWAV(name, &obtained, &ptr, &blen)) { put32be(bp, obtained.freq); put16be(bp, obtained.format); put8(bp, obtained.channels); put8(bp, obtained.silence); put16be(bp, obtained.samples); put16be(bp, obtained.padding); put32be(bp, obtained.size); PUSHGLPTR(ptr, bp); put32be(bp, blen); } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_loadWAVRW(sdl_data *sd, int len, char *buff) { error(); } void es_freeWAV(sdl_data *sd, int len, char *buff) { char *bp; void *ptr; bp = buff; POPGLPTR(ptr, bp); SDL_FreeWAV(ptr); } void es_buildAudioCVT(sdl_data *sd, int len, char *buff) { error(); } void es_convertAudio(sdl_data *sd, int len, char *buff) { char *bp, *start; void *mptr; Uint16 oformat, nformat; Uint8 ochannels, nchannels; int ofreq, nfreq, osize, nsize; SDL_AudioCVT wav_cvt; int sendlen; bp = buff; oformat = get16be(bp); ochannels = get8(bp); ofreq = get32be(bp); nformat = get16be(bp); nchannels = get8(bp); nfreq = get32be(bp); POPGLPTR(mptr, bp); osize = get32be(bp); bp = start = sdl_getbuff(sd, 12); /* Build AudioCVT */ if(SDL_BuildAudioCVT(&wav_cvt,oformat, ochannels, ofreq, nformat, nchannels, nfreq) >= 0) { /* Setup for conversion */ nsize = osize*wav_cvt.len_mult; wav_cvt.buf=(Uint8 *)malloc(nsize); if(wav_cvt.buf != NULL) { wav_cvt.len=osize; memcpy(wav_cvt.buf, mptr, osize); if (SDL_ConvertAudio(&wav_cvt) >= 0) { PUSHGLPTR(wav_cvt.buf, bp); put32be(bp, nsize); } } } sendlen = (int) (bp - start); sdl_send(sd, sendlen); } void es_mixAudio(sdl_data *sd, int len, char *buff) { error(); } void es_lockAudio(sdl_data *sd, int len, char *buff) { error(); } void es_unlockAudio(sdl_data *sd, int len, char *buff) { error(); } void es_closeAudio(sdl_data *sd, int len, char *buff) { SDL_CloseAudio(); } esdl-1.3.1/c_src/esdl_wrapper.c0000775000070100000120000000257412200143736015044 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* Command Handler Dispatch the work on the functions */ #include #include #include "esdl.h" #include "esdl_util.h" #ifndef APIENTRY # define APIENTRY #endif typedef struct sdl_code_fn_def { int op; char *str; sdl_fun fn; } sdl_code_fn; static sdl_code_fn code_fns[] = { #include "esdl_sdl_fp.h" { 0, "LastFunction", NULL}}; static void undefined_function(sdl_data *sd, int len, char *buff) { sd->len = -2; } void init_fps(sdl_data* sd) { int i; int n = MAX_FUNCTIONS_H; /* Must be greater than then the last function op */ int op; sdl_fun* fun_tab; char** str_tab; fun_tab = sd->fun_tab = malloc((n+1) * sizeof(sdl_fun)); str_tab = sd->str_tab = malloc((n+1) * sizeof(char*)); for (i = 0; i < MAX_FUNCTIONS_H; i++) { fun_tab[i] = undefined_function; str_tab[i] = "unknown function"; } for (i = 0; ((op = code_fns[i].op) != 0); i++) { if (fun_tab[op] == undefined_function) { fun_tab[op] = code_fns[i].fn; str_tab[op] = code_fns[i].str; } else { fprintf(stderr, "FParray mismatch in initialization: %d '%s' %d '%s'\r\n", i, str_tab[op], op, code_fns[i].str); } } } esdl-1.3.1/c_src/esdl_ttf.h0000664000070100000120000001172012200143736014154 0ustar dguduucp/* * Copyright (c) 2007 Klas Johansson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ /* Defines the text/ttf functions */ #ifdef _USE_SDL_TTF #ifdef __cplusplus extern "C" { #endif #define SDL_TTF_Linked_VersionFunc TTF_H +1 void es_ttf_linkedVersion(sdl_data *, int, char *); #define SDL_TTF_ByteSwappedUNICODEFunc SDL_TTF_Linked_VersionFunc +1 void es_ttf_byteSwappedUNICODE(sdl_data *, int, char *); #define SDL_TTF_InitFunc SDL_TTF_ByteSwappedUNICODEFunc +1 void es_ttf_init(sdl_data *, int, char *); #define SDL_TTF_OpenFontFunc SDL_TTF_InitFunc +1 void es_ttf_openFont(sdl_data *, int, char *); #define SDL_TTF_OpenFontIndexFunc SDL_TTF_OpenFontFunc +1 void es_ttf_openFontIndex(sdl_data *, int, char *); #define SDL_TTF_OpenFontRWFunc SDL_TTF_OpenFontIndexFunc +1 void es_ttf_openFontRW(sdl_data *, int, char *); #define SDL_TTF_OpenFontIndexRWFunc SDL_TTF_OpenFontRWFunc +1 void es_ttf_openFontIndexRW(sdl_data *, int, char *); #define SDL_TTF_GetFontStyleFunc SDL_TTF_OpenFontIndexRWFunc +1 void es_ttf_getFontStyle(sdl_data *, int, char *); #define SDL_TTF_SetFontStyleFunc SDL_TTF_GetFontStyleFunc +1 void es_ttf_setFontStyle(sdl_data *, int, char *); #define SDL_TTF_FontHeightFunc SDL_TTF_SetFontStyleFunc +1 void es_ttf_fontHeight(sdl_data *, int, char *); #define SDL_TTF_FontAscentFunc SDL_TTF_FontHeightFunc +1 void es_ttf_fontAscent(sdl_data *, int, char *); #define SDL_TTF_FontDescentFunc SDL_TTF_FontAscentFunc +1 void es_ttf_fontDescent(sdl_data *, int, char *); #define SDL_TTF_FontLineSkipFunc SDL_TTF_FontDescentFunc +1 void es_ttf_fontLineSkip(sdl_data *, int, char *); #define SDL_TTF_FontFacesFunc SDL_TTF_FontLineSkipFunc +1 void es_ttf_fontFaces(sdl_data *, int, char *); #define SDL_TTF_FontFaceIsFixedWidthFunc SDL_TTF_FontFacesFunc +1 void es_ttf_fontFaceIsFixedWidth(sdl_data *, int, char *); #define SDL_TTF_FontFaceFamilyNameFunc SDL_TTF_FontFaceIsFixedWidthFunc +1 void es_ttf_fontFaceFamilyName(sdl_data *, int, char *); #define SDL_TTF_FontFaceStyleNameFunc SDL_TTF_FontFaceFamilyNameFunc +1 void es_ttf_fontFaceStyleName(sdl_data *, int, char *); #define SDL_TTF_GlyphMetricsFunc SDL_TTF_FontFaceStyleNameFunc +1 void es_ttf_glyphMetrics(sdl_data *, int, char *); #define SDL_TTF_SizeTextFunc SDL_TTF_GlyphMetricsFunc +1 void es_ttf_sizeText(sdl_data *, int, char *); #define SDL_TTF_SizeUTF8Func SDL_TTF_SizeTextFunc +1 void es_ttf_sizeUTF8(sdl_data *, int, char *); #define SDL_TTF_SizeUNICODEFunc SDL_TTF_SizeUTF8Func +1 void es_ttf_sizeUNICODE(sdl_data *, int, char *); #define SDL_TTF_RenderText_SolidFunc SDL_TTF_SizeUNICODEFunc +1 void es_ttf_renderTextSolid(sdl_data *, int, char *); #define SDL_TTF_RenderUTF8_SolidFunc SDL_TTF_RenderText_SolidFunc +1 void es_ttf_renderUTF8Solid(sdl_data *, int, char *); #define SDL_TTF_RenderUNICODE_SolidFunc SDL_TTF_RenderUTF8_SolidFunc +1 void es_ttf_renderUNICODESolid(sdl_data *, int, char *); #define SDL_TTF_RenderGlyph_SolidFunc SDL_TTF_RenderUNICODE_SolidFunc +1 void es_ttf_renderGlyphSolid(sdl_data *, int, char *); #define SDL_TTF_RenderText_ShadedFunc SDL_TTF_RenderGlyph_SolidFunc +1 void es_ttf_renderTextShaded(sdl_data *, int, char *); #define SDL_TTF_RenderUTF8_ShadedFunc SDL_TTF_RenderText_ShadedFunc +1 void es_ttf_renderUTF8Shaded(sdl_data *, int, char *); #define SDL_TTF_RenderUNICODE_ShadedFunc SDL_TTF_RenderUTF8_ShadedFunc +1 void es_ttf_renderUNICODEShaded(sdl_data *, int, char *); #define SDL_TTF_RenderGlyph_ShadedFunc SDL_TTF_RenderUNICODE_ShadedFunc +1 void es_ttf_renderGlyphShaded(sdl_data *, int, char *); #define SDL_TTF_RenderText_BlendedFunc SDL_TTF_RenderGlyph_ShadedFunc +1 void es_ttf_renderTextBlended(sdl_data *, int, char *); #define SDL_TTF_RenderUTF8_BlendedFunc SDL_TTF_RenderText_BlendedFunc +1 void es_ttf_renderUTF8Blended(sdl_data *, int, char *); #define SDL_TTF_RenderUNICODE_BlendedFunc SDL_TTF_RenderUTF8_BlendedFunc +1 void es_ttf_renderUNICODEBlended(sdl_data *, int, char *); #define SDL_TTF_RenderGlyph_BlendedFunc SDL_TTF_RenderUNICODE_BlendedFunc +1 void es_ttf_renderGlyphBlended(sdl_data *, int, char *); #define SDL_TTF_CloseFontFunc SDL_TTF_RenderGlyph_BlendedFunc +1 void es_ttf_closeFont(sdl_data *, int, char *); #define SDL_TTF_QuitFunc SDL_TTF_CloseFontFunc +1 void es_ttf_quit(sdl_data *, int, char *); #define SDL_TTF_WasInitFunc SDL_TTF_QuitFunc +1 void es_ttf_wasInit(sdl_data *, int, char *); #define SDL_TTF_SetErrorFunc SDL_TTF_WasInitFunc +1 void es_ttf_setError(sdl_data *, int, char *); #define SDL_TTF_GetErrorFunc SDL_TTF_SetErrorFunc +1 void es_ttf_getError(sdl_data *, int, char *); #ifdef __cplusplus } #endif #endif /* _USE_SDL_TTF */ esdl-1.3.1/c_src/esdl_img.c0000664000070100000120000000547512200143736014140 0ustar dguduucp/* * Copyright (c) 2007 Klas Johanssson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* Map erl esdl_img calls to C SDL_image calls */ #include "esdl.h" #include #include #include void es_img_linkedVersion(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; const SDL_version *version; version = IMG_Linked_Version(); bp = start = sdl_get_temp_buff(sd, 3); put8(bp, version->major); put8(bp, version->minor); put8(bp, version->patch); sendlen = bp - start; sdl_send(sd, sendlen); } void es_img_loadTypedRW(sdl_data *sd, int len, char *buff) { } void es_img_load(sdl_data *sd, int len, char *buff) { char *file, *bp, *start; int sendlen; SDL_Surface *surface; file = buff; surface = IMG_Load(file); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_img_loadRW(sdl_data *sd, int len, char *buff) { } void es_img_invertAlpha(sdl_data *sd, int len, char *buff) { } void es_img_isBMP(sdl_data *sd, int len, char *buff) { } void es_img_isPNM(sdl_data *sd, int len, char *buff) { } void es_img_isXPM(sdl_data *sd, int len, char *buff) { } void es_img_isXCF(sdl_data *sd, int len, char *buff) { } void es_img_isPCX(sdl_data *sd, int len, char *buff) { } void es_img_isGIF(sdl_data *sd, int len, char *buff) { } void es_img_isJPG(sdl_data *sd, int len, char *buff) { } void es_img_isTIF(sdl_data *sd, int len, char *buff) { } void es_img_isPNG(sdl_data *sd, int len, char *buff) { } void es_img_isLBM(sdl_data *sd, int len, char *buff) { } void es_img_loadBMPRW(sdl_data *sd, int len, char *buff) { } void es_img_loadPNMRW(sdl_data *sd, int len, char *buff) { } void es_img_loadXPMRW(sdl_data *sd, int len, char *buff) { } void es_img_loadXCFRW(sdl_data *sd, int len, char *buff) { } void es_img_loadPCXRW(sdl_data *sd, int len, char *buff) { } void es_img_loadGIFRW(sdl_data *sd, int len, char *buff) { } void es_img_loadJPGRW(sdl_data *sd, int len, char *buff) { } void es_img_loadTIFRW(sdl_data *sd, int len, char *buff) { } void es_img_loadPNGRW(sdl_data *sd, int len, char *buff) { } void es_img_loadTGARW(sdl_data *sd, int len, char *buff) { } void es_img_loadLBMRW(sdl_data *sd, int len, char *buff) { } void es_img_readXPMFromArray(sdl_data *sd, int len, char *buff) { } void es_img_setError(sdl_data *sd, int len, char *buff) { // not implemented } void es_img_getError(sdl_data *sd, int len, char *buff) { char *err, *bp, *start; int length; err = IMG_GetError(); length = strlen(err); bp = start = sdl_getbuff(sd, length); while(*err != '\0') { put8(bp, *err++); } sdl_send(sd, bp - start); } esdl-1.3.1/c_src/esdl_img.h0000664000070100000120000000710012200143736014130 0ustar dguduucp/* * Copyright (c) 2007 Klas Johansson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ /* Defines the image functions */ #ifdef _USE_SDL_IMAGE #ifdef __cplusplus extern "C" { #endif #define SDL_IMG_LinkedVersionFunc IMG_H +1 void es_img_linkedVersion(sdl_data *, int, char *); #define SDL_IMG_LoadTypedRWFunc SDL_IMG_LinkedVersionFunc +1 void es_img_loadTypedRW(sdl_data *, int, char *); #define SDL_IMG_LoadFunc SDL_IMG_LoadTypedRWFunc +1 void es_img_load(sdl_data *, int, char *); #define SDL_IMG_LoadRWFunc SDL_IMG_LoadFunc +1 void es_img_loadRW(sdl_data *, int, char *); #define SDL_IMG_InvertAlphaFunc SDL_IMG_LoadRWFunc +1 void es_img_invertAlpha(sdl_data *, int, char *); #define SDL_IMG_isBMPFunc SDL_IMG_InvertAlphaFunc +1 void es_img_isBMP(sdl_data *, int, char *); #define SDL_IMG_isPNMFunc SDL_IMG_isBMPFunc +1 void es_img_isPNM(sdl_data *, int, char *); #define SDL_IMG_isXPMFunc SDL_IMG_isPNMFunc +1 void es_img_isXPM(sdl_data *, int, char *); #define SDL_IMG_isXCFFunc SDL_IMG_isXPMFunc +1 void es_img_isXCF(sdl_data *, int, char *); #define SDL_IMG_isPCXFunc SDL_IMG_isXCFFunc +1 void es_img_isPCX(sdl_data *, int, char *); #define SDL_IMG_isGIFFunc SDL_IMG_isPCXFunc +1 void es_img_isGIF(sdl_data *, int, char *); #define SDL_IMG_isJPGFunc SDL_IMG_isGIFFunc +1 void es_img_isJPG(sdl_data *, int, char *); #define SDL_IMG_isTIFFunc SDL_IMG_isJPGFunc +1 void es_img_isTIF(sdl_data *, int, char *); #define SDL_IMG_isPNGFunc SDL_IMG_isTIFFunc +1 void es_img_isPNG(sdl_data *, int, char *); #define SDL_IMG_isLBMFunc SDL_IMG_isPNGFunc +1 void es_img_isLBM(sdl_data *, int, char *); #define SDL_IMG_LoadBMPRWFunc SDL_IMG_isLBMFunc +1 void es_img_loadBMPRW(sdl_data *, int, char *); #define SDL_IMG_LoadPNMRWFunc SDL_IMG_LoadBMPRWFunc +1 void es_img_loadPNMRW(sdl_data *, int, char *); #define SDL_IMG_LoadXPMRWFunc SDL_IMG_LoadPNMRWFunc +1 void es_img_loadXPMRW(sdl_data *, int, char *); #define SDL_IMG_LoadXCFRWFunc SDL_IMG_LoadXPMRWFunc +1 void es_img_loadXCFRW(sdl_data *, int, char *); #define SDL_IMG_LoadPCXRWFunc SDL_IMG_LoadXCFRWFunc +1 void es_img_loadPCXRW(sdl_data *, int, char *); #define SDL_IMG_LoadGIFRWFunc SDL_IMG_LoadPCXRWFunc +1 void es_img_loadGIFRW(sdl_data *, int, char *); #define SDL_IMG_LoadJPGRWFunc SDL_IMG_LoadGIFRWFunc +1 void es_img_loadJPGRW(sdl_data *, int, char *); #define SDL_IMG_LoadTIFRWFunc SDL_IMG_LoadJPGRWFunc +1 void es_img_loadTIFRW(sdl_data *, int, char *); #define SDL_IMG_LoadPNGRWFunc SDL_IMG_LoadTIFRWFunc +1 void es_img_loadPNGRW(sdl_data *, int, char *); #define SDL_IMG_LoadTGARWFunc SDL_IMG_LoadPNGRWFunc +1 void es_img_loadTGARW(sdl_data *, int, char *); #define SDL_IMG_LoadLBMRWFunc SDL_IMG_LoadTGARWFunc +1 void es_img_loadLBMRW(sdl_data *, int, char *); #define SDL_IMG_ReadXPMFromArrayFunc SDL_IMG_LoadLBMRWFunc +1 void es_img_readXPMFromArray(sdl_data *, int, char *); #define SDL_IMG_SetErrorFunc SDL_IMG_ReadXPMFromArrayFunc +1 void es_img_setError(sdl_data *, int, char *); #define SDL_IMG_GetErrorFunc SDL_IMG_SetErrorFunc +1 void es_img_getError(sdl_data *, int, char *); #ifdef __cplusplus } #endif #endif /* _USE_SDL_IMAGE */ esdl-1.3.1/c_src/esdl_util.h0000775000070100000120000000203412200143736014335 0ustar dguduucp/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ #ifdef __cplusplus extern "C" { #endif #include #define getPointer(bp) ((void *) get32be((bp))) #define putPointer(bp, ptr) put32be((bp), ((int) (ptr))) /* We always use 8 bytes to store pointers */ #define POPGLPTR(dstp, srcp) \ do { memcpy(&dstp,srcp,sizeof(void *)); srcp += 8; } while (0) #define PUSHGLPTR(srcp,dstp) \ do { memset(dstp,0,8);memcpy(dstp,&srcp,sizeof(void *)); dstp += 8; } while (0) #define SDL_UTIL_copySdlImage2GLArrayFunc (SDL_UTIL_H+1) void copySdlImage2GLArray(sdl_data *, int, char *); #define SDL_UTIL_DebugFunc (SDL_UTIL_H+2) void sdl_util_debug(sdl_data *sd, int len, char * buff); #define mygl_allocFunc (SDL_UTIL_H+3) void mygl_alloc(sdl_data *, int, char *); #define mygl_writeFunc (SDL_UTIL_H+4) void mygl_write(sdl_data *, int, char *); #ifdef __cplusplus } #endif esdl-1.3.1/rebar.config.script0000664000070100000120000001516512200143736014702 0ustar dguduucp%% -*- erlang -*- %% Config file for cl-application %% This would have been nicer if it was an escript.. %% Start at the bottom and read upwards {value, {port_env, PortEnv0}, Config0} = lists:keytake(port_env, 1, CONFIG). GetEnv = fun(Var) -> case os:getenv(Var) of [] -> false; Other -> Other end end. AddConf = fun(_Var, [], Config) -> Config; (Var, Value, Config) -> lists:keystore(Var, 1, Config, {Var, Value}) end. Error = fun(Format, Args) -> io:format("~n***ERROR:~n" ++ Format ++"~n~n",Args), throw(error) end. ConcatDir = fun(Prefix, PostFix, Dir) -> Prefix ++ filename:join(Dir, PostFix) end. SetupUnix = fun(_) -> (false == os:find_executable("sdl-config")) andalso Error("Could not find sdl-config~n",[]), SDL_CFLAGS = lists:delete($\n, os:cmd("sdl-config --cflags")), SDL_LIBS = lists:delete($\n, os:cmd("sdl-config --libs")), %% io:format("CFLAGS ~p~nLIBS ~p~n",[SDL_CFLAGS,SDL_LIBS]), AddConf("SDL_LIBDIR", SDL_LIBS, AddConf("SDL_CFLAGS", SDL_CFLAGS, PortEnv0)) end. %% Windows stuff below WinType = fun() -> case GetEnv("TERM") of "msys" -> mingw; "cygwin" -> cygwin; _ -> windows end end. WinEnvPrefix = fun(_, mingw) -> %% Both cl.exe and gcc.exe accepts Windows paths [Full|_] = string:tokens(os:cmd("where sh"), "\r\n"), filename:dirname(filename:dirname(Full)); (cl, cygwin) -> io:format("WARNING: Cygwin not supported~n",[]), os:cmd("cygdrive -m /"); (_, _) -> "" end. InstallSDLDLL = fun(LibDir) -> PrivDLL = "priv/SDL.dll", io:format("SDL ~p ~p~n", [LibDir, filelib:is_file(PrivDLL)]), case filelib:is_file(PrivDLL) of false -> case file:copy(filename:join([LibDir, "SDL.dll"]), PrivDLL) of ok -> ok; _ -> case os:find_executable("SDL.dll") of false -> io:format("WARNING: Could not locate SDL.dll~n"); Where -> file:copy(Where, PrivDLL) end end; true -> ok end end. WinSetupGCC = fun(SDLDir) -> io:format("Using gcc as compiler~n"), Dir = case filelib:is_dir(SDLDir) of true -> SDLDir; false -> EnvPrefix = WinEnvPrefix(gcc, WinType()), ExtDir = EnvPrefix++SDLDir, filelib:is_dir(ExtDir) orelse Error("Could not find SDL dir in:~n" " ~s~n ~s~n" " set SDL_DIR=/path/to/opencl", [SDLDir, ExtDir]), ExtDir end, Inc = ConcatDir("-I", "include", Dir), Type = case erlang:system_info(wordsize) of 4 -> "x86"; 8 -> "x64" end, Lib = case filelib:is_dir(filename:join([Dir, "lib", Type])) of true -> ConcatDir("", filename:join("lib", Type), Dir); false -> ConcatDir("", "lib", Dir) end, InstallSDLDLL(Lib), E0 = AddConf("SDL_LIBDIR", "-L" ++ Lib, AddConf("SDL_INCDIR", Inc, PortEnv0)), CC = case GetEnv("CC") of false -> "gcc"; EnvCC -> EnvCC end, GCCConf =[{"win32", "CC" , CC}, {"win32", "DRV_CC_TEMPLATE", "$CC -c $CFLAGS $DRV_CFLAGS $PORT_IN_FILES -o $PORT_OUT_FILE"}, {"win32", "DRV_LINK_TEMPLATE", "$CC $PORT_IN_FILES $LDFLAGS $DRV_LDFLAGS -o $PORT_OUT_FILE"}, {"win32", "DRV_CFLAGS" , "-g -Wall $ERL_CFLAGS"}, {"win32", "DRV_LDFLAGS", "-shared $ERL_LDFLAGS"}, {"win32", "LDFLAGS", "$LDFLAGS $SDL_LIBDIR -lSDL"}, {"win32", "ERL_LDFLAGS", ""}], Replace = fun(New = {Os, Val, _}, Env) -> Add = fun({POs, PVal, _}, {_,Acc}) when POs =:= Os, Val =:= PVal -> {true, [New|Acc]}; (Old,{Found,Acc}) -> {Found, [Old|Acc]} end, case lists:foldl(Add, {false,[]}, Env) of {true, Repl} -> Repl; {false, Repl} -> [New|Repl] end end, lists:foldl(Replace, E0, GCCConf) end. Win32VerifyLinkCmd = fun() -> LinkOut = os:cmd("link --version"), case LinkOut of "Microsoft" ++ _ -> ok; _ -> Dir = filename:dirname(os:find_executable("cl.exe")), Path = os:getenv("PATH"), os:putenv("PATH", filename:nativename(Dir) ++ ";" ++ Path), io:format("WARNING: Wrong link.exe (non Microsoft) found, " "setting cl.exe's dir first in PATH~n", []) end end. WinSetupCL = fun(SDLDir) -> io:format("Using cl.exe as compiler~n"), Win32VerifyLinkCmd(), Dir = case filelib:is_dir(SDLDir) of true -> SDLDir; false -> EnvPrefix = WinEnvPrefix(cl, WinType()), ExtDir = EnvPrefix++SDLDir, case filelib:is_dir(ExtDir) of true -> Error("Could not find SDL dir in:~n" " ~s~n ~s~n" " set SDL_DIR=/path/to/opencl", [SDLDir, ExtDir]), ExtDir end end, Inc = ConcatDir("/I ", "include", Dir), Type = case erlang:system_info(wordsize) of 4 -> "x86"; 8 -> "x64" end, Lib = ConcatDir("", filename:join("lib",Type), Dir), InstallSDLDLL(Lib), AddConf("SDL_LIBDIR", Lib, AddConf("SDL_INCDIR", Inc, PortEnv0)) end. SetupWin32 = fun(SDLDir) -> %% Do we want to compile with Microsoft's toolchain case os:find_executable("cl.exe") of false -> (os:find_executable("gcc") == false) andalso Error("No known compiler found",[]), WinSetupGCC(SDLDir); _ -> case GetEnv("CC") of "gcc" -> WinSetupGCC(SDLDir); "gcc.exe" -> WinSetupGCC(SDLDir); "cc" -> WinSetupGCC(SDLDir); "cc.exe" -> WinSetupGCC(SDLDir); false -> WinSetupCL(SDLDir); Other -> Error("No known compiler found: CC=~s",[Other]) end end end. WinLocateSDLDir = fun() -> case string:tokens(os:cmd("where SDL.dll"), "\r\n") of [] -> io:format("Trying to with SDL_DIR=/opt/local/~n"), "/opt/local/"; [File|_] -> case filelib:is_file(File) of false -> Error("Could not find SDL dir:~n" " set SDL_DIR=/path/to/opencl or ~n" " or add SDL.dll dir to PATH~n", []); true -> filename:dirname(filename:dirname(File)) end end end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SDLDir = case GetEnv("SDL_DIR") of false -> case os:type() of {unix, _} -> []; {win32, _} -> WinLocateSDLDir() end; Dir -> Dir end. PortEnv = case os:type() of {win32, _} -> %% Massage Windows paths SetupWin32(SDLDir); {unix, darwin} -> PortEnv0; {unix, _} -> SetupUnix(SDLDir) end. [{port_env, PortEnv}|Config0]. esdl-1.3.1/src/0000775000070100000120000000000012200427670011676 5ustar dguduucpesdl-1.3.1/src/sdl_events.erl0000775000070100000120000001367112200143736014561 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_events.erl %%% Author : Dan Gudmundsson %%% Purpose : Provides the sdl_events API %%% Created : 7 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_events). -include("esdl.hrl"). -include("sdl_events.hrl"). -export([eventState/2, peepEvents/0, peepEvents/2, peepEvents/3, pollEvent/0, pumpEvents/0, waitEvent/0]). -export([decode_events/1]). -import(sdl, [call/2,cast/2]). %%% Available Functions -define(SDL_PumpEvents, ?SDL_EVENTS_HRL + 1). -define(SDL_PeepEvents, ?SDL_PumpEvents +1). -define(SDL_PollEvent, ?SDL_PeepEvents +1). -define(SDL_WaitEvent, ?SDL_PollEvent +1). -define(SDL_EventState, ?SDL_WaitEvent +1). %%%%%%%%%%%%%%% GENERAL EVENT FUNCTIONS %%%%%%%%%%%%%%% %% Func: pumpEvents %% Args: none %% Returns: ok %% C-API func: void SDL_PumpEvents(void); pumpEvents() -> cast(?SDL_PumpEvents, []). %% Func: peepEvents/0 %% Args: None %% Returns: {NumOfEvents, [Events]} %% C-API func: int SDL_PeepEvents(SDL_Event *events, int numevents, %% SDL_eventaction action, Uint32 mask) %% Desc: Get up to to 16 events of all types. peepEvents() -> peepEvents(16, ?SDL_GETEVENT, ?SDL_ALLEVENTS). %% Func: peepEvents/2 %% Args: NumEvents (might be 0) %% Mask (32 bits event mask) %% Returns: {NumOfEvents, [Events]} %% C-API func: int SDL_PeepEvents(SDL_Event *events, int numevents, %% SDL_eventaction action, Uint32 mask) %% Desc: Exits if error (NumEvents < 256) peepEvents(NumEvents, Mask) when NumEvents < 256 -> peepEvents(NumEvents, ?SDL_GETEVENT, Mask). %% Func: peepEvents/2 %% Args: NumEvents (might be 0) %% ?SDL_GETEVENT %% Mask (32 bits event mask) %% Returns: {NumOfEvents, [Events]} %% C-API func: int SDL_PeepEvents(SDL_Event *events, int numevents, %% SDL_eventaction action, Uint32 mask) %% Desc: Exits if error (NumEvents < 256) peepEvents(NumEvents, ?SDL_GETEVENT, Mask) when NumEvents < 256 -> call(?SDL_PeepEvents, <>), receive {'_esdl_result_', <<>>} -> []; {'_esdl_result_', Events} -> decode_events(Events, []) end. %% Func: pollEvent %% Args: none %% Returns: no_event | Event (one of the event records) %% C-API func: int SDL_PollEvent(SDL_Event *event); %% Desc: pollEvent() -> call(?SDL_PollEvent, []), receive {'_esdl_result_', <<>>} -> no_event; {'_esdl_result_', Events} -> hd(decode_events(Events, [])) end. %% Func: waitEvent %% Args: none %% Returns: Event (one of the event records) %% C-API func: int SDL_WaitEvent(SDL_Event *event); %% Desc: waitEvent() -> call(?SDL_WaitEvent, []), receive {'_esdl_result_', <<>>} -> []; {'_esdl_result_', Events} -> hd(decode_events(Events, [])) end. %% Func: eventState %% Args: EventType (see sdl_events.hrl), State (SDL_QUERY | SDL_IGNORE |SDL_ENABLE) %% Returns: State (?SDL_ENABLE | ?SDL_IGNORE) %% C-API func: Uint8 SDL_EventState(Uint8 type, int state); %% Desc: eventState(Type, State) -> <> = call(?SDL_EventState, <>), Res. %%%%%%%%%%%%%%% Internals %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% decode_events(Bin) -> decode_events(Bin, []). decode_events(<<>>, Acc) -> lists:reverse(Acc); decode_events(<>, Acc) -> decode_events(Rest, [no_event | Acc]); decode_events(<>, Acc) -> Event = #active{gain = Gain, state = State}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #keyboard{which=Which,state=State, scancode=Scancode,sym=Sym,mod=Mod,unicode=Unicode}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #mousemotion{which = Which, state = State, mod = Mod, x = X, y = Y, xrel = Xrel, yrel = Yrel}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #mousebutton{which = Which, button = Button, state = State, mod = Mod, x = X, y = Y}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #joyaxis{which = Which, axis = Axis, value = Value}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #joyball{which = Which, ball = Ball, xrel =Xrel, yrel=Yrel}, decode_events(Rest, [Event | Acc]); decode_events(<>,Acc) -> Event = #joyhat{which = Which, hat = Hat, value = Value}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #joybutton{which = Which, button = Button, state = State}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #joybutton{which = Which, button = Button, state = State}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #quit{}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #resize{w = W, h = H}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #expose{}, decode_events(Rest, [Event | Acc]). esdl-1.3.1/src/sdl_img_funcs.hrl0000664000070100000120000000452112200143736015221 0ustar dguduucp%% Copyright (c) 2007 Klas Johansson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_img_funcs.hrl %%% Author : Klas Johansson %%% Purpose : %%% Created : 18 Feb 2007 by Klas Johansson %%%---------------------------------------------------------------------- %%% Functions -include("esdl.hrl"). -define(SDL_IMG_LinkedVersion, ?SDL_IMG_HRL + 1). -define(SDL_IMG_LoadTypedRW, ?SDL_IMG_LinkedVersion + 1). -define(SDL_IMG_Load, ?SDL_IMG_LoadTypedRW + 1). -define(SDL_IMG_LoadRW, ?SDL_IMG_Load + 1). -define(SDL_IMG_InvertAlpha, ?SDL_IMG_LoadRW + 1). -define(SDL_IMG_isBMP, ?SDL_IMG_InvertAlpha + 1). -define(SDL_IMG_isPNM, ?SDL_IMG_isBMP + 1). -define(SDL_IMG_isXPM, ?SDL_IMG_isPNM + 1). -define(SDL_IMG_isXCF, ?SDL_IMG_isXPM + 1). -define(SDL_IMG_isPCX, ?SDL_IMG_isXCF + 1). -define(SDL_IMG_isGIF, ?SDL_IMG_isPCX + 1). -define(SDL_IMG_isJPG, ?SDL_IMG_isGIF + 1). -define(SDL_IMG_isTIF, ?SDL_IMG_isJPG + 1). -define(SDL_IMG_isPNG, ?SDL_IMG_isTIF + 1). -define(SDL_IMG_isLBM, ?SDL_IMG_isPNG + 1). -define(SDL_IMG_LoadBMPRW, ?SDL_IMG_isLBM + 1). -define(SDL_IMG_LoadPNMRW, ?SDL_IMG_LoadBMPRW + 1). -define(SDL_IMG_LoadXPMRW, ?SDL_IMG_LoadPNMRW + 1). -define(SDL_IMG_LoadXCFRW, ?SDL_IMG_LoadXPMRW + 1). -define(SDL_IMG_LoadPCXRW, ?SDL_IMG_LoadXCFRW + 1). -define(SDL_IMG_LoadGIFRW, ?SDL_IMG_LoadPCXRW + 1). -define(SDL_IMG_LoadJPGRW, ?SDL_IMG_LoadGIFRW + 1). -define(SDL_IMG_LoadTIFRW, ?SDL_IMG_LoadJPGRW + 1). -define(SDL_IMG_LoadPNGRW, ?SDL_IMG_LoadTIFRW + 1). -define(SDL_IMG_LoadTGARW, ?SDL_IMG_LoadPNGRW + 1). -define(SDL_IMG_LoadLBMRW, ?SDL_IMG_LoadTGARW + 1). -define(SDL_IMG_ReadXPMFromArray, ?SDL_IMG_LoadLBMRW + 1). -define(SDL_IMG_SetError, ?SDL_IMG_ReadXPMFromArray + 1). -define(SDL_IMG_GetError, ?SDL_IMG_SetError + 1). esdl-1.3.1/src/sdl_util.hrl0000775000070100000120000000110712200143736014224 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_util.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 13 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -record(sdlmem, {bin, size, type}). -define(_PTR, 64/unsigned-native). esdl-1.3.1/src/sdl_ttf_funcs.hrl0000664000070100000120000000604312200143736015243 0ustar dguduucp%% Copyright (c) 2007 Klas Johansson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_ttf_funcs.hrl %%% Author : Klas Johansson %%% Purpose : %%% Created : 29 Jan 2007 by Klas Johansson %%%---------------------------------------------------------------------- %%% Functions -include("esdl.hrl"). -define(SDL_TTF_LinkedVersion, ?SDL_TTF_HRL + 1). -define(SDL_TTF_ByteSwappedUNICODE, ?SDL_TTF_LinkedVersion + 1). -define(SDL_TTF_Init, ?SDL_TTF_ByteSwappedUNICODE + 1). -define(SDL_TTF_OpenFont, ?SDL_TTF_Init + 1). -define(SDL_TTF_OpenFontIndex, ?SDL_TTF_OpenFont + 1). -define(SDL_TTF_OpenFontRW, ?SDL_TTF_OpenFontIndex + 1). -define(SDL_TTF_OpenFontIndexRW, ?SDL_TTF_OpenFontRW + 1). -define(SDL_TTF_GetFontStyle, ?SDL_TTF_OpenFontIndexRW + 1). -define(SDL_TTF_SetFontStyle, ?SDL_TTF_GetFontStyle + 1). -define(SDL_TTF_FontHeight, ?SDL_TTF_SetFontStyle + 1). -define(SDL_TTF_FontAscent, ?SDL_TTF_FontHeight + 1). -define(SDL_TTF_FontDescent, ?SDL_TTF_FontAscent + 1). -define(SDL_TTF_FontLineSkip, ?SDL_TTF_FontDescent + 1). -define(SDL_TTF_FontFaces, ?SDL_TTF_FontLineSkip + 1). -define(SDL_TTF_FontFaceIsFixedWidth, ?SDL_TTF_FontFaces + 1). -define(SDL_TTF_FontFaceFamilyName, ?SDL_TTF_FontFaceIsFixedWidth + 1). -define(SDL_TTF_FontFaceStyleName, ?SDL_TTF_FontFaceFamilyName + 1). -define(SDL_TTF_GlyphMetrics, ?SDL_TTF_FontFaceStyleName + 1). -define(SDL_TTF_SizeText, ?SDL_TTF_GlyphMetrics + 1). -define(SDL_TTF_SizeUTF8, ?SDL_TTF_SizeText + 1). -define(SDL_TTF_SizeUNICODE, ?SDL_TTF_SizeUTF8 + 1). -define(SDL_TTF_RenderTextSolid, ?SDL_TTF_SizeUNICODE + 1). -define(SDL_TTF_RenderUTF8Solid, ?SDL_TTF_RenderTextSolid + 1). -define(SDL_TTF_RenderUNICODESolid, ?SDL_TTF_RenderUTF8Solid + 1). -define(SDL_TTF_RenderGlyphSolid, ?SDL_TTF_RenderUNICODESolid + 1). -define(SDL_TTF_RenderTextShaded, ?SDL_TTF_RenderGlyphSolid + 1). -define(SDL_TTF_RenderUTF8Shaded, ?SDL_TTF_RenderTextShaded + 1). -define(SDL_TTF_RenderUNICODEShaded, ?SDL_TTF_RenderUTF8Shaded + 1). -define(SDL_TTF_RenderGlyphShaded, ?SDL_TTF_RenderUNICODEShaded + 1). -define(SDL_TTF_RenderTextBlended, ?SDL_TTF_RenderGlyphShaded + 1). -define(SDL_TTF_RenderUTF8Blended, ?SDL_TTF_RenderTextBlended + 1). -define(SDL_TTF_RenderUNICODEBlended, ?SDL_TTF_RenderUTF8Blended + 1). -define(SDL_TTF_RenderGlyphBlended, ?SDL_TTF_RenderUNICODEBlended + 1). -define(SDL_TTF_CloseFont, ?SDL_TTF_RenderGlyphBlended + 1). -define(SDL_TTF_Quit, ?SDL_TTF_CloseFont + 1). -define(SDL_TTF_WasInit, ?SDL_TTF_Quit + 1). -define(SDL_TTF_SetError, ?SDL_TTF_WasInit + 1). -define(SDL_TTF_GetError, ?SDL_TTF_SetError + 1). esdl-1.3.1/src/sdl.erl0000775000070100000120000000553212200143736013172 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl.erl %%% Author : Dan Gudmundsson %%% Purpose : To give access to the Simple Direct Media Layer %%% by Sam Lantinga, see www.libsdl.org. %%% Created : 23 Jun 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl). -include("sdl.hrl"). -include("esdl.hrl"). -include("sdl_util.hrl"). -export([init/1, quit/0, getError/0]). -export([cast/2, call/2]). -export([send_bin/1, send_bin/3]). %% SDL functions %%% Functions %% Func: init %% Args: BitMask %% Returns: WrapperRef %% C-API func: int SDL_Init(Uint32 flags); %% Desc: Initializes the SDL (including the erlang specific parts) init(Flags) when is_integer(Flags) -> Path = case code:priv_dir(esdl) of P when is_list(P) -> P; {error, _} -> %% in case you use erl -pa ../ebin priv_dir don't work :-( case code:is_loaded(?MODULE) of {file, SDLPath} -> strip(SDLPath, "ebin/" ++ atom_to_list(?MODULE) ++ ".beam") ++ "priv/"; _ -> %% For debugging atom_to_list(c:pwd()) ++ "../priv/" end end, case os:type() of {win32, _} -> OsPath = Path ++ ";" ++ os:getenv("PATH"), os:putenv("PATH", OsPath); _ -> ignore end, case catch erl_ddll:load_driver(Path, "sdl_driver") of ok -> ok; {error, R} -> io:format("Driver failed: ~s ~n", [erl_ddll:format_error(R)]); Other -> io:format("Driver crashed: ~p ~n", [Other]) end, Port = open_port({spawn, "sdl_driver"}, [binary]), register(esdl_port, Port), cast(?SDL_Init, <>), Port. %% Func: quit %% Args: none %% Returns: Quits the wrapper %% C-API func: void SDL_Quit(void); quit() -> %% cast(?SDL_Quit, []), erlang:port_close(esdl_port), erl_ddll:unload_driver("sdl_driver"). %% Func: getError %% Args: none %% Returns: DescString %% C-API func: char * SDL_GetError(void); getError() -> Bin = call(?SDL_GetError, []), binary_to_list(Bin). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% cast(Op, Arg) -> erlang:port_control(esdl_port, Op, Arg), ok. call(Op, Arg) -> erlang:port_control(esdl_port, Op, Arg). send_bin(Bin) when is_binary(Bin) -> erlang:port_command(esdl_port, Bin). send_bin(#sdlmem{bin=Bin}, _, _) -> send_bin(Bin); send_bin(Bin, _, _) when is_binary(Bin) -> send_bin(Bin); send_bin(Term, Mod, Line) -> erlang:error({Mod,Line,unsupported_type,Term}). %%%%%%%%%%%%%%%%% NON SDL FUNCTIONS %%%%%%%%%%%%%%%% strip(Src, Src) -> []; strip([H|R], Src) -> [H| strip(R, Src)]. esdl-1.3.1/src/sdl_video_funcs.hrl0000775000070100000120000000716312200143736015563 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_video_funcs.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 30 Aug 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- %%% Functions -include("esdl.hrl"). -define(SDL_VideoDriverName, ?SDL_VIDEO_HRL + 1). -define(SDL_GetVideoSurface, ?SDL_VideoDriverName + 1). -define(SDL_GetVideoInfo, ?SDL_GetVideoSurface + 1). -define(SDL_VideoModeOK, ?SDL_GetVideoInfo + 1). -define(SDL_ListModes, ?SDL_VideoModeOK + 1). -define(SDL_SetVideoMode, ?SDL_ListModes + 1). -define(SDL_UpdateRect, ?SDL_SetVideoMode + 1). -define(SDL_UpdateRects, ?SDL_UpdateRect + 1). -define(SDL_Flip, ?SDL_UpdateRects + 1). -define(SDL_SetColors, ?SDL_Flip + 1). -define(SDL_MapRGB, ?SDL_SetColors + 1). -define(SDL_GetRGB, ?SDL_MapRGB + 1). -define(SDL_CreateRGBSurface,?SDL_GetRGB + 1). -define(SDL_CreateRGBSurfaceFrom, ?SDL_CreateRGBSurface + 1). -define(SDL_FreeSurface, ?SDL_CreateRGBSurfaceFrom + 1). -define(SDL_MUSTLOCK, 0). %% Needed ? Implemented as an erlang func!! -define(SDL_LockSurface, ?SDL_FreeSurface + 1 ). -define(SDL_UnlockSurface, ?SDL_LockSurface + 1). -define(SDL_LoadBMP_RW, ?SDL_UnlockSurface + 1). -define(SDL_LoadBMP, ?SDL_LoadBMP_RW + 1). -define(SDL_SaveBMP_RW, ?SDL_LoadBMP + 1). -define(SDL_SaveBMP, ?SDL_SaveBMP_RW + 1). -define(SDL_SetColorKey, ?SDL_SaveBMP + 1). -define(SDL_SetAlpha, ?SDL_SetColorKey + 1). -define(SDL_SetClipping, ?SDL_SetAlpha + 1). -define(SDL_ConvertSurface, ?SDL_SetClipping + 1 ). % SDL_internal -define(SDL_BlitSurface, ?SDL_ConvertSurface + 1). -define(SDL_UpperBlit, ?SDL_BlitSurface + 1). -define(SDL_LowerBlit, ?SDL_UpperBlit + 1 ).% SDL_semi private -define(SDL_FillRect, ?SDL_LowerBlit + 1). -define(SDL_DisplayFormat, ?SDL_FillRect + 1). %% video overlays ... not supported rigth now %% Windowing stuff -define(SDL_WM_SetCaption, ?SDL_DisplayFormat +1). -define(SDL_WM_GetCaption, ?SDL_WM_SetCaption +1). -define(SDL_WM_SetIcon, ?SDL_WM_GetCaption +1). -define(SDL_WM_IconifyWindow,?SDL_WM_SetIcon +1). -define(SDL_WM_ToggleFullScreen, ?SDL_WM_IconifyWindow +1). -define(SDL_WM_GrabInput, ?SDL_WM_ToggleFullScreen+1). -define(SDL_WM_GetInfo, ?SDL_WM_GrabInput+1). -define(SDL_GL_SetAttribute, ?SDL_WM_GetInfo+1). -define(SDL_GL_GetAttribute, ?SDL_GL_SetAttribute +1). -define(SDL_GL_SwapBuffers, ?SDL_GL_GetAttribute +1). %% Erl sdl special functions -define(ESDL_getSurface, ?SDL_GL_SwapBuffers + 1). -define(ESDL_getPalette, ?ESDL_getSurface + 1). -define(ESDL_getPixelFormat, ?ESDL_getPalette +1). -define(ESDL_getPixels, ?ESDL_getPixelFormat +1). -define(SDL_WM_IsMaximized, ?ESDL_getPixels +1). %% Sdl additions -define(SDL_SetGamma, ?SDL_WM_IsMaximized +1). -define(SDL_SetGammaRamp, ?SDL_SetGamma +1). -define(SDL_GetGammaRamp, ?SDL_SetGammaRamp +1). -define(SDL_MapRGBA, ?SDL_GetGammaRamp + 1). -define(SDL_GetRGBA, ?SDL_MapRGBA + 1). -define(SDL_GetClipRect, ?SDL_GetRGBA + 1). -define(SDL_SetClipRect, ?SDL_GetClipRect + 1). -define(SDL_DisplayFormatAlpha, ?SDL_SetClipRect + 1). -define(SDL_WM_Maximize, ?SDL_DisplayFormatAlpha +1). -define(SDL_WM_MacFileDialog, ?SDL_WM_Maximize +1). esdl-1.3.1/src/sdl_util.erl0000775000070100000120000003512212200143736014225 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_util.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 13 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_util). -export([term2bin/3,matrix2bin/2,bin2list/3, tuplelist2bin/3, tuplelist2bin2/2, tuplelist2bin3/2, tuplelist2bin4/2, alloc/2,getBin/1, read/2,write/2,write/3,readBin/2, copySdlImage2GLArray/3, debug/1,wb/1,whex/1]). %% Obsolete - use alloc instead. -export([malloc/2,free/1]). -include("sdl_video.hrl"). -include("sdl_util.hrl"). -include("sdl.hrl"). -include("esdl.hrl"). -import(sdl, [call/2,cast/2]). -import(lists, [reverse/1]). -define(SDL_UTIL_copySdlImage2GLArray, (?SDL_UTIL_HRL+1)). -define(SDL_UTIL_debug, (?SDL_UTIL_HRL+2)). -define(MYGL_malloc, (?SDL_UTIL_HRL+3)). -define(MYGL_write, (?SDL_UTIL_HRL+4)). %% Func: alloc %% Args: Size and type (?SDL_UNSIGNED_INT, ...) %% Returns: A reference to the memory area %% Desc: Allocates Size unit memory of Type, %% where Type is one of the opengl types described in gl.hrl. %% The memory will be garbage-collected away as any other %% Erlang term; thus there is no need to worry about freeing %% the memory. alloc(Size0, Type) -> %% Make sure that the size is at least 65 bytes %% to guarantee that the binary will be allocated %% outside of the heap. Size = case mem_size(Type, Size0) of Size1 when Size1 < 65 -> 65; Size1 -> Size1 end, Bin = <<0:Size/unit:8>>, #sdlmem{type=Type,bin=Bin,size=Size0}. %% Func: getBin %% Args: References to a memory area allocated by alloc/2. %% Returns: The memory allocated as a binary. %% Desc: Returns all of an allocated memory area as a binary. %% Note that if you do any write operation to the memory, %% the contents of the returned binary will change. %% CAVEAT PROGRAMMOR. getBin(#sdlmem{bin=Bin}) -> Bin. %% Func: malloc %% Args: Size and type (?SDL_UNSIGNED_INT, ...) %% Returns: A reference to the memory area %% Desc: Obsolete name. Use alloc/2 instead. malloc(Size, Type) -> alloc(Size, Type). %% Func: free %% Args: Ref to memory %% Desc: Obsolete function. Does nothing as memory blocks %% allocated by alloc/2 are garbage-collected. free(_Ref) -> ok. %% Func: read/readBin %% Args: MemoryRef, Size %% Returns: A list/Binary of Size elements of type Type %% Desc: Read allocated memory read(#sdlmem{type=Type,bin=Bin}, Size) -> bin2list(Size, Type, Bin). readBin(#sdlmem{type=Type,bin=Bin}, Size) -> if Type =:= ?SDL_BYTE; Type =:= ?SDL_UNSIGNED_BYTE -> <> = Bin, %% Force a copy to prevent the read binary to %% change later. list_to_binary([Data]); true -> %% Non-byte type. No longer supported. erlang:error({non_byte_type,Type}) end. %% Func: write %% Args: MemoryRef, List|Binary %% Returns: ok %% Desc: Write to data memory write(#sdlmem{type=Type,size=Size,bin=Dest}, Data) -> do_write(Type, Size, Dest, Data). %% Func: write %% Args: MemoryRef, Offset, List|Binary %% Returns: ok %% Desc: Write to memory, starting Offset unit into it. write(#sdlmem{type=Type,size=Size0,bin=Dest0}, Offset, Data) when Offset < Size0 -> Size = Size0 - Offset, ByteOffset = mem_size(Type, Offset), <<_:ByteOffset/binary,Dest/binary>> = Dest0, do_write(Type, Size, Dest, Data). do_write(Type, Size0, Dest, List) when is_list(List) -> Size = case length(List) of ListLen when ListLen > Size0 -> Size0; ListLen -> ListLen end, TermBin = term2bin(List, Size, Type), sdl:send_bin(Dest), cast(?MYGL_write, TermBin); do_write(_Type, _Size, Dest, Src) when is_binary(Src), size(Src) =< size(Dest) -> sdl:send_bin(Dest), sdl:send_bin(Src), cast(?MYGL_write, []). %% Func: term2bin %% Args: ListOfNumbers (or tuple), MaxNo, Type %% Returns: Deep list %% Desc: Converts the first MaxNo numbers of ListOfNumbers to a %% binary of the type Type. %% Where Type is SDL_TYPE existing in sdl.hrl (e.g. ?SDL_DOUBLE) term2bin(Bin, _, _) when is_binary(Bin) -> Bin; term2bin(List, N, Type) when is_list(List) -> if length(List) =:= N -> list2bin(List, Type); true -> list2bin(lists:sublist(List, N), Type) end; term2bin(Tuple, N, Type) when is_tuple(Tuple) -> case size(Tuple) of N when Type == ?SDL_BYTE; Type == ?SDL_UNSIGNED_BYTE -> tuple_to_list(Tuple); N -> tuple2bin(Tuple, N, Type); _Sz -> term2bin(tuple_to_list(Tuple), N, Type) end. list2bin(List, ?SDL_BYTE) -> List; list2bin(List,?SDL_UNSIGNED_BYTE) -> List; list2bin(List, ?SDL_FLOAT) -> float_list2bin(List, 32, []); list2bin(List, ?SDL_DOUBLE) -> float_list2bin(List, 64, []); list2bin(List, ?SDL_2_BYTES) -> int_list2bin(List, 16, []); list2bin(List, ?SDL_SHORT) -> int_list2bin(List, 16, []); list2bin(List, ?SDL_UNSIGNED_SHORT) -> int_list2bin(List, 16, []); list2bin(List, ?SDL_3_BYTES) -> int_list2bin(List, 24, []); list2bin(List, ?SDL_4_BYTES) -> int_list2bin(List, 32, []); list2bin(List, ?SDL_INT) -> int_list2bin(List, 32, []); list2bin(List, ?SDL_UNSIGNED_INT) -> int_list2bin(List, 32, []); list2bin(List, boolean) -> bool_list2bin(List, []). float_list2bin([H|T], N, Acc) -> float_list2bin(T, N, [Acc|<>]); float_list2bin([], _, Acc) -> Acc. int_list2bin([H|T], N, Acc) -> int_list2bin(T, N, [Acc|<>]); int_list2bin([], _, Acc) -> Acc. bool_list2bin([false|T], Acc) -> bool_list2bin(T, [Acc,0]); bool_list2bin([true|T], Acc) -> bool_list2bin(T, [Acc,1]); bool_list2bin([H|T], Acc) -> bool_list2bin(T, [Acc,H,1]); bool_list2bin([], Acc) -> Acc. tuple2bin(Tuple, Max, ?SDL_FLOAT) -> float_tuple2bin(Tuple, Max, 32, []); tuple2bin(Tuple, Max, ?SDL_DOUBLE) -> float_tuple2bin(Tuple, Max, 64, []); tuple2bin(Tuple, Max, ?SDL_2_BYTES) -> int_tuple2bin(Tuple, Max, 16, []); tuple2bin(Tuple, Max, ?SDL_SHORT) -> int_tuple2bin(Tuple, Max, 16, []); tuple2bin(Tuple, Max, ?SDL_UNSIGNED_SHORT) -> int_tuple2bin(Tuple, Max, 16, []); tuple2bin(Tuple, Max, ?SDL_3_BYTES) -> int_tuple2bin(Tuple, Max, 24, []); tuple2bin(Tuple, Max, ?SDL_4_BYTES) -> int_tuple2bin(Tuple, Max, 32, []); tuple2bin(Tuple, Max, ?SDL_INT) -> int_tuple2bin(Tuple, Max, 32, []); tuple2bin(Tuple, Max, ?SDL_UNSIGNED_INT) -> int_tuple2bin(Tuple, Max, 32, []); tuple2bin(Tuple, Max, boolean) -> bool_tuple2bin(Tuple, Max, []). float_tuple2bin(_, 0, _, Acc) -> Acc; float_tuple2bin(Tuple, I, N, Acc) -> float_tuple2bin(Tuple, I-1, N, [<<(element(I, Tuple)):N/native-float>>|Acc]). int_tuple2bin(_, 0, _, Acc) -> Acc; int_tuple2bin(Tuple, I, N, Acc) -> int_tuple2bin(Tuple, I-1, N, [<<(element(I, Tuple)):N/native>>|Acc]). bool_tuple2bin(_, 0, Acc) -> Acc; bool_tuple2bin(Tuple, I, Acc0) -> Acc = case element(I, Tuple) of false -> [0|Acc0]; true -> [1|Acc0]; Bool -> [Bool|Acc0] end, bool_tuple2bin(Tuple, I-1, Acc). %% Func: tuplelist2bin[TupleSize] %% Args: [TupleSize,] Type, List %% Returns: Binary %% Desc: Converts a tupleList [{X,Y,..}..] to binary. tuplelist2bin(2,Type,List) -> tuplelist2bin2(Type,List); tuplelist2bin(3,Type,List) -> tuplelist2bin3(Type,List); tuplelist2bin(4,Type,List) -> tuplelist2bin4(Type,List); tuplelist2bin(16,Type,List) -> %% A special case. list_to_binary([matrix2bin(Tuple,Type)|| Tuple <- List]); tuplelist2bin(Other,Type,List) -> list_to_binary([term2bin(Tuple,Other,Type)|| Tuple <- List]). tuplelist2bin2(?SDL_FLOAT,List) -> tuplelist2bin2_float(List,32,[]); tuplelist2bin2(?SDL_DOUBLE,List) -> tuplelist2bin2_float(List,64,[]); tuplelist2bin2(?SDL_INT,List) -> tuplelist2bin2_int(List,32,[]); tuplelist2bin2(?SDL_UNSIGNED_INT,List) -> tuplelist2bin2_int(List,32,[]). tuplelist2bin3(?SDL_FLOAT,List) -> tuplelist2bin3_float(List,32,[]); tuplelist2bin3(?SDL_DOUBLE,List) -> tuplelist2bin3_float(List,64,[]); tuplelist2bin3(?SDL_INT,List) -> tuplelist2bin3_int(List,32,[]); tuplelist2bin3(?SDL_UNSIGNED_INT,List) -> tuplelist2bin3_int(List,32,[]). tuplelist2bin4(?SDL_FLOAT,List) -> tuplelist2bin4_float(List,32,[]); tuplelist2bin4(?SDL_DOUBLE,List) -> tuplelist2bin4_float(List,64,[]); tuplelist2bin4(?SDL_INT,List) -> tuplelist2bin4_int(List,32,[]); tuplelist2bin4(?SDL_UNSIGNED_INT,List) -> tuplelist2bin4_int(List,32,[]). tuplelist2bin2_float([{X,Y}|List],N,Acc) -> tuplelist2bin2_float(List,N,[<>|Acc]); tuplelist2bin2_float([],_,Acc) -> list_to_binary(reverse(Acc)). tuplelist2bin3_float([{X,Y,Z}|List],N,Acc) -> tuplelist2bin3_float(List,N,[<>|Acc]); tuplelist2bin3_float([],_,Acc) -> list_to_binary(reverse(Acc)). tuplelist2bin4_float([{X,Y,Z,W}|List],N,Acc) -> tuplelist2bin4_float(List,N,[<>|Acc]); tuplelist2bin4_float([],_,Acc) -> list_to_binary(reverse(Acc)). tuplelist2bin2_int([{X,Y}|List],N,Acc) -> tuplelist2bin2_int(List,N,[<>|Acc]); tuplelist2bin2_int([],_,Acc) -> list_to_binary(reverse(Acc)). tuplelist2bin3_int([{X,Y,Z}|List],N,Acc) -> tuplelist2bin3_int(List,N,[<>|Acc]); tuplelist2bin3_int([],_,Acc) -> list_to_binary(reverse(Acc)). tuplelist2bin4_int([{X,Y,Z,W}|List],N,Acc) -> tuplelist2bin4_int(List,N,[<>|Acc]); tuplelist2bin4_int([],_,Acc) -> list_to_binary(reverse(Acc)). %% Func: bin2list %% Args: No, Type, Binary %% Returns: ListOfNumbers %% Desc: Converts the first 'No' of numbers in the binary Binary %% to a list of numbers of type Type. bin2list(undefined, Type, Bin) -> bin2list(size(Bin), Type, Bin); bin2list(N, ?SDL_UNSIGNED_BYTE, Bin0) -> Bin = if N < size(Bin0) -> <> = Bin0, B; true -> Bin0 end, binary_to_list(Bin); bin2list(N, ?SDL_UNSIGNED_SHORT, Bin) -> bin2unsigned(N, 2, Bin); bin2list(N, ?SDL_UNSIGNED_INT, Bin) -> bin2unsigned(N, 4, Bin); bin2list(N, ?SDL_BYTE, Bin) -> bin2int(N, 1, Bin); bin2list(N, ?SDL_SHORT, Bin) -> bin2int(N, 2, Bin); bin2list(N, ?SDL_INT, Bin) -> bin2int(N, 4, Bin); bin2list(N, ?SDL_FLOAT, Bin) -> bin2float(N, 4, Bin); bin2list(N, ?SDL_DOUBLE, Bin) -> bin2float(N, 8, Bin); bin2list(_, boolean, Bin) -> [B =/= 0 || B <- binary_to_list(Bin)]. bin2float(N, Sz, Bin) -> bin2float_1(Sz*(N-1), Sz, Bin, []). bin2float_1(N, _, _, Acc) when N < 0 -> Acc; bin2float_1(N, Sz, Bin, Acc) -> <<_:N/binary,F:Sz/native-float-unit:8,_/binary>> = Bin, bin2float_1(N-Sz, Sz, Bin, [F|Acc]). bin2unsigned(N, Sz, Bin) -> bin2unsigned_1(Sz*(N-1), Sz, Bin, []). bin2unsigned_1(N, _, _, Acc) when N < 0 -> Acc; bin2unsigned_1(N, Sz, Bin, Acc) -> <<_:N/binary,U:Sz/native-unsigned-unit:8,_/binary>> = Bin, bin2unsigned_1(N-Sz, Sz, Bin, [U|Acc]). bin2int(N, Sz, Bin) -> bin2int_1(Sz*(N-1), Sz, Bin, []). bin2int_1(N, _, _, Acc) when N < 0 -> Acc; bin2int_1(N, Sz, Bin, Acc) -> <<_:N/binary,U:Sz/native-signed-unit:8,_/binary>> = Bin, bin2int_1(N-Sz, Sz, Bin, [U|Acc]). matrix2bin(Matrix, ?SDL_FLOAT) -> matrix2bin_1(Matrix, 32); matrix2bin(Matrix, ?SDL_DOUBLE) -> matrix2bin_1(Matrix, 64). matrix2bin_1({A,B,C, E,F,G, I,J,K, M,N,O}, S) -> <>; matrix2bin_1({A,B,C,D, E,F,G,H, I,J,K,L, M,N,O,P}, S) -> <>; matrix2bin_1([A,B,C, E,F,G, I,J,K, M,N,O], S) -> <>; matrix2bin_1([A,B,C,D, E,F,G,H, I,J,K,L, M,N,O,P], S) -> <>. %% Func: copySdlImage2GLArray %% Args: SdlImageRef, malloced Mem, BytesPerPixel %% Returns: ok or exits %% Desc: Converts sdl_surface data to a byte RGB(A) buffer. %% sdl_surfaces are BGR and upside/down. copySdlImage2GLArray(Image, Mem, Bpp) when is_record(Image, sdl_surface) -> copySdlImage2GLArray(Image#sdl_surface.self, Mem, Bpp); copySdlImage2GLArray({surfacep, Image}, #sdlmem{bin=Mem}, Bpp) when Bpp == 3; Bpp == 4 -> sdl:send_bin(Mem), case call(?SDL_UTIL_copySdlImage2GLArray, <>) of <<1:8>> -> ok; _O -> error({error, _O}) end. mem_size(?SDL_BYTE, Size) -> Size; mem_size(?SDL_UNSIGNED_BYTE, Size) -> Size; mem_size(?SDL_UNSIGNED_SHORT, Size) -> 2*Size; mem_size(?SDL_SHORT, Size) -> 2*Size; mem_size(?SDL_UNSIGNED_INT, Size) -> 4*Size; mem_size(?SDL_INT, Size) -> 4*Size; mem_size(?SDL_FLOAT, Size) -> 4*Size; mem_size(?SDL_DOUBLE, Size) -> 8*Size. %% Func: Debug %% Args: Level (0 is off) %% Returns: ok %% Desc: Set ESDL debug level debug(L) when is_integer(L) -> cast(?SDL_UTIL_debug, [L]). %% Debug functions wb([]) -> ok; wb([A, B, C, D|R]) -> whex([A, B, C,D]), wb(R). whex([]) -> io:format(" ~n"); whex([A|R]) -> A1 = A div 16, A2 = A rem 16, whex(A1),whex(A2), io:format(" "), whex(R); whex(A) when A < 10 -> io:format("~p", [A]); whex(A) when A == 10 -> io:format("A"); whex(A) when A == 11 -> io:format("B"); whex(A) when A == 12 -> io:format("C"); whex(A) when A == 13 -> io:format("D"); whex(A) when A == 14 -> io:format("E"); whex(A) when A == 15 -> io:format("F"). esdl-1.3.1/src/sdl_video.erl0000775000070100000120000006507512200143736014370 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_video.erl %%% Author : Dan Gudmundsson %%% Purpose : Provide access to SDL's video functions %%% Created : 26 Jun 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_video). -include("sdl.hrl"). -include("esdl.hrl"). -include("sdl_video.hrl"). -include("sdl_video_funcs.hrl"). -include("sdl_util.hrl"). %%% ERL_SDL functions -export([getSurface/1, getPixelFormat/1, getPalette/1, getPixels/2]). %%% SDL_Functions -export([ blitSurface/4, createRGBsurface/8, createRGBsurface/4, createRGBsurfaceFrom/9, displayFormat/1, displayFormatAlpha/1, fillRect/3, flip/1, freeSurface/1, getColors/3, getVideoSurface/0, getVideoinfo/0, listModes/2, loadBMP/1, lockSurface/1, mapRGB/4, mapRGBA/5, mustLock/1, saveBMP/2, setAlpha/3, setClipping/5, setColorKey/3, setColors/4, setVideoMode/4, unlockSurface/1, updateRect/5, updateRects/2, videoDriverName/0, videoModeOK/4, setGamma/3, setGammaRamp/3, getGammaRamp/0, %% Window Manager Funcs wm_setCaption/2, wm_getCaption/0, wm_setIcon/2, wm_iconifyWindow/0, wm_toggleFullScreen/1, wm_grabInput/1, wm_getInfo/0, wm_isMaximized/0, wm_maximize/0, wm_mac_file_dialog/1, %% OpenGL Support funcs gl_setAttribute/2, gl_getAttribute/1, gl_swapBuffers/0, getClipRect/1, setClipRect/2 ]). %% Imports -import(sdl, [call/2,cast/2]). %%-import(sdl, [call/1]). %% Defines -define(mk_rectbin(Rect), (<<(Rect#sdl_rect.x):16, (Rect#sdl_rect.y):16, (Rect#sdl_rect.w):16, (Rect#sdl_rect.h):16>>)/binary ). -define(mk_rectbinary(Rect), <<(Rect#sdl_rect.x):16, (Rect#sdl_rect.y):16, (Rect#sdl_rect.w):16, (Rect#sdl_rect.h):16>>). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ERL_SDL API %% Func: getSurface %% Args: Surface Ref %% Returns: sdl_surface record %% C-API func: %% Desc: Copies data pointed to by Surface to sdl_surface record. getSurface(Surface) when is_record(Surface, sdl_surface) -> getSurface(Surface#sdl_surface.self); getSurface({surfacep, Ptr} = Ref) -> <> %% Cminx:32, Cmaxx:32, Cminy :32, Cmaxy:32>> = call(?ESDL_getSurface, <>), #sdl_surface{self = Ref, flags = Flags, format = if Format /= 0 -> {formatp, Format}; true -> null end, w = W, h = H, pitch = Pitch, pixels = if Pixels /= 0 -> {pixelp, Pixels}; true -> null end, offset = Offset}. %% Func: getPixelFormat %% Args: PixelFormatRef %% Returns: a sdl_pixelformat record %% C-API func: %% Desc: Copies data pointed to by Surface to sdl_pixelformat record. getPixelFormat(Surface) when is_record(Surface, sdl_surface) -> getPixelFormat(Surface#sdl_surface.self); getPixelFormat({surfacep, Ptr} = Ref) -> Bin = call(?ESDL_getPixelFormat, <>), <> = Bin, #sdl_pixelformat{self = Ref, palette = if Palette /= 0 -> {palettep, Palette}; true -> null end, bitsPerPixel = BitsPP, bytesPerPixel= BytesPP, rloss = Rloss, gloss = Gloss, bloss = Bloss, aloss = Aloss, rshift = Rshift, gshift = Gshift, bshift = Bshift, ashift = Ashift, rmask = Rmask, gmask = Gmask, bmask = Bmask, amask = Amask, colorkey = Colorkey, alpha = Alpha}. %% Func: getPalette %% Args: SurfaceRef ref %% Returns: a sdl_palette record %% C-API func: %% Desc: Copies data pointed to by Surface to sdl_palette record. getPalette(Surface) when is_record(Surface, sdl_surface) -> getPalette(Surface#sdl_surface.self); getPalette({surfacep, Ptr}) -> <> = call(?ESDL_getPalette, <>), getColors(Tail, Length, []). % local functions getColors(_Bin, 0, Acc) -> lists:reverse(Acc); getColors(<>, N, Acc) -> Color = #sdl_color{r = R, g = G, b = B}, getColors(Tail, N-1, [Color | Acc]). %% Func: getPixels %% Args: Surface Ref, Size (a sdl_rectangle record) %% Returns: A binary containing all pixles, size varies with pixel format %% C-API func: %% Desc: Copies pixels (specified by Size) of Surface to a binary getPixels(Surface, Size) when is_record(Surface, sdl_surface) -> getPixels(Surface#sdl_surface.self, Size); getPixels({surfacep, Ref}, Size) -> Bin = call(?ESDL_getPixels, <>), Bin. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% SDL API %% Func: setVideoMode %% Args: %% Returns: a surface ref or the atom 'error' %% C-API func: SDL_Surface *SDL_SetVideoMode(int width, int height, %% int bpp, Uint32 flags); setVideoMode(W, H, Bpp, Type) -> call(?SDL_SetVideoMode, <>), receive {'_esdl_result_', 0} -> error; {'_esdl_result_', Pointer} -> case (Type band ?SDL_OPENGL) > 1 of true -> DynLib = case os:type() of {win32,_} -> "erl_gl.dll"; _ -> "erl_gl.so" end, WXDL0 = filename:join(code:priv_dir(wx),DynLib), WXDL = case filelib:is_file(WXDL0) of true -> WXDL0; false -> filename:join([code:priv_dir(wx), erlang:system_info(system_architecture), DynLib]) end, call(?ESDL_Init_Opengl, <<(list_to_binary(WXDL))/binary, 0:8>>), receive {'_esdl_result_', 0} -> error(opengl_init_failed); {'_esdl_result_', GL} when GL > 0 -> put(opengl_port, esdl_port), ok end; false -> ok end, {surfacep, Pointer} end. %% Func: videoDriverName %% Args: %% Returns: [Name] | [] %% C-API func: char *SDL_VideoDriverName(char *namebuf, int maxlen); videoDriverName() -> binary_to_list(call(?SDL_VideoDriverName, [])). %% Func: getVideoSurface %% Args: %% Returns: surface ref to the current display %% C-API func: SDL_Surface * SDL_GetVideoSurface(void); getVideoSurface() -> <> = call(?SDL_GetVideoSurface, []), {surfacep, Bin}. getVideoinfo() -> <> = call(?SDL_GetVideoInfo, []), #sdl_videoinfo{hw_available = HW /= 0, wm_available = WM /= 0, blit_hw = BHW /= 0, blit_hw_CC = BHWCC /= 0, blit_hw_A = BHWA /= 0, blit_sw = BSW /= 0, blit_sw_CC = BSWCC /= 0, blit_sw_A = BSWA /= 0, blit_fill = BF /= 0, video_mem = VM, vfmt = {formatp, VF}}. %% Func: videoModeOK %% Args: See sdl documentation %% Returns: true | false (see sdl doc) %% C-API func: int SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags); videoModeOK(W, H, Bpp, Type) -> call(?SDL_VideoModeOK, <>), receive {'_esdl_result_', Res} -> Res /= 0 end. %% Func: listModes %% Args: PixelFormat (either as sdl_pixelformat record or a PixelFormat Ref or null) %% VideoFlags %% Returns: [AvailableDimensions (in sdl_rect)] | all %% C-API func: SDL_Rect ** SDL_ListModes(SDL_PixelFormat *format, Uint32 flags); listModes({formatp, Ref}, Flags) -> <> = call(?SDL_ListModes,<>), listModesRet(M, Bin); listModes(null, Flags) -> <> = call(?SDL_ListModes, <>), listModesRet(M, Bin); listModes(PF, Flags) when is_record(PF, sdl_pixelformat) -> <> = call(?SDL_ListModes, < 0; {palettep, Ref} -> Ref end):?_PTR, (PF#sdl_pixelformat.bitsPerPixel):8, (PF#sdl_pixelformat.bytesPerPixel):8, (PF#sdl_pixelformat.rloss):8, (PF#sdl_pixelformat.gloss):8, (PF#sdl_pixelformat.bloss):8, (PF#sdl_pixelformat.aloss):8, (PF#sdl_pixelformat.rshift):8, (PF#sdl_pixelformat.gshift):8, (PF#sdl_pixelformat.bshift):8, (PF#sdl_pixelformat.ashift):8, (PF#sdl_pixelformat.rmask):32, (PF#sdl_pixelformat.gmask):32, (PF#sdl_pixelformat.bmask):32, (PF#sdl_pixelformat.amask):32, (PF#sdl_pixelformat.colorkey):32, (PF#sdl_pixelformat.alpha):8>>), listModesRet(M, Bin). listModesRet(0, <<>>) -> []; listModesRet(255, <<>>) -> all; listModesRet(0, <>) -> [#sdl_rect{x = X, y=Y, w=W, h=H} | listModesRet(0, Rest)]. %% Func: displayFormat %% Args: Surface Ref %% Returns: Surface Ref %% C-API func: SDL_Surface * SDL_DisplayFormat(SDL_Surface *surface); displayFormat(Surface) when is_record(Surface, sdl_surface) -> displayFormat(Surface#sdl_surface.self); displayFormat({surfacep, Ref}) -> <> = call(?SDL_DisplayFormat, <>), case Res of 0 -> exit({sdl_displayformat, returned_null_pointer}); _ -> {surfacep, Res} end. %% Func: blitSurface %% Args: SrcSurfaceRef, SrcRect | null, DestSurfaceRef, DestRect | null %% Returns: {ClippedSrcRect | null, ClippedDestRect | null} or %% {error, ErrorLevel} Where ErrorLevel = -1 | -2 %% C-API func: int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, %% SDL_Surface *dst, SDL_Rect *dstrect); blitSurface(SSurf, SRect, DSurf, DRect) when is_record(SSurf, sdl_surface) -> blitSurface(SSurf#sdl_surface.self, SRect, DSurf, DRect); blitSurface(SSurf, SRect, DSurf, DRect) when is_record(DSurf, sdl_surface) -> blitSurface(SSurf, SRect, DSurf#sdl_surface.self, DRect); blitSurface({surfacep, SrcRef}, null, {surfacep, DestRef}, null) -> blitSurface2(<>); blitSurface({surfacep, SrcRef}, SrcRect, {surfacep, DestRef}, null) -> blitSurface2(<>); blitSurface({surfacep, SrcRef}, null, {surfacep, DestRef}, DestRect) -> blitSurface2(<>); blitSurface({surfacep, SrcRef}, SRect, %{sdl_rect, SX,SY,SW,SH}, {surfacep, DestRef}, DRect) -> %{sdl_rect, DX,DY,DW,DH}) -> blitSurface2(<>). %DX:16, DY:16, DW:16, DH:16>>). blitSurface2(Bin) -> <> = call(?SDL_BlitSurface, Bin), {SR, DR} = case Type of 0 -> {null, null}; 1 -> <> = Rest, {#sdl_rect{x = X, y = Y, w = W, h = H}, null}; 2 -> <> = Rest, {null, #sdl_rect{x = X, y = Y, w = W, h = H}}; 3 -> <> = Rest, {#sdl_rect{x = Xs, y = Ys, w = Ws, h = Hs}, #sdl_rect{x = Xd, y = Yd, w = Wd, h = Hd}} end, case Res of 0 -> {SR, DR}; Error -> {error, Error, SR, DR} end. %% Func: fillRect %% Args: SurfaceRef, sdl_rectangle|null, color %% Returns: true | false (on failure) %% C-API func: int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); fillRect(S, R, C) when is_record(S, sdl_surface) -> fillRect(S#sdl_surface.self, R, C); fillRect({surfacep, SRef}, null, Color) -> fillRect2(<>); fillRect({surfacep, SRef}, {sdl_rect, X, Y, W, H}, Color) -> fillRect2(<>). fillRect2(Bin) -> <> = call(?SDL_FillRect, Bin), Res == 0. %% Func: updateRect %% Args: SurfaceRef, X, Y, W, H %% Returns: ok %% C-API func: void SDL_UpdateRect(SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h); updateRect(S, X, Y, W, H) -> updateRects(S, [#sdl_rect{x = X, y=Y, w=W, h=H}]). %% Func: updateRects %% Args: SurfaceRef, [sdl_rect] %% Returns: ok %% C-API func: void SDL_UpdateRects(SDL_Surface *screen, int numrects, SDL_Rect *rects); updateRects(S, R) when is_record(S, sdl_surface) -> updateRects(S#sdl_surface.self, R); updateRects({surfacep, Ref}, Rects) when is_list(Rects) -> Length = length(Rects), BinRects = list_to_binary(mk_rectbins(Rects)), cast(?SDL_UpdateRects, <>). mk_rectbins([]) -> [] ; mk_rectbins([H|T]) -> [?mk_rectbinary(H) | mk_rectbins(T)]. %% Func: flip %% Args: Surface Ref %% Returns: true | false (if error) %% C-API func: int SDL_Flip(SDL_Surface *screen); flip({surfacep, Ref}) -> <> = call(?SDL_Flip, <>), Res == 0; flip(S) when is_record(S, sdl_surface) -> flip(S#sdl_surface.self). %% Func: setColors %% Args: SurfaceRef, [ColorList], FirstColor, NoOfColors %% Returns: true (when all colors where set) false (otherwise) %% C-API func: int SDL_SetColors(SDL_Surface *surface, SDL_Color *colors, int firstcolor, int ncolors); setColors(S, Colors, FirstColor, Ncolors) when is_record(S, sdl_surface) -> setColors(S#sdl_surface.self, Colors, FirstColor, Ncolors); setColors({surfacep, Ref}, Colors, FirstColor, Ncolors) when is_list(Colors) -> BinC = list_to_binary(mkbin_colors(Colors, Ncolors)), Length = size(BinC) div 3, <> = call(?SDL_SetColors, <>), Res == 1. mkbin_colors([], _) -> <<>> ; mkbin_colors(_, 0) -> <<>> ; mkbin_colors([H|R], N) -> Bb = mkbin_colors(R, N-1), <<(H#sdl_color.r):8, (H#sdl_color.g):8,(H#sdl_color.b):8, Bb/binary>>. %% Func: setColorKey %% Args: Surface Ref, Flag(int), Key(int) %% Returns: true (on success) | false on failure %% C-API func: int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key); setColorKey(Surface, Flag, Key) when is_record(Surface, sdl_surface) -> setColorKey(Surface#sdl_surface.self, Flag, Key); setColorKey({surfacep, Ref}, Flag, Key) -> <> = call(?SDL_SetColorKey, <>), Res == 0. %% Func: mapRGB %% Args: Surface Ref, Int32, Int32, Int32 %% Returns: Int32 %% C-API func: Uint32 SDL_MapRGB(SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b); mapRGB(Surface, R, G, B) when is_record(Surface, sdl_surface) -> mapRGB(Surface#sdl_surface.self, R, G, B); mapRGB({surfacep, Ref}, R, G, B) -> <> = call(?SDL_MapRGB, <>), Pixel. %% Func: createRGBsurface %% Args: SurfaceFlags Width Height Depth Rmask:32 Gmask:32 Bmask:32 Amask:32 %% Returns: A surface ref %% C-API func: SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); createRGBsurface(Flags, W, H, D, RM, GM, BM, AM) -> <> = call(?SDL_CreateRGBSurface, <>), case Ref of 0 -> exit({createRGBsurface, returned_null_pointer}); _ -> {surfacep, Ref} end. createRGBsurface(Flags, W, H, D) -> <> = call(?SDL_CreateRGBSurface, <>), case Ref of 0 -> exit({createRGBsurface, returned_null_pointer}); _ -> {surfacep, Ref} end. %% Func: createRGBsurfaceFrom %% Args: Pixels(Binary) Width Height Depth Pitch %% Rmask:32 Gmask:32 Bmask:32 Amask:32 %% Returns: A surface ref %% C-API func: SDL_Surface *SDL_CreateRGBSurfaceFrom(void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); createRGBsurfaceFrom(Pixels, W, H, D, P, RM, GM, BM, AM) when is_binary(Pixels) -> <> = call(?SDL_CreateRGBSurface, <>), case Ref of 0 -> exit({createRGBsurface, returned_null_pointer}); _ -> {surfacep, Ref} end; createRGBsurfaceFrom({pixelp, PixelRef}, W, H, D, P, RM, GM, BM, AM) -> <> = call(?SDL_CreateRGBSurface, <>), case Ref of 0 -> exit({createRGBsurface, returned_null_pointer}); _ -> {surfacep, Ref} end. %% Func: freeSurface %% Args: Surface Ref %% Returns: ok %% C-API func: void SDL_FreeSurface(SDL_Surface *surface); freeSurface(Surface) when is_record(Surface, sdl_surface) -> freeSurface(Surface#sdl_surface.self); freeSurface({surfacep, Ref}) -> cast(?SDL_FreeSurface, <>). %% Func: mustLock %% Args: surfaceRef %% Returns: Bool %% C-API func: Macro mustLock(Surface) when is_record(Surface, sdl_surface) -> Flag = Surface#sdl_surface.flags band (?SDL_HWSURFACE bor ?SDL_ASYNCBLIT bor ?SDL_RLEACCEL), Flag /= 0. %% Func: lockSurface (I don't have any hardware to test this function on %% the manual says don't do any lib func calls when surface is locked %% we can't avoid that :) %% Args: Surface Ref %% Returns: true (if locked) false otherwise %% C-API func: int SDL_LockSurface(SDL_Surface *surface); lockSurface(Surface) when is_record(Surface, sdl_surface) -> lockSurface(Surface#sdl_surface.self); lockSurface({surfacep, Ref}) -> <> = call(?SDL_LockSurface, <>), Res == 0. %% Func: unLockSurface (I don't have any hardware to test this function on) %% Args: Surface Ref %% Returns: ok %% C-API func: void SDL_UnlockSurface(SDL_Surface *surface); unlockSurface(Surface) when is_record(Surface, sdl_surface) -> unlockSurface(Surface#sdl_surface.self); unlockSurface({surfacep, Ref}) -> cast(?SDL_UnlockSurface, <>). %% Func: loadBMP %% Args: Name of the BMP file (string) %% Returns: a surface ref or null %% C-API func: SDL_Surface * SDL_LoadBMP(char * file); loadBMP(File) when is_list(File) -> <> = call(?SDL_LoadBMP, [File,0]), case Res of 0 -> null; _ -> {surfacep, Res} end. %% Func: saveBMP %% Args: Name of the BMP file (string) %% Returns: true or false (if it failed) %% C-API func: int SDL_SaveBMP(SDL_Surface *surface, char *file) saveBMP(Surface, File) when is_record(Surface, sdl_surface) -> saveBMP(Surface#sdl_surface.self, File); saveBMP({surfacep, Ref}, File) when is_list(File) -> <> = call(?SDL_SaveBMP, [<>,File,0]), Res == 0. %% Func: setAlpha %% Args: SurfaceRef, Flag:32, Alpha:32 %% Returns: integer (undocumented in (my version of) SDL) %% C-API func: int SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha); setAlpha(Surface, Flag, Alpha) when is_record(Surface, sdl_surface) -> setAlpha(Surface#sdl_surface.self, Flag, Alpha); setAlpha({surfacep, Ref}, Flag, Alpha)-> <> = call(?SDL_SetAlpha, <>), Res. %% Func: setClipping %% Args: SurfaceRef, Top, Left, Botton, Right %% Returns: ok %% C-API func: %% Desc: Obsolete?? setClipping(Surface, Top, Left, Botton, Right) when is_record(Surface, sdl_surface) -> setClipping(Surface#sdl_surface.self, Top, Left, Botton, Right); setClipping({surfacep, SRef}, Top, Left, Botton, Right) -> cast(?SDL_SetClipping, <>). %% Func: setGamma %% Args: red, green, blue %% Returns: Bool %% C-API func: int SDL_SetGamma(float red, float green, float blue) %% Desc: setGamma(Red,Green,Blue) -> <> = call(?SDL_SetGamma, <>), Res == 0. %% Func: setGammaRamp %% Args: redList, greenList, blueList (where each list contains 256 16 bits value) %% Returns: Bool %% C-API func: int SDL_SetGammaRamp(Uint16 red[256], Uint16 green[256], Uint16 blue[256]) %% Desc: setGammaRamp(Red,Green,Blue) -> Args = sdl_util:term2bin(Red ++ Green ++ Blue, 256*3, ?SDL_UNSIGNED_SHORT), <> = call(?SDL_SetGammaRamp, Args), Res == 0. %% Func: getGammaRamp %% Args: none %% Returns: {res, redList, greenList, blueList} (where each list contains 256 16 bits value) %% C-API func: int SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue]) %% Desc: If res is == true, the lists contain valid information getGammaRamp() -> <> = call(?SDL_GetGammaRamp, []), {Res == 0, sdl_util:bin2list(256, ?SDL_UNSIGNED_SHORT, R), sdl_util:bin2list(256, ?SDL_UNSIGNED_SHORT, G), sdl_util:bin2list(256, ?SDL_UNSIGNED_SHORT, B)}. %%%%%%%%%%% WindowManager Functions %%%%%%%%%%% %% Func: wm_setCaption %% Args: Title List, IconTitleList %% Returns: ok %% C-API func: void SDL_WM_SetCaption(const char *title, const char *icon); wm_setCaption(Title, IconTitle) -> cast(?SDL_WM_SetCaption, [Title,0,IconTitle,0]). %% Func: wm_getCaption %% Args: %% Returns: {TitleStr, IconTitleStr} %% C-API func: void SDL_WM_GetCaption(char **title, char **icon); wm_getCaption() -> <> = call(?SDL_WM_GetCaption, []), <> = Bin, {binary_to_list(Title), binary_to_list(Icon)}. %% Func: wm_setIcon %% Args: Icon (sdl_surface), Mask (list of bytes) | null %% Returns: ok %% C-API func: void SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); wm_setIcon(Icon, Mask) when is_record(Icon, sdl_surface) -> wm_setIcon(Icon#sdl_surface.self, Mask); wm_setIcon({surfacep, Ref}, null) -> cast(?SDL_WM_SetIcon, <>); wm_setIcon({surfacep, Ref}, Mask) when is_binary(Mask) -> cast(?SDL_WM_SetIcon, <>). %% Func: WM_IconifyWindow %% Args: %% Returns: ok %% C-API func: int SDL_WM_IconifyWindow(void); wm_iconifyWindow() -> cast(?SDL_WM_IconifyWindow, []). %% Func: SDL_WM_ToggleFullScreen %% Args: SurfaceRef %% Returns: true or false (on failure) %% C-API func: int SDL_WM_ToggleFullScreen(SDL_Surface *surface); wm_toggleFullScreen(Surface) when is_record(Surface, sdl_surface) -> wm_toggleFullScreen(Surface#sdl_surface.self); wm_toggleFullScreen({surfacep, Ref}) -> cast(?SDL_WM_ToggleFullScreen, <>), receive {'_esdl_result_', Res} -> Res == 1 end. %% Func: wm_grabInput %% Args: GrabMode (?SDL_GRAB_QUERY | ?SDL_GRAB_OFF | ?SDL_GRAB_ON) %% Returns:GrabMode (?SDL_GRAB_OFF | ?SDL_GRAB_ON) %% C-API func: SDL_GrabMode SDL_WM_GrabInput(SDL_GrabMode mode); wm_grabInput(GrabMode) -> <> = call(?SDL_WM_GrabInput, [GrabMode]), Res. %% Func: wm_getInfo %% Args: %% Returns: {SDLVersion = {Major, Minor, Patch}, OSSpecBinary} %% C-API func: %% Desc: Only windows returns anything useful (window handle) wm_getInfo() -> cast(?SDL_WM_GetInfo, []), PtrSize = 8*erlang:system_info(wordsize), receive {'_esdl_result_', Major, Minor, Patch, Rest} -> {{Major, Minor, Patch}, <>} end. %% Func: wm_isMaximized %% Args: %% Returns: Boolean %% C-API func: %% Desc: Only windows returns anything useful (window handle) wm_isMaximized() -> <> = call(?SDL_WM_IsMaximized, []), Bool /= 0. %% Func: wm_maximize %% Args: %% Returns: nothing %% C-API func: %% Desc: Only works on windows wm_maximize() -> cast(?SDL_WM_Maximize, []). %% Func: wm_maximize %% Args: %% Returns: nothing %% C-API func: %% Desc: Only works on Mac wm_mac_file_dialog(Props) -> Operation = case proplists:get_value(operation, Props) of open -> 0; save -> 1 end, Title = proplists:get_value(title, Props), Dir = proplists:get_value(directory, Props), DefName = proplists:get_value(default_filename, Props), Filters0 = proplists:get_value(filters, Props), Filters = [[F,0] || "."++F <- Filters0] ++ [0], Data = [Operation,Dir,0,Title,0,DefName,0|Filters], call(?SDL_WM_MacFileDialog, Data), receive {'_esdl_result_',String} -> String end. %%%%%%%%%%%%%%%%%% GL support Funcs %%%%%%%%%%%%%%%%%%%%% %% Func: gl_setAttribute %% Args: %% Returns: ok %% C-API func: int SDL_GL_SetAttribute(SDL_GLattr attr, int value); gl_setAttribute(Attr, Val) -> cast(?SDL_GL_SetAttribute, <>). %% Func: gl_getAttribute %% Args: %% Returns: Attribute Value %% C-API func: int SDL_GL_GetAttribute(SDL_GLattr attr, int* value); gl_getAttribute(Attr) -> call(?SDL_GL_GetAttribute, <>), receive {'_esdl_result_', Res} -> Res end. %% Func: gl_swapBuffers %% Args: %% Returns: A timestamp generated with SDL_GetTicks %% C-API func: void SDL_GL_SwapBuffers(void); gl_swapBuffers() -> <> = call(?SDL_GL_SwapBuffers, []), TS. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Func: mapRGBA %% Args: Surface Ref, Int32, Int32, Int32, Int32 %% Returns: Int32 %% C-API func: Uint32 SDL_MapRGB(SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b, Uint8 a); mapRGBA(Surface, R, G, B, A) when is_record(Surface, sdl_surface) -> mapRGBA(Surface#sdl_surface.self, R, G, B, A); mapRGBA({surfacep, Ref}, R, G, B, A) -> <> = call(?SDL_MapRGBA, <>), Pixel. %% Func: getClipRect %% Args: Surface Ref %% Returns: Rect %% C-API func: void SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect); getClipRect(Surface) when is_record(Surface, sdl_surface) -> getClipRect(Surface#sdl_surface.self); getClipRect({surfacep, Ref}) -> <> = call(?SDL_GetClipRect, <>), #sdl_rect{x=X, y=Y, w=W, h=H}. %% Func: setClipRect %% Args: Surface Ref, Rect %% Returns: ok %% C-API func: void SDL_SetClipRect(SDL_Surface *surface, SDL_Rect *rect); setClipRect(Surface, Rect) when is_record(Surface, sdl_surface) -> setClipRect(Surface#sdl_surface.self, Rect); setClipRect({surfacep, Ref}, #sdl_rect{x=X, y=Y, w=W, h=H}) -> cast(?SDL_SetClipRect, <>). %% Func: displayFormatAlpha %% Args: Surface Ref %% Returns: Surface Ref %% C-API func: SDL_Surface * SDL_DisplayFormatAlpha(SDL_Surface *surface); displayFormatAlpha(Surface) when is_record(Surface, sdl_surface) -> displayFormat(Surface#sdl_surface.self); displayFormatAlpha({surfacep, Ref}) -> <> = call(?SDL_DisplayFormatAlpha, <>), case Res of 0 -> exit({sdl_displayformatalpha, returned_null_pointer}); _ -> {surfacep, Res} end. %%%%%%%%%%% Internal functions %%%%%%%%%%% esdl-1.3.1/src/sdl_keyboard.erl0000775000070100000120000000501212200143736015043 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_keyboard.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 12 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_keyboard). -include("esdl.hrl"). %%-compile(export_all). -export([enableKeyRepeat/2, enableUNICODE/1, getKeyName/1, getKeyState/0, getModState/0, setModState/1]). -define(SDL_EnableUNICODE, ?SDL_KEYBOARD_HRL+1). -define(SDL_EnableKeyRepeat, ?SDL_EnableUNICODE+1). -define(SDL_GetKeyName, ?SDL_EnableKeyRepeat+1). -define(SDL_GetKeyState, ?SDL_GetKeyName+1). -define(SDL_GetModState, ?SDL_GetKeyState+1). -define(SDL_SetModState, ?SDL_GetModState+1). -import(sdl, [call/2,cast/2]). %%%%%%%%%%%%%%%% KEYBOARD FUNCTIONS %%%%%%%%%%%%%%%%%%% %% Func: getKeyState %% Args: none %% Returns: A tuple continaing the state of each key(i.e. state of each Key) %% C-API func: Uint8 * SDL_GetKeyState(int *numkeys); getKeyState() -> Res = call(?SDL_GetKeyState, []), list_to_tuple(binary_to_list(Res)). %% Func: SDL_EnableUNICODE %% Args: true | false %% Returns: Previous Setting (true | False) %% C-API func: int SDL_EnableUNICODE(int enable); %% Desc: enableUNICODE(Bool) -> B = if Bool == true -> 1; true -> 0 end, <> = call(?SDL_EnableUNICODE, [B]), Res. %% Func: SDL_EnableKeyRepeat %% Args: Delay Interval %% Returns: true | false (if failure) %% C-API func: int SDL_EnableKeyRepeat(int delay, int interval); %% Desc: enableKeyRepeat(Delay, Interval) -> <> = call(?SDL_EnableKeyRepeat, <>), Res =:= 0. %% Func: SDL_GetKeyName %% Args: SDLKey %% Returns: A string %% C-API func: char * SDL_GetKeyName(SDLKey key); %% Desc: getKeyName(Key) -> binary_to_list(call(?SDL_GetKeyName, <>)). %% Func: getModState %% Args: none %% Returns: KModState (see KMOD_* in sdl_keyboard.hrl) %% C-API func: SDLMod SDL_GetModState(void); getModState() -> case call(?SDL_GetModState, []) of [] -> 0; <> -> Res end. %% Func: setModState %% Args: KModState (see KMOD_* in sdl_keyboard.hrl) %% Returns: ok %% C-API func: void SDL_SetModState(SDLMod modstate); setModState(ModState) -> cast(?SDL_SetModState, <>). esdl-1.3.1/src/sdl.app.src0000664000070100000120000000073712200427670013757 0ustar dguduucp%%%------------------------------------------------------------------- %%% @author Dan Gudmundsson %%% @copyright (C) 2013, Dan Gudmundsson %%% @doc %%% %%% @end %%% Created : 25 Feb 2013 by Dan Gudmundsson %%%------------------------------------------------------------------- {application, sdl, [{description, "SDL binding for Erlang"}, {vsn, "esdl-1.3.1"}, {modules, {modules}}, {env, []}, {applications,[kernel,stdlib]} ] }. esdl-1.3.1/src/sdl_mouse.erl0000775000070100000120000000673012200143736014403 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_mouse.erl %%% Author : Dan Gudmundsson %%% Purpose : Mouse related functions %%% Created : 12 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_mouse). -include("esdl.hrl"). -include("sdl_mouse.hrl"). -include("sdl_util.hrl"). -export([createCursor/6, freeCursor/1, getCursor/0, getMouseState/0, getRelativeMouseState/0, setCursor/1, showCursor/1, warpMouse/2 ]). -import(sdl, [call/2,cast/2]). -define(SDL_GetMouseState, ?SDL_MOUSE_HRL+1). -define(SDL_GetRelativeMouseState, ?SDL_GetMouseState+1). -define(SDL_WarpMouse, ?SDL_GetRelativeMouseState +1). -define(SDL_CreateCursor, ?SDL_WarpMouse +1). -define(SDL_SetCursor, ?SDL_CreateCursor+1). -define(SDL_GetCursor, ?SDL_SetCursor+1). -define(SDL_FreeCursor, ?SDL_GetCursor+1). -define(SDL_ShowCursor, ?SDL_FreeCursor+1). %%%%%%%%%%%%%%%%%%%%% MOUSE FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%% %% Func: getMouseState %% Args: none %% Returns: {MouseState, X, Y} %% C-API func: Uint8 SDL_GetMouseState(int *x, int *y); %% Desc: getMouseState() -> <> = call(?SDL_GetMouseState, []), {State,X,Y}. %% Func: getRelativeMouseState %% Args: none %% Returns: {MouseState, X, Y} %% C-API func: Uint8 SDL_GetRelativeMouseState(int *x, int *y); %% Desc: getRelativeMouseState() -> <> = call(?SDL_GetRelativeMouseState, []), {State,X,Y}. %% Func: warpMouse %% Args: X, Y %% Returns: ok %% C-API func: void SDL_WarpMouse(Uint16 x, Uint16 y); %% Desc: warpMouse(X, Y) -> cast(?SDL_WarpMouse, <>). %% Func: createCursor %% Args: Data (Binary), Mask(Binary), W, H, HotX, HotY %% Returns: CursorRef %% C-API func: SDL_Cursor *SDL_CreateCursor %% (Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y); %% Desc: Data & Mask must be less than 32*32 bytes. createCursor(Data, Mask, W, H, HotX, HotY) when is_binary(Data), is_binary(Mask) -> case call(?SDL_CreateCursor, <>) of <<0:64>> -> exit({createCursor, returned_null}); <> -> {cursorp,Ptr} end. %% Func: setCursor %% Args: CursorRef %% Returns: ok %% C-API func: void SDL_SetCursor(SDL_Cursor *cursor); setCursor({cursorp,Ref}) -> cast(?SDL_SetCursor, <>). %% Func: getCursor %% Args: none %% Returns: A cursorRef %% C-API func: void SDL_SetCursor(SDL_Cursor *cursor); getCursor() -> case call(?SDL_GetCursor, []) of <<0:64>> -> exit({getCursor, returned_null}); <> -> {cursorp, Ptr} end. %% Func: freeCursor %% Args: CursorRef %% Returns: ok %% C-API func: void SDL_FreeCursor(SDL_Cursor *cursor); freeCursor({cursorp,Ref}) -> cast(?SDL_FreeCursor, <>). %% Func: showCursor %% Args: true | false %% Returns: true | false (if cursor was displayed before the call) %% C-API func: int SDL_ShowCursor(int toggle); showCursor(Bool) -> B = case Bool of false -> 0; true -> 1 end, call(?SDL_ShowCursor, [B]), receive {'_esdl_result_', Res} -> Res =:= 1 end. esdl-1.3.1/src/sdl_ttf.erl0000664000070100000120000005554712200143736014057 0ustar dguduucp%% Copyright (c) 2007 Klas Johansson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_ttf.erl %%% Author : Klas Johansson %%% Purpose : Provide access to SDL's TTF functions (tested with SDL_ttf 2.0.7) %%% Created : 29 Jan 2007 by Klas Johansson %%%---------------------------------------------------------------------- -module(sdl_ttf). -include("sdl_ttf.hrl"). -include("sdl_ttf_funcs.hrl"). -include("sdl_util.hrl"). -include("sdl_video.hrl"). %%% ERL_SDL functions -export([]). %%% SDL_Functions -export([linkedVersion/0]). -export([byteSwappedUNICODE/1]). -export([init/0]). -export([openFont/2]). -export([openFontIndex/3]). -export([openFontRW/0]). -export([openFontIndexRW/0]). -export([getFontStyle/1]). -export([setFontStyle/2]). -export([fontHeight/1]). -export([fontAscent/1]). -export([fontDescent/1]). -export([fontLineSkip/1]). -export([fontFaces/1]). -export([fontFaceIsFixedWidth/1]). -export([fontFaceFamilyName/1]). -export([fontFaceStyleName/1]). -export([glyphMetrics/2]). -export([sizeText/2]). -export([sizeUTF8/2]). -export([sizeUNICODE/2]). -export([renderTextSolid/3]). -export([renderUTF8Solid/3]). -export([renderUNICODESolid/3]). -export([renderGlyphSolid/3]). -export([renderTextShaded/4]). -export([renderUTF8Shaded/4]). -export([renderUNICODEShaded/4]). -export([renderGlyphShaded/4]). -export([renderTextBlended/3]). -export([renderUTF8Blended/3]). -export([renderUNICODEBlended/3]). -export([renderGlyphBlended/3]). -export([closeFont/1]). -export([quit/0]). -export([wasInit/0]). -export([setError/1]). -export([getError/0]). %% Imports -import(sdl, [call/2, cast/2]). %% Defines -define(INT, 16/signed). -define(LONG, 32/signed). -define(UINT8, 8/unsigned). -define(UINT16, 16/unsigned). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ERL_SDL API %% Func: linkedVersion %% Args: - %% Returns: {Major, Minor, Patch} %% C-API func: const SDL_version * TTF_Linked_Version(void); %% Desc: This function gets the version of the SDL_ttf library. linkedVersion() -> <> = call(?SDL_TTF_LinkedVersion, []), {Major, Minor, Patch}. %% Func: byteSwappedUNICODE %% Args: Int %% Returns: void %% C-API func: void TTF_ByteSwappedUNICODE(int swapped); %% Desc: This function tells the library whether UNICODE text is generally %% byteswapped. A UNICODE BOM character in a string will override %% this setting for the remainder of that string. byteSwappedUNICODE(Int) -> cast(?SDL_TTF_ByteSwappedUNICODE, [<>]). %% Func: init %% Args: - %% Returns: Result %% C-API func: int TTF_Init(void); %% Desc: Initialize the TTF engine. Returns 0 on success, -1 on any error. init() -> <> = call(?SDL_TTF_Init, []), Res. %% Func: openFont %% Args: File, PointSize %% Returns: TTF_Font Ref %% C-API func: TTF_Font * TTF_OpenFont(const char *file, int ptsize); %% Desc: Open a font file and create a font of the specified point size. openFont(File, PointSize) -> <> = call(?SDL_TTF_OpenFont, [[File,0], <>]), case FontP of 0 -> exit({openFont, returned_null_pointer}); _ -> #ttf_font{ptr = FontP} end. %% Func: openFontIndex %% Args: File, PointSize, Index %% Returns: TTF_Font Ref %% C-API func: TTF_Font * TTF_OpenFontIndex(const char *file, %% int ptsize, %% long index); %% Desc: Open a font file and create a font of the specified point size. %% Some .fon fonts will have several sizes embedded in the file, so the %% point size becomes the index of choosing which size. If the value %% is too high, the last indexed size will be the default. openFontIndex(File, PointSize, Index) -> Args = [[File,0], <>, <>], <> = call(?SDL_TTF_OpenFontIndex, Args), case FontP of 0 -> exit({openFont, returned_null_pointer}); _ -> #ttf_font{ptr = FontP} end. %% Func: openFontRW %% Args: N/A %% Returns: N/A %% C-API func: TTF_Font * TTF_OpenFontRW(SDL_RWops *src, %% int freesrc, %% int ptsize); %% Desc: Not implemented. openFontRW() -> exit({not_implemented, openFontRW}). %% Func: openFontIndexRW %% Args: N/A %% Returns: N/A %% C-API func: TTF_Font * TTF_OpenFontIndexRW(SDL_RWops *src, %% int freesrc, %% int ptsize, %% long index); %% Desc: Not implemented. openFontIndexRW() -> exit({not_implemented, openFontIndexRW}). %% Func: getFontStyle %% Args: TTF_Font Ref %% Returns: FontStyle %% C-API func: int TTF_GetFontStyle(TTF_Font *font); %% Desc: Retrieve the font style. %% This font style is implemented by modifying the font glyphs, and %% doesn't reflect any inherent properties of the truetype font file. getFontStyle(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_GetFontStyle, [<>]), FontStyle. %% Func: setFontStyle %% Args: TTF_Font Ref, FontStyle %% Returns: %% C-API func: void TTF_SetFontStyle(TTF_Font *font, int style); %% Desc: Set the font style. %% This font style is implemented by modifying the font glyphs, and %% doesn't reflect any inherent properties of the truetype font file. setFontStyle(Font, FontStyle) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, cast(?SDL_TTF_SetFontStyle, [<>, <>]). %% Func: fontHeight %% Args: TTF_Font Ref %% Returns: FontHeight %% C-API func: int TTF_FontHeight(TTF_Font *font); %% Desc: Get the total height of the font - usually equal to point size fontHeight(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontHeight, [<>]), FontHeight. %% Func: fontAscent %% Args: TTF_Font Ref %% Returns: FontAscent %% C-API func: int TTF_FontAscent(TTF_Font *font); %% Desc: Get the offset from the baseline to the top of the font %% This is a positive value, relative to the baseline. fontAscent(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontAscent, [<>]), FontAscent. %% Func: fontDescent %% Args: TTF_Font Ref %% Returns: FontDescent %% C-API func: int TTF_FontDescent(TTF_Font *font); %% Desc: Get the offset from the baseline to the bottom of the font %% This is a negative value, relative to the baseline. fontDescent(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontDescent, [<>]), FontDescent. %% Func: fontLineSkip %% Args: TTF_Font Ref %% Returns: FontLineSkip %% C-API func: int TTF_FontLineSkip(TTF_Font *font); %% Desc: Get the recommended spacing between lines of text for this font fontLineSkip(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontLineSkip, [<>]), FontLineSkip. %% Func: fontFaces %% Args: TTF_Font Ref %% Returns: FontFaces %% C-API func: long TTF_FontFaces(TTF_Font *font); %% Desc: Get the number of faces of the font fontFaces(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontFaces, [<>]), FontFaces. %% Func: fontFaceIsFixedWidth %% Args: TTF_Font Ref %% Returns: IsFixedWidth %% C-API func: int TTF_FontFaceIsFixedWidth(TTF_Font *font); %% Desc: Test if the current font face of the loaded font is a fixed %% width font. Fixed width fonts are monospace, meaning every %% character that exists in the font is the same width, thus you %% can assume that a rendered string's width is going to be %% the result of a simple calculation: %% glyph_width * string_length fontFaceIsFixedWidth(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontFaceIsFixedWidth, [<>]), IsFixedW. %% Func: fontFaceFamilyName %% Args: TTF_Font Ref %% Returns: FaceFamilyName %% C-API func: char * TTF_FontFaceFamilyName(TTF_Font *font); %% Desc: Get the current font face family name from the loaded %% font. This function may return a NULL pointer, in which case %% the information is not available. fontFaceFamilyName(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, binary_to_list(call(?SDL_TTF_FontFaceFamilyName, [<>])). %% Func: fontFaceStyleName %% Args: TTF_Font Ref %% Returns: FaceStyleName %% C-API func: char * TTF_FontFaceStyleName(TTF_Font *font); %% Desc: Get the current font face style name from the loaded %% font. This function may return a NULL pointer, in which case %% the information is not available. fontFaceStyleName(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, binary_to_list(call(?SDL_TTF_FontFaceStyleName, [<>])). %% Func: glyphMetrics %% Args: TTF_Font Ref, Ch %% Returns: {MinX, MinY, MaxX, MaxY, Advance} %% C-API func: int TTF_GlyphMetrics(TTF_Font *font, Uint16 ch, %% int *minx, int *maxx, %% int *miny, int *maxy, %% int *advance); %% Desc: Get the metrics (dimensions) of a glyph. glyphMetrics(Font, Ch) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_GlyphMetrics, [<>, <>]), case Res of 0 -> {MinX, MaxX, MinY, MaxY, Adv}; -1 -> exit({error, {failed_to_get_glyph_metrics, Ch}}) end. %% Func: sizeText %% Args: TTF_Font Ref, Text %% Returns: {Width, Height} %% C-API func: int TTF_SizeText(TTF_Font *font, const char *text, %% int *w, int *h); %% Desc: Get the dimensions of a rendered string of text. sizeText(Font, Text) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_SizeText, [<>, [Text,0]]), case Res of 0 -> {W, H}; -1 -> exit({error, {failed_to_get_text_size, Text}}) end. %% Func: sizeUTF8 %% Args: TTF_Font Ref, Text %% Returns: {Width, Height} %% C-API func: int TTF_SizeUTF8(TTF_Font *font, const char *text, %% int *w, int *h); %% Desc: Get the dimensions of a rendered string of text. sizeUTF8(Font, Text) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_SizeUTF8, [<>, [Text,0]]), case Res of 0 -> {W, H}; -1 -> exit({error, {failed_to_get_utf8_text_size, Text}}) end. %% Func: sizeUNICODE %% Args: TTF_Font Ref, Text %% Returns: {Width, Height} %% C-API func: int TTF_SizeUNICODE(TTF_Font *font, const Uint16 *text, %% int *w, int *h); %% Desc: Get the dimensions of a rendered string of text. sizeUNICODE(Font, Text) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, Args = [<>, mk_unicode_text(Text)], <> = call(?SDL_TTF_SizeUNICODE, Args), case Res of 0 -> {W, H}; -1 -> exit({error, {failed_to_get_unicode_text_size, Text}}) end. %% Func: renderTextSolid %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderText_Solid(TTF_Font *font, %% const char *text, %% SDL_Color fg); %% Desc: Create an 8-bit palettized surface and render the given text %% at the fast quality with the given font and color. %% %% The palette has 0 as the colorkey, giving it a transparent %% background, with 1 as the text color. renderTextSolid(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderTextSolid, mk_render_args(FontP, mk_latin1_text(Text), FgColor)). %% Func: renderUTF8Solid %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUTF8_Solid(TTF_Font *font, %% const char *text, %% SDL_Color fg); %% Desc: Create an 8-bit palettized surface and render the given text %% at the fast quality with the given font and color. %% %% The palette has 0 as the colorkey, giving it a transparent %% background, with 1 as the text color. renderUTF8Solid(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUTF8Solid, mk_render_args(FontP, mk_utf8_text(Text), FgColor)). %% Func: renderUNICODESolid %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUNICODE_Solid(TTF_Font *font, %% const Uint16 *text, %% SDL_Color fg); %% Desc: Create an 8-bit palettized surface and render the given text %% at the fast quality with the given font and color. %% %% The palette has 0 as the colorkey, giving it a transparent %% background, with 1 as the text color. renderUNICODESolid(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUNICODESolid, mk_render_args(FontP, mk_unicode_text(Text), FgColor)). %% Func: renderGlyphSolid %% Args: TTF_Font Ref, Glyph, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderGlyph_Solid(TTF_Font *font, %% Uint16 ch, %% SDL_Color fg); %% Desc: Create an 8-bit palettized surface and render the given glyph %% at fast quality with the given font and color. The 0 pixel %% is the colorkey, giving a transparent background, and the 1 %% pixel is set to the text color. The glyph is rendered %% without any padding or centering in the X direction, and %% aligned normally in the Y direction. renderGlyphSolid(Font, Glyph, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderGlyphSolid, mk_render_args(FontP, mk_uint16_glyph(Glyph), FgColor)). %% Func: renderTextShaded %% Args: TTF_Font Ref, Text, FgColor, BgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderText_Shaded(TTF_Font *font, %% const char *text, %% SDL_Color fg, %% SDL_Color bg); %% Desc: Create an 8-bit palettized surface and render the given text %% at high quality with the given font and colors. %% %% The 0 pixel is background, while other pixels have varying %% degrees of the foreground color. renderTextShaded(Font, Text, FgColor, BgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderTextShaded, mk_render_args(FontP,mk_latin1_text(Text),FgColor,BgColor)). %% Func: renderUTF8Shaded %% Args: TTF_Font Ref, Text, FgColor, BgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUTF8_Shaded(TTF_Font *font, %% const char *text, %% SDL_Color fg, %% SDL_Color bg); %% Desc: Create an 8-bit palettized surface and render the given text %% at high quality with the given font and colors. %% %% The 0 pixel is background, while other pixels have varying %% degrees of the foreground color. renderUTF8Shaded(Font, Text, FgColor, BgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUTF8Shaded, mk_render_args(FontP,mk_utf8_text(Text),FgColor,BgColor)). %% Func: renderUNICODEShaded %% Args: TTF_Font Ref, Text, FgColor, BgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUNICODE_Shaded(TTF_Font *font, %% const Uint16 *text, %% SDL_Color fg, %% SDL_Color bg); %% Desc: Create an 8-bit palettized surface and render the given text %% at high quality with the given font and colors. %% %% The 0 pixel is background, while other pixels have varying %% degrees of the foreground color. renderUNICODEShaded(Font, Text, FgColor, BgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUNICODEShaded, mk_render_args(FontP,mk_unicode_text(Text),FgColor,BgColor)). %% Func: renderGlyphShaded %% Args: TTF_Font Ref, Glyph, FgColor, BgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderGlyph_Shaded(TTF_Font *font, %% Uint16 ch, %% SDL_Color fg, %% SDL_Color bg); %% Desc: Create an 8-bit palettized surface and render the given glyph %% at high quality with the given font and colors. The 0 pixel %% is background, while other pixels have varying degrees of the %% foreground color. The glyph is rendered without any padding %% or centering in the X direction, and aligned normally in the %% Y direction. renderGlyphShaded(Font, Glyph, FgColor, BgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderGlyphShaded, mk_render_args(FontP, mk_uint16_glyph(Glyph), FgColor, BgColor)). %% Func: renderTextBlended %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderText_Blended(TTF_Font *font, %% const char *text, %% SDL_Color fg); %% Desc: Create a 32-bit ARGB surface and render the given text at %% high quality, using alpha blending to dither the font with %% the given color. renderTextBlended(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderTextBlended, mk_render_args(FontP, mk_latin1_text(Text), FgColor)). %% Func: renderUTF8Blended %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUTF8_Blended(TTF_Font *font, %% const char *text, %% SDL_Color fg); %% Desc: Create a 32-bit ARGB surface and render the given text at %% high quality, using alpha blending to dither the font with %% the given color. renderUTF8Blended(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUTF8Blended, mk_render_args(FontP, mk_utf8_text(Text), FgColor)). %% Func: renderUNICODEBlended %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUNICODE_Blended(TTF_Font *font, %% const Uint16 *text, %% SDL_Color fg); %% Desc: Create a 32-bit ARGB surface and render the given text at %% high quality, using alpha blending to dither the font with %% the given color. renderUNICODEBlended(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUNICODEBlended, mk_render_args(FontP, mk_unicode_text(Text), FgColor)). %% Func: renderGlyphBlended %% Args: TTF_Font Ref, Glyph, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderGlyph_Blended(TTF_Font *font, %% Uint16 ch, %% SDL_Color fg); %% Desc: Create a 32-bit ARGB surface and render the given glyph at %% high quality, using alpha blending to dither the font with %% the given color. The glyph is rendered without any padding or %% centering in the X direction, and aligned normally in the %% Y direction. renderGlyphBlended(Font, Glyph, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderGlyphBlended, mk_render_args(FontP, mk_uint16_glyph(Glyph), FgColor)). %% Func: closeFont %% Args: TTF_Font Ref %% Returns: void %% C-API func: void TTF_CloseFont(TTF_Font *font); %% Desc: Close an opened font file. closeFont(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, call(?SDL_TTF_CloseFont, [<>]). %% Func: quit %% Args: - %% Returns: void %% C-API func: void TTF_Quit(void); %% Desc: De-initialize the TTF engine. quit() -> call(?SDL_TTF_Quit, []). %% Func: wasInit %% Args: - %% Returns: Int %% C-API func: int TTF_WasInit(void); %% Desc: Check if the TTF engine is initialized. wasInit() -> <> = call(?SDL_TTF_WasInit, []), WasInit. %% Func: setError %% Args: N/A %% Returns: N/A %% C-API func: void TTF_SetError(const char *fmt, ...) %% Desc: Not implemented. setError(_Error) -> exit({not_implemented, setError}). %% Func: getError %% Args: - %% Returns: Error %% C-API func: char * TTF_GetError() %% Desc: Returns a (string) containing a human readable version or the %% reason for the last error that occured. getError() -> Bin = call(?SDL_TTF_GetError, []), binary_to_list(Bin). %%%%%%%%%%% Internal functions %%%%%%%%%%% %% Note: The order in which the arguments arrive and are passed to %% the driver differ. We're avoiding a strlen (and the %% like) in the driver by having the text as the last %% parameter. mk_render_args(FontP, Text, FgColor) -> [<>, mk_color(FgColor), Text]. mk_render_args(FontP, Text, FgColor, BgColor) -> [<>, mk_color(FgColor), mk_color(BgColor), Text]. mk_render_call(RenderFunc, Args) -> <> = call(RenderFunc, Args), case SurfacePtr of 0 -> exit({render_function_returned_null_pointer, RenderFunc}); _ -> {surfacep, SurfacePtr} end. mk_latin1_text(Text) -> [Text,0]. mk_utf8_text(Text) -> [Text,0]. mk_unicode_text(Text) -> lists:map(fun(C) -> <> end, Text++"\0"). mk_uint16_glyph(C) -> <>. mk_color(C) -> <<(C#sdl_color.r):?UINT8, (C#sdl_color.g):?UINT8,(C#sdl_color.b):?UINT8>>. esdl-1.3.1/src/sdl_audio.erl0000775000070100000120000001267512200143736014361 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%% File : sdl_audio.erl %%% Author : Dan Gudmundsson %%% Purpose : Implements a SDL_AUDIO interface %%% Created : 9 Aug 2000 by Dan Gudmundsson -module(sdl_audio). -compile(export_all). -include("esdl.hrl"). -include("sdl_util.hrl"). %% Functions -define(SDL_AudioDriverName, ?SDL_AUDIO_HRL +1). -define(SDL_OpenAudio, ?SDL_AudioDriverName +1). -define(SDL_GetAudioStatus, ?SDL_OpenAudio +1). -define(SDL_PauseAudio, ?SDL_GetAudioStatus +1). -define(SDL_LoadWAV, ?SDL_PauseAudio +1). -define(SDL_LoadWAV_RW, ?SDL_LoadWAV +1). -define(SDL_FreeWAV, ?SDL_LoadWAV_RW +1). -define(SDL_BuildAudioCVT, ?SDL_FreeWAV +1). -define(SDL_ConvertAudio, ?SDL_BuildAudioCVT +1). -define(SDL_MixAudio, ?SDL_ConvertAudio +1). -define(SDL_LockAudio, ?SDL_MixAudio +1). -define(SDL_UnlockAudio, ?SDL_LockAudio +1). -define(SDL_CloseAudio, ?SDL_UnlockAudio +1). -define(PLAY_AUDIO, ?SDL_CloseAudio +1). -import(sdl, [cast/2,call/2]). -include("sdl_audio.hrl"). -record(audiop, %Pointer to loaded audio data. {ptr, size}). %% Func: audioDrivername() %% Args: none %% Returns: DriverName(String) or [] %% C-API func: char *SDL_AudioDriverName(char *namebuf, int maxlen); audioDrivername() -> binary_to_list(call(?SDL_AudioDriverName, [])). %% Func: openAudio %% Args: DesiredFormat (audiospec-record), ForceFormat (true | false) %% Returns: ObtainedFormat or exit(audio_failure) %% C-API func: int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); openAudio(Desired, ForceFormat) when is_record(Desired, audiospec) -> FF = if ForceFormat == true -> 1; ForceFormat == false -> 0 end, Res = call(?SDL_OpenAudio, <>), case Res of <<>> -> exit(audio_failure); <> -> #audiospec{freq=Freq, format=Format, channels=Chs, silence=Sil, samples=Samps, padding=Padding, size=Size} end. %% Func: closeAudio %% Args: none %% Returns: ok %% C-API func: void SDL_CloseAudio(void); closeAudio() -> cast(?SDL_CloseAudio, []). %% Func: getAudioStatus %% Args: none %% Returns: Status %% C-API func: SDL_audiostatus SDL_GetAudioStatus(void); getAudioStatus() -> <> = call(?SDL_GetAudioStatus, []), Res. %% Func: pauseAudio %% Args: [true | false] %% Returns: ok %% C-API func: void SDL_PauseAudio(int pause_on); pauseAudio(true) -> cast(?SDL_PauseAudio, [1]); pauseAudio(false) -> cast(?SDL_PauseAudio, [0]). %% Func: loadWAV %% Args: FileName %% Returns: {AudioSpec, AudioBufferPtr} or exits %% C-API func: SDL_AudioSpec *SDL_LoadWAV(char *file, SDL_AudioSpec *spec, %% Uint8 **audio_buf, Uint32 *audio_len) loadWAV(File) -> Res = call(?SDL_LoadWAV, [File,0]), case Res of <> -> {#audiospec{freq=Freq, format=Format, channels=Chs, silence=Sil, samples=Samps, padding=Padding, size=Size}, #audiop{ptr=BufferPtr,size=BufferLen}}; Else -> erlang:error({load_wav_failed, Else}) end. %% Func: freeWAV %% Args: AudioWavRef %% Returns: ok %% C-API func: void SDL_FreeWAV(Uint8 *audio_buf); freeWAV(#audiop{ptr=Ptr}) -> cast(?SDL_FreeWAV, <>). %% Func: play_audio %% Args: AudioWavRef, SampleLen, Repeat (integer or infinity) %% Returns: ok %% Desc: Used to start audio playing play_audio(#audiop{ptr=Ptr,size=Size}, Repeat) -> R = if Repeat == infinity -> -1; true -> Repeat end, <<>> = call(?PLAY_AUDIO, <>). % %% Func: buildAudioCVT % %% Args: Src_format, Src_channels, Src_rate, % %% Dst_format, Dst_channels, Dst_rate % %% Returns: CVT record % %% Desc: %% Func: convertAudio %% Args: FromAudioSpec, ToAudioSpec, SampleBuffer %% Returns: NewBuffer or exists if conversion failed %% C-API func: int SDL_ConvertAudio(SDL_AudioCVT *cvt); %% Desc: This differs from the orginal SDL function in both syntax %% and semantics, convertAudio handles the buildCVT and other things %% SDL requires. %% convertAudio converts Buffer (in 'FromAudioSpec' format) and %% returns a new audio buffer (in 'ToAudioSpec' format) %% Don't forget to call freeWav with old Buffer convertAudio(FromAS, ToAS, #audiop{ptr=Ptr,size=Size}) -> Res = call(?SDL_ConvertAudio, <<(FromAS#audiospec.format):16, (FromAS#audiospec.channels):8, (FromAS#audiospec.freq):32, (ToAS#audiospec.format):16, (ToAS#audiospec.channels):8, (ToAS#audiospec.freq):32, Ptr:?_PTR, Size:32>>), case Res of <> when NBufferPtr /= 0 -> #audiop{ptr=NBufferPtr,size=NBufferLen}; _ -> erlang:error({error, Res}) end. esdl-1.3.1/src/sdl_active.erl0000775000070100000120000000215712200143736014525 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_active.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 12 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_active). -include("sdl_events.hrl"). -include("esdl.hrl"). -export([getAppState/0, quitRequested/0]). -define(SDL_GetAppState, ?SDL_ACTIVE_HRL+1). -import(sdl, [call/2]). %% Func: quitRequested %% Args: none %% Returns: true | false %% C-API func: SDL_QuitRequested() quitRequested() -> sdl_events:pumpEvents(), case sdl_events:peepEvents(0, ?SDL_PEEKEVENT, ?SDL_QUITMASK) of [] -> false; _ -> true end. %% Func: getAppState %% Args: none %% Returns: State (bitmask) %% C-API func: Uint8 SDL_GetAppState(void); getAppState() -> <> = call(?SDL_GetAppState, []), Res. esdl-1.3.1/src/sdl_joystick.erl0000775000070100000120000001532412200143736015111 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_joystick.erl %%% Author : Dan Gudmundsson %%% Purpose : Joystick functions %%% Created : 19 Apr 2001 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_joystick). -compile(export_all). -include("esdl.hrl"). -include("sdl_joystick.hrl"). -include("sdl_util.hrl"). -import(sdl, [call/2,cast/2]). -define(SDL_NumJoysticks, ?SDL_JOYSTICK_HRL + 1). -define(SDL_JoystickName, ?SDL_NumJoysticks + 1). -define(SDL_JoystickOpen, ?SDL_JoystickName + 1). -define(SDL_JoystickOpened, ?SDL_JoystickOpen + 1). -define(SDL_JoystickIndex, ?SDL_JoystickOpened + 1). -define(SDL_JoystickNumAxes, ?SDL_JoystickIndex + 1). -define(SDL_JoystickNumBalls, ?SDL_JoystickNumAxes + 1). -define(SDL_JoystickNumHats, ?SDL_JoystickNumBalls + 1). -define(SDL_JoystickNumButtons, ?SDL_JoystickNumHats + 1). -define(SDL_JoystickUpdate, ?SDL_JoystickNumButtons + 1). -define(SDL_JoystickEventState, ?SDL_JoystickUpdate + 1). -define(SDL_JoystickGetAxis, ?SDL_JoystickEventState +1). -define(SDL_JoystickGetHat, ?SDL_JoystickGetAxis + 1). -define(SDL_JoystickGetButton, ?SDL_JoystickGetHat + 1). -define(SDL_JoystickGetBall, ?SDL_JoystickGetButton + 1). -define(SDL_JoystickClose, ?SDL_JoystickGetBall + 1). %% Func: NumJoysticks %% Args: none %% Returns: Number of joysticks %% C-API func: int SDL_NumJoysticks(void); %% Desc: Count the number of joysticks attached to the system numJoysticks() -> <> = call(?SDL_NumJoysticks, []), Res. %% Func: Name %% Args: JoystickIndex %% Returns: Name (List) %% C-API func: char *SDL_JoystickName(int device_index); %% Desc: Get the implementation dependent name of a joystick. %% This can be called before any joysticks are opened. %% If no name can be found, this function returns NULL. name(Index) -> Name = call(?SDL_JoystickName, [Index]), binary_to_list(Name). %% Func: open %% Args: JoystickIndex %% Returns: Joystick or exits %% C-API func: SDL_Joystick *SDL_JoystickOpen(int device_index); %% Desc: Open a joystick for use - the index passed as an argument refers to %% the N'th joystick on the system. This index is the value which will %% identify this joystick in future joystick events. %% This function returns a joystick identifier, or NULL if an error occurred. open(Index) -> <> = call(?SDL_JoystickOpen, [Index]), ID. %% Func: opened %% Args: JoystickIndex %% Returns: true or false %% C-API func: int SDL_JoystickOpened(int device_index); %% Desc: Returns true if the joystick has been opened, or false if it has not. opened(Index) -> <> = call(?SDL_JoystickOpened, <>), Bool == 1. %% Func: index %% Args: Joystick %% Returns: index %% C-API func: int SDL_JoystickIndex(SDL_Joystick *joystick); %% Desc: Get the device index of an opened joystick. index(Joystick) -> <> = call(?SDL_JoystickIndex, <>), Index. %% Func: numAxes %% Args: Joystick %% Returns: no of axes %% C-API func: int SDL_JoystickNumAxes(SDL_Joystick *joystick); %% Desc: Get the number of general axis controls on a joystick numAxes(Joystick) -> <> = call(?SDL_JoystickNumAxes, <>), Axes. %% Func: numBalls %% Args: Joystick %% Returns: no of balls %% C-API func: int SDL_JoystickNumBalls(SDL_Joystick *joystick); %% Desc: Get the number of trackballs on a joystick %% Joystick trackballs have only relative motion events associated %% with them and their state cannot be polled. numBalls(Joystick) -> <> = call(?SDL_JoystickNumBalls, <>), Balls. %% Func: numHats %% Args: Joystick %% Returns: no of Hats %% C-API func: int SDL_JoystickNumHats(SDL_Joystick *joystick); %% Desc: Get the number of POV hats on a joystick numHats(Joystick) -> <> = call(?SDL_JoystickNumHats, <>), Hats. %% Func: numButtons %% Args: Joystick %% Returns: no of Buttons %% C-API func: int SDL_JoystickNumButtons(SDL_Joystick *joystick); %% Desc: Get the number of buttons on a joystick numButtons(Joystick) -> <> = call(?SDL_JoystickNumButtons, <>), Buttons. %% Func: update %% Args: none %% Returns: none %% C-API func: void SDL_JoystickUpdate(void); %% Desc: Update the current state of the open joysticks. %% This is called automatically by the event loop if any joystick %% events are enabled. update() -> cast(?SDL_JoystickUpdate, []). %% Func: getAxis %% Args: Joystick, Axis %% Returns: State (Int range: -32768 to 32767) %% C-API func: Sint16 SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis); %% Desc: Get the current state of an axis control on a joystick %% The state is a value ranging from -32768 to 32767. %% The axis indices start at index 0. getAxis(Joystick, Axis) -> <> = call(?SDL_JoystickGetAxis, <>), State. %% Func: getHat %% Args: Joystick, Hat %% Returns: HatState %% C-API func: Uint8 SDL_JoystickGetHat(SDL_Joystick *joystick, int hat); %% Desc: Get the current state of a POV hat on a joystick %% The return value is one of the following positions in sdl_joystick.hrl %% The hat indices start at index 0. getHat(Joystick, Hat) -> <> = call(?SDL_JoystickGetHat, <>), State. %% Func: getButton %% Args: Joystick, Button %% Returns: State %% C-API func: Uint8 SDL_JoystickGetButton(SDL_Joystick *joystick, int button); %% Desc: Get the current state of a button on a joystick %% The button indices start at index 0. getButton(Joystick, Button) -> <> = call(?SDL_JoystickGetButton, <>), State. %% Func: getBall %% Args: Joystick, Ball %% Returns: {DX, DY} or badarg %% C-API func: int SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); %% Desc: Get the ball axis change since the last poll %% This returns 0, or -1 if you passed it invalid parameters. %% The ball indices start at index 0. getBall(Joystick, Ball) -> case call(?SDL_JoystickGetBall, <>) of <> -> {Dx, Dy}; Res -> {badarg, Res} end. %% Func: close %% Args: Joystick %% Returns: none %% C-API func: void SDL_JoystickClose(SDL_Joystick *joystick); %% Desc: Close a joystick previously opened with SDL_JoystickOpen() close(Joystick) -> cast(?SDL_JoystickClose, <>). esdl-1.3.1/src/esdl.hrl0000775000070100000120000000234212200143736013336 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %%%---------------------------------------------------------------------- %%% File : esdl.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 6 Oct 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -ifndef(SDL_HRL). %% These must exactly match those in c_src/esdl.h -define(SDL_HRL, 20). -define(SDL_VIDEO_HRL, 30). -define(SDL_EVENTS_HRL, 100). -define(SDL_MOUSE_HRL, 110). -define(SDL_KEYBOARD_HRL, 120). -define(SDL_ACTIVE_HRL, 130). -define(SDL_JOYSTICK_HRL, 133). -define(SDL_AUDIO_HRL, 150). -define(SDL_UTIL_HRL, 180). -define(SDL_TTF_HRL, 200). -define(SDL_IMG_HRL, 300). -define(SDL_MAX_FUNCTIONS_HRL, 400). %/* Current Max.. Increase if needed */ -define(SDL_Init, ?SDL_HRL + 1). -define(SDL_Quit, ?SDL_Init + 1). -define(SDL_GetError, ?SDL_Quit +1). -define(ESDL_Init_Opengl, ?SDL_GetError +1). -endif. esdl-1.3.1/src/sdl_img.erl0000664000070100000120000001636112200143736014025 0ustar dguduucp%% Copyright (c) 2007 Klas Johansson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_img.erl %%% Author : Klas Johansson %%% Purpose : Provide access to SDL's image functions (tested with %%% SDL_image 1.2.4) %%% Created : 18 Feb 2007 by Klas Johansson %%%---------------------------------------------------------------------- -module(sdl_img). -include("sdl_img_funcs.hrl"). -include("sdl_util.hrl"). -include("sdl_video.hrl"). %%% ERL_SDL functions -export([]). %%% SDL_Functions -export([linkedVersion/0]). -export([loadTypedRW/0]). -export([load/1]). -export([loadRW/0]). -export([invertAlpha/0]). -export([isBMP/0]). -export([isPNM/0]). -export([isXPM/0]). -export([isXCF/0]). -export([isPCX/0]). -export([isGIF/0]). -export([isJPG/0]). -export([isTIF/0]). -export([isPNG/0]). -export([isLBM/0]). -export([loadBMPRW/0]). -export([loadPNMRW/0]). -export([loadXPMRW/0]). -export([loadXCFRW/0]). -export([loadPCXRW/0]). -export([loadGIFRW/0]). -export([loadJPGRW/0]). -export([loadTIFRW/0]). -export([loadPNGRW/0]). -export([loadTGARW/0]). -export([loadLBMRW/0]). -export([readXPMFromArray/0]). -export([setError/1]). -export([getError/0]). %% Imports -import(sdl, [call/2, cast/2]). %% Defines -define(INT, 16/signed). -define(LONG, 32/signed). -define(UINT8, 8/unsigned). -define(UINT16, 16/unsigned). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ERL_SDL API %% Func: linkedVersion %% Args: - %% Returns: {Major, Minor, Patch} %% C-API func: const SDL_version * IMG_Linked_Version(void); %% Desc: This function gets the version of the SDL_image library. linkedVersion() -> <> = call(?SDL_IMG_LinkedVersion, []), {Major, Minor, Patch}. %% Func: loadTypedRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, char *type); %% Desc: Not implemented. loadTypedRW() -> exit({not_implemented, loadTypedRW}). %% Func: load %% Args: File %% Returns: Surface Ref %% C-API func: SDL_Surface * IMG_Load(const char *file); %% Desc: Load an image from an SDL data source. load(File) -> <> = call(?SDL_IMG_Load, [[File,0]]), case SurfacePtr of 0 -> exit({load, returned_null_pointer}); _ -> {surfacep, SurfacePtr} end. %% Func: loadRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_Load_RW(SDL_RWops *src, int freesrc); %% Desc: Not implemented. loadRW() -> exit({not_implemented, loadRW}). %% Func: invertAlpha %% Args: N/A %% Returns: N/A %% C-API func: int IMG_InvertAlpha(int on); %% Desc: Not implemented. invertAlpha() -> exit({not_implemented, invertAlpha}). %% Func: isBMP %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isBMP(SDL_RWops *src); %% Desc: Not implemented. isBMP() -> exit({not_implemented, isBMP}). %% Func: isPNM %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isPNM(SDL_RWops *src); %% Desc: Not implemented. isPNM() -> exit({not_implemented, isPNM}). %% Func: isXPM %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isXPM(SDL_RWops *src); %% Desc: Not implemented. isXPM() -> exit({not_implemented, isXPM}). %% Func: isXCF %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isXCF(SDL_RWops *src); %% Desc: Not implemented. isXCF() -> exit({not_implemented, isXCF}). %% Func: isPCX %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isPCX(SDL_RWops *src); %% Desc: Not implemented. isPCX() -> exit({not_implemented, isPCX}). %% Func: isGIF %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isGIF(SDL_RWops *src); %% Desc: Not implemented. isGIF() -> exit({not_implemented, isGIF}). %% Func: isJPG %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isJPG(SDL_RWops *src); %% Desc: Not implemented. isJPG() -> exit({not_implemented, isJPG}). %% Func: isTIF %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isTIF(SDL_RWops *src); %% Desc: Not implemented. isTIF() -> exit({not_implemented, isTIF}). %% Func: isPNG %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isPNG(SDL_RWops *src); %% Desc: Not implemented. isPNG() -> exit({not_implemented, isPNG}). %% Func: isLBM %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isLBM(SDL_RWops *src); %% Desc: Not implemented. isLBM() -> exit({not_implemented, isLBM}). %% Func: loadBMPRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadBMP_RW(SDL_RWops *src); %% Desc: Not implemented. loadBMPRW() -> exit({not_implemented, loadBMPRW}). %% Func: loadPNMRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadPNM_RW(SDL_RWops *src); %% Desc: Not implemented. loadPNMRW() -> exit({not_implemented, loadPNMRW}). %% Func: loadXPMRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadXPM_RW(SDL_RWops *src); %% Desc: Not implemented. loadXPMRW() -> exit({not_implemented, loadXPMRW}). %% Func: loadXCFRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadXCF_RW(SDL_RWops *src); %% Desc: Not implemented. loadXCFRW() -> exit({not_implemented, loadXCFRW}). %% Func: loadPCXRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadPCX_RW(SDL_RWops *src); %% Desc: Not implemented. loadPCXRW() -> exit({not_implemented, loadPCXRW}). %% Func: loadGIFRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadGIF_RW(SDL_RWops *src); %% Desc: Not implemented. loadGIFRW() -> exit({not_implemented, loadGIFRW}). %% Func: loadJPGRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadJPG_RW(SDL_RWops *src); %% Desc: Not implemented. loadJPGRW() -> exit({not_implemented, loadJPGRW}). %% Func: loadTIFRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadTIF_RW(SDL_RWops *src); %% Desc: Not implemented. loadTIFRW() -> exit({not_implemented, loadTIFRW}). %% Func: loadPNGRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadPNG_RW(SDL_RWops *src); %% Desc: Not implemented. loadPNGRW() -> exit({not_implemented, loadPNGRW}). %% Func: loadTGARW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadTGA_RW(SDL_RWops *src); %% Desc: Not implemented. loadTGARW() -> exit({not_implemented, loadTGARW}). %% Func: loadLBMRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadLBM_RW(SDL_RWops *src); %% Desc: Not implemented. loadLBMRW() -> exit({not_implemented, loadLBMRW}). %% Func: readXPMFromArray %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_ReadXPMFromArray(char **xpm); %% Desc: Not implemented. readXPMFromArray() -> exit({not_implemented, readXPMFromArray}). %% Func: setError %% Args: N/A %% Returns: N/A %% C-API func: void IMG_SetError(const char *fmt, ...) %% Desc: Not implemented. setError(_Error) -> exit({not_implemented, setError}). %% Func: getError %% Args: - %% Returns: Error %% C-API func: char * IMG_GetError() %% Desc: Returns a (string) containing a human readable version or the %% reason for the last error that occured. getError() -> Bin = call(?SDL_IMG_GetError, []), binary_to_list(Bin). %%%%%%%%%%% Internal functions %%%%%%%%%%% esdl-1.3.1/include/0000775000070100000120000000000012200143736012530 5ustar dguduucpesdl-1.3.1/include/sdl_keyboard.hrl0000775000070100000120000002026312200143736015707 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_keyboard.hrl %%% Author : Dan Gudmundsson %%% Purpose : Define the available keys %%% Created : 7 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -define(SDL_DEFAULT_REPEAT_DELAY, 500). -define(SDL_DEFAULT_REPEAT_INTERVAL, 30). -define(SDLK_UNKNOWN , 0). -define(SDLK_FIRST , 0). -define(SDLK_BACKSPACE , 8). -define(SDLK_TAB , 9). -define(SDLK_CLEAR , 12). -define(SDLK_RETURN , 13). -define(SDLK_PAUSE , 19). -define(SDLK_ESCAPE , 27). -define(SDLK_SPACE , 32). -define(SDLK_EXCLAIM , 33). -define(SDLK_QUOTEDBL , 34). -define(SDLK_HASH , 35). -define(SDLK_DOLLAR , 36). -define(SDLK_AMPERSAND , 38). -define(SDLK_QUOTE , 39). -define(SDLK_LEFTPAREN , 40). -define(SDLK_RIGHTPAREN , 41). -define(SDLK_ASTERISK , 42). -define(SDLK_PLUS , 43). -define(SDLK_COMMA , 44). -define(SDLK_MINUS , 45). -define(SDLK_PERIOD , 46). -define(SDLK_SLASH , 47). -define(SDLK_0 , 48). -define(SDLK_1 , 49). -define(SDLK_2 , 50). -define(SDLK_3 , 51). -define(SDLK_4 , 52). -define(SDLK_5 , 53). -define(SDLK_6 , 54). -define(SDLK_7 , 55). -define(SDLK_8 , 56). -define(SDLK_9 , 57). -define(SDLK_COLON , 58). -define(SDLK_SEMICOLON , 59). -define(SDLK_LESS , 60). -define(SDLK_EQUALS , 61). -define(SDLK_GREATER , 62). -define(SDLK_QUESTION , 63). -define(SDLK_AT , 64). % %% Skip uppercase letters % -define(SDLK_LEFTBRACKET , 91). -define(SDLK_BACKSLASH , 92). -define(SDLK_RIGHTBRACKET , 93). -define(SDLK_CARET , 94). -define(SDLK_UNDERSCORE , 95). -define(SDLK_BACKQUOTE , 96). -define(SDLK_a , 97). -define(SDLK_b , 98). -define(SDLK_c , 99). -define(SDLK_d , 100). -define(SDLK_e , 101). -define(SDLK_f , 102). -define(SDLK_g , 103). -define(SDLK_h , 104). -define(SDLK_i , 105). -define(SDLK_j , 106). -define(SDLK_k , 107). -define(SDLK_l , 108). -define(SDLK_m , 109). -define(SDLK_n , 110). -define(SDLK_o , 111). -define(SDLK_p , 112). -define(SDLK_q , 113). -define(SDLK_r , 114). -define(SDLK_s , 115). -define(SDLK_t , 116). -define(SDLK_u , 117). -define(SDLK_v , 118). -define(SDLK_w , 119). -define(SDLK_x , 120). -define(SDLK_y , 121). -define(SDLK_z , 122). -define(SDLK_DELETE , 127). %% End of ASCII mapped keysyms %% International keyboard syms -define(SDLK_WORLD_0 , 160). %% 0xA0 -define(SDLK_WORLD_1 , 161). -define(SDLK_WORLD_2 , 162). -define(SDLK_WORLD_3 , 163). -define(SDLK_WORLD_4 , 164). -define(SDLK_WORLD_5 , 165). -define(SDLK_WORLD_6 , 166). -define(SDLK_WORLD_7 , 167). -define(SDLK_WORLD_8 , 168). -define(SDLK_WORLD_9 , 169). -define(SDLK_WORLD_10 , 170). -define(SDLK_WORLD_11 , 171). -define(SDLK_WORLD_12 , 172). -define(SDLK_WORLD_13 , 173). -define(SDLK_WORLD_14 , 174). -define(SDLK_WORLD_15 , 175). -define(SDLK_WORLD_16 , 176). -define(SDLK_WORLD_17 , 177). -define(SDLK_WORLD_18 , 178). -define(SDLK_WORLD_19 , 179). -define(SDLK_WORLD_20 , 180). -define(SDLK_WORLD_21 , 181). -define(SDLK_WORLD_22 , 182). -define(SDLK_WORLD_23 , 183). -define(SDLK_WORLD_24 , 184). -define(SDLK_WORLD_25 , 185). -define(SDLK_WORLD_26 , 186). -define(SDLK_WORLD_27 , 187). -define(SDLK_WORLD_28 , 188). -define(SDLK_WORLD_29 , 189). -define(SDLK_WORLD_30 , 190). -define(SDLK_WORLD_31 , 191). -define(SDLK_WORLD_32 , 192). -define(SDLK_WORLD_33 , 193). -define(SDLK_WORLD_34 , 194). -define(SDLK_WORLD_35 , 195). -define(SDLK_WORLD_36 , 196). -define(SDLK_WORLD_37 , 197). -define(SDLK_WORLD_38 , 198). -define(SDLK_WORLD_39 , 199). -define(SDLK_WORLD_40 , 200). -define(SDLK_WORLD_41 , 201). -define(SDLK_WORLD_42 , 202). -define(SDLK_WORLD_43 , 203). -define(SDLK_WORLD_44 , 204). -define(SDLK_WORLD_45 , 205). -define(SDLK_WORLD_46 , 206). -define(SDLK_WORLD_47 , 207). -define(SDLK_WORLD_48 , 208). -define(SDLK_WORLD_49 , 209). -define(SDLK_WORLD_50 , 210). -define(SDLK_WORLD_51 , 211). -define(SDLK_WORLD_52 , 212). -define(SDLK_WORLD_53 , 213). -define(SDLK_WORLD_54 , 214). -define(SDLK_WORLD_55 , 215). -define(SDLK_WORLD_56 , 216). -define(SDLK_WORLD_57 , 217). -define(SDLK_WORLD_58 , 218). -define(SDLK_WORLD_59 , 219). -define(SDLK_WORLD_60 , 220). -define(SDLK_WORLD_61 , 221). -define(SDLK_WORLD_62 , 222). -define(SDLK_WORLD_63 , 223). -define(SDLK_WORLD_64 , 224). -define(SDLK_WORLD_65 , 225). -define(SDLK_WORLD_66 , 226). -define(SDLK_WORLD_67 , 227). -define(SDLK_WORLD_68 , 228). -define(SDLK_WORLD_69 , 229). -define(SDLK_WORLD_70 , 230). -define(SDLK_WORLD_71 , 231). -define(SDLK_WORLD_72 , 232). -define(SDLK_WORLD_73 , 233). -define(SDLK_WORLD_74 , 234). -define(SDLK_WORLD_75 , 235). -define(SDLK_WORLD_76 , 236). -define(SDLK_WORLD_77 , 237). -define(SDLK_WORLD_78 , 238). -define(SDLK_WORLD_79 , 239). -define(SDLK_WORLD_80 , 240). -define(SDLK_WORLD_81 , 241). -define(SDLK_WORLD_82 , 242). -define(SDLK_WORLD_83 , 243). -define(SDLK_WORLD_84 , 244). -define(SDLK_WORLD_85 , 245). -define(SDLK_WORLD_86 , 246). -define(SDLK_WORLD_87 , 247). -define(SDLK_WORLD_88 , 248). -define(SDLK_WORLD_89 , 249). -define(SDLK_WORLD_90 , 250). -define(SDLK_WORLD_91 , 251). -define(SDLK_WORLD_92 , 252). -define(SDLK_WORLD_93 , 253). -define(SDLK_WORLD_94 , 254). -define(SDLK_WORLD_95 , 255). %% 0xFF %% Numeric keypad -define(SDLK_KP0 , 256). -define(SDLK_KP1 , 257). -define(SDLK_KP2 , 258). -define(SDLK_KP3 , 259). -define(SDLK_KP4 , 260). -define(SDLK_KP5 , 261). -define(SDLK_KP6 , 262). -define(SDLK_KP7 , 263). -define(SDLK_KP8 , 264). -define(SDLK_KP9 , 265). -define(SDLK_KP_PERIOD , 266). -define(SDLK_KP_DIVIDE , 267). -define(SDLK_KP_MULTIPLY , 268). -define(SDLK_KP_MINUS , 269). -define(SDLK_KP_PLUS , 270). -define(SDLK_KP_ENTER , 271). -define(SDLK_KP_EQUALS , 272). %% Arrows + Home/End pad -define(SDLK_UP , 273). -define(SDLK_DOWN , 274). -define(SDLK_RIGHT , 275). -define(SDLK_LEFT , 276). -define(SDLK_INSERT , 277). -define(SDLK_HOME , 278). -define(SDLK_END , 279). -define(SDLK_PAGEUP , 280). -define(SDLK_PAGEDOWN , 281). %% Function keys -define(SDLK_F1 , 282). -define(SDLK_F2 , 283). -define(SDLK_F3 , 284). -define(SDLK_F4 , 285). -define(SDLK_F5 , 286). -define(SDLK_F6 , 287). -define(SDLK_F7 , 288). -define(SDLK_F8 , 289). -define(SDLK_F9 , 290). -define(SDLK_F10 , 291). -define(SDLK_F11 , 292). -define(SDLK_F12 , 293). -define(SDLK_F13 , 294). -define(SDLK_F14 , 295). -define(SDLK_F15 , 296). %% Key state modifier keys -define(SDLK_NUMLOCK , 300). -define(SDLK_CAPSLOCK , 301). -define(SDLK_SCROLLOCK , 302). -define(SDLK_RSHIFT , 303). -define(SDLK_LSHIFT , 304). -define(SDLK_RCTRL , 305). -define(SDLK_LCTRL , 306). -define(SDLK_RALT , 307). -define(SDLK_LALT , 308). -define(SDLK_RMETA , 309). -define(SDLK_LMETA , 310). -define(SDLK_LSUPER , 311). %% Left "Windows" key . -define(SDLK_RSUPER , 312). %% Right "Windows" key . -define(SDLK_MODE , 313). %% "Alt Gr" key . %% Miscellaneous function keys -define(SDLK_HELP , 315). -define(SDLK_PRINT , 316). -define(SDLK_SYSREQ , 317). -define(SDLK_BREAK , 318). -define(SDLK_MENU , 319). -define(SDLK_POWER , 320). %% Power Macintosh power key . -define(SDLK_EURO , 321). %% Some european keyboards . %%% /* Enumeration of valid key mods (possibly OR'd together) */ -define(KMOD_NONE , 16#0000). -define(KMOD_LSHIFT , 16#0001). -define(KMOD_RSHIFT , 16#0002). -define(KMOD_LCTRL , 16#0040). -define(KMOD_RCTRL , 16#0080). -define(KMOD_LALT , 16#0100). -define(KMOD_RALT , 16#0200). -define(KMOD_LMETA , 16#0400). -define(KMOD_RMETA , 16#0800). -define(KMOD_NUM , 16#1000). -define(KMOD_CAPS , 16#2000). -define(KMOD_MODE , 16#4000). -define(KMOD_RESERVED , 16#8000). -define(KMOD_CTRL, (?KMOD_LCTRL bor ?KMOD_RCTRL)). -define(KMOD_SHIFT, (?KMOD_LSHIFT bor ?KMOD_RSHIFT)). -define(KMOD_ALT, (?KMOD_LALT bor ?KMOD_RALT)). -define(KMOD_META, (?KMOD_LMETA bor ?KMOD_RMETA)). esdl-1.3.1/include/sdl_audio.hrl0000775000070100000120000000272612200143736015214 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_video.hrl %%% Author : Dan Gudmundsson %%% Purpose : defines from SDL_audio.h %%% Created : 9 Aug 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- %% Data Types -record(audiospec, {freq, %% Int32 DSP frequency -- samples per second format, %% Uint16 Audio data format channels, %% Uint8 Number of channels: 1 mono, 2 stereo silence, %% Uint8 Audio buffer silence value (calculated) samples, %% Uint16 Audio buffer size in samples padding, %% Uint16 Necessary for some compile environments size}). %% Uint32 Audio buffer size in bytes (calculated) %% Audio format flags (defaults to LSB byte order) -define(AUDIO_U8, 16#0008). %% Unsigned 8-bit samples -define(AUDIO_S8, 16#8008). %% Signed 8-bit samples -define(AUDIO_U16LSB, 16#0010). %% Unsigned 16-bit samples -define(AUDIO_S16LSB, 16#8010). %% Signed 16-bit samples -define(AUDIO_U16MSB, 16#1010). %% As above, but big-endian byte order -define(AUDIO_S16MSB, 16#9010). %% As above, but big-endian byte order -define(AUDIO_U16SYS, 16#FFF1). %% Native audio ordering -define(AUDIO_S16SYS, 16#FFF0). esdl-1.3.1/include/sdl_active.hrl0000775000070100000120000000132512200143736015360 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_active.hrl %%% Author : Dan Gudmundsson %%% Purpose : Active Macros %%% Created : 12 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -define(SDL_APPMOUSEFOCUS, 16#01). %/* The app has mouse coverage */ -define(SDL_APPINPUTFOCUS, 16#02). %/* The app has input focus */ -define(SDL_APPACTIVE, 16#04). %/* The application is active */ esdl-1.3.1/include/sdl_video.hrl0000775000070100000120000001257712200143736015226 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_video.hrl %%% Author : Dan Gudmundsson %%% Purpose : defines from SDL_video.h %%% Created : 22 Jun 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- %% Statics %% Data Types -record(sdl_rect, {x, y, w, h}). -record(sdl_color, {r,g,b}). %% Where each color is 8bits %% sdl_palette = [sdl_color] -record(sdl_pixelformat, { self = null, %% Ref to this record palette = null, %% colorRef bitsPerPixel, %% Uint8 bytesPerPixel, %% Uint8 rloss, %% Uint8 gloss, %% Uint8 bloss, %% Uint8 aloss, %% Uint8 rshift, %% Uint8 gshift, %% Uint8 bshift, %% Uint8 ashift, %% Uint8 rmask, %% Uint32 gmask, %% Uint32 bmask, %% Uint32 amask, %% Uint32 %%/* RGB color key information */ colorkey, %% Uint32 %%/* Alpha value information (per-surface alpha) */ alpha %% Uint8 }). -record(sdl_surface, { self, %% Ref to this record flags, % Uint32 /* Read-only */ format, % SDL_PixelFormat ref* /* Read-only */ w, h, % int /* Read-only */ pitch, % Uint16 /* Read-only */ pixels, % void * ref /* Read-write */ offset % int /* Private */ %% /* Hardware-specific surface info */ %%hwdata, % struct private_hwdata /* clipping information */ % clip_minx, % int /* Read-only */ % clip_maxx, % int /* Read-only */ % clip_miny, % int /* Read-only */ % clip_maxy % int /* Read-only */ %% /* info for fast blit mapping to other surfaces */ %%map, % struct SDL_BlitMap /* Private */ %% /* List of surfaces mapped */ %%mapped, % struct map_list /* Private */ %% /* Reference count -- used when freeing surface */ %%refcount % int /* Read-mostly */ }). -record(sdl_videoinfo, { hw_available , %boolean Flag: Can you create hardware surfaces? wm_available , %boolean Flag: Can you talk to a window manager? blit_hw , %boolean Flag: Accelerated blits HW --> HW blit_hw_CC , %boolean Flag: Accelerated blits with Colorkey blit_hw_A , %boolean Flag: Accelerated blits with Alpha blit_sw , %boolean Flag: Accelerated blits SW --> HW blit_sw_CC , %boolean Flag: Accelerated blits with Colorkey blit_sw_A , %boolean Flag: Accelerated blits with Alpha blit_fill , %boolean Flag: Accelerated color fill video_mem , % video memory in k bytes vfmt % Ref to SDL_PixelFormat }). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% SDL_video.h see file for documentation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -define(SDL_GRAB_QUERY, -1). -define(SDL_GRAB_OFF, 0). -define(SDL_GRAB_ON, 1). -define(SDL_GRAB_FULLSCREEN, 2). %%/* These are the currently supported flags for the SDL_surface */ %%/* Available for SDL_CreateRGBSurface() or SDL_SetVideoMode() */ -define( SDL_SWSURFACE, 16#00000000). %% /* Surface is in system memory */ -define( SDL_HWSURFACE, 16#00000001). %% /* Surface is in video memory */ -define( SDL_ASYNCBLIT, 16#00000004). %% /* Use asynchronous blits if possible */ %% /* Available for SDL_SetVideoMode() */ -define( SDL_ANYFORMAT, 16#10000000). %% /* Allow any video depth/pixel-format */ -define( SDL_HWPALETTE, 16#20000000). %% /* Surface has exclusive palette */ -define( SDL_DOUBLEBUF, 16#40000000). %% /* Set up double-buffered video mode */ -define( SDL_FULLSCREEN,16#80000000). %% /* Surface is a full screen display */ -define( SDL_OPENGL, 16#00000002). %% /* Create an OpenGL rendering context */ -define( SDL_RESIZABLE, 16#00000010). %% /* This video mode may be resized */ -define( SDL_NOFRAME, 16#00000020). %% /* No window caption or edge frame */ %% /* Used internally (read-only) */ -define( SDL_HWACCEL, 16#00000100). %%/* Blit uses hardware acceleration */ -define( SDL_SRCCOLORKEY, 16#00001000). %%/* Blit uses a source color key */ -define( SDL_RLEACCELOK, 16#00002000). %%/* Private flag */ -define( SDL_RLEACCEL, 16#00004000). %%/* Colorkey blit is RLE accelerated */ -define( SDL_SRCALPHA, 16#00010000). %%/* Blit uses source alpha blending */ -define( SDL_SRCCLIPPING, 16#00100000). %%/* Blit uses source clipping */ -define( SDL_PREALLOC, 16#01000000). %%/* Surface uses preallocated memory */ %% The OpenGL window attributes -define(SDL_GL_RED_SIZE, 0). -define(SDL_GL_GREEN_SIZE, 1). -define(SDL_GL_BLUE_SIZE, 2). -define(SDL_GL_ALPHA_SIZE, 3). -define(SDL_GL_BUFFER_SIZE, 4). -define(SDL_GL_DOUBLEBUFFER, 5). -define(SDL_GL_DEPTH_SIZE, 6). -define(SDL_GL_STENCIL_SIZE, 7). -define(SDL_GL_ACCUM_RED_SIZE, 8). -define(SDL_GL_ACCUM_GREEN_SIZE, 9). -define(SDL_GL_ACCUM_BLUE_SIZE, 10). -define(SDL_GL_ACCUM_ALPHA_SIZE, 11). -define(SDL_GL_STEREO, 12). -define(SDL_GL_MULTISAMPLEBUFFERS, 13). -define(SDL_GL_MULTISAMPLESAMPLES, 14). -define(SDL_GL_ACCELERATED_VISUAL, 15). -define(SDL_GL_SWAP_CONTROL, 16). esdl-1.3.1/include/sdl_events.hrl0000775000070100000120000001324712200143736015417 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_events.hrl %%% Author : Dan Gudmundsson %%% Purpose : Event definitions %%% Created : 7 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -define(SDL_QUERY, -1). %% Arg to eventState function -define(SDL_IGNORE, 0). -define(SDL_ENABLE, 1). -define(SDL_ADDEVENT, 0). %% Arg to peepEvents function -define(SDL_PEEKEVENT, 1). -define(SDL_GETEVENT, 2). -define(SDL_PRESSED, 1). -define(SDL_RELEASED, 0). -define(SDL_ALL_HOTKEYS, 16#FFFFFFFF). %% Events (are defined by the following records) -record(active, %% SDL_ActiveEvent {gain, %% Whether given states were gained or lost (1/0) state}). %% A mask of the focus states -record(keyboard, %% SDL_KeyboardEvent {which, %% The keyboard device index state, %% SDL_PRESSED or SDL_RELEASED scancode, %% hardware specific scancode sym, %% SDL virtual keysym see sdl_keyboard.hrl mod, %% current key modifiers see sdl_keyboard.hrl unicode}). %% translated character -record(mousemotion,%% SDL_MouseMotionEvent {which, %% The mouse device index state, %% The current button state mod=0, %% Current key modifiers x, y, %% The X/Y coordinates of the mouse xrel, %% The relative motion in the X direction yrel}). %% The relative motion in the Y direction -record(mousebutton,%% SDL_MouseButtonEvent {which, %% The mouse device index button, %% The mouse button index state, %% SDL_PRESSED or SDL_RELEASED mod=0, %% Current key modifiers x, y}). %% The X/Y coordinates of the mouse at press time -record(joyaxis, %% SDL_JoyAxisEvent {which, %% the joystick device index axis, %% The joystick axis index value}). %% The axis value (range: -32768 to 32767) -record(joyball, %% SDL_JoyBallEvent {which, %% The joystick device index ball, %% The joystick trackball index xrel, %% The relative motion in the X direction yrel}). %% The relative motion in the Y direction -record(joyhat, %% SDL_JoyHatEvent {which, %% The joystick device index hat, %% The joystick hat index value}). %% The hat position value: %%% 8 1 2 %%% 7 0 3 %%% 6 5 4 %%% Note that zero means the POV is centered. -record(joybutton, %% SDL_JoyButtonEvent {which, %% The joystick device index button, %% The joystick button index state}). %% SDL_PRESSED or SDL_RELEASED -record(resize, %%SDL_ResizeEvent {w, %% New width h}). %% New height -record(expose, %%SDL_ExposeEvent The "screen redraw" event {}). %% -record(quit, {}). %%SDL_QuitEvent %-record(userevent, %%SDL_USEREVENT % int code, User defined event code % void *data1, User defined data pointer % void *data2, User defined data pointer %-record(syswme, %%SDL_SysWMEvent % {msg}). %%% %% EVENT TYPES and their masks -define(SDL_NOEVENT, 0). %% No (new) event -define(SDL_ACTIVEEVENT,1). %% Application loses/gains visibility -define(SDL_ACTIVEEVENTMASK, (1 bsl ?SDL_ACTIVEEVENT)). -define(SDL_KEYDOWN, 2). %% Keys pressed -define(SDL_KEYDOWNMASK, (1 bsl ?SDL_KEYDOWN)). -define(SDL_KEYUP, 3). %% Keys released -define(SDL_KEYUPMASK, (1 bsl ?SDL_KEYUP)). -define(SDL_MOUSEMOTION,4). %% Mouse moved -define(SDL_MOUSEMOTIONMASK, (1 bsl ?SDL_MOUSEMOTION)). -define(SDL_MOUSEBUTTONDOWN,5).%% Mouse button pressed -define(SDL_MOUSEBUTTONDOWNMASK,(1 bsl ?SDL_MOUSEBUTTONDOWN)). -define(SDL_MOUSEBUTTONUP,6). %% Mouse button released -define(SDL_MOUSEBUTTONUPMASK, (1 bsl ?SDL_MOUSEBUTTONUP)). -define(SDL_JOYAXISMOTION,7). %% Joystick axis motion -define(SDL_JOYAXISMOTIONMASK, (1 bsl ?SDL_JOYAXISMOTION)). -define(SDL_JOYBALLMOTION,8). %% Joystick trackball motion -define(SDL_JOYBALLMOTIONMASK, (1 bsl ?SDL_JOYBALLMOTION)). -define(SDL_JOYHATMOTION,9). %% Joystick hat position change -define(SDL_JOYHATMOTIONMASK, (1 bsl ?SDL_JOYHATMOTION)). -define(SDL_JOYBUTTONDOWN,10). %% Joystick button pressed -define(SDL_JOYBUTTONDOWNMASK, (1 bsl ?SDL_JOYBUTTONDOWN)). -define(SDL_JOYBUTTONUP,11). %% Joystick button released -define(SDL_JOYBUTTONUPMASK, (1 bsl ?SDL_JOYBUTTONUP)). -define(SDL_QUIT,12). %% User-requested quit -define(SDL_QUITMASK, (1 bsl ?SDL_QUIT)). -define(SDL_SYSWMEVENT,13). %% System specific event -define(SDL_SYSWMEVENTMASK, (1 bsl ?SDL_SYSWMEVENT)). %%-define(SDL_EVENT_RESERVEDA, Reserved for future use.. %%-define(SDL_EVENT_RESERVEDB, Reserved for future use.. -define(SDL_VIDEORESIZE,16). %% User resized video mode -define(SDL_VIDEORESIZEMASK, (1 bsl ?SDL_VIDEORESIZE)). -define(SDL_VIDEOEXPOSE,17). %% User resized video mode -define(SDL_VIDEOEXPOSEMASK, (1 bsl ?SDL_VIDEOEXPOSE)). -define(SDL_MOUSEEVENTMASK, (?SDL_MOUSEBUTTONUPMASK bor ?SDL_MOUSEBUTTONDOWNMASK bor ?SDL_MOUSEMOTIONMASK)). -define(SDL_JOYEVENTMASK, (?SDL_JOYAXISMOTIONMASK bor ?SDL_JOYBALLMOTIONMASK bor ?SDL_JOYHATMOTIONMASK bor ?SDL_JOYBUTTONDOWNMASK bor ?SDL_JOYBUTTONUPMASK)). -define(SDL_KEYBOARDMASK, (?SDL_KEYDOWNMASK bor ?SDL_KEYUPMASK)). -define(SDL_MOUSEBUTTONMASK, (?SDL_MOUSEBUTTONDOWNMASK bor ?SDL_MOUSEBUTTONUPMASK)). -define(SDL_JOYBUTTONMASK, (?SDL_JOYBUTTONDOWNMASK bor ?SDL_JOYBUTTONUPMASK)). -define(SDL_ALLEVENTS, 16#FFFFFFFF). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% esdl-1.3.1/include/sdl_joystick.hrl0000775000070100000120000000163712200143736015752 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_joystick.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 19 Apr 2001 by Dan Gudmundsson %%%---------------------------------------------------------------------- -define( SDL_HAT_CENTERED, 16#00). -define( SDL_HAT_UP, 16#01). -define( SDL_HAT_RIGHT, 16#02). -define( SDL_HAT_DOWN, 16#04). -define( SDL_HAT_LEFT, 16#08). -define( SDL_HAT_RIGHTUP, (?SDL_HAT_RIGHT bor ?SDL_HAT_UP)). -define( SDL_HAT_RIGHTDOWN, (?SDL_HAT_RIGHT bor ?SDL_HAT_DOWN)). -define( SDL_HAT_LEFTUP, (?SDL_HAT_LEFT bor ?SDL_HAT_UP)). -define( SDL_HAT_LEFTDOWN, (?SDL_HAT_LEFT bor ?SDL_HAT_DOWN)). esdl-1.3.1/include/sdl.hrl0000775000070100000120000000406312200143736014027 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%% Defines for SDL %%% see documentation for SDL and SDL/sdl.h %%% %%% By Dan Gudmundsson %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% sdl.h -define(SDL_INIT_TIMER, 16#00000001). -define(SDL_INIT_AUDIO, 16#00000010). -define(SDL_INIT_VIDEO, 16#00000020). -define(SDL_INIT_CDROM, 16#00000100). -define(SDL_INIT_JOYSTICK, 16#00000200). -define(SDL_INIT_NOPARACHUTE, 16#00100000). -define(SDL_INIT_EVENTTHREAD, 16#01000000). %% Don't work on windows and in the driver -define(SDL_INIT_EVERYTHING, 16#0000FFFF). -define(SDL_INIT_NOERLDRIVER, 16#02000000). %% Don't use the linked in driver -define(SDL_INIT_ERLDRIVER, 16#04000000). %% Use the linked driver -define(printError(), fun([]) -> ignore; (Estr) -> io:format("SDL Error in ~p ~p: " ++ Estr ++"~n", [?MODULE, ?LINE]) end (sdl:getError())). -define(SDL_USES_WX_GL, 1). -define(GL_BYTE_SIZE, 8). -define(GL_UNSIGNED_BYTE_SIZE, 8). -define(GL_SHORT_SIZE, 16). -define(GL_UNSIGNED_SHORT_SIZE, 16). -define(GL_INT_SIZE, 32). -define(GL_UNSIGNED_INT_SIZE, 32). -define(GL_FLOAT_SIZE, 32). -define(GL_DOUBLE_SIZE, 64). -define(gl_type_size(TYPE), case (TYPE) of 16#1400 -> ?GL_BYTE_SIZE; 16#1401 -> ?GL_UNSIGNED_BYTE_SIZE; 16#1402 -> ?GL_SHORT_SIZE; 16#1403 -> ?GL_UNSIGNED_SHORT_SIZE; 16#1404 -> ?GL_INT_SIZE; 16#1405 -> ?GL_UNSIGNED_INT_SIZE; 16#1406 -> ?GL_FLOAT_SIZE; 16#140A -> ?GL_DOUBLE_SIZE end). -define(SDL_BYTE, 16#1400). -define(SDL_UNSIGNED_BYTE, 16#1401). -define(SDL_SHORT, 16#1402). -define(SDL_UNSIGNED_SHORT, 16#1403). -define(SDL_INT, 16#1404). -define(SDL_UNSIGNED_INT, 16#1405). -define(SDL_FLOAT, 16#1406). -define(SDL_2_BYTES, 16#1407). -define(SDL_3_BYTES, 16#1408). -define(SDL_4_BYTES, 16#1409). -define(SDL_DOUBLE, 16#140A). -define(SDL_DOUBLE_EXT, 16#140A). esdl-1.3.1/include/sdl_ttf.hrl0000664000070100000120000000156012200143736014700 0ustar dguduucp%% Copyright (c) 2007 Klas Johansson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_ttf.hrl %%% Author : Klas Johansson %%% Purpose : defines from SDL_ttf.h %%% Created : 29 Jan 2007 by Klas Johansson %%%---------------------------------------------------------------------- -record(ttf_font, {ptr}). %% ZERO WIDTH NO-BREAKSPACE (Unicode byte order mark) -define(UNICODE_BOM_NATIVE, 16#FEFF). -define(UNICODE_BOM_SWAPPED, 16#FFFE). -define(SDL_TTF_STYLE_NORMAL, 16#00). -define(SDL_TTF_STYLE_BOLD, 16#01). -define(SDL_TTF_STYLE_ITALIC, 16#02). -define(SDL_TTF_STYLE_UNDERLINE, 16#04). esdl-1.3.1/include/sdl_mouse.hrl0000775000070100000120000000156712200143736015245 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_mouse.hrl %%% Author : Dan Gudmundsson %%% Purpose : Usable mouse macros %%% Created : 12 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -define(SDL_BUTTON_LEFT, 1). -define(SDL_BUTTON_MIDDLE, 2). -define(SDL_BUTTON_RIGHT, 3). -define(SDL_BUTTON_X1, 4). -define(SDL_BUTTON_X2, 5). -define(SDL_BUTTON_LMASK, 2#00001). -define(SDL_BUTTON_MMASK, 2#00010). -define(SDL_BUTTON_RMASK, 2#00100). -define(SDL_BUTTON_X1MASK, 2#01000). -define(SDL_BUTTON_X2MASK, 2#10000). esdl-1.3.1/test/0000775000070100000120000000000012200143736012064 5ustar dguduucpesdl-1.3.1/test/erlang-drop-shadow.png0000664000070100000120000003577212200143736016305 0ustar dguduucp‰PNG  IHDRȳ̽SœbKGDÿÿÿ ½§“ pHYsaa¨?§itIME×%1j1â IDATxÚí}yœ$GuæyÖÕÓÇôŒ4šCÒ “CHF–0,–ËF#nƒÀ{1¯í°1냵-l´Æ,s sX–±`9Äa„@÷ ÑÌ}OOÕuå±teMTTDfVuuWµTùûå¯{zº+3"Þ÷Þ÷^¼x]£kt®Ñ5ºF×è]£kt®Õ»È|†x±ÑÒŒdrd‰ôñïÈ h–'(È £kY2–1Õ È ¡|”Ç/0HrÖ«œ0î³X¯Èív0D¸»ýl™µ`ÜÏ™äwÙãP@žhô3I–У<%ÉRÏrDzŒ&¦@>I “ ˆ& p-ƒ¤Ÿ4b-ÓP"ù**YM•<©d‰ ÿÇËVfY2zMò³$«’„ðxš0@*˜HþëZÅriÄ㆒Œò¤’%Ò¥,±°d’!#ÀZƒùü“Î:;ؽ{kh aókèà7¿2€P€°„…'Ó½xøË`³ÍÁÐæs©D#5$Y)©êû$jÀ„Å^+`!ð剩_n” PÉSüï4yŠe(‚€Ý jŽ?Ê K‰set±ÈÚ¸n¼­òξÏX±xèë…üå81cqƒŠš7i~ÕM0Œ@Éê§i œ›$"‰>0‰CʆlnZc4 ãy?ëç(Ø<€ 9Ùï®eIë†Z1Æú¿çašµ£ðªÛNÌPvó6›àÕ›ï¨)„C(¢_¦s_õæ¸ nŒ–p›Í;þ·Íý\ü[~~´hîÀæéƒõꇴbñÎ~~pÓÂääš·8wñ:d–%#Ú[“Oû<Ù  ærýïÕÅ…æÀ‚æM“h-™™W¿mÃÆõLLžMöì¹ 01±µÏ?Ý9z4 ‰=½Ì4çN=r¹u[í{³'n»•±…Y׉ŒrôÿJ%¼› åª=ä8ìàÄäÛ¶ZÖ=Ô÷­>>§¸ÄÎZ²¤P˜ šDµŒ.´¢Æú Åâ7þ¦Q»@aÉ…i¡ Ç}Øu¢â±üéú Û¶»î‹í ¸ÒX¬<ƒ˜-ææ6U@€ÙYA^‰ƒñàWò“ziÝ­;núdµ²‹£ž<Õ¹ŸQ‰dž(¼"Ñþ¤¼°ç³cëþ:çûÿ»¤Ô…ÀX“øn¤W"U Œiýš%ײ]ú_ô£(ÏÑM@68ã0QU˜[ }bÛ—Ž?þ»z¹üëXcW’ÉÂP3€§ŽÁS_hoN¾x룖õ™¿Y\¸£9'¡À¯Ck‹Né0(–ú÷qJ?ùNøRà û±&0 …L©öGÕ! ÚÐ7 þ×óöçzžÖ4‰yŽ3ò\[—pÆaðATàÐÿ~˶s¾`ç?=~àÀ·tÏ{] Že-|Âvœ_¾°Rùôu…ÒG^¶~ú¬æ¼¸yù¶.ø(Gs§Ðî®×Â#“×]§}zÖXÓŠ¨äJ(WÒæd¢“Þ6~ägÅâm7..j.p¾yËXB‡SôÏâ÷4®ŸÞøß7=úCÝó^K–ÆÓß‹1m]£qÅkÊ‹_x÷†S^Ôœ¿‚+Á‰–@G›Ÿö¡Êâø¥Kˆè¨«æ¤§(V $Q(V-—›». î” „®ˆÈ`ˆ¶-xñŽSOÿ·©éOZ³³× ŠÆWú%Œ(šþ…¹¹| —}Sxä,É0FµÏc÷Œ•>Bü>D´¼léYÁ‘Å‚´9U˵ À͆~ûQ×…âå5¨>fhÀñ&ñg?þ6?ÿ«*x”’§xþ»ßk˜¯•€„—› tkX,2>6{âÑEËü~Ÿ¢Xy…²ý’T…¡¥ðEþ÷–=™{m{ïµê~ 'ÔÝ•Sµšàx³ðŸc— â¥cxzDÿè=Ó®ä4gA ¬ªý’ÕIZÚyëûïÆgAH¸L ’Cû>ˆ)ÈšmLô™²R,‚¥}Þ)–®ãóÙ)ÑhDˆ¶Ä‘+&‰:`@‘:ä/;÷¼Â‹uý+È/ Tÿ2Fž67ÿ;/)•žš‘ni¦­²B7Ök{jÅâÎ>„WâØõúž9Š•ôµ§ë~ËÚõ¨Ó¨+€ à ÂÏ’ÒßW+Ó­zÕþïC£ñ¬a ñcë~=ŒÞ¾1_Xß øH²$d€àà×¶µ¯³3gi™kk w–@…RÆ»K5Ao©&¾®Ÿ ý‡%Ö‚áówÄ„ŸÌA‚$žXýÚ±ñçÙ¾ÿCäèbÜóÏ{Ñ^ФYE$æX`¢RüØì‰®iX&@xê® údRüÚj,ÞMcï‰ ðk!¦ÄwPV‹^‰ç_4úŸœ{ÞÔ†(ºŽQj @À.ò¼+7èÆ4Ô{$F†(áJû!ñ÷âÎKY+ݼŒ5Ó$Àèy¬Z—‚Òõèzxv “ÀÂÃÉÔŸû¹ÙáªÕò?Z~ØS÷¸Š6§a¯|­•m?WpÖU°ƒòE˜ŒZq 3¼Þ÷¾Èzõv% $ýȲ®ûLcÿ1߯ “ÀçÊð_y+),Èj[µzóØº©\ü ñuQDŸgR"î3 ŠÈhãXEÌ‚ŸÕjåyÓ¼£A•²ë«éY»Dš}±]âHÀá ‰WÌN]-¿£#‚€\žË½DÑ)à ñ Ø|imã|´öÕ²"LaI"™?º{y;ëi` +®¯]ºvl—çV$Àˆo—†Ž4еšÖC{ÆÆ9«R}†üb”â2M¿í›eªÝõ®Ö>EfAx†áÝsYïózv}­@Ám–µWpºc ¸P¼ÿƒÀ÷hÓD/7í3´ ¸kà:3ŠÎáœsÞzdÉÑZMg Žz‹e<æ{ 5ÃxdÖs82k‹ÿU¯Ê`=dà…‰Äz[ÚærùÅŒR²²A×OÓõ +ƒ“¾Úû!"@Ä¿?cY;úDç†Ï‚Ü ì¡')¥ò$ιÌ÷©Õ vÐ[@É/ƹ ×Í›µ9pè/€±u`œeñ!?RÜ-8²*&YH¤~±Oƒ$M1 “ÕŽ¼éé½8|¸W·jI}èî“ôJfA’RÙ‡Å9Wi4ZSÐ P©½¤stkAÄ÷äöé{NlH¢†*JKw>´{[vfÚ×"}µ ?±¬ýðÜHÂÕCÈO úÌyÖÅŠËæ €baLG/Öc9VD<Æ,H±E°[c*lÜHÉÜ`z€¥ÁDÔÛ åzÝüàŽ¬dΰ‡vÛ,Ç:Mû¾R‰î€³°Ð¿q0©¹Ž— I€`C ¦~t­]gŸôãÃÒ®Tm?=¶® ø•c¾œs@cŒ¨Ò¹Ø l4öEC,KüXYÒJؤuJ0ôýGG¢·¦-Ȳ6xµþ8ñë°;ç"WÕèQ-ŽdnM]}µ"ý± ºžËJÇÖÐäZàyÎHæÖœé[5™¾d{.z¯þË‚„£Xž;’¹5¾€£oi<æô®%pð–Díg¬i0‘47!k(I ˆ$¿eËèŒÊÚ¦XËK_b›–‰áè}×wš5ç¸÷ŽdîqᤓdóÄÄY)/1ìyJJ+²07[ÉÜš¤É«æ¤§?dn®˜ÀUVeXiX;Å:móHäÖ®¹ª>ˆò„1ÍÐ4Ma-Ö4åÚ±nìþ‘Ì­i+2x'}]¡pÚ™ÅÒ:ÓÂÓêÕ h”ŽøüôÑ#y{b‚£oaõº­W«&:ÏKkïÌDXˆ¦1}jjv$wkÒQ_¶œõ-Õä²Í›Ï@{š nL†ÜÏPÊÊóóŽdndA–u]ÎaZ ­ÚzHmàY¿þøH`é@N_·Yáwh –dXAÑv"òxeñ¡‘¬=1¯¾d]­~šFˆh=Ä®KkéÜv $»6nQ¬@²HŒúðДiž1¥ëÁI×ÊÕ—ýUòGZ¹snö(l»1—@z¿Ç|òÄÄ]B­dA†×÷hä1×­;QôðH\FYÖuîbõL‰ÕÑ-UØ— 8:ª²Ì›æÝ#qdY×Y†qNF ‚!¥YLz Ÿ¿o$.#€,ë:…í¤³gx\%O˜a³* Â~ä¹QÓ\‰LÂE¾—³=V(Ì1Mc#€W®ÑXÎøø¤ #Á¢ kD«£ßøÎz­ìXÖ##¨¯ý–¹øyßÛ÷çÚƒÎÛ;’ËÍh¦9]„ç 4Kư;êL”è®}wùB¯‹ÂÇà‹MË[(Aóq²Â?h;F}§Ó8xi±xÚ+ˆþÌ­Æé¥ZŸ×nàô0zò¸e}sÑ÷ýæ3L$*g`¸jhñ~H ÚS«U­›øÖÖ xó ;,óð÷\ç0 W¸½æÿÅ> ãÖÜ`Ü]¯7î\VÛve—l÷¼íˆ"²L€ WhñÊAé¦uŽ2K¢êÔ4,~ˆØN.ü†Fnbºþ„.(wÌ4ªŸŽÂG£v‹Óª¥jÞ‹ w@åöZõgïkÔnøÇbþK»ò¹Ÿ/#<Ì@aC0†_ðƒ§ád‡ þVY’aH;Qm¶äå…#‡tý«OTpø¶^Mé烠.8åNÓç¨ à¨4ïåæ-¥zG¥ò³?s7þƒmýëžBaWáa¦XǧX] ì¶(:û ˚ܷÔ":ÉŠhCJ³Ä æÛY‡7Ú—ÿÖ+˜ï›O(p€Eÿø;Ó¨&P+õ¦%qšÿÓ,Æ)æ¸ÅšÅÝ96ì»jÕ]w/*·¼&Ÿ»ìôzãLBiTu4ëÉWÑV`Rš»Â´.â,G< f Ͷp/ß©7Žñw7Çö™æ O,¯œàããÝC£ãZ%F¬bŠÅS­ø®pwY°,-‹Â€êÎz}ÏÿªVnø[Ûúüññ½”(eÍh‚ÕèZñ®h¥ #zQA×ó@ jñ™¾ÃN³" !ÿïix½oYÇž(ø¸Å¶öüÛbyÄrˆ ‰Â•§’@ÃÚ¨×ýNcß»þýÃ9ûKÖíKx͈³"Ën÷·¢ó¼õ/Ðs8ËÁ[ÉIŒÃbEøhVHf§v»m]KtýqŽï‚íýg×y'ùq¤ª!P+ÙÝHø½0á–:ó;ƾŸQº;@Ä>™=Y’•íÁÇ~Å´žkkZN™Ãž¥ãj„Gîãûþ§ëµ;æóß{<ƒã;`{>ö‰åhHè•Ìq¸ï]‰CÏ[›Šänѳ'‹ä9Ž{©Â)ñ²Ûo¬x“Ê©Fcóevî Î‚Ø +"³$ƒö?dѬˆ‰Pê|<ðþ¥ìz<‚ãûÙw=ÁO%VCF«Üÿñ ðÐo><\—а$µ·0ò;ŠJ ¯JõáË@žE–"<Õ’Yò(Ã*D²ZVä1Ï;ñíé©Gºþ¸éFÅ|WÓö\G£GBÆd{¢öoássH¨š“ðÙ5µ—Ol|’ã<'åÕ“(V×`Y•6Çg8ÎyÏ+ÏlZ›³$IVd’UV$ä­ï?fgùO‚¿¡„økšÆnÉçwІrBìpÖ£‘àkˆ»è7_âíós˜@ßEÃð®ôƒßFz×a8†Ø‚4¯WíW9`Ø ‡=ÉY' Ø A{þ‘{cìÜqÊ)Ÿ¦š¬Upøš^«k;¯sêJ4¼ÌÁŽ¿)•޶4xî{Þª(©ØûÆÖ½(ïºgeU8çl¨2Y«m~åØº 8€ð@SR†ÍŠÈvÕy-ØZÐ;òû¦×‘jZ¸ÖÀ1cµ´­{o ü#8¹;.‹TÕÔ*h8"¦R!ð h^¹~zúŒJõÍ’Nf2'ècoÌUÁ‹ƒà…ës¹’„jYаï ÷ET§ CÍŠµèÕ3Ç¿ñÕœýÑ`éßCMÃNË:òAÝõc§qLb5d›€¢õˆ-G<<8(:÷&øô™u„S…ûµZý=zM bn´Õ|Ø:×ÛðZ¢]ÖE'wÞŠè º5hŸ•IXH‹?ÿ[£~ÏÆJ×T ãè0ƒ£fÞçlëÁ¿÷ÝûæiT寑¶;. çz àùsæ• ßGnZ¯ÈyÞå]ëã>z´Õ^gúÁågÙöF Õ’9íªV ƒ´"T¢éx'³¹¹ZyøÏÁ®Þ]ÈßMVî]fƒ°{ ùÃï#ì¶o:}‘|ãOFUáwxœ? =½=ÉYN̼ýƒS7¶±Z{_V9eìr۷ŵ¢(÷V¢]©yΊˆN»Õ"»$Löå©VG(ôh̼¿QÿÌ—JÅY4ŒW‰§Ûcšs©“;®nÔwÎAE’ƒ»Æ¿ï¡ó܇*’Ä2†ZÉæBÁ¸t¡üw„ÒÉdºo½hRjb›œU¡téçµ[%Ú'Ö@†„·ËiÃxñ ‰+Ú·i³›ª•7›æ®×ÙÖ³žryÑó&V„°Ý†>÷MÃØ}—Ó˜aÀÓÖe;åü!ï‹–ƒ÷9M–þ:Wx‡1?ÿ•¾Šš“5F)žWÜmÛýÔódæYÆ_cP7ÉT²¸’MÙ6o-•¦Æ«• KÓŒ ùÂ:Ëó,êy­°¬9>ŽjzÇõÍ壟þlͲ¼»\gæ8¥Nà!:ÓcÄ}ÙÆœ#¹ÅÝqqh´J´ÆKMësp*§÷¸8²rR«æƒ¬ˆ0^Òh¼äe“S»¿¶0¿É–„ ¾È ©,á„1ü~ǹv´ç#¼ãAà‚…{C(Ï 3ߨÙ¥:Õ J ©UHÀu¢0bõêÒ“|OvŽ>”‰õà7t_ð$À£UYÀ!ÒV'€/Noü fg¹'™ïIŽjA€¥ëW–ß´7—?úëxͨ–,'.M¢Éá¨ó¦8óHˆ|ÅB'ËQ3)cF= c^m´„*ˆâ™bz¾ìy‚^yPˆÀPQàn΀‹š]»Ö²_@fO¼ Ë/:Fú©äAYþÊ36ù‡†ùöwÂù`ãä¢ùM! šï5ýapØ“œv@d'Å F~ÓT–í¬IÂÞDò<8xÇœ¿]t& òkH¢TQÂ>Ë(¼ñôÏ}Îóí={¿Ü D“ÂˬY•«T«mý«|ñ­ô½¬D¡'¡Zñâ!±"I ‘m|‰9\±àå8ÁŒ­‡ê8{vvöhߎi/¿ðRk¸iÓ¦;Ž=ún~?pâĉëø¼86l۶ͬV«/]XX×d€Ã ÔGFÝÚ>cË–-Óõzý׫Õêeããã—...n Ãp]÷.Ã0ær¹oÎÍÍÝÅ£)am•Òí멤 …ó!_êÁâ¼ÀçSèZÛ4M»À)ªüùÏÈårÇr¹Ü7LÓ¼®\.„üÈ©ª @k‘LÓ|6€ë…Ç|À•)Î%ï›e‰4ã·^¯¿@ëÐPEJé•>™^[Ê„€·LyþóçççÿÏé§Ÿþðþýûœ€(‹¥Z­öeɘ~ KÇ¢;Nžyæ™[æççÿôرc¿†¡ sss­_*—Ëð<¨Õjo²m{×ØØØ‡Ëåò÷Â0 „ý Ù:Ûö­[ÊYzo†¤ç¨ú£/+|èºî©õzý·ËåòmÚ´é5MË£½”©ªZc[ž“blíç2dè5!6OºP:rúé§_†áÅâ/7ט¦™G{‘oÙxH…’ÎuEæ¡C‡>vÊ)§lE{1qe‹¼H]¿ËPü˜¡Üš+Ã0Œ-[¶¼êÀ;߃#íò<יּ¹¹O†qõ¦M›¦!?u™¥ßeßÚ@ ½8‹Ï”d9DÐ[ÍàÒñãÇß³qãÆ·âdIÓœ Pªg늱¨ÛÆÉrͲ(鉾°°ðÆX‡€ø¾ÑÄÄÄ“‘­D«‘w\Qm/—ËaÛöÚ ŠóÏi ¸T<"i}UMZ;æ»T*½ëèÑ£×GQ4ÞµÌ\×½ÒqœNMMM ïªRÂ=Ó2Ò@[†1%ZJV{7 ù?ðp>ŸŸ“=„RŠãÇ¿srrr›$‰UŒMƒ¼C¯ìsÒ³â! €6999V¯×_©뺯‚¼Ž±™Ñ’èIÖÚ÷ý_³mû-Ígä¹gt49òÕEí $7Fâ~›6mzCµZý@u¶<×uÝ+‹š¦ù ׎}×0ŒYÙCËåò³Çù3˲ò Å¡’)ÒfϤ”ÊuÀï¢=Í„÷1",è² >Ü#:™*àþ)€ý–eM0ÆÎ ‚à÷¢(ºPÐ.… ^àã8™Ë%+rж‹`Al´'ŠÙÉbhR¶;®ŠÜhš¦]EÑiªð}ÿ%†a|& Cí yDyç‘?d%ÕÆõzý¦¦¦~>??¿É£­waZ) è<7Ô–}±uëÖs<ø·2!- ?,•J™™9ËRµZÕlÛ.åóùW8Žóæf€ˆ§\/û®ïû?L‰Æu»ÖÅÒè”RÙDG÷Œà+„G7ÊÑ\^õ^€üââ"u]w?cì¯LÓ<$ù½K$ÑL0Ã*Š¥ ÔA슕Ŋ$…tõF£ñÆÎ}šmÛ7ì‚Â*¦Ñ“„#Š"³V«}èÔSOÝÞ|F^f£¥B*E›ãhš­°¸Æììì‡È wÂuÝwÏÌÌžó§u9rä‘B¡ð1Bt]¯‹Å/äóù×W*•o(ÖETÂè–fuC±´Âû²41ç_昳 „PéÅb1¶Ñ†æ¢QÅžaŒé D<ÃŽF¨8®¬Dª¨ÕßD)å‹¥…ëׯÿÄñãÇßÁ¿D†—Û¶ý)Ïó]3 Å½d°ÈžsI¡Pxc†_ÄÉq­ÚXQÙš¦%ù @ûa¯69™››{“èwB†aüC½^çý]á;±Z­vûÄÄ„íyÞíõz½ŒÎV|y(íÙç2Ü3ÅÊê¤Á‰•… õ„È‚(8I>ˆ)hÛ󼳯i‘˜ú¤æÒ\,þ0—Lë3nb“6 Ń^ݶ©îØ£ð}ÿËw˲¬žç½PpÖÏ- ›Æ´P‹‹ÏéèL¥I£XZE÷†q›ïûÏáœö‰z½þ6˲þÖ÷ýŘª0ÆìÅE%”:€………gH|«F£ÑxDáGÉR†õ‘kÕæhR—äTªÕ͆œ :€õ¦š÷$÷ýTóÿôöNdÏz*€g¸¨X,¾!‚wA` BÖ°mû^™#žt'P¬¬Ÿ“å4  mݺuc†W´9W–U]\\ÜÀò}ŸeYs‚0™~©‹}-Cð@‹¢HÓ4í«…BáÿA!DŸŸŸ…äYwóZ8 Ä*ìWlÎårÛ Ï 3,\šO¤»®[6 ãÞ‰¢ˆ8Žó»ãããÛšÄL#þ=4Ñš ¸±BÓ{H %K­Bô.nÞ1'ýðCúÑþ  à6ÁAͣߥs”=À0"˲ÃðîJ¥²/ƒ£,¯¦,‘˜r’B±Zï´~ýúgÌÎÎ>Y …QE÷óBæºî1Ó4A°I 2ϰWb=â;’„¤3Íg£Ñx8—ËÝáºîeœ)¸®ûÖ|>u¼œ,QA@u´\.ïp‘@+ÏqGæ«èS…8o³`h/³”Ù1ú éÜÀE"4nø²+ÝRH¢SŽçyyq‹1v«ïûsèþ¨*ëbâ©b#•$h%‘æhžçý¶ä?õ}ßm†U[ÚÐ0Œ€ Š¢gX–õUß÷}Á’øŠèO7óÍÂ0ü¦mÛÛ<ÏÛÊQ»'år¹WøÏÁdÂÞPK{SJÁY\,æóùœã8‘"¸C³ÊF©TrkµÿºU$µ¦ºðúÒaTb’¿ iÚo6w\ãðgÞ0Œ_ÕuýËQ1!’ÈϺStßðEܧɶn³Û·o_àÀ—I¢9yJé[D×uÝŽL× &J¥Òù¾ïß#Ð,$4C„NœÚ ?¦i^oYÖŸø¾Ÿãöbž?>>~8%ºÈ ¨%œËåðšMH¹õ,˜¦ùTÇq˜@>ü-?Ç£ëúû£(jk›P¯×¬EgÍã®ý•öAúZgÉu݃¶mß"ùùÙ¶m_€ä#¤I…™YàËÎYdIKP® ð úí®ðbÏp9€ç0Æ.€ a^š@±d¡IWGsÇqæ ÃøWÃ0øÐ9__«ÕTr”¤¥ ¥ô aóâX|ß.G‹]×­8àhó>¦ëúœ¦i%ñŠÅâEà€¼øw&ʯõI•úúT€šr«mÛó¼°y®AÔŽ²¯¬G ’0²4Íqœ«ú1ÙžçgÆx8º94$­GÖh4 „|SØ_2–˜Ô‚ÈœåÖs«ÕjÕ4Í’u»8ŸÏoQÌu‡W,Ï‚ £M´®ëBží Aµj„%hlñ ürÀBFͶíoÒÞŽRZðRBˆX$kId´"b„HÏ5Ñ&&&.p]·/Ý”(¥Û¶/„¼ORjO@:ºPéº~³mÛeT"©û.ccc7éº.úv¿ŸÏçKâ~‘x†‘ ‚à÷ÅÏÍår3•JåÒ“»Žb­„Q ¤Œûw{F˜@¥Ry —Ëí–iÖb±øt¨ ¨ÊÞ§TK‡ìûŽß‰¢èõÍä£WU_ð-ßÁÒø[üKÅ"îp‡iš H.!„ˆàà“µ€_yç©Àuݺ¦iÿlÛv%#@)ÝÌÌ̃¶m‹E0†á–e½Ã4Íu²4–RUŠãããïuç «¸¹™*¤g°f]‰²v˜JºÖx¹ð2¢é¾K•M€åµåmý!äÿBÞ.æ¹®û2˲ò}¿‘b5²¢ÙàÕgІXJ±ñ…Ÿ¥MOO•Ëå—Kxó·«Õê—pò Æ#^pèº^‚@L=9Û¶íi×uAÞ‘ŠO¥ÉbAxÍÞÚðsg¶X,^†á{ΤgY3 €X–um£Ñx –²,øˆÖÓ,ËúÐØØØM~\­V`…B!O9Rúƹ¹¹s%Öã°ïû·qsßCNºH/×:´Wþ*&@ÒÀ‘V¥°ºF£1[*•n¯ÕjÏ´Q.ŸÏ¿Àµ=Ð)ñ:Àëþÿ³8ÙD(P1å\¢è¥až"X_Ó´ïAÞ­V¬Ýt—iš/ ‚€· D×õgøŠ‚Úi,£¸_Hª¥Ôëõ‡J¥ÒWjµÚ«2‚A¦)”Ëåƒ6løÈüüü_DQÔ& ¾ïOù¾ÿÃ0^ ÜtÔmÆØTóC‡ cšæç]× ‘ñÜK·A¤ÕÚIGV#iQù:À¡ã8?Ìår³Çïé¥Réb$÷éGZ=jˬuçÕ¯i÷...‚ºÎqënîrß'~FE—4w£ÅóçY5(ƒ¼E´Ø&Úó<ï+¶m?œ¢¸Tþg[×Ý'NÜ’Ïç¯á£d¢’k*§M”R8‚R©ô™jµúsd«ÿÜËþWf€¬dÚnʲð½ý(ŠjŒ±›D‡1F‚ ¸J×õ"V¶ÑŽžmlll›ïûÏ83ÆÇÇo–PQPãMVÏ0ŒIÁ¦±±±Ó!Ïj¿g ÐÙ?½­‘Q ]×?bYÖ¢äsÄÆ òšd­ß«Õj7MMM½ß4Ír·“nÛ¶§iÚ5µZm‡ÂòÉz.*;Ùbµy;&“1VérS¡½çC­Æ°”Â’þ&^ÀV[.ÏóÎår÷¹®{>ÿÞžç‘b±øÚz½~ ä©Ñâ3ýæ3‘é`‚‚áwl Ë3]×_C)ˆaGæææ~Ôô;x¿&ØŽ¹©Õj뺾K,ðàyÞEJ±Œ1ÖŒÏåž+F´ø"å:–ÎÏϋſ£”þ¥P<ïÉ!«¨&¸ùÑfffnÏçóÚ¶}U£Ñx¥´”á¿3‚›<Ï+£³ßc¨ˆÈÉ f I kÆš0Ž-LJòã3ËEtFÐk"W¸Å¤üίö:MΑm;r‹öîºb+®¸ ߯ŽïYÇMSÈsܳxÇYì•'¶ù’µúbœ_ÀŸ·–•ñá;r%NÄ¡`møÈ¡ðbŠ8,J$óÇQŽ×Ä`išöß(¥çsáíÛ±TZ6àÖ:žsþ]ÀÉU[! Ó4',˺¸Ñh¯aÅ ‘ƒ§ M*¢ íSˆ@«:S˜U;’€DölÆC–.Â[¤²ÞÛTâ‚E áΚBP¨$jFÐY7LQ!A!²ÍÝP!LšÄˆ݌e}ïCæ@ˆL‰È ¡/‹Ñ7‰£Î–K±Tí x!QÃlR‰”%I ’úH€Ó.YzÖ©,‰ølTBŒ"ñ$Em+uJ}(ñC4A³ tæ}1…p‡Ây Èzÿɤ‘°!Ú÷hïf,›ï@ 8Cg» @ˆ`õE€ Š%(®eQu¢ Ñ~àD̽'йŠòD)ˆ¦‚ÆJJ<a™àˆEup†J(?/!Ô]TEGYÔšz‚ï!ë«‘Tµ]Õ)˜Jœuº‚ÓG¥E„µTixY—ÙHb±‰ÂâF'’„=2ÿ#ê%«¢Û6Б„óóÍ; EŽBžJ4̱Ÿ“µÔ'UŽÊoP)›+¢°Päm«Å†;²Þà*e”Tû‰(À¥ò³D-¯IÖŠIRMÄ¿ç+ŠaŠ(§¨¹©byð©2’U>qÒ­êlÛsKÕšrá:&áçºbÑUBBÝÅVXÑOÈrj‘)ÂÓT1Y2è× NW¤Hq€MR9çLÉR9÷êÚQª®±i§.5n† HŒxŠ›t"ûÐ!?(=[¢¢ìk”@á—mAuÇÚPœªF­ $i ÈÛœ©#KÇV^ÃÊ:õÊ´¼†l ìeÍ#™deçÔe9Bª}£´sÕªæžâgPÉ;$5Ç@9 …)ë-;D¬ª.QJIý¦P²T±Ös$)¢æÒ6È’œf¦p˜ÔM“*ˆ ÈYFáQmú©€Ÿ| ÙŠ<ɺÒν«è¢lŒZß%Œ¤Ì‹ª›qÖr¡I2ÅÖN¥t)z?”IÀ’Žœò4!éxgÖ¾èIi/Y:8eÙðìæyi§ädÂÐkñ´¬S’ñ3áù²¿WíÝd•…$Ó ó­RHZE’Ô5¹gpdˆjQHœvh‰¥<»§öY)@Q P–:Wª±eÑÞYÁÜ-À’>§×wÈ¢DÐż £ÌRSÕY+Éï:«›ô𻲒¤È8aiÊRÞô8¦®"Š1‘eŒ«Ûw”ýœ,ós²¼ëQ~HF€¦Y´nÊGeQ¶=£€¨Lt–ÿKP¶ï™Õšd}éñ3»=¤Åú¸vl…þ¶Û5aŸT ¶kË–ú®¢X½. ëaÂVób«ôylÀ廉Hl™ï@º|OÖÅ3z?äÆú=‡z>ƒ €®ÔE§ãZéyZé“§lµæ_Çè]këb£)]£kt®Ñ5ºF×è]£kt=^¯ÿ~›~r—IEND®B`‚esdl-1.3.1/test/testsprite.erl0000775000070100000120000001510712200143736015005 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : testsprite.erl %%% Author : Dan Gudmundsson %%% Purpose : testing, this code should correspond to the testsprite.c %%% in sdl library %%% Created : 26 Jun 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(testsprite). -author('dgud@dan.du.uab.ericsson.se'). -compile(export_all). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -define(NUM_SPRITES, 100). -define(MAX_SPEED, 1). go() -> go([]). go(Config) -> Server = sdl:init(?SDL_INIT_VIDEO), sdl_util:debug(1), Flags = case lists:member(fullscreen, Config) of true -> ?SDL_ANYFORMAT bor ?SDL_FULLSCREEN bor ?SDL_RESIZABLE; _ -> ?SDL_ANYFORMAT bor ?SDL_RESIZABLE end, ScreenRef = sdl_video:setVideoMode(640, 480, 8, Flags), io:format("Video Driver Name: ~s\n", [sdl_video:videoDriverName()]), Screen = sdl_video:getSurface(ScreenRef), additional_tests(ScreenRef), SpriteRef = load_sprite("icon.bmp"), Sprite = sdl_video:getSurface(SpriteRef), {R1, R2, R3} = erlang:now(), random:seed(R1,R2,R3), Rects = create_rects(?NUM_SPRITES, Sprite#sdl_surface.w, Sprite#sdl_surface.h, Screen#sdl_surface.w, Screen#sdl_surface.h), Vels = [velocity(0,0) || _ <- Rects], Background = sdl_video:mapRGB(Screen, 0, 0, 0), print_info(Screen, Sprite), testblit(Screen, Sprite, Background), timer:sleep(500), {S1, S2, S3} = erlang:now(), NumUpdates = 400, sdl_util:debug(0), moveSprites(NumUpdates, Screen, Sprite, Background, Rects, Vels), {E1, E2, E3} = erlang:now(), S = 100000 * S1 + S2 + S3 / 100000, E = 100000 * E1 + E2 + E3 / 100000, io:format("FPS: ~p\n", [NumUpdates / (E - S)]), sdl:quit(), Background. moveSprites(0, _, _, _,_,_) -> ok; moveSprites(N, Screen, Sprite, Background, Rects, Vels) -> true = sdl_video:fillRect(Screen, null, Background), {Nr, Nv, Updates} = moveSprite(Rects, [], Vels, [], Screen, Sprite, []), DB = (Screen#sdl_surface.flags band ?SDL_DOUBLEBUF), if DB == ?SDL_DOUBLEBUF -> sdl_video:flip(Screen); true -> sdl_video:updateRects(Screen, Updates) end, case sdl_events:pollEvent() of #quit{} -> exit(normal); no_event -> ignore; #mousemotion{} -> ignore; Event -> io:format("Got event ~p~n", [Event]) end, moveSprites(N-1, Screen, Sprite, Background, lists:reverse(Nr), Nv). moveSprite([], RA, [], VA, _, _, Updates) -> {RA, VA, Updates}; moveSprite([R |RTail], RAcc, [{XS,YS}|VTail], VAcc, Screen, Sprite, UAcc) -> TX = R#sdl_rect.x + XS, TY = R#sdl_rect.y + YS, {Nx, Nxs} = if TX < 0; TX >= Screen#sdl_surface.w -> Xvel = -XS, {TX + Xvel, Xvel}; true -> {TX, XS} end, {Ny, Nys} = if TY < 0; TY >= Screen#sdl_surface.h -> Yvel = -YS, {TY + Yvel, Yvel}; true -> {TY, YS} end, NR = R#sdl_rect{x = Nx, y = Ny}, {_, CR} = sdl_video:blitSurface(Sprite, null, Screen, NR), moveSprite(RTail, [NR|RAcc], VTail, [{Nxs, Nys}|VAcc], Screen, Sprite, [CR | UAcc]). testblit(Screen, Sprite, BG) -> Rect = #sdl_rect{x = 0, y = 0, w = Sprite#sdl_surface.w, h = Sprite#sdl_surface.h}, true = sdl_video:fillRect(Screen, null, BG), CR = case sdl_video:blitSurface(Sprite, null, Screen, Rect) of {null, ClippedRect} -> io:format("Blit successfull~n"), ClippedRect; _ -> io:format("Blit failed~n"), ?printError(), exit({error, bad_blit}) end, sdl_video:updateRects(Screen, [CR]), %% It migth have changed Sprite1 = sdl_video:getSurface(Sprite), SpriteFlags = Sprite1#sdl_surface.flags, case ( SpriteFlags band ?SDL_HWACCEL) > 0 of true -> io:format("Sprite blit uses hardware acc~n"); false -> io:format("Sprite blit don't use HW acceleration~n") end, case ( SpriteFlags band ?SDL_RLEACCEL) > 0 of true -> io:format("Sprite blit uses RLE acc~n"); false -> io:format("Sprite blit don't use RLE acceleration~n") end, Sprite1. load_sprite(File) -> SpriteRef = case sdl_video:loadBMP(File) of null -> io:format("Couldn't load BMP file: ~p ~n", [File]), exit(load_bmp); SR -> SR end, Sprite = sdl_video:getSurface(SpriteRef), Pf = sdl_video:getPixelFormat(SpriteRef), case Pf#sdl_pixelformat.palette of null -> io:format("No Palette found ~n"), ignore; Palette -> <> = sdl_video:getPixels(Sprite, #sdl_rect{x = 0, y = 0, w = 1, h = 1}), io:format("Palette found set key ~p to transparent ~n", [Pixel]), true = sdl_video:setColorKey(Sprite, ?SDL_SRCCOLORKEY bor ?SDL_RLEACCEL, Pixel) end, case sdl_video:displayFormat(Sprite) of null -> sdl_video:freeSurface(Sprite), io:format("Failed to convert background~n"), exit({error, convert_failed}); Converted -> sdl_video:freeSurface(Sprite), Converted end. create_rects(0, SpriteW, SpriteH, WinW, WinH) -> []; create_rects(N, SpriteW, SpriteH, WinW, WinH) -> R = #sdl_rect{x = random:uniform(WinW), y = random:uniform(WinH), w = SpriteW, h = SpriteH}, [R | create_rects(N-1, SpriteW, SpriteH, WinW, WinH)]. print_info(Screen, Sprite) -> ScreenFlags = Screen#sdl_surface.flags, SpriteFlags = Sprite#sdl_surface.flags, case ( ScreenFlags band ?SDL_HWSURFACE) > 0 of true -> io:format("Screen is in video memory~n"); false -> io:format("Screen is in system memory~n") end, case ( ScreenFlags band ?SDL_DOUBLEBUF) > 0 of true -> io:format("Screen is doubled buffered~n"); _ -> ignore end, case (SpriteFlags band ?SDL_HWSURFACE) > 0 of true -> io:format("Sprite is in video memory~n"); false -> io:format("Sprite is in system memory~n") end. velocity(0, 0) -> XV = random:uniform(?MAX_SPEED *2 + 1) - (?MAX_SPEED + 1), YV = random:uniform(?MAX_SPEED *2) - (?MAX_SPEED + 1), velocity(XV, YV); velocity(X, Y) -> {X, Y}. additional_tests(Screen) -> PFormat = sdl_video:getPixelFormat(Screen), Palette = sdl_video:getPalette(Screen), io:format("Got a palette with ~p colors~n", [length(Palette)]). esdl-1.3.1/test/testjoy.erl0000775000070100000120000001456112200143736014303 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %%%---------------------------------------------------------------------- %%% File : testjoy.erl %%% Author : %%% Purpose : Test joystick handling %%% Created : 20 Apr 2001 by %%%---------------------------------------------------------------------- -module(testjoy). -author('dgud@erix.ericsson.se'). -compile(export_all). %%-export([Function/Arity, ...]). -include_lib("wx/include/gl.hrl"). -include("sdl.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -include("sdl_events.hrl"). -include("sdl_joystick.hrl"). -define(CUBE, {{ 10.0, 10.0, -10.0}, %1 { 10.0, -10.0, -10.0}, %2 {-10.0, -10.0, -10.0}, {-10.0, 10.0, -10.0}, %4 {-10.0, 10.0, 10.0}, { 10.0, 10.0, 10.0}, %6 { 10.0, -10.0, 10.0}, {-10.0, -10.0, 10.0}}). %8 go() -> go([]). go(Flags) -> init(Flags), Nr = sdl_joystick:numJoysticks(), io:format("Found ~p joysticks ~n", [Nr]), if Nr > 0 -> ok; true -> exit(no_josticks_found) end, PrintName = fun(Index) -> io:format("Joystick ~p: ~s~n", [Index, sdl_joystick:name(Index)]) end, for(PrintName, Nr - 1), JoyI = case lists:keysearch(joystick, 1, Flags) of {value, {joystick, N}} when N < Nr, N >= 0 -> N; _ -> 0 end, Joy = sdl_joystick:open(JoyI), %% sdl_util:debug(19), io:format("Testing joystick ~p: ~n", [JoyI]), io:format("Number of axis ~p: ~n", [sdl_joystick:numAxes(Joy)]), io:format("Number of balls ~p: ~n", [sdl_joystick:numBalls(Joy)]), io:format("Number of hats ~p: ~n", [sdl_joystick:numHats(Joy)]), io:format("Number of buttons ~p: ~n", [sdl_joystick:numButtons(Joy)]), init_video(Flags), Res = (catch test(Joy, {0.0, 0.0, 0.0}, [])), io:format("~p ~n", [Res]), sdl_joystick:close(Joy), sdl:quit(). test(Joy, Pos, Buttons) -> {_, Evs} = sdl_events:peepEvents(sune, 10, ?SDL_GETEVENT, 16#FFFF), {Npos = {NX, NY, NZ}, Nbuttons} = check_joy(Evs, Pos, Buttons), %% io:format("Pressed buttons ~p ~n", [Nbuttons]), gl:loadIdentity(), gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), drawButtons(Nbuttons), gl:loadIdentity(), gl:translatef(-5.0, -5.0, -50.0), draw_cube(), gl:color3f(0.0, 0.0, 1.0), gl:translatef(NX, NY, NZ), gl:'begin'(?GL_LINES), % Draw Cross gl:vertex3f(-1.0, 0.0, 0.0), gl:vertex3f(1.0, 0.0, 0.0), gl:vertex3f(0.0, -1.0, 0.0), gl:vertex3f(0.0, 1.0, 0.0), gl:'end'(), gl:swapBuffers(), case {gl:getError(), sdl:getError()} of {0, ""} -> ok; {GL, SDL} -> io:format("Errors Reported ~p ~s~n", [GL, SDL]) end, timer:sleep(5), test(Joy, Npos, Nbuttons). drawButtons([]) -> ok; drawButtons([H|R]) -> Size = 1.0, X1 = Size * H, X2 = X1 + Size, Y1 = 5.0, Y2 = Y1*2, gl:'begin'(?GL_QUADS), gl:vertex3f(X1 -10, Y1, -20.0), gl:vertex3f(X1 -10, Y2, -20.0), gl:vertex3f(X2 -10, Y2, -20.0), gl:vertex3f(X2 -10, Y1, -20.0), gl:'end'(), drawButtons(R). check_joy([], Pos, B) -> {Pos, B}; check_joy([Ev|R], Pos = {X, Y, Z}, B) -> case Ev of JA when is_record(JA, joyaxis) -> %% io:format("Got ~p ~n", [JA]), NewA = 10 / 32767 * JA#joyaxis.value, case JA#joyaxis.axis of 0 -> check_joy(R, {NewA, Y, Z},B); 1 -> check_joy(R, {X, -NewA, Z},B); 3 -> check_joy(R, {X, Y, -NewA},B); _ -> check_joy(R, Pos, B) %% Ignore end; JB when is_record(JB, joybutton) -> Butt = JB#joybutton.button, %% io:format("Button ~w changed ~n", [Butt]), case JB#joybutton.state of ?SDL_PRESSED -> check_joy(R, Pos, [Butt|B]); ?SDL_RELEASED -> check_joy(R, Pos, lists:delete(Butt, B)) end; #quit{} -> throw(quit); no_event -> check_joy(R, Pos, B); Quit when is_record(Quit, keyboard) -> if Quit#keyboard.sym == ?SDLK_ESCAPE -> throw(quit); Quit#keyboard.sym == ?SDLK_q -> throw(quit); true -> io:format("Got event ~p~n", [Quit]), check_joy(R, Pos, B) end; Event -> io:format("Got ~p ~n", [Event]), check_joy(R, Pos, B) end. draw_cube() -> gl:'begin'(?GL_LINES), gl:color3f(1.0, 0.0, 0.0), gl:vertex3fv(element(1, ?CUBE)), gl:vertex3fv(element(2, ?CUBE)), gl:vertex3fv(element(2, ?CUBE)), gl:vertex3fv(element(3, ?CUBE)), gl:vertex3fv(element(3, ?CUBE)), gl:vertex3fv(element(4, ?CUBE)), gl:vertex3fv(element(4, ?CUBE)), gl:vertex3fv(element(5, ?CUBE)), gl:vertex3fv(element(5, ?CUBE)), gl:vertex3fv(element(8, ?CUBE)), gl:vertex3fv(element(8, ?CUBE)), gl:vertex3fv(element(3, ?CUBE)), gl:vertex3fv(element(1, ?CUBE)), gl:vertex3fv(element(6, ?CUBE)), gl:vertex3fv(element(6, ?CUBE)), gl:vertex3fv(element(7, ?CUBE)), gl:vertex3fv(element(7, ?CUBE)), gl:vertex3fv(element(2, ?CUBE)), gl:vertex3fv(element(6, ?CUBE)), gl:vertex3fv(element(5, ?CUBE)), gl:vertex3fv(element(5, ?CUBE)), gl:vertex3fv(element(8, ?CUBE)), gl:vertex3fv(element(8, ?CUBE)), gl:vertex3fv(element(7, ?CUBE)), gl:vertex3fv(element(6, ?CUBE)), gl:vertex3fv(element(1, ?CUBE)), gl:vertex3fv(element(1, ?CUBE)), gl:vertex3fv(element(4, ?CUBE)), gl:vertex3fv(element(4, ?CUBE)), gl:vertex3fv(element(5, ?CUBE)), gl:vertex3fv(element(7, ?CUBE)), gl:vertex3fv(element(2, ?CUBE)), gl:vertex3fv(element(3, ?CUBE)), gl:vertex3fv(element(8, ?CUBE)), gl:'end'(). for(Fun, N) when N < 0 -> ok; for(Fun, N) -> Fun(N), for(Fun, N-1). init(Config) -> Wrapper = sdl:init(?SDL_INIT_JOYSTICK bor ?SDL_INIT_VIDEO bor ?SDL_INIT_ERLDRIVER), ok. init_video(Config) -> Flags = case lists:member(fullscreen, Config) of true -> ?SDL_OPENGL bor ?SDL_FULLSCREEN; _ -> ?SDL_OPENGL end, sdl_video:setVideoMode(640, 480, 16, Flags), gl:viewport(0,0,640,480), gl:matrixMode(?GL_PROJECTION), gl:loadIdentity(), glu:perspective(40.0, 640/480, 10.0, 80.0), gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), gl:enable(?GL_DEPTH_TEST), gl:depthFunc(?GL_LESS), gl:clearColor(0.9,0.9,0.9,0.0). esdl-1.3.1/test/testgl.erl0000775000070100000120000001500412200143736014075 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : testgl.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 11 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(testgl). -author('dgud@erix.ericsson.se'). -include_lib("wx/include/gl.hrl"). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -export([go/0, go/1]). go() -> go([]). go(Config) -> %% Init sdl:init(?SDL_INIT_VIDEO bor ?SDL_INIT_ERLDRIVER bor ?SDL_INIT_NOPARACHUTE), sdl_util:debug(2), Flags = case lists:member(fullscreen, Config) of true -> ?SDL_OPENGL bor ?SDL_FULLSCREEN; _ -> ?SDL_OPENGL bor ?SDL_RESIZABLE end, sdl_video:gl_setAttribute(?SDL_GL_DOUBLEBUFFER, 1), AvailableWindowedSzs = sdl_video:listModes(null, Flags bor ?SDL_FULLSCREEN), DriverName = sdl_video:videoDriverName(), io:format("Driver ~p ~n", [DriverName]), io:format("Available WindowSizes ~p ~n", [AvailableWindowedSzs]), case AvailableWindowedSzs of [{_, 0,0,W,H}|_] -> Res = [Test || Test <- [32,24,16,15], true == sdl_video:videoModeOK(W,H,Test,Flags)], io:format("A guess at max video res is ~px~p:~p ~n", [W,H, hd(Res)]); _ -> io:format("Can't guess max resolution~n", []) end, SR = sdl_video:setVideoMode(640, 480, 16, Flags), Rs= sdl_video:gl_getAttribute(?SDL_GL_RED_SIZE), Gs= sdl_video:gl_getAttribute(?SDL_GL_GREEN_SIZE), Bs= sdl_video:gl_getAttribute(?SDL_GL_BLUE_SIZE), Ds= sdl_video:gl_getAttribute(?SDL_GL_DEPTH_SIZE), Db= (1 == sdl_video:gl_getAttribute(?SDL_GL_DOUBLEBUFFER)), io:format("OpenGL attributes ~n"), io:format("Sizes in bits Red ~p Green ~p Blue ~p Depth ~p Doublebuffered ~p~n", [Rs, Gs, Bs, Ds, Db]), io:format("Vendor: ~s~n", [gl:getString(?GL_VENDOR)]), io:format("Renderer: ~s~n", [gl:getString(?GL_RENDERER)]), io:format("Version: ~s~n", [gl:getString(?GL_VERSION)]), io:format("GL AUX BUFFERS ~p~n", [hd(gl:getIntegerv(?GL_AUX_BUFFERS))]), io:format("SDL Version ~p~n", [sdl_video:wm_getInfo()]), io:format("Extensions: ~s~n", [gl:getString(?GL_EXTENSIONS)]), io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), io:format("~p~n~n", [catch gl:getConvolutionParameterfv(16#8011, 16#801A)]), sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_IGNORE), sdl_events:eventState(?SDL_KEYDOWN ,?SDL_ENABLE), sdl_events:eventState(?SDL_QUIT ,?SDL_ENABLE), sdl_events:eventState(?SDL_VIDEORESIZE, ?SDL_ENABLE), ?printError(), initWin(), sdl_util:debug(00), Cube = {{ 0.5, 0.5, -0.5}, { 0.5, -0.5, -0.5}, {-0.5, -0.5, -0.5}, {-0.5, 0.5, -0.5}, {-0.5, 0.5, 0.5}, { 0.5, 0.5, 0.5}, { 0.5, -0.5, 0.5}, {-0.5, -0.5, 0.5}}, Colors = {{ 1.0, 1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 1.0, 1.0}, { 1.0, 1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 0.0, 1.0}}, drawBox(Cube, Colors), sdl:quit(), ok. initWin() -> gl:viewport(0,0,640,480), gl:matrixMode(?GL_PROJECTION), gl:loadIdentity(), gl:ortho( -2.0, 2.0, -2.0, 2.0, -20.0, 20.0), gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), gl:enable(?GL_DEPTH_TEST), gl:depthFunc(?GL_LESS), gl:clearColor(0.0,0.0,0.0,1.0). drawBox(Cube, Colors) -> %%timer:sleep(30), gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), gl:'begin'(?GL_QUADS), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:'end'(), gl:matrixMode(?GL_MODELVIEW), gl:rotatef(5.0, 1.0, 1.0, 1.0), case {gl:getError(), sdl:getError()} of {0, ""} -> ok; {GL, ""} -> io:format("Errors Reported ~p => ~n", [GL]), io:format("~s~n", [glu:errorString(GL)]); {GL, SDL} -> io:format("Errors Reported ~p ~s~n", [GL, SDL]) end, sdl_video:gl_swapBuffers(), case check_event() of ok -> timer:sleep(10), drawBox(Cube, Colors); quit -> ok end. check_event() -> case sdl_events:pollEvent() of #quit{} -> quit; #resize{} -> io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), ok; no_event -> ok; #keyboard{sym=$f} -> Surface = sdl_video:getVideoSurface(), io:format("~p\n", [sdl_video:wm_toggleFullScreen(Surface)]), ok; #keyboard{sym=?SDLK_q} -> quit; #keyboard{sym=?SDLK_ESCAPE} -> quit; Event -> io:format("Got event ~p~n", [Event]), ok end. esdl-1.3.1/test/testbin.erl0000775000070100000120000000240112200143736014240 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : testbin.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 12 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(testbin). -author('dgud@erix.ericsson.se'). -compile(export_all). %%-export([Function/Arity, ...]). -include("sdl.hrl"). init() -> go(). go() -> Wrapper = sdl:init(?SDL_INIT_VIDEO), io:format("Wrapper ~p~n", [Wrapper]), F32 = sdl_util:malloc(7, ?SDL_FLOAT), F64 = sdl_util:malloc(7, ?SDL_DOUBLE), Args = [0.0, 1.0, 1000000.0, 0.000001, -1.0, -1000000.0, -0.000001], io:format("E Writing ~f ~f ~f ~f ~f ~f ~f~n", Args), sdl_util:write(F32, Args), sdl_util:write(F64, Args), io:format("Reading~n"), List32 = sdl_util:read(F32, length(Args)), io:format("E Read32 ~f ~f ~f ~f ~f ~f ~f~n", List32), List64 = sdl_util:read(F64, length(Args)), io:format("E Read64 ~f ~f ~f ~f ~f ~f ~f~n", List64), ok. esdl-1.3.1/test/test_glimg.erl0000664000070100000120000002622612200143736014736 0ustar dguduucp%% Copyright (c) 2007 Klas Johansson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : test_glimg.erl %%% Author : Klas Johansson %%% Purpose : Demonstrate the use of SDL_image as OpenGL textures. %%% This is based on testgl.erl (actually test_glfont.erl). %%% Created : 19 Feb 2007 by Klas Johansson %%%---------------------------------------------------------------------- -module(test_glimg). -author('klajo at users.sourceforge.net'). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -include_lib("wx/include/gl.hrl"). -export([go/0, go/1]). -define(def_img_file, "erlang-drop-shadow.png"). go() -> go([]). go(Config) -> %% Init sdl:init(?SDL_INIT_VIDEO bor ?SDL_INIT_ERLDRIVER bor ?SDL_INIT_NOPARACHUTE), sdl_util:debug(1), Flags = case lists:member(fullscreen, Config) of true -> ?SDL_OPENGL bor ?SDL_FULLSCREEN; _ -> ?SDL_OPENGL bor ?SDL_RESIZABLE end, sdl_video:gl_setAttribute(?SDL_GL_DOUBLEBUFFER, 1), AvailableWindowedSzs = sdl_video:listModes(null, Flags bor ?SDL_FULLSCREEN), DriverName = sdl_video:videoDriverName(), io:format("Driver ~p ~n", [DriverName]), io:format("Available WindowSizes ~p ~n", [AvailableWindowedSzs]), case AvailableWindowedSzs of [{_, 0,0,W,H}|_] -> Res = [Test || Test <- [32,24,16,15], true == sdl_video:videoModeOK(W,H,Test,Flags)], io:format("A guess at max video res is ~px~p:~p ~n", [W,H, hd(Res)]); _ -> io:format("Can't guess max resolution~n", []) end, SR = sdl_video:setVideoMode(800, 600, 0, Flags), S = sdl_video:getSurface(SR), Rs= sdl_video:gl_getAttribute(?SDL_GL_RED_SIZE), Gs= sdl_video:gl_getAttribute(?SDL_GL_GREEN_SIZE), Bs= sdl_video:gl_getAttribute(?SDL_GL_BLUE_SIZE), Ds= sdl_video:gl_getAttribute(?SDL_GL_DEPTH_SIZE), Db= (1 == sdl_video:gl_getAttribute(?SDL_GL_DOUBLEBUFFER)), io:format("OpenGL attributes ~n"), io:format("Sizes in bits Red ~p Green ~p Blue ~p Depth ~p Doublebuffered ~p~n", [Rs, Gs, Bs, Ds, Db]), io:format("Vendor: ~s~n", [gl:getString(?GL_VENDOR)]), io:format("Renderer: ~s~n", [gl:getString(?GL_RENDERER)]), io:format("Version: ~s~n", [gl:getString(?GL_VERSION)]), io:format("GL AUX BUFFERS ~p~n", [gl:getIntegerv(?GL_AUX_BUFFERS)]), io:format("SDL Version ~p~n", [sdl_video:wm_getInfo()]), io:format("Extensions: ~s~n", [gl:getString(?GL_EXTENSIONS)]), io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), io:format("~p", [catch gl:getConvolutionParameterfv(16#8011, 16#801A)]), sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_IGNORE), sdl_events:eventState(?SDL_KEYDOWN ,?SDL_ENABLE), sdl_events:eventState(?SDL_QUIT ,?SDL_ENABLE), sdl_events:eventState(?SDL_VIDEORESIZE, ?SDL_ENABLE), sdl_events:eventState(?SDL_MOUSEMOTION, ?SDL_ENABLE), ?printError(), %% Open image and draw it onto an SDL surface ImgRef = sdl_img:load(?def_img_file), Img = sdl_video:getSurface(ImgRef), %% Move this onto an OpenGL texture {Texture, MinX, MinY, MaxX, MaxY} = load_texture(Img), sdl_video:freeSurface(ImgRef), init_win(S), sdl_util:debug(0), Cube = {{ 0.5, 0.5, -0.5}, { 0.5, -0.5, -0.5}, {-0.5, -0.5, -0.5}, {-0.5, 0.5, -0.5}, {-0.5, 0.5, 0.5}, { 0.5, 0.5, 0.5}, { 0.5, -0.5, 0.5}, {-0.5, -0.5, 0.5}}, Colors = {{ 1.0, 1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 1.0, 1.0}, { 1.0, 1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 0.0, 1.0}}, draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, ((S#sdl_surface.w - Img#sdl_surface.w) div 2), ((S#sdl_surface.h - Img#sdl_surface.h) div 2), Img#sdl_surface.w, Img#sdl_surface.h), sdl:quit(), ok. init_win(#sdl_surface{w = W, h = H}) -> Ratio = W/H, gl:viewport(0,0,W,H), gl:matrixMode(?GL_PROJECTION), gl:loadIdentity(), gl:ortho( -2.0*Ratio, 2.0*Ratio, -2.0, 2.0, -20.0, 20.0), gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), gl:enable(?GL_DEPTH_TEST), gl:depthFunc(?GL_LESS), gl:shadeModel(?GL_SMOOTH), gl:clearColor(1.0,1.0,1.0,1.0). draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X, Y, W, H) -> gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), gl:glBegin(?GL_QUADS), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:glEnd(), gl:matrixMode(?GL_MODELVIEW), gl:rotatef(0.1, 1.0, 1.0, 1.0), case {gl:getError(), sdl:getError()} of {0, ""} -> ok; {GL, ""} -> io:format("Errors Reported ~p => ~n", [GL]), io:format("~s~n", [glu:errorString(GL)]); {GL, SDL} -> io:format("Errors Reported ~p ~s~n", [GL, SDL]) end, enter_2d_mode(), gl:bindTexture(?GL_TEXTURE_2D, Texture), gl:'begin'(?GL_TRIANGLE_STRIP), gl:texCoord2f(MinX, MinY), gl:vertex2i(X, Y ), gl:texCoord2f(MaxX, MinY), gl:vertex2i(X+W, Y ), gl:texCoord2f(MinX, MaxY), gl:vertex2i(X, Y+H), gl:texCoord2f(MaxX, MaxY), gl:vertex2i(X+W, Y+H), gl:'end'(), leave_2d_mode(), gl:swapBuffers(), case check_event() of ok -> draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X, Y, W, H); {mouse_moved, MX, MY} -> X2 = MX - W div 2, Y2 = MY - H div 2, draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X2, Y2, W, H); quit -> ok end. check_event() -> case sdl_events:pollEvent() of #quit{} -> quit; #resize{} -> io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), ok; no_event -> ok; #keyboard{sym=$f} -> Surface = sdl_video:getVideoSurface(), io:format("~p\n", [sdl_video:wm_toggleFullScreen(Surface)]), ok; #keyboard{sym=?SDLK_q} -> quit; #keyboard{sym=?SDLK_ESCAPE} -> quit; #mousemotion{x=MX, y=MY} -> {mouse_moved, MX, MY}; Event -> io:format("Got event ~p~n", [Event]), ok end. load_texture(Surface) -> #sdl_surface{w = SW, h = SH, flags = SFlags} = Surface, #sdl_pixelformat{alpha = SAlpha} = sdl_video:getPixelFormat(Surface), %% Use the surface width and height expanded to powers of 2 W = get_power_of_two_roof(Surface#sdl_surface.w), H = get_power_of_two_roof(Surface#sdl_surface.h), MinX = 0, MinY = 0, MaxX = SW / W, MaxY = SH / H, Image = sdl_video:createRGBsurface(?SDL_SWSURFACE, W, H, _Depth=32, 16#FF000000, % createRGBsurface expects 16#00FF0000, % big endian mask values 16#0000FF00, 16#000000FF), %% Save the alpha blending attributes SavedFlags = SFlags band (?SDL_SRCALPHA bor ?SDL_RLEACCELOK), if (SavedFlags band ?SDL_SRCALPHA) == ?SDL_SRCALPHA -> sdl_video:setAlpha(Surface, 0, 0); true -> ok end, %% Copy the surface into the GL texture image Area = #sdl_rect{x = 0, y = 0, w = SW, h = SH}, sdl_video:blitSurface(Surface, Area, Image, Area), Pixels = sdl_video:getPixels(Image, #sdl_rect{x = 0, y = 0, w = W, h = H}), %% Restore the alpha blending attributes if (SavedFlags band ?SDL_SRCALPHA) == ?SDL_SRCALPHA -> sdl_video:setAlpha(Surface, SavedFlags, SAlpha); true -> ok end, %% Create an OpenGL texture for the image [Texture] = gl:genTextures(1), gl:bindTexture(?GL_TEXTURE_2D, Texture), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MAG_FILTER, ?GL_NEAREST), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MIN_FILTER, ?GL_NEAREST), gl:texImage2D(?GL_TEXTURE_2D, 0, ?GL_RGBA, W, H, 0, ?GL_RGBA, ?GL_UNSIGNED_BYTE, Pixels), sdl_video:freeSurface(Image), {Texture, MinX, MinY, MaxX, MaxY}. get_power_of_two_roof(X) -> get_power_of_two_roof_2(1, X). get_power_of_two_roof_2(N, X) when N >= X -> N; get_power_of_two_roof_2(N, X) -> get_power_of_two_roof_2(N*2, X). enter_2d_mode() -> ScreenPtr = sdl_video:getVideoSurface(), Screen = sdl_video:getSurface(ScreenPtr), W = Screen#sdl_surface.w, H = Screen#sdl_surface.h, %% Note, there may be other things you need to change, %% depending on how you have your OpenGL state set up. gl:pushAttrib(?GL_ENABLE_BIT), gl:disable(?GL_DEPTH_TEST), gl:disable(?GL_CULL_FACE), gl:enable(?GL_TEXTURE_2D), %% This allows alpha blending of 2D textures with the scene gl:enable(?GL_BLEND), gl:blendFunc(?GL_SRC_ALPHA, ?GL_ONE_MINUS_SRC_ALPHA), gl:viewport(0, 0, W, H), gl:matrixMode(?GL_PROJECTION), gl:pushMatrix(), gl:loadIdentity(), %% SDL coordinates will be upside-down in the OpenGL world. We'll %% therefore flip the bottom and top coordinates in the orthogonal %% projection to correct this. %% Note: We could flip the texture/image itself, but this will %% also work for mouse coordinates. gl:ortho(0.0, W, H, 0.0, 0.0, 1.0), gl:matrixMode(?GL_MODELVIEW), gl:pushMatrix(), gl:loadIdentity(), gl:texEnvf(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_REPLACE). leave_2d_mode() -> gl:matrixMode(?GL_MODELVIEW), gl:popMatrix(), gl:matrixMode(?GL_PROJECTION), gl:popMatrix(), gl:popAttrib(). esdl-1.3.1/test/test_ttf.erl0000664000070100000120000001476512200143736014441 0ustar dguduucp%% Copyright (c) 2007 Klas Johansson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : test_ttf.erl %%% Author : Klas Johansson %%% Purpose : Testing; this code test various functions of the sdl_ttf API. %%% Created : 29 Jan 2007 by Klas Johansson %%%---------------------------------------------------------------------- -module(test_ttf). -author('klajo at users.sourceforge.net'). -compile(export_all). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -include("sdl_ttf.hrl"). go(FontFile, FontSize) -> go(FontFile, FontSize, []). go(FontFile, FontSize, Config) -> FontStyle = ?SDL_TTF_STYLE_NORMAL, FgColor = #sdl_color{r=0,g=153,b=255}, BgColor = #sdl_color{r=0,g=0,b=0}, TextStr = "The quick brown fox jumped over the lazy dog", Utf8Str = "The quick brown fox jumped over the lazy dog", UnicodeStr = "If you have a compatible font you'll see a Unicode fi-ligature here: " ++ [16#fb01], %% initialization sdl:init(?SDL_INIT_VIDEO), sdl_ttf:init(), sdl_util:debug(1), listen_to_keypress_events(), 1 = sdl_ttf:wasInit(), Flags = case lists:member(fullscreen, Config) of true -> ?SDL_ANYFORMAT bor ?SDL_FULLSCREEN bor ?SDL_RESIZABLE; _ -> ?SDL_ANYFORMAT bor ?SDL_RESIZABLE end, ScreenRef = sdl_video:setVideoMode(640, 480, 8, Flags), Screen = sdl_video:getSurface(ScreenRef), %% non-existing font {'EXIT', _} = (catch sdl_ttf:openFont("/tmp/no-such-font.ttf", 18)), [_|_] = sdl_ttf:getError(), %% the user-specified font F = case (catch sdl_ttf:openFont(FontFile, FontSize)) of {'EXIT', {openFont, returned_null_pointer}} -> exit({error, {failed_to_open_font, sdl_ttf:getError()}}); F0 -> F0 end, %% run the getters (and a couple of setters) io:format("Vsn=~p~n", [sdl_ttf:linkedVersion()]), sdl_ttf:byteSwappedUNICODE(0), sdl_ttf:setFontStyle(F, FontStyle), io:format("getFontStyle=0x~.16b~n", [sdl_ttf:getFontStyle(F)]), io:format("fontHeight=~p~n", [sdl_ttf:fontHeight(F)]), io:format("fontAscent=~p~n", [sdl_ttf:fontAscent(F)]), io:format("fontDescent=~p~n", [sdl_ttf:fontDescent(F)]), io:format("fontLineSkip=~p~n", [sdl_ttf:fontLineSkip(F)]), io:format("fontFaces=~p~n", [sdl_ttf:fontFaces(F)]), io:format("fontFaceIsFixedWidth=~p~n",[sdl_ttf:fontFaceIsFixedWidth(F)]), io:format("fontFaceFamilyName=~p~n", [sdl_ttf:fontFaceFamilyName(F)]), io:format("fontFaceStyleName=~p~n", [sdl_ttf:fontFaceStyleName(F)]), io:format("glyphMetrics=~p~n", [sdl_ttf:glyphMetrics(F, $A)]), io:format("sizeText=~p~n", [sdl_ttf:sizeText(F, "abcd")]), io:format("sizeUTF8=~p~n", [sdl_ttf:sizeUTF8(F, "abcd")]), io:format("sizeUNICODE=~p~n", [sdl_ttf:sizeUNICODE(F, "abcd")]), %% draw some text print_at(Screen, F, TextStr, FgColor, BgColor, latin1, solid, 10, 10), print_at(Screen, F, Utf8Str, FgColor, BgColor, utf8, shaded, 20, 40), print_at(Screen, F, UnicodeStr, FgColor, BgColor, unicode, shaded, 30, 70), %% quit at keypress await_keypress(), sdl_ttf:closeFont(F), sdl:quit(). print_at(Screen, Font, TextStr, FgColor, BgColor, TextEnc, RenderMode, X, Y)-> TextRef = mk_text_surface(Font,TextStr,FgColor,BgColor,TextEnc,RenderMode), Text = sdl_video:getSurface(TextRef), blit_text(Screen, Text, BgColor, X, Y), %% save an image containing the text, just for fun sdl_video:saveBMP(Text, "/tmp/sdl-ttf-test.bmp"), %% set the text free :-) sdl_video:freeSurface(Text). mk_text_surface(Font, TextStr, FgColor, BgColor, TextEnc, RenderMode) -> TextRef = render_text(Font,TextStr,FgColor,BgColor,TextEnc,RenderMode), Text = sdl_video:getSurface(TextRef), PFmt = sdl_video:getPixelFormat(TextRef), case PFmt#sdl_pixelformat.palette of null -> io:format("No Palette found ~n"), ignore; _Palette -> <> = sdl_video:getPixels(Text, #sdl_rect{x = 0, y = 0, w = 1, h = 1}), io:format("Palette found set key ~p to transparent ~n", [Pixel]), true = sdl_video:setColorKey(Text, ?SDL_SRCCOLORKEY bor ?SDL_RLEACCEL, Pixel) end, case sdl_video:displayFormat(Text) of null -> sdl_video:freeSurface(Text), io:format("Failed to convert background~n"), exit({error, convert_failed}); ConvS -> sdl_video:freeSurface(Text), ConvS end. render_text(Font, Text, FgColor, _BgColor, latin1, solid) -> sdl_ttf:renderTextSolid(Font, Text, FgColor); render_text(Font, Text, FgColor, BgColor, latin1, shaded) -> sdl_ttf:renderTextShaded(Font, Text, FgColor, BgColor); render_text(Font, Text, FgColor, _BgColor, latin1, blended) -> sdl_ttf:renderTextBlended(Font, Text, FgColor); render_text(Font, Text, FgColor, _BgColor, utf8, solid) -> sdl_ttf:renderUTF8Solid(Font, Text, FgColor); render_text(Font, Text, FgColor, BgColor, utf8, shaded) -> sdl_ttf:renderUTF8Shaded(Font, Text, FgColor, BgColor); render_text(Font, Text, FgColor, _BgColor, utf8, blended) -> sdl_ttf:renderUTF8Blended(Font, Text, FgColor); render_text(Font, Text, FgColor, _BgColor, unicode, solid) -> sdl_ttf:renderUNICODESolid(Font, Text, FgColor); render_text(Font, Text, FgColor, BgColor, unicode, shaded) -> sdl_ttf:renderUNICODEShaded(Font, Text, FgColor, BgColor); render_text(Font, Text, FgColor, _BgColor, unicode, blended) -> sdl_ttf:renderUNICODEBlended(Font, Text, FgColor). blit_text(Screen, Text, BgColor, X, Y) -> Background = sdl_video:mapRGB(Screen, BgColor#sdl_color.r, BgColor#sdl_color.g, BgColor#sdl_color.b), Rect = #sdl_rect{x = X, y = Y, w = Text#sdl_surface.w, h = Text#sdl_surface.h}, true = sdl_video:fillRect(Screen, null, Background), {null, ClippedRect} = sdl_video:blitSurface(Text, null, Screen, Rect), sdl_video:updateRects(Screen, [ClippedRect]), sdl_video:getSurface(Text). listen_to_keypress_events() -> sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_IGNORE), sdl_events:eventState(?SDL_KEYDOWN ,?SDL_ENABLE), sdl_events:eventState(?SDL_QUIT ,?SDL_ENABLE), ?printError(). await_keypress() -> sdl_events:waitEvent(). esdl-1.3.1/test/Makefile0000775000070100000120000000114412200143736013527 0ustar dguduucp# Copyright (c) 2001 Dan Gudmundsson # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # $Id$ # TestMods = testsprite testgl testbin erldemo testaudio testjoy test_glfont test_ttf test_glimg TestTargets = $(TestMods:%=%.beam) # Targets target: $(TestTargets) clean: rm -f $(TestTargets) rm -f *~ core erl_crash.dump # Rules ESRC = . EBIN = . ERLC = erlc ERLINC = ../include ERL_COMPILE_FLAGS = -pa ../../esdl/ebin %.beam: $(ESRC)/%.erl $(ERLC) -W -I$(ERLINC) -bbeam $(ERL_FLAGS) $(ERL_COMPILE_FLAGS) -o$(EBIN) $< esdl-1.3.1/test/PoweredBump.bmp0000775000070100000120000060006612200143736015030 0ustar dguduucpBM66(: : ///111333444444444333111...///111222222111000$$$$$$000444888;;;===?????????===;;;888444000...444:::???BBBEEEGGGGGGGGGGGGEEEBBB???;;;666111000333555555444222///......000222444555555333000...444:::>>>BBBDDDFFFFFFEEECCC@@@===999444...000222333222000$$$$$$000111111///$$$......$$$333999===???>>>;;;777000000777===CCCIIIMMMQQQSSSUUUUUUUUUSSSPPPMMMHHHCCC===777000444<<>>CCCEEEEEEDDDAAA???<<<::::::<<>>GGGNNNSSSVVVWWWVVVSSSPPPMMMLLLLLLMMMPPPSSSVVVWWWVVVSSSNNNFFF===444$$$666AAAKKKUUU^^^dddiiimmmnnnooonnnkkkhhhccc]]]UUUMMMCCC:::000$$$666???HHHOOOTTTVVVVVVSSSMMMFFF???777///...555===FFFLLLQQQSSSSSSOOOIIIBBB999000222;;;DDDKKKPPPSSSRRROOOIIIAAA888///$$$666AAAKKKTTT\\\bbbdddccc___XXXNNNCCC777$$$444===GGGQQQZZZbbbjjjpppuuuxxx{{{}}}~~~~~~|||zzzvvvrrrlllddd[[[QQQGGG<<<222666BBBNNNZZZeeeooovvv|||€€€‚‚‚ƒƒƒ‚‚‚€€€~~~zzzuuuoooggg^^^TTTIII===222444@@@KKKVVV^^^eeehhhiiihhhfffbbb```^^^^^^___bbbeeehhhiiigggccc]]]TTTIII>>>333555AAANNNZZZeeennnvvv{{{€€€}}}yyytttmmmeee\\\QQQEEE:::000555@@@LLLVVV___dddggggggddd___XXXOOOEEE===555///$$$222:::CCCMMMVVV^^^ccceeeddd```YYYOOODDD999///333>>>IIITTT\\\bbbdddddd```YYYPPPEEE:::000...888CCCOOO[[[fffnnnsssvvvuuuppphhh]]]PPPBBB555$$$666@@@LLLWWWaaakkksss{{{………‰‰‰‹‹‹ŽŽŽŽŽŽ‹‹‹ˆˆˆ„„„~~~wwwnnncccWWWKKK???444222???MMM[[[hhhttt~~~………‹‹‹’’’’’’’’’‰‰‰„„„}}}uuukkk```TTTFFF999...111===JJJXXXcccmmmtttxxxzzzyyywwwtttrrrppppppqqqtttwwwyyyyyywwwrrrkkkaaaUUUGGG:::///111>>>LLLZZZhhhttt}}}………‹‹‹‘‘‘’’’‰‰‰ƒƒƒ|||sssiii]]]PPPCCC777...222===JJJWWWcccmmmssswwwxxxvvvqqqiii```VVVLLLDDD===999888;;;@@@IIISSS]]]gggnnnsssuuutttoooggg\\\PPPCCC777...111<<>>111$$$777BBBNNN[[[fffqqq{{{ƒƒƒ‰‰‰“““–––˜˜˜ššš››››››ššš™™™———“““ŽŽŽˆˆˆttthhh[[[MMM???333888GGGWWWfffttt€€€ŠŠŠ“““™™™ŸŸŸ   ŸŸŸœœœ™™™”””ˆˆˆvvvjjj]]]NNN@@@333777EEETTTcccpppzzz‚‚‚‡‡‡‰‰‰‰‰‰ˆˆˆ………ƒƒƒ‚‚‚„„„†††‡‡‡‡‡‡„„„vvvkkk^^^OOO@@@333$$$888FFFVVVfffttt€€€ŠŠŠ’’’˜˜˜œœœžžžžžž™™™•••ŽŽŽ‡‡‡~~~sssgggYYYKKK>>>333...///777CCCRRRaaannnxxx€€€………†††………{{{rrrhhh^^^UUUNNNIIIHHHKKKQQQYYYcccmmmwww~~~‚‚‚„„„‚‚‚|||ssshhhZZZKKK>>>444///111888EEESSSaaannnxxx~~~‚‚‚}}}vvvlll___QQQDDD:::444444:::DDDQQQ___mmmzzz………ŽŽŽ“““•••”””ŽŽŽ………xxxhhhWWWFFF888$$$$$$666BBBOOO]]]jjjuuu€€€‰‰‰–––ššš   ¡¡¡££££££¤¤¤¤¤¤£££¢¢¢ŸŸŸœœœ–––ŽŽŽ„„„xxxjjj[[[LLL>>>111000>>>NNN___ppp~~~‹‹‹•••¤¤¤¨¨¨ªªªªªª¨¨¨¥¥¥¡¡¡›››•••ŽŽŽ†††|||pppbbbSSSDDD666000===LLL]]]mmmzzz………“““–––———–––”””’’’‘‘‘‘‘‘’’’””””””’’’ˆˆˆsssdddTTTEEE777$$$222>>>NNN___ooo~~~ŠŠŠ•••£££§§§©©©¨¨¨¦¦¦¢¢¢œœœ•••ŽŽŽ„„„yyymmm___PPPBBB777222333;;;HHHXXXhhhvvvŠŠŠ““““““‹‹‹ƒƒƒzzzqqqhhhaaa]]][[[^^^ccckkkttt}}}†††ŒŒŒ‡‡‡~~~qqqbbbSSSDDD999444666>>>LLL[[[kkkxxx‚‚‚‰‰‰ŠŠŠ‚‚‚xxxkkk\\\OOOEEE??????FFFPPP^^^mmm{{{ˆˆˆ“““›››   ¢¢¢   ššš‘‘‘ƒƒƒsss```NNN???333......555@@@NNN\\\jjjwww‚‚‚ŒŒŒ”””šššŸŸŸ¢¢¢¥¥¥¦¦¦§§§§§§¨¨¨©©©©©©ªªª©©©¨¨¨¦¦¦¡¡¡›››’’’‡‡‡yyyjjjYYYIII:::...333CCCTTTfffwww………’’’¥¥¥¬¬¬¯¯¯±±±°°°®®®ªªª¥¥¥ŸŸŸ˜˜˜‘‘‘ˆˆˆ~~~rrreeeVVVFFF888333BBBSSSdddttt‚‚‚ŽŽŽ———¡¡¡££££££¢¢¢   ŸŸŸžžžžžžŸŸŸŸŸŸžžž›››–––ŽŽŽ„„„wwwhhhWWWGGG888...555CCCTTTeeevvv………’’’¥¥¥«««®®®¯¯¯®®®«««¦¦¦   ™™™‘‘‘‡‡‡|||oooaaaSSSDDD999333555===KKK[[[lll{{{‡‡‡‘‘‘˜˜˜œœœžžž™™™“““ŒŒŒ„„„|||uuuqqqoooqqqvvv|||„„„ŒŒŒ”””™™™››››››———………xxxhhhXXXHHH===888:::DDDRRRbbbrrr€€€‹‹‹’’’–––———“““ŒŒŒ‚‚‚uuugggZZZQQQKKKLLLSSS^^^lllzzzˆˆˆ”””ŸŸŸ§§§¬¬¬®®®«««¥¥¥šššŒŒŒ{{{hhhUUUEEE999444666>>>JJJYYYhhhvvvƒƒƒ–––¢¢¢¦¦¦¨¨¨©©©©©©©©©©©©©©©ªªª«««¬¬¬­­­­­­¬¬¬ªªª¥¥¥žžž”””‡‡‡wwwgggUUUDDD555666GGGYYYkkk|||‹‹‹˜˜˜£££«««±±±´´´µµµ´´´°°°«««¦¦¦ŸŸŸ˜˜˜‡‡‡}}}qqqcccTTTEEE777666FFFWWWiiizzz‰‰‰•••ŸŸŸ¦¦¦«««®®®®®®­­­¬¬¬«««ªªªªªª©©©¨¨¨¦¦¦¢¢¢›››’’’‡‡‡xxxhhhWWWFFF888......888GGGYYYkkk|||‹‹‹˜˜˜¢¢¢ªªª°°°³³³³³³±±±­­­§§§   ˜˜˜†††{{{oooaaaRRRDDD999333555>>>LLL]]]nnn~~~‹‹‹–––žžž¤¤¤§§§¨¨¨¦¦¦¡¡¡›››•••ŽŽŽˆˆˆ„„„ƒƒƒ„„„ˆˆˆ”””ššš   ¤¤¤¥¥¥¤¤¤žžž–––ŠŠŠ|||kkkZZZKKK???;;;>>>HHHWWWhhhxxx†††‘‘‘™™™žžž›››”””‹‹‹~~~qqqeee\\\XXXYYY```kkkxxx†††“““ŸŸŸ©©©±±±µµµ···´´´­­­¢¢¢“““‚‚‚ooo\\\KKK@@@;;;>>>GGGUUUdddsss———žžž¤¤¤§§§©©©ªªª©©©©©©¨¨¨§§§§§§©©©ªªª¬¬¬®®®°°°°°°¯¯¯¬¬¬¦¦¦žžž’’’„„„sss```NNN===///999JJJ\\\ooo€€€œœœ§§§¯¯¯µµµ···¸¸¸µµµ±±±«««¤¤¤•••ŒŒŒƒƒƒxxxlll___PPPAAA444999III[[[nnnŽŽŽ›››¥¥¥­­­³³³¶¶¶¸¸¸¸¸¸···¶¶¶µµµ³³³²²²°°°¬¬¬¦¦¦žžž”””‡‡‡wwwfffUUUDDD666$$$///:::JJJ\\\nnn€€€œœœ¦¦¦®®®³³³µµµµµµ²²²¬¬¬¥¥¥•••‹‹‹vvvjjj\\\NNNAAA777222444===KKK]]]nnn™™™¢¢¢ªªª®®®°°°°°°­­­©©©£££žžž™™™•••”””•••˜˜˜œœœ¡¡¡§§§«««­­­­­­ªªª¤¤¤ššš~~~mmm[[[KKK@@@<<<@@@LLL\\\mmm}}}‹‹‹–––žžž£££¤¤¤¡¡¡›››‘‘‘†††zzzooogggdddfffmmmxxx„„„‘‘‘©©©²²²¹¹¹½½½¾¾¾»»»´´´¨¨¨™™™‡‡‡tttaaaQQQFFFBBBFFFPPP___nnn}}}ŠŠŠ•••žžž¤¤¤©©©««««««ªªª¨¨¨¥¥¥¤¤¤££££££¤¤¤§§§ªªª­­­°°°²²²³³³±±±­­­¦¦¦œœœŽŽŽ~~~kkkXXXFFF666:::KKK^^^qqqƒƒƒ’’’ŸŸŸªªª²²²···¹¹¹¹¹¹µµµ°°°©©©¡¡¡™™™‡‡‡}}}rrrfffXXXIII;;;000$$$:::KKK^^^qqq‚‚‚’’’ŸŸŸªªª³³³¹¹¹½½½ÀÀÀÀÀÀÀÀÀ¿¿¿¾¾¾¼¼¼¹¹¹¶¶¶°°°©©©ŸŸŸ“““„„„tttbbbPPP@@@333///;;;LLL^^^qqq‚‚‚‘‘‘žžž¨¨¨°°°´´´¶¶¶´´´°°°©©©¡¡¡———ŽŽŽ„„„yyynnnbbbUUUHHH;;;222///111;;;III[[[mmm~~~ššš¥¥¥­­­³³³¶¶¶¸¸¸···´´´°°°¬¬¬§§§¤¤¤££££££¥¥¥©©©­­­±±±´´´µµµ´´´¯¯¯§§§œœœŽŽŽ}}}kkkZZZJJJ@@@===BBBNNN^^^ppp€€€ŽŽŽššš¢¢¢§§§©©©§§§   ———ŒŒŒwwwqqqooorrryyyƒƒƒŽŽŽ›››¦¦¦±±±¹¹¹ÀÀÀÃÃÃÄÄÄÀÀÀ¸¸¸¬¬¬‹‹‹xxxfffVVVLLLIIINNNYYYhhhwww………’’’œœœ¤¤¤©©©¬¬¬¬¬¬ªªª§§§¤¤¤¡¡¡žžžŸŸŸ¢¢¢¦¦¦ªªª¯¯¯²²²´´´´´´²²²¬¬¬£££———‡‡‡uuuaaaNNN<<<...;;;LLL```sss„„„”””¡¡¡«««³³³¸¸¸ººº¹¹¹µµµ¯¯¯§§§žžž”””‹‹‹vvvkkk]]]OOOBBB555$$$;;;LLL```sss„„„”””¢¢¢­­­¶¶¶¾¾¾ÃÃÃÆÆÆÇÇÇÇÇÇÇÇÇÅÅÅÃÃÿ¿¿ººº³³³ªªªŸŸŸ‘‘‘ppp]]]KKK;;;//////<<>><<>>444///<<>>000...<<>>222222AAASSSfffxxx‰‰‰˜˜˜¥¥¥°°°¹¹¹ÀÀÀÄÄÄÇÇÇÇÇÇÆÆÆÄÄÄÂÂÂÀÀÀÀÀÀÀÀÀÁÁÁÂÂÂÂÂÂÀÀÀ¼¼¼´´´ªªªœœœŒŒŒzzzfffSSSBBB777222555???OOObbbttt†††•••¡¡¡«««±±±´´´µµµ²²²­­­§§§¡¡¡œœœšššššš¡¡¡§§§­­­³³³¹¹¹¿¿¿ÃÃÃÆÆÆÈÈÈÇÇÇ»»»°°°¢¢¢’’’‚‚‚sssiiidddfffnnnyyy‡‡‡”””ŸŸŸ¨¨¨®®®°°°®®®ªªª¢¢¢™™™ˆˆˆ‚‚‚€€€………ŠŠŠ‘‘‘™™™¡¡¡¨¨¨®®®³³³¶¶¶¶¶¶´´´¯¯¯¦¦¦ššš‹‹‹yyyeeeQQQ>>>///...<<>>111...<<>>OOObbbuuu†††•••¢¢¢¬¬¬²²²¶¶¶···µµµ±±±¬¬¬§§§£££      ¢¢¢¦¦¦ªªª¯¯¯´´´¸¸¸½½½ÁÁÁÄÄÄÅÅÅÄÄÄÁÁÁ¹¹¹¯¯¯¡¡¡’’’‚‚‚tttkkkgggjjjrrr}}}‹‹‹———¢¢¢ªªª¯¯¯±±±®®®¨¨¨   –––ŒŒŒƒƒƒ~~~|||~~~‚‚‚ˆˆˆ˜˜˜ŸŸŸ¦¦¦¬¬¬°°°³³³³³³±±±¬¬¬£££˜˜˜‰‰‰wwwdddQQQ>>>///...<<>>OOObbbuuu‡‡‡–––£££­­­´´´¹¹¹ººº¹¹¹¶¶¶²²²­­­ªªª§§§¦¦¦§§§©©©¬¬¬¯¯¯²²²¶¶¶ººº¾¾¾ÁÁÁÂÂÂÁÁÁ¾¾¾···­­­   ‘‘‘‚‚‚uuullliiilllttt€€€™™™¤¤¤«««°°°±±±®®®§§§žžž”””‰‰‰€€€{{{yyyzzz†††•••¤¤¤©©©­­­¯¯¯¯¯¯¬¬¬§§§žžž“““………tttaaaOOO===......<<>>000...===OOObbbvvvˆˆˆ———¥¥¥°°°¹¹¹ÀÀÀÃÃÃÄÄĽ½½···¯¯¯¦¦¦œœœ’’’‡‡‡zzzlll\\\LLL===000///<<>>OOOaaasss„„„“““   «««´´´»»»ÀÀÀÃÃÃÆÆÆÆÆÆÇÇÇÆÆÆÅÅž¾¾¸¸¸°°°¥¥¥———‡‡‡uuuaaaNNN===000...<<>>NNNaaattt………”””ŸŸŸ¨¨¨­­­®®®«««£££———ˆˆˆuuuaaaMMM;;;888HHHZZZlll}}}›››§§§±±±¹¹¹¿¿¿ÃÃÃÆÆÆÈÈÈÉÉÉÈÈÈÇÇÇÃÃþ¾¾···­­­¡¡¡’’’€€€nnnZZZGGG777...<<>>222...222>>>NNNaaattt………”””ŸŸŸ¨¨¨­­­®®®«««£££———‡‡‡uuuaaaLLL:::333AAASSSeeewww‡‡‡–––¢¢¢­­­¶¶¶¾¾¾ÃÃÃÇÇÇÊÊÊËËËÊÊÊÈÈÈÄÄľ¾¾µµµªªªœœœŒŒŒzzzgggSSSAAA222...<<>>NNNaaattt………“““ŸŸŸ¨¨¨­­­®®®«««£££———‡‡‡ttt```LLL:::$$$;;;KKK]]]ooo€€€©©©³³³¼¼¼ÂÂÂÇÇÇÊÊÊÌÌÌËËËÉÉÉÄÄĽ½½³³³§§§˜˜˜†††sss```LLL;;;$$$...<<>>NNNaaattt………“““ŸŸŸ¨¨¨¬¬¬­­­ªªª¢¢¢–––‡‡‡ttt```LLL:::555DDDUUUgggyyy‰‰‰˜˜˜¥¥¥°°°¹¹¹ÀÀÀÆÆÆÊÊÊÌÌÌËËËÉÉÉÃÃû»»°°°£££“““€€€mmmYYYFFF666$$$<<>>NNN```sss„„„’’’žžž§§§¬¬¬¬¬¬©©©¡¡¡–––†††ttt```LLL:::///===NNN```rrrƒƒƒ’’’   «««µµµ¾¾¾ÄÄÄÈÈÈÊÊÊÊÊÊÇÇÇÁÁÁ¸¸¸¬¬¬žžžzzzfffRRR@@@111$$$<<>>000:::LLL___rrr„„„“““¡¡¡¬¬¬´´´ººº¾¾¾¾¾¾¼¼¼¸¸¸²²²«««¢¢¢™™™„„„xxxjjjZZZJJJ;;;///$$$:::LLL___rrr„„„“““   «««´´´ººº¾¾¾¿¿¿¿¿¿¾¾¾¼¼¼ººº¹¹¹···¶¶¶³³³¯¯¯¨¨¨ŸŸŸ“““„„„sss```MMM===222...111<<>>000999JJJ]]]ppp‚‚‚‘‘‘ŸŸŸªªª²²²¸¸¸¼¼¼½½½¼¼¼¸¸¸³³³­­­¦¦¦”””‰‰‰}}}ooo```PPPAAA333999JJJ]]]ppp‘‘‘žžž©©©²²²¸¸¸¼¼¼¾¾¾¾¾¾½½½¼¼¼ººº¸¸¸¶¶¶³³³°°°«««£££™™™~~~mmm[[[III:::///000;;;JJJ\\\nnn˜˜˜   ¥¥¥¦¦¦¢¢¢›››ooo\\\III888999HHHZZZkkk|||ŒŒŒ™™™¥¥¥¯¯¯¶¶¶»»»¾¾¾½½½¹¹¹²²²¨¨¨šššŠŠŠxxxeeeQQQ???000:::KKK^^^qqq‚‚‚’’’ŸŸŸ©©©±±±¶¶¶¸¸¸···³³³¬¬¬£££˜˜˜‚‚‚xxxrrrpppqqqwww‰‰‰’’’›››¢¢¢¦¦¦¦¦¦£££›››‚‚‚rrraaaQQQFFFBBBEEEOOO]]]lll|||ŠŠŠ•••ŸŸŸ¦¦¦«««®®®¯¯¯¯¯¯­­­ªªª§§§¤¤¤¢¢¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡   ™™™’’’‰‰‰}}}ooo```OOO>>>000777HHHZZZmmm~~~ŽŽŽ›››¦¦¦¯¯¯µµµ¹¹¹»»»ººº¸¸¸´´´®®®¨¨¨   ———‚‚‚ttteeeUUUEEE777777GGGZZZmmm~~~ŽŽŽ›››¦¦¦®®®µµµ¹¹¹»»»»»»»»»¹¹¹···µµµ²²²¯¯¯«««¥¥¥’’’†††wwwfffTTTCCC555...888HHHYYYkkk|||‰‰‰”””œœœ   ¡¡¡žžž———ŒŒŒ}}}lllZZZGGG777333AAAQQQcccttt„„„’’’žžž¨¨¨¯¯¯´´´···¶¶¶²²²«««   “““ƒƒƒppp]]]JJJ:::888III[[[nnnŽŽŽššš¤¤¤¬¬¬°°°±±±¯¯¯ªªª£££™™™vvvlllgggeeehhhoooyyy„„„ŽŽŽ———¡¡¡¡¡¡žžž———ŒŒŒ~~~nnn]]]MMMAAA;;;===FFFSSSbbbrrr€€€ŒŒŒ———ŸŸŸ¥¥¥ªªª­­­®®®­­­¬¬¬«««©©©¨¨¨§§§¦¦¦¥¥¥¥¥¥¤¤¤¢¢¢žžž™™™’’’ˆˆˆ|||nnn^^^MMM===///444DDDVVVhhhzzz‰‰‰–––¡¡¡©©©°°°´´´¶¶¶¶¶¶µµµ²²²­­­¨¨¨¡¡¡™™™………xxxiiiYYYIII:::...555DDDVVVhhhyyy‰‰‰–––¡¡¡©©©¯¯¯´´´¶¶¶···¶¶¶µµµ³³³°°°­­­©©©¤¤¤•••ŠŠŠ}}}nnn]]]LLL===000555DDDUUUgggwww„„„———››››››˜˜˜‘‘‘‡‡‡yyyhhhVVVDDD444$$$:::IIIZZZkkk{{{‰‰‰•••ŸŸŸ§§§¬¬¬®®®­­­©©©¢¢¢———ŠŠŠzzzhhhUUUDDD444555EEEWWWiiizzzˆˆˆ”””žžž¤¤¤¨¨¨¨¨¨¦¦¦   ˜˜˜ttthhh___ZZZYYY^^^fffqqq}}}‡‡‡‘‘‘———›››œœœ˜˜˜‘‘‘‡‡‡yyyiiiXXXHHH<<<555666===IIIWWWggguuu‚‚‚———žžž¤¤¤¨¨¨ªªª¬¬¬¬¬¬««««««ªªª©©©¨¨¨§§§¦¦¦¤¤¤¡¡¡———„„„xxxiiiYYYIII:::$$$111@@@QQQccctttƒƒƒššš£££©©©®®®°°°±±±°°°­­­ªªª¥¥¥ŸŸŸ˜˜˜„„„xxxjjjZZZJJJ;;;...222@@@QQQcccsssƒƒƒššš¢¢¢¨¨¨­­­¯¯¯°°°°°°®®®¬¬¬©©©¥¥¥   ›››”””‹‹‹€€€sssdddTTTDDD666222???PPPaaappp~~~ˆˆˆ””””””‘‘‘‹‹‹€€€ssscccQQQ@@@222333@@@PPP```ppp‹‹‹–––£££¥¥¥¤¤¤   ˜˜˜ŽŽŽ€€€ppp^^^MMM<<<...222AAARRRcccsss‚‚‚–––œœœŸŸŸžžž›››•••ŒŒŒtttggg[[[QQQLLLMMMSSS]]]iiiuuu€€€ŠŠŠ”””•••‘‘‘‹‹‹ssscccRRRCCC666///...444>>>LLLZZZiiivvv‚‚‚ŒŒŒ”””›››   ¤¤¤¦¦¦§§§¨¨¨¨¨¨¨¨¨§§§¦¦¦¥¥¥£££¡¡¡˜˜˜‘‘‘‰‰‰~~~qqqcccSSSCCC555$$$;;;KKK[[[lllzzz‡‡‡‘‘‘ššš   ¥¥¥§§§©©©¨¨¨§§§¤¤¤   ššš”””ŒŒŒ‚‚‚vvvhhhXXXIII:::......;;;JJJ[[[kkkzzz‡‡‡‘‘‘™™™   ¤¤¤¦¦¦§§§§§§¥¥¥£££ŸŸŸ›››–––ˆˆˆtttfffXXXIII;;;///...:::IIIYYYhhhuuu€€€‡‡‡‹‹‹ŒŒŒ‰‰‰‚‚‚xxxkkk\\\KKK<<<...888FFFVVVeeettt€€€‹‹‹’’’———™™™˜˜˜”””‚‚‚uuueeeUUUDDD555...<<>>222444AAAPPP^^^kkkuuu|||€€€~~~xxxnnnbbbSSSDDD666000<<>>JJJWWWbbbkkksssyyy}}}€€€‚‚‚‚‚‚‚‚‚€€€~~~zzzvvvooofff\\\PPPDDD777$$$222>>>KKKWWWbbblllsssyyy|||}}}zzzvvvqqqkkkddd\\\RRRHHH>>>444...999DDDOOOWWW]]]aaabbb___ZZZRRRHHH<<<111555@@@LLLWWWaaahhhmmmooonnnjjjdddZZZOOOBBB666333???KKKWWW```gggkkkllljjjeee^^^TTTIII>>>333333===HHHSSS[[[bbbeeefffccc^^^UUUKKK???444555???HHHRRR[[[dddkkkqqqwww{{{~~~€€€€€€~~~{{{vvvqqqjjjbbbXXXNNNCCC888...333>>>HHHRRR[[[bbbhhhllloooqqqqqqqqqpppnnnkkkfff```XXXOOODDD:::///444>>>IIISSS\\\ccchhhkkkmmmnnnmmmkkkhhheee```ZZZSSSKKKCCC:::111555===DDDIIIMMMMMMKKKGGG@@@777...555>>>HHHQQQXXX\\\^^^^^^ZZZTTTKKKAAA777$$$555???IIIQQQWWWZZZ[[[YYYUUUNNNEEE<<<333333<<>>555222:::BBBJJJRRRYYY```eeeiiimmmoooppppppooommmjjjeee```YYYQQQHHH???666...222:::CCCJJJQQQVVVZZZ\\\^^^___^^^^^^\\\YYYUUUPPPIIIAAA888000333;;;DDDKKKQQQVVVYYY[[[\\\[[[YYYVVVSSSNNNHHHBBB;;;444$$$000444666777555222$$$222999AAAGGGKKKMMMLLLIIIDDD===555$$$333;;;AAAGGGJJJJJJIIIDDD???888000000777===BBBDDDEEECCC???999222...444;;;AAAHHHMMMSSSWWWZZZ\\\]]]]]]\\\[[[XXXSSSNNNHHHAAA:::222...555;;;@@@DDDHHHJJJKKKLLLLLLKKKJJJHHHDDD@@@:::444$$$///666;;;@@@DDDGGGIIIIIIHHHGGGDDDAAA===888333...$$$333777:::<<<<<<999555000///444888::::::888555111000333555666444222$$$...333888===AAAEEEHHHJJJKKKKKKJJJHHHFFFBBB===888333$$$...222555888999;;;;;;;;;;;;:::888666222......222555777888888777666444222...$$$......$$$$$$$$$///222555888999:::::::::888666333000$$$............$$$$$$......$$$$$$...///000000000000000000000000/////////......$$$$$$$$$...///000000000000000000//////...$$$000444777:::<<<===>>>>>>>>>>>>?????????>>>>>>>>>>>>>>>======<<<;;;999777444000$$$111555888:::<<<===>>>>>>>>>>>>>>>>>>>>>>>>===<<<:::888555111000777===CCCGGGKKKMMMOOOPPPQQQQQQRRRRRRRRRRRRRRRRRRRRRQQQQQQQQQPPPOOOMMMKKKHHHCCC>>>888111111888>>>DDDHHHKKKMMMOOOPPPPPPQQQQQQQQQQQQQQQQQQPPPOOOMMMJJJFFF@@@:::333222;;;DDDLLLTTTYYY^^^aaaccceeefffggghhhhhhhhhhhhhhhhhhhhhggggggffffffdddbbb___[[[UUUNNNFFF>>>555333<<>>222666CCCPPP\\\gggooowww}}}………‰‰‰‹‹‹‘‘‘‘‘‘‘‘‘‘‘‘ŒŒŒˆˆˆ‚‚‚yyyooocccUUUFFF888$$$333@@@OOO^^^kkkwww‰‰‰–––›››žžž¡¡¡¢¢¢¤¤¤¤¤¤¥¥¥¥¥¥¥¥¥¥¥¥¤¤¤¤¤¤£££¡¡¡ŸŸŸ™™™“““………{{{pppcccUUUFFF888///;;;IIIWWWdddpppyyyˆˆˆŽŽŽ“““———›››   ¡¡¡¢¢¢££££££¢¢¢¡¡¡žžž™™™“““ŠŠŠrrrcccSSSBBB444888GGGWWWggguuuŒŒŒ•••œœœ£££¨¨¨¬¬¬¯¯¯±±±²²²³³³´´´´´´´´´´´´³³³³³³±±±°°°­­­©©©¥¥¥ŸŸŸ———ŽŽŽ„„„xxxkkk\\\LLL===///$$$$$$$$$$$$$$$$$$000===LLL[[[iiiuuu€€€‰‰‰———¢¢¢¦¦¦ªªª­­­¯¯¯°°°±±±²²²±±±°°°­­­¨¨¨¢¢¢™™™ŽŽŽ€€€ppp^^^LLL;;;$$$///<<>>MMM\\\kkkxxxƒƒƒ•••¤¤¤©©©®®®³³³¶¶¶¹¹¹»»»¼¼¼½½½½½½»»»¹¹¹´´´®®®¥¥¥™™™‹‹‹zzzgggTTTAAA222111@@@QQQbbbsss‚‚‚ššš¤¤¤­­­´´´»»»¿¿¿ÃÃÃÆÆÆÇÇÇÈÈÈÉÉÉÉÉÉÉÉÉÉÉÉÈÈÈÇÇÇÅÅž¾¾¹¹¹³³³«««¢¢¢˜˜˜ŒŒŒqqqaaaPPP@@@111$$$000444777;;;>>>BBBEEEHHHKKKMMMNNNPPPPPPQQQQQQPPPOOONNNLLLIIIFFFCCC???<<<888444000...<<>>000$$$222666;;;???DDDHHHMMMQQQUUUYYY\\\___bbbdddeeeffffffffffffeeedddaaa___[[[WWWSSSOOOKKKFFF@@@;;;555000888FFFVVVeeetttŒŒŒ———   ©©©°°°¶¶¶¼¼¼ÁÁÁÅÅÅÈÈÈÊÊÊËËËÌÌÌËËËÈÈÈÄÄĽ½½´´´©©©ššš‰‰‰uuu```KKK999666EEEWWWiiizzz‰‰‰———£££®®®···¿¿¿ÅÅÅÊÊÊÎÎÎÑÑÑÓÓÓÔÔÔÕÕÕÕÕÕÔÔÔÔÔÔÒÒÒÐÐÐÍÍÍÉÉÉÃÃý½½µµµ«««¡¡¡•••ˆˆˆyyyjjjYYYIII:::$$$///555;;;AAAFFFLLLRRRWWW\\\aaafffjjjnnnrrruuuwwwyyy{{{|||}}}}}}}}}|||zzzxxxuuurrrnnnjjjeee```[[[TTTNNNGGG@@@999333...333@@@PPP___nnn|||‰‰‰”””žžž§§§¯¯¯···½½½ÂÂÂÇÇÇÊÊÊÍÍÍÏÏÏÐÐÐÏÏÏÍÍÍÉÉɹ¹¹­­­ŸŸŸyyycccNNN;;;777GGGYYYkkk|||‹‹‹™™™¥¥¥°°°¹¹¹ÁÁÁÈÈÈÍÍÍÑÑÑÔÔÔÖÖÖ××××××××××××ÖÖÖÔÔÔÑÑÑÍÍÍÉÉÉ»»»²²²¨¨¨œœœ‚‚‚ssscccRRRBBB444...555<<>>666...333@@@NNN^^^mmm{{{ˆˆˆ”””ŸŸŸ©©©±±±¹¹¹¿¿¿ÅÅÅÊÊÊÎÎÎÐÐÐÒÒÒÒÒÒÐÐÐÍÍÍÇÇǾ¾¾²²²¤¤¤’’’}}}gggQQQ===$$$888III[[[mmm~~~ŽŽŽœœœ¨¨¨³³³¼¼¼ÄÄÄËËËÐÐÐÔÔÔ×××ÙÙÙÚÚÚÚÚÚÚÚÚØØØÖÖÖÔÔÔÐÐÐÊÊÊÄÄļ¼¼²²²§§§›››ŽŽŽ€€€qqqaaaQQQAAA444111:::CCCMMMVVV___hhhpppxxx………‹‹‹‘‘‘–––›››ŸŸŸ£££¦¦¦©©©«««­­­¯¯¯±±±²²²³³³³³³³³³²²²²²²°°°¯¯¯­­­ªªª§§§£££ŸŸŸššš•••ŽŽŽ‡‡‡wwwnnndddZZZPPPFFF===444$$$777EEETTTcccrrr€€€™™™£££¬¬¬µµµ¼¼¼ÂÂÂÈÈÈÌÌÌÏÏÏÑÑÑÒÒÒÑÑÑÍÍÍÈÈÈ¿¿¿³³³¤¤¤“““~~~hhhQQQ===$$$888III\\\nnnŽŽŽœœœ¨¨¨³³³¼¼¼ÄÄÄËËËÑÑÑÕÕÕØØØÙÙÙÚÚÚÚÚÚÚÚÚØØØÖÖÖÒÒÒÍÍÍÇÇÇÀÀÀ···¬¬¬   “““………vvvfffVVVGGG999$$$666@@@JJJTTT^^^hhhqqqzzz‚‚‚‰‰‰–––œœœ¡¡¡¦¦¦ªªª®®®±±±´´´¶¶¶¹¹¹»»»¼¼¼¾¾¾¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¼¼¼»»»¹¹¹¶¶¶³³³¯¯¯«««¦¦¦¡¡¡ššš“““‹‹‹‚‚‚yyyooodddYYYNNNDDD:::111///;;;IIIXXXhhhwww„„„‘‘‘œœœ¦¦¦°°°¸¸¸¿¿¿ÅÅÅÊÊÊÎÎÎÐÐÐÑÑÑÐÐÐÍÍÍÈÈÈ¿¿¿´´´¥¥¥“““~~~hhhRRR===$$$888III\\\nnnŽŽŽœœœ¨¨¨³³³¼¼¼ÄÄÄËËËÑÑÑÕÕÕ×××ÙÙÙÚÚÚÚÚÚÙÙÙ×××ÔÔÔÐÐÐÊÊÊÃÃúºº°°°¥¥¥˜˜˜ŠŠŠ{{{lll\\\LLL===111111:::EEEOOOZZZeeeoooyyy‚‚‚ŠŠŠ’’’™™™   ¥¥¥«««¯¯¯³³³···ººº½½½ÀÀÀÂÂÂÄÄÄÅÅÅÇÇÇÈÈÈÈÈÈÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÈÈÈÇÇÇÆÆÆÄÄÄÂÂÂÀÀÀ½½½¹¹¹µµµ±±±«««¥¥¥žžž–––„„„yyynnnbbbWWWKKK@@@666$$$333???NNN]]]lll{{{ˆˆˆ•••   ªªª²²²ºººÁÁÁÆÆÆËËËÎÎÎÏÏÏÏÏÏÍÍÍÇÇÇ¿¿¿´´´¥¥¥“““~~~hhhRRR===$$$999III\\\nnnŽŽŽœœœ¨¨¨³³³¼¼¼ÄÄÄËËËÑÑÑÕÕÕ×××ÙÙÙÚÚÚÚÚÚØØØÖÖÖÒÒÒÍÍÍÆÆÆ¾¾¾´´´©©©qqqaaaQQQBBB555333>>>IIITTT```kkkuuu‰‰‰‘‘‘™™™¡¡¡§§§­­­²²²···»»»¿¿¿ÂÂÂÅÅÅÇÇÇÉÉÉËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÎÎÎÍÍÍËËËÉÉÉÇÇÇÄÄÄÁÁÁ¾¾¾¹¹¹´´´®®®§§§   ———ƒƒƒwwwkkk^^^RRRFFF;;;111666CCCQQQaaapppŒŒŒ˜˜˜£££­­­µµµ¼¼¼ÃÃÃÈÈÈËËËÍÍÍÍÍÍËËËÆÆÆ¾¾¾³³³¥¥¥“““~~~hhhRRR>>>$$$999III\\\nnn©©©´´´½½½ÅÅÅÌÌÌÑÑÑÕÕÕØØØÙÙÙÙÙÙÙÙÙ×××ÔÔÔÏÏÏÉÉɹ¹¹®®®¢¢¢•••†††wwwfffVVVFFF888$$$666AAALLLXXXdddppp{{{………ŽŽŽ———ŸŸŸ§§§­­­³³³¹¹¹½½½ÁÁÁÅÅÅÈÈÈÊÊÊÌÌÌÎÎÎÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÓÓÓÒÒÒÑÑÑÏÏÏÍÍÍËËËÈÈÈÄÄÄÀÀÀ»»»¶¶¶¯¯¯¨¨¨ŸŸŸ–––‹‹‹rrreeeXXXKKK???444...999FFFUUUeeeuuuƒƒƒœœœ¦¦¦¯¯¯···¾¾¾ÄÄÄÈÈÈËËËËËËÉÉÉÅÅŽ½½³³³¥¥¥“““iiiRRR>>>$$$999JJJ\\\ooo€€€©©©´´´½½½ÅÅÅÌÌÌÑÑÑÕÕÕØØØÙÙÙÙÙÙØØØÕÕÕÑÑÑÌÌÌÅÅŽ½½³³³§§§šššŒŒŒ}}}lll\\\KKK===000$$$777BBBOOO[[[gggsss~~~‰‰‰“““œœœ¤¤¤«««²²²¸¸¸¾¾¾ÂÂÂÆÆÆÉÉÉÌÌÌÎÎÎÐÐÐÒÒÒÔÔÔÕÕÕÖÖÖÖÖÖ×××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ×××ÖÖÖÕÕÕÔÔÔÓÓÓÑÑÑÏÏÏÍÍÍÉÉÉÆÆÆÁÁÁ¼¼¼¶¶¶®®®¦¦¦œœœ’’’†††yyykkk]]]OOOBBB666$$$000<<>>$$$999JJJ]]]ooo€€€©©©´´´½½½ÅÅÅÌÌÌÑÑÑÕÕÕ×××ØØØØØØÖÖÖÓÓÓÏÏÏÉÉÉÁÁÁ···¬¬¬   ’’’ƒƒƒsssbbbQQQBBB444777BBBOOO\\\iiiuuuŒŒŒ–––ŸŸŸ§§§¯¯¯¶¶¶¼¼¼ÂÂÂÆÆÆÊÊÊÍÍÍÐÐÐÒÒÒÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙØØØ×××ÖÖÖÕÕÕÓÓÓÑÑÑÎÎÎÊÊÊÆÆÆÁÁÁ»»»´´´¬¬¬¢¢¢———ŒŒŒ~~~pppbbbSSSEEE999///333@@@OOO___ooo~~~‹‹‹˜˜˜£££¬¬¬´´´»»»ÁÁÁÄÄÄÆÆÆÅÅÅ»»»±±±£££’’’~~~hhhRRR>>>$$$999JJJ]]]ooo€€€©©©´´´½½½ÅÅÅÌÌÌÑÑÑÔÔÔ×××××××××ÕÕÕÑÑÑÌÌÌÅÅż¼¼±±±¥¥¥˜˜˜‰‰‰yyyhhhWWWGGG888666BBBOOO\\\jjjvvv‚‚‚˜˜˜¡¡¡ªªª²²²¹¹¹¿¿¿ÄÄÄÉÉÉÌÌÌÐÐÐÒÒÒÔÔÔÖÖÖ×××ØØØÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙÙÙØØØ×××ÕÕÕÓÓÓÑÑÑÍÍÍÊÊÊÅÅÅ¿¿¿¸¸¸°°°§§§œœœƒƒƒttteeeVVVHHH;;;000777EEETTTdddtttƒƒƒœœœ¦¦¦¯¯¯···½½½ÁÁÁÃÃÃÃÃÃÀÀÀººº°°°£££’’’~~~hhhRRR>>>$$$999JJJ]]]ooo€€€©©©´´´½½½ÅÅÅËËËÐÐÐÔÔÔÖÖÖ×××ÖÖÖÓÓÓÏÏÏÈÈÈÀÀÀ···«««žžž€€€ooo^^^MMM>>>000444@@@NNN\\\jjjwwwƒƒƒ™™™£££¬¬¬´´´»»»ÁÁÁÆÆÆËËËÏÏÏÒÒÒÕÕÕ×××ØØØÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÙÙÙØØØ×××ÕÕÕÓÓÓÐÐÐÌÌÌÈÈÈÃÃü¼¼´´´«««   ”””†††xxxhhhYYYJJJ===222///<<>>$$$999JJJ]]]ooo€€€©©©´´´½½½ÅÅÅËËËÐÐÐÔÔÔÖÖÖÖÖÖÔÔÔÑÑÑËËËÄÄÄ»»»±±±¤¤¤–––‡‡‡vvveeeTTTCCC555111>>>KKKZZZhhhvvvƒƒƒŽŽŽ™™™£££­­­µµµ¼¼¼ÃÃÃÈÈÈÍÍÍÐÐÐÓÓÓÖÖÖØØØÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÚÚÚÙÙÙØØØ×××ÕÕÕÒÒÒÏÏÏËËËÆÆÆ¿¿¿···®®®£££———‰‰‰zzzkkk[[[LLL>>>222333AAAPPPaaaqqq€€€™™™¤¤¤­­­µµµººº¾¾¾¿¿¿¼¼¼···®®®¡¡¡‘‘‘~~~hhhRRR>>>$$$999JJJ]]]ooo€€€©©©´´´½½½ÅÅÅËËËÐÐÐÓÓÓÕÕÕÕÕÕÒÒÒÎÎÎÈÈÈÀÀÀ¶¶¶«««ŽŽŽ~~~mmm[[[JJJ;;;...///;;;HHHWWWfffttt‚‚‚ŽŽŽ™™™£££­­­µµµ½½½ÄÄÄÉÉÉÎÎÎÑÑÑÔÔÔ×××ÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÚÚÚÙÙÙØØØÖÖÖÔÔÔÑÑÑÍÍÍÈÈÈÁÁÁººº±±±¦¦¦™™™‹‹‹|||lll\\\MMM???333$$$999HHHXXXiiixxx‡‡‡“““žžž¨¨¨°°°¶¶¶ººº¼¼¼ººº¶¶¶­­­¡¡¡‘‘‘}}}hhhRRR>>>$$$999JJJ]]]ooo€€€©©©´´´½½½ÅÅÅËËËÐÐÐÒÒÒÔÔÔÓÓÓÐÐÐËËËÄÄÄ»»»±±±¤¤¤–––†††uuucccQQQAAA333777EEETTTcccrrrŒŒŒ˜˜˜¢¢¢¬¬¬µµµ½½½ÄÄÄÉÉÉÎÎÎÒÒÒÕÕÕ×××ÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÚÚÚÙÙÙ×××ÕÕÕÒÒÒÎÎÎÊÊÊÃÃü¼¼³³³¨¨¨›››~~~nnn]]]MMM???222444BBBRRRbbbrrrŽŽŽššš¤¤¤¬¬¬³³³¸¸¸ººº¹¹¹´´´¬¬¬   }}}hhhRRR>>>$$$999JJJ]]]ooo€€€©©©´´´½½½ÅÅÅËËËÏÏÏÒÒÒÒÒÒÑÑÑÍÍÍÈÈÈÀÀÀ¶¶¶«««ŽŽŽ}}}kkkYYYHHH999444AAAOOO___nnn|||ŠŠŠ–––¡¡¡«««´´´¼¼¼ÃÃÃÉÉÉÎÎÎÒÒÒÕÕÕØØØÙÙÙÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÚÚÚØØØÖÖÖÓÓÓÏÏÏËËËÄÄĽ½½´´´©©©œœœŽŽŽ~~~nnn]]]MMM>>>222111>>>NNN___ooo~~~‹‹‹———¡¡¡ªªª±±±¶¶¶¸¸¸¸¸¸³³³«««ŸŸŸ}}}hhhRRR>>>$$$999JJJ]]]ooo€€€©©©´´´½½½ÄÄÄÊÊÊÎÎÎÐÐÐÑÑÑÏÏÏËËËÄÄļ¼¼±±±¥¥¥–––†††tttbbbPPP???111///<<>>$$$999JJJ]]]ooo€€€©©©´´´½½½ÄÄÄÊÊÊÍÍÍÏÏÏÏÏÏÌÌÌÈÈÈÁÁÁ···«««žžž~~~lllYYYGGG888777EEETTTdddsss‚‚‚›››¦¦¦°°°¹¹¹ÁÁÁÈÈÈÍÍÍÒÒÒÕÕÕØØØÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÚÚÚÙÙÙ×××ÕÕÕÑÑÑÌÌÌÆÆÆ¾¾¾µµµ©©©œœœŽŽŽ~~~lll[[[JJJ;;;///$$$777DDDRRRaaappp~~~‹‹‹–––   ©©©°°°µµµ¸¸¸···³³³«««ŸŸŸ}}}hhhRRR>>>$$$999JJJ]]]ooo€€€©©©´´´½½½ÄÄÄÉÉÉÍÍÍÎÎÎÍÍÍÊÊÊÄÄļ¼¼²²²¥¥¥———‡‡‡uuucccPPP???111222???NNN^^^nnn}}}ŠŠŠ———£££­­­···¿¿¿ÆÆÆÌÌÌÑÑÑÔÔÔ×××ÙÙÙÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÙÙÙ×××ÕÕÕÑÑÑÌÌÌÆÆÆ¾¾¾µµµ©©©œœœ|||kkkYYYHHH999$$$$$$555@@@LLLZZZhhhvvvƒƒƒŽŽŽ™™™£££«««²²²···¹¹¹¸¸¸³³³«««ŸŸŸ}}}hhhRRR>>>$$$999JJJ]]]ooo€€€©©©´´´¼¼¼ÄÄÄÉÉÉÌÌÌÍÍÍËËËÈÈÈÁÁÁ¸¸¸­­­ŸŸŸmmmZZZHHH888$$$999GGGWWWhhhwww†††“““ŸŸŸªªª´´´½½½ÄÄÄËËËÐÐÐÔÔÔ×××ÙÙÙÚÚÚÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÙÙÙØØØÕÕÕÑÑÑÌÌÌÆÆÆ¾¾¾µµµ©©©›››ŒŒŒ{{{iiiWWWFFF777111888BBBLLLXXXeeerrr~~~ŠŠŠ”””žžž§§§¯¯¯µµµ¹¹¹»»»¹¹¹µµµ¬¬¬   }}}hhhRRR>>>$$$999JJJ]]]ooo€€€©©©³³³¼¼¼ÃÃÃÈÈÈËËËËËËÉÉÉÄÄĽ½½³³³§§§™™™‰‰‰wwweeeRRRAAA222333@@@PPP```pppššš¦¦¦°°°ºººÂÂÂÉÉÉÎÎÎÓÓÓÖÖÖÙÙÙÚÚÚÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÚÚÚØØØÕÕÕÑÑÑÌÌÌÆÆÆ¾¾¾´´´¨¨¨™™™ŠŠŠxxxfffTTTCCC555000777???GGGQQQ\\\gggsss~~~‰‰‰“““œœœ¥¥¥­­­´´´¹¹¹½½½¾¾¾¼¼¼¶¶¶­­­¡¡¡‘‘‘}}}hhhRRR>>>...999JJJ]]]ooo€€€©©©³³³¼¼¼ÂÂÂÇÇÇÉÉÉÉÉÉÇÇÇÁÁÁ¹¹¹¯¯¯¢¢¢“““‚‚‚ppp]]]JJJ:::$$$$$$:::IIIYYYiiiyyy‡‡‡•••¡¡¡¬¬¬¶¶¶¿¿¿ÆÆÆÌÌÌÑÑÑÕÕÕØØØÚÚÚÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÚÚÚØØØÕÕÕÑÑÑÌÌÌÅÅŽ½½²²²¦¦¦———‡‡‡uuucccQQQ@@@333000666>>>FFFOOOXXXbbbmmmwww‹‹‹”””¥¥¥­­­´´´ººº¾¾¾ÁÁÁÁÁÁ¾¾¾¸¸¸¯¯¯¢¢¢‘‘‘~~~hhhRRR>>>...999JJJ]]]ooo€€€©©©³³³»»»ÂÂÂÆÆÆÈÈÈÈÈÈÄÄľ¾¾µµµªªªœœœŒŒŒzzzgggUUUCCC444222@@@PPPaaaqqq€€€ŽŽŽ›››§§§±±±»»»ÃÃÃÊÊÊÏÏÏÔÔÔ×××ÙÙÙÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÚÚÚØØØÕÕÕÑÑÑÌÌÌÅÅż¼¼±±±¤¤¤•••„„„rrr```NNN>>>111000666>>>FFFNNNWWWaaajjjttt}}}‡‡‡˜˜˜   ¨¨¨¯¯¯¶¶¶»»»ÀÀÀÄÄÄÅÅÅÄÄÄÁÁÁººº°°°¢¢¢‘‘‘~~~hhhRRR>>>...999JJJ\\\ooo€€€œœœ¨¨¨²²²»»»ÁÁÁÅÅÅÇÇÇÆÆÆÂ»»»±±±¥¥¥–––………sss```MMM<<>>FFFNNNWWWaaajjjsss|||………–––žžž¥¥¥¬¬¬³³³¹¹¹¾¾¾ÃÃÃÆÆÆÉÉÉÉÉÉÇÇÇÃÃü¼¼±±±£££’’’~~~hhhRRR>>>...999JJJ\\\ooo€€€œœœ¨¨¨²²²ºººÀÀÀÄÄÄÅÅÅÃÃþ¾¾···¬¬¬ŸŸŸ~~~kkkXXXFFF666111???OOO```ppp€€€ŽŽŽ›››§§§²²²»»»ÃÃÃÊÊÊÐÐÐÔÔÔ×××ÙÙÙÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÙÙÙ×××ÔÔÔÐÐÐÊÊʸ¸¸­­­ŸŸŸ}}}kkkYYYHHH;;;111000777>>>FFFOOOXXXaaajjjsss|||………•••œœœ¤¤¤«««±±±···¼¼¼ÁÁÁÆÆÆÉÉÉÌÌÌÍÍÍÍÍÍÊÊÊÅÅŽ½½²²²¤¤¤’’’~~~hhhRRR>>>...999JJJ\\\oooŽŽŽœœœ¨¨¨²²²ººº¿¿¿ÃÃÃÃÃÃÁÁÁ¼¼¼³³³¨¨¨ššš‰‰‰wwwdddQQQ???111666EEEVVVgggwww†††”””¡¡¡¬¬¬¶¶¶¿¿¿ÇÇÇÍÍÍÒÒÒÖÖÖØØØÚÚÚÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÙÙÙ×××ÔÔÔÏÏÏÉÉÉÀÀÀ¶¶¶ªªªœœœ‹‹‹zzzhhhWWWHHH===777444555999???FFFOOOXXXaaajjjsss|||………•••œœœ£££ªªª±±±¶¶¶¼¼¼ÁÁÁÅÅÅÉÉÉÍÍÍÏÏÏÐÐÐÑÑÑÏÏÏÌÌÌÇÇǾ¾¾³³³¤¤¤“““~~~hhhRRR>>>...999JJJ\\\oooŽŽŽœœœ§§§±±±¹¹¹¾¾¾ÁÁÁÁÁÁ¾¾¾¸¸¸¯¯¯£££”””ƒƒƒppp]]]JJJ999...;;;KKK]]]nnn~~~ŒŒŒššš¦¦¦±±±ºººÃÃÃÊÊÊÏÏÏÔÔÔ×××ÙÙÙÛÛÛÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÚÚÚÙÙÙÖÖÖÒÒÒÍÍÍÇÇǾ¾¾´´´§§§˜˜˜ˆˆˆwwwgggYYYNNNGGGDDDEEEIIIPPPXXXaaajjjsss|||………•••œœœ£££ªªª°°°¶¶¶»»»ÀÀÀÅÅÅÉÉÉÌÌÌÏÏÏÒÒÒÓÓÓÔÔÔÓÓÓÒÒÒÎÎÎÈÈÈ¿¿¿´´´¥¥¥“““~~~hhhRRR>>>...999JJJ\\\oooŽŽŽ›››§§§°°°¸¸¸½½½¿¿¿¿¿¿»»»µµµ«««žžž}}}jjjVVVDDD444333AAARRRcccttt„„„’’’ŸŸŸªªªµµµ¾¾¾ÆÆÆÌÌÌÒÒÒÕÕÕØØØÚÚÚÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÛÛÛÚÚÚØØØÕÕÕÒÒÒÌÌÌÅÅż¼¼±±±¤¤¤–––‡‡‡xxxkkk```YYYVVVXXX\\\bbbjjjsss|||………•••œœœ£££ªªª°°°¶¶¶»»»ÀÀÀÄÄÄÈÈÈÌÌÌÏÏÏÒÒÒÔÔÔÕÕÕÖÖÖ×××ÖÖÖÔÔÔÐÐÐÉÉÉÀÀÀ´´´¥¥¥“““iiiRRR>>>......///...:::JJJ]]]oooŽŽŽ›››§§§°°°···¼¼¼¾¾¾½½½¸¸¸±±±¦¦¦™™™‰‰‰vvvcccOOO>>>///777FFFXXXiiizzz‰‰‰———£££¯¯¯¹¹¹ÁÁÁÈÈÈÎÎÎÓÓÓ×××ÙÙÙÛÛÛÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÛÛÛÚÚÚØØØÕÕÕÐÐÐËËËÃÃúºº¯¯¯£££–––‰‰‰}}}sssmmmjjjkkkooouuu}}}………•••œœœ£££ªªª°°°¶¶¶»»»ÀÀÀÄÄÄÈÈÈÌÌÌÏÏÏÑÑÑÔÔÔÖÖÖ×××ØØØÙÙÙØØØ×××ÕÕÕÐÐÐÊÊÊÁÁÁµµµ¥¥¥“““iiiRRR>>>...000555999;;;;;;888333$$$$$$:::KKK]]]ooo€€€ŽŽŽ›››¦¦¦¯¯¯¶¶¶ººº¼¼¼ººº¶¶¶®®®¢¢¢”””ƒƒƒppp\\\III888...<<>>...222:::BBBGGGIIIHHHEEE???777///...<<>>...111;;;EEENNNTTTWWWVVVRRRKKKAAA777...000???PPPaaasss‚‚‚œœœ§§§¯¯¯µµµ¹¹¹¹¹¹···±±±¨¨¨›››ŒŒŒyyyeeeQQQ???000555DDDVVVhhhyyyˆˆˆ———£££¯¯¯¹¹¹ÁÁÁÉÉÉÏÏÏÓÓÓ×××ÙÙÙÛÛÛÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÛÛÛÚÚÚØØØÖÖÖÒÒÒÎÎÎÈÈÈÁÁÁººº²²²«««¦¦¦¢¢¢      £££¦¦¦«««°°°¶¶¶»»»ÀÀÀÄÄÄÈÈÈÌÌÌÏÏÏÒÒÒÔÔÔÖÖÖØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÙÙÙÖÖÖÑÑÑÊÊÊÁÁÁµµµ¦¦¦”””iiiSSS>>>...777DDDOOOYYY```cccbbb^^^VVVLLL@@@444333BBBTTTeeevvv………’’’žžž¨¨¨°°°¶¶¶¹¹¹¹¹¹¶¶¶°°°¦¦¦™™™‰‰‰vvvbbbMMM;;;$$$888HHHZZZlll}}}ŒŒŒššš§§§²²²¼¼¼ÄÄÄËËËÐÐÐÔÔÔØØØÚÚÚÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÛÛÛÚÚÚØØØÕÕÕÒÒÒÎÎÎÉÉÉÃÃý½½···³³³¯¯¯®®®®®®°°°³³³···¼¼¼ÀÀÀÄÄÄÈÈÈÌÌÌÏÏÏÒÒÒÔÔÔÖÖÖØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÙÙÙÖÖÖÒÒÒËË˵µµ¦¦¦”””iiiSSS>>>...111===KKKXXXbbbiiimmmlllhhh```UUUHHH;;;///888GGGYYYjjjzzz‰‰‰–––¡¡¡ªªª²²²···ºººººº···°°°¦¦¦™™™ˆˆˆuuu```LLL:::$$$;;;LLL^^^ppp©©©´´´¾¾¾ÆÆÆÌÌÌÑÑÑÕÕÕØØØÚÚÚÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÛÛÛÚÚÚØØØÕÕÕÒÒÒÎÎÎÊÊÊÅÅÅÁÁÁ½½½»»»ººº»»»¼¼¼¿¿¿ÂÂÂÅÅÅÉÉÉÌÌÌÏÏÏÒÒÒÔÔÔÖÖÖØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÛÛÛÚÚÚ×××ÒÒÒËË˵µµ¦¦¦”””iiiSSS>>>...444BBBQQQ___iiiqqqttttttoooggg\\\OOO@@@333000>>>NNN___ppp™™™¤¤¤­­­´´´¹¹¹¼¼¼¼¼¼¸¸¸²²²¨¨¨ššš‰‰‰vvvaaaMMM;;;...000???PPPbbbsss„„„“““   ¬¬¬¶¶¶¿¿¿ÇÇÇÍÍÍÒÒÒÖÖÖØØØÚÚÚÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÛÛÛÚÚÚØØØÕÕÕÓÓÓÏÏÏÌÌÌÉÉÉÇÇÇÅÅÅÄÄÄÄÄÄÆÆÆÇÇÇÊÊÊÍÍÍÏÏÏÒÒÒÔÔÔÖÖÖØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÚÚÚ×××ÒÒÒËË˶¶¶§§§”””iiiSSS>>>...777FFFUUUcccnnnvvvzzzyyyuuunnnbbbTTTEEE777555DDDTTTfffvvv………’’’§§§°°°···¼¼¼¾¾¾¾¾¾»»»µµµ«««zzzfffRRR@@@222$$$...$$$555CCCTTTfffwww‡‡‡•••¢¢¢®®®¸¸¸ÁÁÁÈÈÈÎÎÎÓÓÓÖÖÖÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÛÛÛÙÙÙØØØÖÖÖÔÔÔÒÒÒÏÏÏÎÎÎÍÍÍÌÌÌÌÌÌÍÍÍÏÏÏÐÐÐÒÒÒÔÔÔÖÖÖØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÜÜÜÚÚÚ×××ÒÒÒËË˶¶¶§§§”””iiiSSS>>>...999HHHXXXfffrrrzzz~~~~~~zzzrrrgggYYYIII:::......;;;JJJ[[[lll|||ŠŠŠ———¢¢¢«««³³³ººº¾¾¾ÁÁÁÁÁÁ¾¾¾¸¸¸¯¯¯¢¢¢’’’€€€lllXXXFFF888000///444888;;;<<<;;;888444///...///...$$$000:::HHHYYYjjj{{{ŠŠŠ˜˜˜¤¤¤¯¯¯¹¹¹ÁÁÁÈÈÈÎÎÎÓÓÓÖÖÖÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÚÚÚÙÙÙ×××ÖÖÖÔÔÔÓÓÓÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÜÜÜÚÚÚ×××ÒÒÒËË˶¶¶§§§”””iiiSSS>>>...999IIIYYYhhhttt|||€€€}}}vvvkkk\\\MMM===000222@@@PPPbbbsss‚‚‚œœœ¦¦¦¯¯¯···½½½ÁÁÁÃÃÃÃÃÃÁÁÁ»»»³³³§§§˜˜˜‡‡‡tttaaaPPPBBB999666888<<>>CCCFFFHHHJJJJJJKKKLLLOOOTTT[[[eeeppp|||ˆˆˆ“““žžž©©©²²²ºººÁÁÁÇÇÇÌÌÌÐÐÐÓÓÓÖÖÖØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÜÜÜÚÚÚ×××ÒÒÒËË˶¶¶§§§•••€€€jjjTTT@@@000888HHHXXXhhhttt~~~ƒƒƒ………ƒƒƒ|||rrreeeVVVFFF888///000;;;KKK^^^pppœœœ§§§°°°···½½½ÂÂÂÅÅÅÈÈÈÈÈÈÈÈÈÄÄÄ¿¿¿···¬¬¬žžž€€€rrrgggaaa```cccjjjrrrzzz‚‚‚‚‚‚yyyrrrkkkddd___^^^___ccciiinnnsssuuuuuurrrllldddYYYNNNAAA666$$$555>>>FFFNNNSSSWWWZZZ[[[\\\\\\]]]___ccchhhpppyyyƒƒƒ———¡¡¡ªªª²²²¹¹¹ÀÀÀÅÅÅÊÊÊÎÎÎÒÒÒÕÕÕ×××ØØØÙÙÙÚÚÚÚÚÚÙÙÙØØØØØØ×××ÖÖÖÖÖÖÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßßßßßßßßßÞÞÞÞÞÞÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÝÝÝÛÛÛÙÙÙÖÖÖÑÑÑÊÊÊÁÁÁµµµ¦¦¦”””€€€jjjTTT@@@000$$$......$$$777GGGWWWgggttt~~~„„„†††„„„uuuiiiZZZJJJ<<<222///333>>>MMM```rrrƒƒƒ’’’žžž¨¨¨±±±¸¸¸¾¾¾ÂÂÂÆÆÆÈÈÈÉÉÉÈÈÈÆÆÆÂ»»»±±±¥¥¥———‰‰‰|||sssmmmlllpppwww€€€ˆˆˆŽŽŽ‘‘‘’’’‹‹‹„„„|||uuupppnnnppptttyyy„„„‡‡‡‡‡‡„„„~~~uuujjj]]]OOOAAA555$$$...777AAALLLVVV^^^dddiiikkkllllllllllllnnnpppuuu{{{‚‚‚ŠŠŠ“““›››£££«««³³³¹¹¹¿¿¿ÄÄÄÉÉÉÍÍÍÑÑÑÓÓÓÖÖÖ×××ØØØÙÙÙÙÙÙØØØ×××ÖÖÖÕÕÕÔÔÔÔÔÔÔÔÔÕÕÕÖÖÖ×××ÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞÞÞÞßßßßßßßßßßßßßßßÞÞÞÞÞÞÝÝÝÜÜÜÜÜÜÛÛÛÚÚÚÚÚÚÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÙÙÙØØØØØØØØØØØØØØØÙÙÙÚÚÚÚÚÚÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÝÝÝÜÜÜÛÛÛÙÙÙÖÖÖÑÑÑÊÊÊÁÁÁµµµ¦¦¦”””€€€jjjTTT@@@222...222666999;;;;;;:::888444///666EEEVVVfffsss}}}„„„‡‡‡†††xxxlll^^^NNN@@@666222555???OOOaaattt………“““ŸŸŸªªª²²²¹¹¹¾¾¾ÂÂÂÅÅÅÇÇÇÈÈÈÈÈÈÆÆÆÃÃý½½µµµªªªžžž‘‘‘………|||wwwwww{{{‚‚‚ŠŠŠ“““™™™žžžŸŸŸ™™™“““‹‹‹………€€€~~~ƒƒƒˆˆˆŽŽŽ“““–––———”””ŽŽŽ†††zzzlll]]]MMM@@@666111222888BBBNNNZZZeeennntttxxx{{{{{{{{{zzzzzzzzz|||„„„ŠŠŠ˜˜˜ŸŸŸ¦¦¦­­­´´´¹¹¹¿¿¿ÃÃÃÈÈÈÌÌÌÏÏÏÒÒÒÔÔÔÖÖÖ×××ØØØØØØ×××ÕÕÕÔÔÔÓÓÓÒÒÒÑÑÑÒÒÒÓÓÓÔÔÔÖÖÖ×××ÙÙÙÚÚÚÜÜÜÝÝÝÝÝÝÞÞÞßßßßßßßßßßßßßßßÞÞÞÝÝÝÝÝÝÜÜÜÛÛÛÚÚÚÙÙÙØØØ××××××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×××ØØØØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÚÚÚÚÚÚÙÙÙØØØ×××ÖÖÖÖÖÖÖÖÖ××××××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÝÝÝÜÜÜÛÛÛÙÙÙÖÖÖÑÑÑÊÊÊÁÁÁµµµ¦¦¦”””€€€jjjTTTBBB444$$$333999@@@EEEIIIKKKKKKIIIFFFBBB<<<555...444CCCTTTdddrrr}}}„„„ˆˆˆˆˆˆ„„„|||qqqcccTTTFFF;;;666888AAAPPPbbbttt………”””   ªªª²²²¹¹¹¾¾¾ÁÁÁÄÄÄÆÆÆÇÇÇÇÇÇÆÆÆÃÃþ¾¾···®®®£££———„„„€€€ƒƒƒ‹‹‹“““œœœ£££¨¨¨ªªª©©©¥¥¥ŸŸŸ™™™’’’‹‹‹ŒŒŒ•••›››   £££¤¤¤¢¢¢œœœ”””ˆˆˆzzzjjjYYYKKK@@@;;;<<>>FFFNNNTTTXXXZZZ[[[YYYVVVQQQKKKBBB999000333AAARRRbbbqqq}}}………‰‰‰ŠŠŠ‡‡‡€€€wwwjjj\\\NNNBBB<<<<<>>000///===NNN___ppp~~~‰‰‰’’’˜˜˜›››œœœ›››˜˜˜“““ŽŽŽˆˆˆƒƒƒ||||||~~~ƒƒƒŠŠŠ’’’ššš¡¡¡§§§«««¬¬¬­­­¬¬¬ªªª©©©©©©ªªªªªª««««««©©©¦¦¦¢¢¢ššš˜˜˜šššžžž¤¤¤¬¬¬³³³ººº¿¿¿ÂÂÂÄÄÄÅÅÅÆÆÆÅÅÅÅÅÅÅÅÅÄÄÄÄÄÄÄÄÄÂÂÂÁÁÁ¿¿¿½½½ººº···´´´¯¯¯¨¨¨¡¡¡˜˜˜ˆˆˆƒƒƒ‚‚‚………ŒŒŒ•••ŸŸŸ¨¨¨¯¯¯´´´µµµ³³³®®®¨¨¨¡¡¡ššš•••““““““–––ššš   ¦¦¦¬¬¬±±±¶¶¶¹¹¹¼¼¼¾¾¾ÀÀÀÃÃÃÆÆÆÉÉÉÍÍÍÑÑÑÕÕÕÙÙÙÛÛÛÜÜÜÛÛÛÙÙÙÕÕÕÐÐÐËËËÆÆÆÃÃÃÂÂÂÂÂÂÄÄÄÇÇÇÊÊÊÎÎÎÑÑÑÔÔÔÖÖÖØØØÛÛÛÝÝÝÞÞÞßßßßßßßßßÝÝÝÚÚÚÖÖÖÓÓÓÏÏÏÍÍÍËËËËËËËËËÌÌÌÍÍÍÎÎÎÎÎÎÎÎÎÍÍÍÌÌÌËËËÉÉÉÈÈÈÇÇÇÇÇÇÈÈÈÊÊÊÍÍÍÐÐÐÓÓÓÖÖÖØØØÙÙÙÙÙÙØØØ×××ÕÕÕÓÓÓÑÑÑÐÐÐÐÐÐÑÑÑÒÒÒÔÔÔÕÕÕ×××ØØØØØØÖÖÖÔÔÔÑÑÑÍÍÍÉÉÉÇÇÇÅÅÅÅÅÅÆÆÆÈÈÈËËËÍÍÍÐÐÐÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××ØØØØØØÙÙÙÙÙÙØØØ×××ÕÕÕÓÓÓÏÏÏËËËÅÅž¾¾¶¶¶¬¬¬   ’’’ooo\\\LLLAAA<<>>000333BBBRRRbbbppp{{{ƒƒƒˆˆˆ‹‹‹ŒŒŒŒŒŒŒŒŒŽŽŽ‘‘‘’’’“““•••———œœœ¡¡¡¦¦¦¬¬¬°°°³³³µµµµµµµµµ³³³±±±¯¯¯¬¬¬©©©¥¥¥   œœœ———”””“““•••™™™ŸŸŸ¥¥¥«««°°°³³³µµµ¶¶¶¶¶¶¶¶¶···¸¸¸¸¸¸¸¸¸···µµµ±±±­­­¨¨¨¤¤¤¡¡¡   ¡¡¡¢¢¢¤¤¤¤¤¤£££ŸŸŸššš”””‹‹‹‹‹‹ŽŽŽ”””›››¢¢¢¨¨¨¬¬¬­­­ªªª¥¥¥žžž–––ŠŠŠˆˆˆŠŠŠ–––žžž¦¦¦¬¬¬¯¯¯°°°¯¯¯¬¬¬§§§£££ŸŸŸžžžŸŸŸ£££¨¨¨®®®µµµººº¾¾¾ÀÀÀ¿¿¿¼¼¼¶¶¶¯¯¯¨¨¨   ššš–––”””“““”””———›››ŸŸŸ¥¥¥«««²²²¸¸¸¾¾¾ÂÂÂÄÄÄÅÅÅÃÃÿ¿¿ººº´´´¯¯¯ªªª¨¨¨¨¨¨©©©¬¬¬°°°³³³¶¶¶¸¸¸¸¸¸···´´´°°°­­­ªªªªªª«««®®®²²²···¼¼¼¿¿¿¿¿¿¾¾¾ººº´´´­­­¦¦¦   œœœžžž¢¢¢§§§­­­³³³¹¹¹¼¼¼½½½¼¼¼¸¸¸³³³«««£££›››•••‹‹‹‹‹‹ŒŒŒŽŽŽ‘‘‘’’’”””———›››ŸŸŸ¤¤¤ªªª°°°¶¶¶»»»ÀÀÀÄÄÄÇÇÇÉÉÉÊÊÊËËËËËËÊÊÊÈÈÈÅÅÅ¿¿¿¸¸¸¯¯¯¤¤¤ššš‘‘‘ŠŠŠ††††††ˆˆˆ‹‹‹’’’”””–––———–––•••’’’†††{{{nnn^^^MMM<<<...111???OOO___mmmxxx†††‰‰‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽ’’’“““•••———šššžžž£££¨¨¨­­­²²²¶¶¶¸¸¸¸¸¸···µµµ²²²¯¯¯«««§§§¢¢¢˜˜˜”””‘‘‘‘‘‘“““———£££©©©®®®±±±³³³³³³²²²²²²²²²²²²²²²²²²±±±®®®«««¦¦¦¢¢¢žžžœœœœœœžžž   £££¤¤¤¤¤¤¡¡¡œœœ–––ŒŒŒ‹‹‹‘‘‘˜˜˜ŸŸŸ¦¦¦ªªª«««©©©¥¥¥žžž–––‰‰‰‡‡‡ˆˆˆŒŒŒ“““›››£££©©©­­­®®®¬¬¬¨¨¨£££žžž™™™———˜˜˜›››¡¡¡¨¨¨¯¯¯µµµººº¼¼¼¼¼¼ºººµµµ®®®¦¦¦–––‘‘‘ŒŒŒŒŒŒŽŽŽ’’’———œœœ£££ªªª²²²¸¸¸½½½ÀÀÀÁÁÁ¿¿¿»»»¶¶¶¯¯¯©©©¤¤¤¢¢¢¡¡¡£££¦¦¦ªªª®®®²²²´´´µµµ´´´±±±­­­©©©¦¦¦¤¤¤¥¥¥¨¨¨­­­²²²···ººº»»»ººº¶¶¶°°°¨¨¨   ™™™•••“““•••™™™ŸŸŸ¦¦¦­­­³³³···¹¹¹¸¸¸µµµ¯¯¯§§§”””ŒŒŒ………€€€}}}||||||}}}~~~‚‚‚„„„‡‡‡ŠŠŠ•••›››¢¢¢©©©°°°¶¶¶¼¼¼ÀÀÀÄÄÄÇÇÇÉÉÉÊÊÊËËËËËËÊÊÊÇÇÇÃÃý½½´´´«««¡¡¡———ŒŒŒ‹‹‹ŒŒŒŽŽŽ‘‘‘“““•••••••••”””’’’ŠŠŠ‚‚‚xxxjjjZZZJJJ:::...;;;KKK[[[jjjvvv~~~„„„ˆˆˆ‰‰‰ŠŠŠ‰‰‰‰‰‰ŠŠŠ‹‹‹’’’•••———™™™œœœ   ¤¤¤ªªª¯¯¯³³³···¹¹¹ººº¸¸¸¶¶¶²²²®®®©©©¤¤¤žžž™™™”””•••›››¡¡¡§§§¬¬¬®®®¯¯¯¯¯¯®®®¬¬¬¬¬¬««««««ªªª©©©¦¦¦£££ŸŸŸœœœ™™™———˜˜˜›››žžž¡¡¡¤¤¤¤¤¤¢¢¢žžž˜˜˜’’’‹‹‹ŒŒŒ•••œœœ£££¨¨¨ªªª©©©¥¥¥ŸŸŸ———ŠŠŠ‡‡‡‡‡‡ŠŠŠ‘‘‘˜˜˜   ¦¦¦ªªª«««©©©¥¥¥ŸŸŸ™™™“““‘‘‘‘‘‘”””ššš¡¡¡©©©±±±¶¶¶ººº»»»¹¹¹´´´­­­¥¥¥œœœ”””ŽŽŽŠŠŠ‡‡‡‡‡‡ˆˆˆ‹‹‹•••œœœ¤¤¤«««²²²¸¸¸¼¼¼½½½¼¼¼¸¸¸²²²«««¤¤¤žžž›››šššœœœ   ¤¤¤ªªª®®®±±±²²²±±±®®®ªªª¥¥¥¡¡¡ŸŸŸ   £££§§§­­­²²²¶¶¶¸¸¸···³³³¬¬¬¤¤¤›››“““ŽŽŽ‹‹‹ŒŒŒ‘‘‘———ŸŸŸ¦¦¦­­­²²²µµµ´´´±±±ªªª¢¢¢———ŒŒŒ‚‚‚yyyrrrnnnlllllllllmmmoooppprrrtttxxx}}}ƒƒƒŠŠŠ’’’ššš¢¢¢ªªª²²²¸¸¸½½½ÂÂÂÅÅÅÈÈÈÊÊÊËËËËËËËËËÉÉÉÆÆÆÀÀÀ¹¹¹°°°¦¦¦–––’’’‘‘‘“““”””””””””“““’’’ŒŒŒ†††tttfffWWWFFF777888HHHXXXgggsss}}}ƒƒƒ‡‡‡‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ŠŠŠ“““–––˜˜˜›››žžž¢¢¢¦¦¦«««°°°µµµ¸¸¸ºººººº¸¸¸µµµ°°°«««¥¥¥ŸŸŸ™™™“““ŽŽŽŠŠŠˆˆˆ‰‰‰ŒŒŒ‘‘‘˜˜˜žžž¤¤¤©©©««««««ªªª¨¨¨¦¦¦¥¥¥£££¢¢¢¡¡¡   ›››———”””’’’’’’“““———›››ŸŸŸ£££¤¤¤£££ŸŸŸššš”””‹‹‹‹‹‹“““™™™   ¦¦¦©©©©©©§§§¡¡¡ššš“““ŒŒŒˆˆˆ‡‡‡ŠŠŠ–––žžž¤¤¤¨¨¨©©©§§§¢¢¢›››”””ŽŽŽŠŠŠŠŠŠ“““›››¤¤¤¬¬¬³³³¸¸¸ººº¹¹¹µµµ®®®¦¦¦žžž•••ŽŽŽ‰‰‰†††„„„„„„†††ŠŠŠ–––žžž¦¦¦­­­´´´¸¸¸ººº¹¹¹µµµ¯¯¯§§§ŸŸŸ™™™•••“““•••™™™ŸŸŸ¥¥¥ªªª®®®°°°¯¯¯¬¬¬§§§¢¢¢žžž››››››žžž¢¢¢©©©¯¯¯³³³µµµ´´´°°°ªªª¡¡¡———ˆˆˆ………………‰‰‰˜˜˜¡¡¡¨¨¨®®®±±±±±±®®®§§§žžž’’’†††yyynnneee___[[[ZZZZZZ[[[]]]^^^```ccchhhnnnvvv‰‰‰’’’œœœ¥¥¥­­­µµµ»»»ÀÀÀÃÃÃÆÆÆÉÉÉÊÊÊËËËÌÌÌÊÊÊÈÈÈÃÃü¼¼³³³ªªª¡¡¡ššš•••“““““““““”””””””””“““‘‘‘ŒŒŒˆˆˆƒƒƒ{{{pppcccSSSCCC444555DDDTTTcccpppzzz‚‚‚†††ˆˆˆ‰‰‰‰‰‰‰‰‰‰‰‰ŠŠŠŒŒŒ“““———ššš   ¤¤¤¨¨¨­­­±±±µµµ¸¸¸ººº¹¹¹···²²²­­­§§§   ™™™’’’ŒŒŒ‡‡‡ƒƒƒ‚‚‚ƒƒƒ‡‡‡”””ššš   ¤¤¤¦¦¦§§§¥¥¥¢¢¢ŸŸŸ›››™™™———•••“““‘‘‘ŽŽŽŒŒŒ‹‹‹ŒŒŒŽŽŽ“““˜˜˜¢¢¢¤¤¤¤¤¤¡¡¡œœœ–––ŒŒŒŠŠŠŒŒŒ———¤¤¤¨¨¨©©©¨¨¨¤¤¤–––‹‹‹ŠŠŠ‹‹‹–––¢¢¢¦¦¦§§§¤¤¤ŸŸŸ˜˜˜ŠŠŠ………………ˆˆˆŽŽŽ–––   ©©©±±±¶¶¶¹¹¹¹¹¹···±±±ªªª¢¢¢™™™’’’‹‹‹‡‡‡„„„ƒƒƒ„„„‡‡‡‹‹‹‘‘‘™™™¡¡¡©©©°°°´´´¶¶¶¶¶¶²²²«««¤¤¤›››”””ŽŽŽ“““ššš   §§§«««­­­­­­ªªª¥¥¥ŸŸŸššš——————™™™žžž¤¤¤«««°°°³³³²²²¯¯¯¨¨¨ŸŸŸ•••ŒŒŒ„„„€€€€€€„„„ŠŠŠ“““œœœ¥¥¥«««¯¯¯¯¯¯¬¬¬¥¥¥›››ŽŽŽ€€€rrrdddXXXPPPKKKIIIHHHIIIJJJLLLNNNRRRXXX```jjjuuu€€€ŒŒŒ–––¡¡¡ªªª²²²¸¸¸¾¾¾ÂÂÂÅÅÅÈÈÈÊÊÊËËËÌÌÌËËËÉÉÉÄÄľ¾¾¶¶¶­­­¤¤¤˜˜˜•••””””””””””””“““‘‘‘ŠŠŠ………€€€wwwlll___OOO???111222@@@PPP```mmmxxx€€€………ˆˆˆ‰‰‰‰‰‰‰‰‰‰‰‰ŠŠŠ”””˜˜˜›››ŸŸŸ¢¢¢¦¦¦ªªª®®®²²²¶¶¶¸¸¸¹¹¹¸¸¸´´´¯¯¯¨¨¨¡¡¡™™™‘‘‘‰‰‰ƒƒƒ~~~{{{zzz}}}‡‡‡ŽŽŽ•••›››ŸŸŸ      žžž›››˜˜˜”””‘‘‘ŽŽŽŒŒŒŠŠŠˆˆˆ………ƒƒƒ‚‚‚‚‚‚„„„‰‰‰ŽŽŽ”””›››   £££¤¤¤¢¢¢˜˜˜‘‘‘ŒŒŒŠŠŠŠŠŠŽŽŽ”””›››¡¡¡¦¦¦©©©©©©¦¦¦¡¡¡›››•••ŽŽŽŽŽŽ‘‘‘———œœœ¢¢¢¥¥¥¥¥¥¢¢¢•••†††€€€ƒƒƒ‰‰‰’’’œœœ¦¦¦¯¯¯µµµººº»»»¹¹¹µµµ¯¯¯§§§ŸŸŸ˜˜˜‘‘‘ŒŒŒˆˆˆ†††………†††‰‰‰•••¥¥¥¬¬¬±±±´´´´´´°°°ªªª¢¢¢™™™‘‘‘‹‹‹‰‰‰ŠŠŠŽŽŽ•••œœœ£££¨¨¨««««««¨¨¨£££žžž˜˜˜”””“““•••ššš¡¡¡¨¨¨­­­±±±±±±®®®¨¨¨ŸŸŸ•••ŠŠŠ‚‚‚}}}|||†††˜˜˜¡¡¡¨¨¨¬¬¬­­­ªªª£££˜˜˜‹‹‹{{{kkk[[[MMMCCC===999888999999;;;>>>BBBIIISSS^^^kkkyyy†††’’’§§§°°°···½½½ÁÁÁÄÄÄÇÇÇÉÉÉËËËÌÌÌËËËÉÉÉÅÅÅ¿¿¿¸¸¸¯¯¯§§§   ›››———–––•••””””””’’’ŽŽŽ‹‹‹‡‡‡ƒƒƒ}}}tttiii[[[KKK<<<...///<<>>MMM]]]nnn}}}ŒŒŒ™™™¤¤¤­­­µµµ»»»ÀÀÀÃÃÃÆÆÆÈÈÈÊÊÊËËËËËËÉÉÉÅÅÅ¿¿¿¸¸¸°°°¨¨¨¢¢¢ššš˜˜˜–––•••“““‘‘‘ŽŽŽ‹‹‹ˆˆˆƒƒƒ~~~wwwnnncccTTTEEE666666EEEUUUdddqqq|||ƒƒƒ‰‰‰ŒŒŒŽŽŽŽŽŽ’’’•••˜˜˜œœœ   ¤¤¤§§§«««®®®±±±´´´¶¶¶¶¶¶µµµ±±±«««¢¢¢———‹‹‹~~~qqqfff]]]WWWUUUWWW\\\ccckkkttt{{{………‡‡‡†††ƒƒƒ~~~yyyrrrlllfffaaa^^^[[[ZZZ[[[]]]bbbiiiqqq{{{………———œœœŸŸŸ   ˜˜˜’’’ŒŒŒ‡‡‡………†††ŠŠŠ———žžž¤¤¤§§§©©©¨¨¨¦¦¦£££   œœœœœœžžž¡¡¡¢¢¢£££¡¡¡œœœ•••„„„|||vvvuuuxxx‰‰‰”””   «««µµµ¼¼¼ÁÁÁÃÃÃÃÃÃÀÀÀ»»»µµµ®®®§§§   ššš”””‹‹‹ŠŠŠ‹‹‹•••œœœ£££©©©®®®°°°®®®ªªª¤¤¤›››’’’‹‹‹†††………‡‡‡”””›››¡¡¡¥¥¥¦¦¦£££žžž˜˜˜‘‘‘ŒŒŒŠŠŠ‹‹‹———ŸŸŸ§§§¬¬¬¯¯¯¯¯¯«««¤¤¤ššš†††~~~{{{|||‰‰‰“““œœœ¤¤¤©©©«««¨¨¨¢¢¢———ˆˆˆvvvcccOOO===///$$$888GGGXXXjjj{{{ŠŠŠ˜˜˜£££­­­µµµ»»»¿¿¿ÃÃÃÆÆÆÈÈÈÉÉÉÊÊÊÊÊÊÈÈÈÄÄľ¾¾···¯¯¯¨¨¨¢¢¢ššš˜˜˜———•••“““‘‘‘ŽŽŽŠŠŠ‡‡‡‚‚‚}}}vvvlll```RRRBBB444222AAAPPP```nnnzzz‚‚‚‰‰‰‘‘‘’’’”””———›››žžž¢¢¢¥¥¥¨¨¨¬¬¬¯¯¯²²²´´´¶¶¶¶¶¶´´´¯¯¯¨¨¨žžž’’’„„„uuugggYYYOOOIIIGGGHHHNNNUUU^^^gggooouuuyyy{{{zzzwwwrrrlllddd]]]VVVPPPLLLJJJIIIKKKNNNUUU]]]hhhsss‰‰‰’’’˜˜˜œœœ›››———‘‘‘‹‹‹†††ƒƒƒƒƒƒ†††‹‹‹’’’ššš   ¥¥¥¨¨¨¨¨¨¨¨¨¦¦¦£££¡¡¡      ¡¡¡¢¢¢¢¢¢¢¢¢ŸŸŸššš’’’‰‰‰€€€xxxrrrqqqttt|||†††’’’ŸŸŸªªª´´´¼¼¼ÂÂÂÅÅÅÆÆÆÄÄÄÀÀÀººº´´´¬¬¬¥¥¥žžž———‘‘‘ŠŠŠŠŠŠ’’’™™™   §§§¬¬¬¯¯¯®®®«««¦¦¦žžž–––ŽŽŽ‰‰‰‡‡‡ˆˆˆ“““ššš   ¤¤¤¥¥¥¢¢¢–––ŠŠŠ‡‡‡ˆˆˆŒŒŒ“““œœœ¤¤¤ªªª®®®¯¯¯¬¬¬¦¦¦”””ŠŠŠ‚‚‚~~~~~~‚‚‚‰‰‰“““œœœ¤¤¤©©©«««©©©¢¢¢———ˆˆˆvvvbbbNNN<<<...555DDDUUUhhhyyy‰‰‰———£££­­­´´´ººº¿¿¿ÂÂÂÅÅÅÇÇÇÉÉÉÉÉÉÈÈÈÆÆÆÂ½½½¶¶¶®®®§§§¡¡¡ššš˜˜˜———•••“““‰‰‰†††|||tttjjj]]]OOO@@@222...<<>>888222111;;;GGGUUUcccppp{{{ƒƒƒ‰‰‰‹‹‹‹‹‹ˆˆˆƒƒƒ~~~xxxtttrrrssswww}}}………”””šššžžž   ¢¢¢¢¢¢¡¡¡¡¡¡   ŸŸŸžžžœœœ˜˜˜“““‹‹‹‚‚‚xxxnnnfffaaaaaafffppp|||ŠŠŠ———¤¤¤¯¯¯¸¸¸¿¿¿ÃÃÃÄÄÄÃÃÃÀÀÀ»»»´´´¬¬¬£££›››“““ŒŒŒ†††‚‚‚‚‚‚†††ŒŒŒ”””œœœ¤¤¤©©©­­­®®®¬¬¬©©©£££žžž™™™–––•••–––™™™   ¡¡¡   –––‡‡‡€€€||||||ˆˆˆ‘‘‘ššš£££©©©®®®¯¯¯­­­¨¨¨¢¢¢ššš”””ŽŽŽ“““ššš¡¡¡©©©®®®¯¯¯­­­§§§›››ŒŒŒzzzeeePPP===...111@@@RRRfffxxx‰‰‰———£££­­­µµµ¼¼¼ÀÀÀÃÃÃÅÅÅÆÆÆÆÆÆÅÅÅÃÃÿ¿¿ººº´´´­­­¦¦¦   ›››˜˜˜–––•••”””“““‘‘‘ŽŽŽŠŠŠ‡‡‡ƒƒƒ~~~wwwnnncccVVVGGG888///<<>>GGGOOOUUUXXXYYYXXXUUUOOOIIIDDDAAA@@@CCCIIIPPPYYYbbbjjjqqqvvvzzz}}}~~~~~~}}}zzzwwwqqqjjjbbbXXXMMMDDD===;;;>>>GGGUUUdddttt‚‚‚™™™¢¢¢§§§ªªª«««©©©¥¥¥ŸŸŸ———†††~~~vvvpppllliiiiiijjjnnnuuu}}}………ŽŽŽ———žžž¤¤¤§§§©©©©©©¨¨¨¦¦¦¤¤¤¢¢¢¡¡¡   ŸŸŸššš•••ŽŽŽ………zzzpppfff```___bbbkkkvvv‚‚‚ŽŽŽ™™™¢¢¢©©©­­­¯¯¯¯¯¯®®®¬¬¬ªªª©©©©©©¬¬¬°°°´´´¸¸¸»»»»»»¸¸¸°°°¤¤¤”””kkkVVVAAA111333CCCVVViii{{{ŒŒŒššš¦¦¦°°°¸¸¸¾¾¾ÂÂÂÅÅÅÅÅÅÄÄÄÁÁÁ½½½···°°°©©©   ˜˜˜’’’ŒŒŒ‰‰‰‡‡‡‡‡‡‡‡‡†††………ƒƒƒ~~~zzzuuuoooggg]]]PPPCCC666777CCCOOO[[[fffpppwww~~~ƒƒƒ†††ŠŠŠŒŒŒ’’’•••™™™žžž£££©©©®®®³³³µµµµµµ²²²¬¬¬¡¡¡“““lllVVVBBB111222999???EEEHHHIIIHHHEEE@@@;;;666333333555:::AAAIIIRRRYYY```fffjjjmmmnnnoooooonnnkkkhhhccc\\\SSSJJJAAA888333222666???LLL\\\kkkzzz‡‡‡‘‘‘™™™žžž¡¡¡¡¡¡ŸŸŸ›››•••ŽŽŽ………}}}uuuoooiiieeecccccceeeiiinnnvvv~~~‡‡‡———¡¡¡¤¤¤¥¥¥¥¥¥¤¤¤¢¢¢   ŸŸŸ›››™™™•••‡‡‡}}}rrrfff\\\UUUTTTWWW```lllyyy†††’’’œœœ¤¤¤ªªª­­­¯¯¯¯¯¯®®®®®®­­­®®®±±±´´´¸¸¸¼¼¼¾¾¾¾¾¾ººº²²²¦¦¦–––ƒƒƒnnnXXXDDD333555EEEWWWjjj}}}›››§§§±±±¹¹¹¿¿¿ÃÃÃÅÅÅÅÅÅÃÃÃÀÀÀ»»»´´´¬¬¬¤¤¤ššš’’’ŠŠŠ………‚‚‚€€€€€€€€€}}}{{{wwwsssnnnhhh```UUUIII===111$$$888CCCNNNYYYbbbjjjqqqwww{{{ƒƒƒ†††ŠŠŠŽŽŽ“““™™™   §§§­­­²²²µµµ¶¶¶´´´®®®¤¤¤–––………pppZZZFFF444000444777777777444111$$$$$$333:::BBBIIIOOOTTTYYY[[[]]]^^^^^^]]][[[XXXSSSLLLEEE===555...******///777DDDSSSbbbppp}}}‡‡‡”””–––———•••‘‘‘‹‹‹„„„}}}uuunnnhhhccc```^^^^^^```ccciiiooowww‡‡‡•••šššžžžŸŸŸ   ŸŸŸžžž›››™™™–––’’’ŽŽŽ‡‡‡ttthhh\\\QQQJJJHHHLLLUUUbbbppp~~~ŠŠŠ•••žžž¥¥¥©©©¬¬¬®®®®®®¯¯¯°°°±±±´´´···»»»¾¾¾ÀÀÀ¿¿¿¼¼¼´´´¨¨¨˜˜˜………pppZZZEEE444666FFFYYYlll~~~ŽŽŽœœœ¨¨¨²²²ºººÀÀÀÃÃÃÅÅÅÅÅÅÃÃþ¾¾¸¸¸±±±¨¨¨žžž”””ŠŠŠ‚‚‚|||yyywwwwwwwwwwwwvvvtttrrrnnnjjjeee___VVVLLLAAA555$$$777AAAJJJSSS[[[bbbhhhnnnssswww|||‡‡‡ŽŽŽ•••¥¥¥¬¬¬²²²¶¶¶···¶¶¶±±±¨¨¨ššš‰‰‰uuu___JJJ888$$$333888>>>CCCGGGIIIKKKLLLLLLLLLJJJGGGCCC>>>888222,,,'''%%%%%%)))111<<>>===AAAJJJWWWeeetttŒŒŒ–––žžž¤¤¤¨¨¨«««¬¬¬®®®¯¯¯²²²´´´¸¸¸¼¼¼¿¿¿ÀÀÀÀÀÀ¼¼¼µµµ©©©ššš‡‡‡rrr\\\GGG666777HHHZZZmmm©©©³³³ºººÀÀÀÃÃÃÅÅÅÄÄÄÁÁÁ½½½¶¶¶®®®¤¤¤™™™‚‚‚yyysssnnnllllllllllllkkkiiigggddd___ZZZSSSKKKBBB888...333<<>>>>>???@@@AAADDDHHHOOOVVV^^^ffflllqqqtttvvvvvvuuutttrrrooommmkkkhhhgggeeedddddddddeeefffgggiiilllooorrrvvvyyy{{{}}}~~~~~~}}}{{{wwwqqqjjjbbbYYYPPPGGG>>>555$$$$$$777CCCOOO[[[fffpppyyy€€€‡‡‡’’’˜˜˜žžž¤¤¤«««±±±¶¶¶ººº»»»¹¹¹´´´ªªªœœœ‹‹‹wwwbbbMMM:::...===NNNaaattt………”””¡¡¡¬¬¬µµµ»»»ÀÀÀÂÂÂÂÂÂÀÀÀ¼¼¼¶¶¶­­­¢¢¢”””„„„sssaaaQQQDDD;;;666333333333222111///$$$000:::GGGVVVfffuuu„„„‘‘‘žžž¨¨¨±±±¸¸¸¼¼¼¾¾¾¼¼¼···®®®¡¡¡|||gggQQQ>>>...///666===CCCHHHKKKMMMOOOPPPQQQRRRSSSTTTVVVYYY]]]ccciiinnnsssvvvxxxzzzzzzyyyyyywwwvvvtttrrrqqqpppooonnnnnnnnnooooooppprrrsssuuuxxxzzz|||~~~~~~|||yyyssslllcccYYYNNNDDD:::222...777BBBLLLWWW```iiiqqqyyy€€€‡‡‡ŽŽŽ•••¥¥¥¬¬¬³³³···¹¹¹¸¸¸³³³ªªªŒŒŒxxxcccNNN;;;000???QQQdddvvv‡‡‡–––¢¢¢­­­¶¶¶¼¼¼ÀÀÀÂÂÂÂÂÂÀÀÀ¼¼¼µµµ¬¬¬   ‘‘‘€€€nnn[[[III;;;111444AAAQQQbbbsss‚‚‚¨¨¨±±±¹¹¹½½½ÀÀÀ¿¿¿ººº²²²¦¦¦–––ƒƒƒmmmWWWCCC222$$$777AAAJJJQQQXXX\\\```ccceeefffggghhhiiikkkmmmpppssswww{{{~~~€€€‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚€€€~~~}}}|||{{{{{{{{{{{{{{{|||}}}}}}€€€ƒƒƒ„„„„„„………„„„‚‚‚{{{tttkkk___SSSFFF;;;111$$$555>>>GGGPPPYYYaaajjjrrr{{{„„„–––ŸŸŸ§§§¯¯¯´´´······²²²ªªªŒŒŒyyydddOOO<<<$$$111AAASSSfffxxx‰‰‰˜˜˜¤¤¤®®®···½½½ÁÁÁÃÃÃÂÂÂÀÀÀ»»»´´´«««ŸŸŸ~~~jjjVVVDDD555000===NNN```qqq¨¨¨²²²¹¹¹¾¾¾ÁÁÁÁÁÁ½½½¶¶¶ªªª›››‰‰‰ttt^^^III777555AAAMMMWWW```hhhnnnrrrvvvyyy{{{|||}}}€€€ƒƒƒ………‡‡‡ŠŠŠ‹‹‹ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒ‹‹‹‹‹‹ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŽŽŽŽŽŽŠŠŠ†††€€€xxxmmm```QQQCCC666111999@@@HHHQQQZZZdddooozzz„„„ššš£££¬¬¬²²²µµµµµµ±±±©©©yyydddOOO<<<...444CCCVVViii{{{‹‹‹™™™¦¦¦°°°¸¸¸¾¾¾ÂÂÂÃÃÃÃÃÃÀÀÀ»»»´´´ªªªžžžŽŽŽ|||hhhTTTAAA111$$$;;;LLL^^^ppp©©©²²²ººº¿¿¿ÂÂÂÃÃÃÀÀÀ¹¹¹¯¯¯¡¡¡{{{eeePPP===$$$$$$<<>>JJJWWWffftttƒƒƒœœœ¦¦¦­­­²²²³³³°°°¨¨¨{{{fffQQQ>>>///999JJJ]]]ooo‘‘‘žžžªªª´´´¼¼¼ÁÁÁÅÅÅÆÆÆÅÅŽ½½µµµ«««žžžŽŽŽ{{{gggQQQ>>>///:::JJJ]]]ooo€€€©©©³³³»»»ÁÁÁÅÅÅÆÆÆÅÅÅÀÀÀ¸¸¸¬¬¬œœœ‰‰‰ttt^^^JJJ888555GGGXXXhhhvvv‚‚‚•••œœœ¢¢¢§§§«««®®®°°°²²²³³³´´´µµµµµµ¶¶¶¶¶¶¶¶¶¶¶¶····························································¶¶¶¶¶¶¶¶¶µµµ´´´²²²¯¯¯ªªª¤¤¤›››‚‚‚rrr___MMM<<<...444???NNN]]]nnn}}}ŒŒŒ˜˜˜£££«««°°°±±±®®®§§§œœœ{{{fffRRR???///...<<>>...999JJJ]]]ooo€€€©©©³³³»»»ÂÂÂÆÆÆÈÈÈÇÇÇÃÃü¼¼±±±¢¢¢|||fffQQQ>>>...777JJJ]]]mmm|||‰‰‰“““¥¥¥«««±±±¶¶¶¹¹¹¼¼¼¾¾¾¿¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀ¾¾¾¼¼¼¹¹¹³³³¬¬¬£££———‰‰‰xxxeeeRRR@@@111777FFFVVVhhhxxxˆˆˆ•••   ¨¨¨­­­¯¯¯¬¬¬¦¦¦›››ŒŒŒ{{{gggRRR???///111@@@RRReeewwwˆˆˆ———¤¤¤¯¯¯¹¹¹ÀÀÀÅÅÅÉÉÉÊÊÊÉÉÉÆÆÆÀÀÀ¸¸¸­­­   |||gggQQQ>>>...999JJJ]]]ooo€€€©©©³³³¼¼¼ÂÂÂÇÇÇÉÉÉÉÉÉÆÆÆÀÀÀ¶¶¶©©©˜˜˜„„„oooYYYEEE444888LLL___pppŒŒŒ˜˜˜¢¢¢ªªª²²²¸¸¸½½½ÁÁÁÄÄÄÆÆÆÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊÊÊÊËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËÊÊÊÊÊÊÊÊÊÊÊÊÉÉÉÇÇÇÄÄÄÀÀÀ»»»³³³ªªªŽŽŽ}}}jjjVVVCCC333222@@@QQQcccttt„„„‘‘‘¥¥¥ªªª¬¬¬©©©£££™™™‹‹‹yyyfffRRR???000555DDDVVViii{{{‹‹‹ššš§§§²²²»»»ÂÂÂÇÇÇËËËÌÌÌËËËÈÈȺºº¯¯¯¡¡¡|||gggQQQ>>>...999JJJ]]]ooo€€€©©©´´´¼¼¼ÃÃÃÈÈÈËËËËËËÉÉÉÃÃúºº®®®ŸŸŸŒŒŒwwwaaaMMM:::888LLL___qqq€€€ŽŽŽššš¤¤¤®®®µµµ¼¼¼ÁÁÁÆÆÆÉÉÉÌÌÌÎÎÎÏÏÏÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÏÏÏÍÍÍÊÊÊÆÆÆÀÀÀ¸¸¸­­­¡¡¡’’’€€€mmmYYYFFF555$$$;;;LLL^^^ppp€€€˜˜˜¡¡¡¦¦¦§§§¥¥¥ŸŸŸ•••ˆˆˆwwwdddQQQ>>>///999III[[[mmmªªª´´´½½½ÄÄÄÉÉÉÍÍÍÎÎÎÍÍÍÉÉÉÃÃû»»°°°¢¢¢‘‘‘}}}gggRRR>>>...999JJJ]]]ooo€€€©©©´´´½½½ÄÄÄÉÉÉÌÌÌÍÍÍËËËÆÆÆ¿¿¿´´´¥¥¥”””€€€jjjUUUBBB222777JJJ^^^ppp€€€ŽŽŽ›››¦¦¦¯¯¯¸¸¸¿¿¿ÄÄÄÉÉÉÍÍÍÐÐÐÒÒÒÓÓÓÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××××××××××××××××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÔÔÔÓÓÓÑÑÑÎÎÎÉÉÉÃÃúºº¯¯¯¢¢¢“““nnnZZZFFF555777GGGYYYkkk{{{‰‰‰”””œœœ¡¡¡¢¢¢   ššš‘‘‘„„„sssaaaNNN===...///===NNN```rrrƒƒƒ’’’   ¬¬¬···¿¿¿ÆÆÆËËËÎÎÎÏÏÏÎÎÎËËËÅÅż¼¼±±±£££‘‘‘}}}hhhRRR>>>...999JJJ]]]ooo€€€©©©´´´½½½ÄÄÄÊÊÊÍÍÍÎÎÎÍÍÍÉÉÉÃÃù¹¹¬¬¬œœœˆˆˆsss^^^III888444HHH[[[mmm}}}ŒŒŒ™™™¤¤¤®®®···¿¿¿ÅÅÅÊÊÊÎÎÎÑÑÑÔÔÔÖÖÖ×××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØ×××ÕÕÕÓÓÓÏÏÏÊÊÊÃÃû»»¯¯¯¢¢¢’’’€€€mmmYYYEEE555444CCCTTTeeeuuu‚‚‚•••ššš›››™™™“““ŠŠŠ}}}nnn]]]KKK:::333BBBSSSeeewww‡‡‡–––£££¯¯¯¹¹¹ÂÂÂÈÈÈÍÍÍÐÐÐÑÑÑÐÐÐÌÌÌÆÆÆ¾¾¾²²²£££’’’~~~hhhRRR>>>...999JJJ]]]ooo€€€©©©´´´½½½ÄÄÄÊÊÊÎÎÎÐÐÐÏÏÏÌÌÌÆÆÆ¾¾¾²²²£££‘‘‘}}}hhhSSS@@@000222DDDWWWiiizzz‰‰‰———¢¢¢­­­¶¶¶¾¾¾ÄÄÄÊÊÊÎÎÎÒÒÒÕÕÕ×××ØØØÙÙÙÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙÙÙØØØ×××ÔÔÔÐÐÐÊÊÊÃÃù¹¹­­­   ~~~jjjVVVCCC333000>>>NNN^^^nnn{{{………‘‘‘“““‘‘‘‹‹‹‚‚‚vvvgggVVVFFF666777GGGXXXjjj{{{‹‹‹™™™¦¦¦±±±»»»ÄÄÄÊÊÊÏÏÏÑÑÑÒÒÒÑÑÑÎÎÎÈÈÈ¿¿¿³³³¤¤¤“““~~~hhhRRR>>>...999JJJ]]]ooo€€€©©©´´´½½½ÅÅÅÊÊÊÏÏÏÑÑÑÑÑÑÎÎÎÊÊʸ¸¸ªªª™™™†††qqq\\\HHH666///@@@RRRddduuu„„„’’’ŸŸŸªªª³³³¼¼¼ÃÃÃÉÉÉÍÍÍÑÑÑÔÔÔ×××ØØØÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÙÙÙ×××ÓÓÓÏÏÏÈÈÈÀÀÀ¶¶¶ªªªœœœ‹‹‹yyyfffRRR@@@000888GGGVVVeeerrr|||ƒƒƒˆˆˆ‰‰‰‡‡‡yyymmm___OOO???222...<<>>...999JJJ]]]ooo€€€©©©´´´½½½ÅÅÅËËËÏÏÏÒÒÒÒÒÒÑÑÑÍÍÍÆÆÆ½½½°°°¡¡¡{{{fffQQQ>>>///;;;LLL]]]oooššš¥¥¥¯¯¯¸¸¸ÀÀÀÆÆÆËËËÏÏÏÓÓÓÖÖÖØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÚÚÚØØØÕÕÕÑÑÑÌÌÌÅÅŽ½½²²²¦¦¦———‡‡‡tttaaaNNN<<<...222???MMM[[[gggqqqxxx|||}}}zzzuuummmbbbUUUFFF888333AAARRRddduuu………”””¡¡¡­­­···ÀÀÀÈÈÈÎÎÎÒÒÒÔÔÔÔÔÔÓÓÓÏÏÏÉÉÉÀÀÀ´´´¥¥¥“““iiiRRR>>>...999JJJ]]]ooo€€€ªªªµµµ¾¾¾ÅÅÅËËËÐÐÐÓÓÓÔÔÔÓÓÓÐÐÐÊÊÊ···©©©˜˜˜………ppp[[[GGG666555EEEVVVgggxxx‡‡‡”””   «««´´´¼¼¼ÂÂÂÈÈÈÍÍÍÑÑÑÔÔÔÖÖÖØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÙÙÙ×××ÔÔÔÏÏÏÉÉɸ¸¸­­­   ‘‘‘€€€nnn[[[HHH888777CCCOOOZZZcccjjjnnnooolllggg___UUUIII===111888GGGYYYjjj{{{ŠŠŠ˜˜˜¤¤¤°°°ºººÂÂÂÊÊÊÏÏÏÓÓÓÕÕÕÕÕÕÔÔÔÐÐÐÊÊÊÁÁÁµµµ¦¦¦”””iiiRRR>>>...999JJJ]]]ooo€€€ªªªµµµ¾¾¾ÆÆÆÌÌÌÑÑÑÔÔÔÕÕÕÔÔÔÒÒÒÍÍÍÆÆÆ½½½°°°¡¡¡{{{fffQQQ???000000>>>NNN___pppššš¥¥¥¯¯¯···¾¾¾ÄÄÄÊÊÊÎÎÎÑÑÑÔÔÔÖÖÖØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÙÙÙ×××ÔÔÔÑÑÑËËËÅÅŽ½½³³³§§§™™™ŠŠŠyyygggTTTBBB333///999CCCMMMUUU[[[^^^___]]]XXXQQQHHH===333000>>>NNN___qqq©©©´´´½½½ÅÅÅÌÌÌÑÑÑÔÔÔÖÖÖÖÖÖÔÔÔÐÐÐÊÊÊÁÁÁµµµ¦¦¦”””iiiSSS>>>...999JJJ]]]ooo€€€ªªªµµµ¾¾¾ÆÆÆÌÌÌÑÑÑÔÔÔÖÖÖÖÖÖÔÔÔÐÐÐÊÊÊ···©©©˜˜˜………ppp\\\HHH777777FFFVVVgggwww†††“““žžž©©©±±±¹¹¹ÀÀÀÅÅÅÊÊÊÎÎÎÑÑÑÔÔÔÖÖÖØØØÙÙÙÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÚÚÚÙÙÙ×××ÕÕÕÑÑÑÍÍÍÇÇÇÀÀÀ···¬¬¬   ’’’‚‚‚qqq___MMM<<<...///777???EEEJJJMMMNNNLLLHHHBBB:::222666DDDUUUfffwww†††”””¡¡¡­­­···ÀÀÀÇÇÇÍÍÍÒÒÒÕÕÕ××××××ÕÕÕÑÑÑÊÊÊÁÁÁµµµ¦¦¦”””iiiSSS>>>...999JJJ\\\ooo€€€ªªªµµµ¾¾¾ÆÆÆÌÌÌÑÑÑÔÔÔÖÖÖ×××ÖÖÖÓÓÓÎÎÎÆÆÆ½½½°°°¡¡¡|||gggSSS@@@111111>>>NNN^^^nnn}}}ŠŠŠ———¡¡¡«««³³³»»»ÁÁÁÆÆÆÊÊÊÎÎÎÑÑÑÓÓÓÕÕÕ×××ØØØÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÙÙÙØØØÖÖÖÔÔÔÑÑÑÍÍÍÈÈÈÁÁÁ¹¹¹°°°¥¥¥˜˜˜ŠŠŠzzzhhhVVVEEE666222777;;;===>>><<<999444//////<<>>...999III\\\nnn©©©´´´½½½ÅÅÅËËËÐÐÐÔÔÔÖÖÖ××××××ÔÔÔÐÐÐÊÊÊ···ªªª™™™‡‡‡rrr^^^JJJ999666DDDTTTdddsssŽŽŽ™™™¤¤¤¬¬¬´´´»»»ÁÁÁÆÆÆÊÊÊÍÍÍÐÐÐÒÒÒÔÔÔÖÖÖØØØÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙÙÙØØØ×××ÕÕÕÓÓÓÐÐÐÍÍÍÈÈÈ»»»²²²¨¨¨qqq___NNN>>>000...///000...555CCCSSSddduuu„„„’’’ŸŸŸ«««µµµ¾¾¾ÆÆÆÌÌÌÑÑÑÕÕÕ×××ØØØØØØÕÕÕÑÑÑÊÊÊÁÁÁµµµ¦¦¦”””iiiSSS>>>...999III\\\nnn©©©´´´½½½ÅÅÅËËËÑÑÑÔÔÔ×××ØØØØØØÖÖÖÓÓÓÎÎÎÇÇǽ½½±±±¢¢¢‘‘‘~~~iiiUUUCCC333///<<>>...999III\\\nnnœœœ©©©´´´½½½ÅÅÅËËËÑÑÑÔÔÔ×××ØØØÙÙÙ×××ÕÕÕÑÑÑÊÊʸ¸¸«««›››‰‰‰uuuaaaMMM<<<...333@@@NNN]]]lllzzz†††’’’œœœ¥¥¥­­­³³³¹¹¹¿¿¿ÃÃÃÇÇÇÊÊÊÍÍÍÏÏÏÑÑÑÓÓÓÔÔÔÕÕÕÖÖÖ××××××××××××××××××××××××ÖÖÖÕÕÕÔÔÔÒÒÒÐÐÐÍÍÍÊÊÊÆÆÆÁÁÁ»»»´´´«««¡¡¡–––ŠŠŠ|||mmm]]]MMM===000444BBBRRRccctttƒƒƒ‘‘‘©©©³³³¼¼¼ÄÄÄËËËÐÐÐÔÔÔ×××ØØØÙÙÙØØØÕÕÕÑÑÑÊÊÊÁÁÁµµµ¦¦¦”””iiiRRR>>>...999III\\\nnnœœœ©©©´´´½½½ÅÅÅËËËÐÐÐÔÔÔ×××ØØØØØØØØØÖÖÖÒÒÒÍÍÍÆÆÆ½½½±±±£££“““€€€lllXXXEEE555777CCCRRR```nnn{{{‡‡‡’’’›››¤¤¤«««²²²···¼¼¼ÁÁÁÄÄÄÈÈÈÊÊÊÌÌÌÎÎÎÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÒÒÒÐÐÐÏÏÏÍÍÍÊÊÊÇÇÇÃÃþ¾¾¹¹¹²²²ªªª¢¢¢———ŒŒŒqqqbbbSSSCCC555...;;;JJJZZZkkk{{{‰‰‰———£££­­­···¿¿¿ÇÇÇÍÍÍÑÑÑÕÕÕ×××ØØØØØØ×××ÕÕÕÐÐÐÉÉÉÀÀÀ´´´¥¥¥”””iiiRRR>>>...888HHH[[[mmm~~~ŽŽŽœœœ¨¨¨³³³¼¼¼ÄÄÄÊÊÊÏÏÏÓÓÓÖÖÖ×××ØØØ×××ÖÖÖÓÓÓÏÏÏÉÉÉÁÁÁ···ªªª›››ŠŠŠwwwcccPPP>>>000...999FFFTTTaaaooo{{{†††ššš¢¢¢©©©¯¯¯µµµ¹¹¹½½½ÁÁÁÄÄÄÇÇÇÉÉÉËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÐÐÐÐÐÐÏÏÏÏÏÏÎÎÎÌÌÌËËËÉÉÉÆÆÆÃÃÃÀÀÀ»»»¶¶¶°°°©©©   ———ttteeeWWWHHH:::...444BBBRRRcccsss‚‚‚œœœ§§§±±±ºººÂÂÂÈÈÈÎÎÎÒÒÒÕÕÕ×××××××××ÖÖÖÓÓÓÎÎÎÈÈÈ¿¿¿³³³¤¤¤“““~~~hhhRRR>>>...888HHHZZZmmm~~~›››§§§²²²»»»ÂÂÂÉÉÉÍÍÍÑÑÑÔÔÔÕÕÕÖÖÖÖÖÖÕÕÕÓÓÓÏÏÏÊÊÊÄÄÄ»»»°°°£££“““nnnZZZHHH777000;;;HHHUUUbbbnnnzzz………ŽŽŽ———ŸŸŸ¥¥¥«««±±±µµµ¹¹¹½½½ÀÀÀÂÂÂÄÄÄÆÆÆÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊÊÊÊÉÉÉÉÉÉÈÈÈÆÆÆÄÄÄ¿¿¿»»»···²²²¬¬¬¦¦¦žžž–––ŒŒŒuuuhhhYYYKKK===111...:::IIIZZZjjjzzzˆˆˆ•••   «««´´´¼¼¼ÃÃÃÉÉÉÎÎÎÑÑÑÔÔÔÕÕÕÖÖÖÕÕÕÔÔÔÑÑÑÍÍÍÆÆÆ½½½²²²£££’’’~~~hhhRRR>>>...777GGGYYYlll}}}ŒŒŒššš¦¦¦°°°¹¹¹ÀÀÀÆÆÆËËËÏÏÏÑÑÑÓÓÓÓÓÓÓÓÓÓÓÓÑÑÑÎÎÎÊÊÊÅÅŽ½½´´´¨¨¨šššŠŠŠwwwdddQQQ???111111<<>>...666FFFXXXjjj{{{ŠŠŠ˜˜˜¤¤¤®®®¶¶¶½½½ÃÃÃÈÈÈËËËÍÍÍÏÏÏÐÐÐÐÐÐÏÏÏÎÎÎÌÌÌÉÉÉÄÄľ¾¾¶¶¶«««ŸŸŸmmmZZZGGG777111;;;FFFRRR]]]iiittt}}}†††ŽŽŽ•••›››¡¡¡¦¦¦ªªª®®®±±±´´´¶¶¶¸¸¸¹¹¹ººº»»»»»»»»»ººº¹¹¹···µµµ²²²¯¯¯«««§§§¢¢¢œœœ–––ŽŽŽ†††|||rrrfffZZZMMMAAA555888GGGWWWhhhwww………‘‘‘œœœ¦¦¦¯¯¯···½½½ÃÃÃÇÇÇÊÊÊÍÍÍÎÎÎÏÏÏÏÏÏÏÏÏÍÍÍÊÊÊÆÆÆÀÀÀ···­­­ŸŸŸŽŽŽ{{{fffQQQ>>>...444DDDVVVgggxxxˆˆˆ•••¡¡¡«««³³³ººº¿¿¿ÄÄÄÇÇÇÉÉÉÊÊÊËËËËËËÊÊÊÉÉÉÈÈÈÅÅÅÁÁÁ¼¼¼µµµ­­­¢¢¢•••………tttaaaOOO>>>///000:::DDDOOOZZZdddnnnxxx€€€ˆˆˆŽŽŽ”””šššŸŸŸ£££¦¦¦©©©¬¬¬®®®¯¯¯°°°±±±±±±±±±°°°®®®­­­ªªª§§§¤¤¤   ›››–––‰‰‰xxxnnncccXXXLLL@@@666///===MMM]]]mmm{{{ˆˆˆ”””žžž§§§¯¯¯¶¶¶¼¼¼ÀÀÀÄÄÄÆÆÆÈÈÈÊÊÊÊÊÊÊÊÊÉÉÉÈÈÈÅÅÅÁÁÁ»»»³³³©©©œœœŒŒŒyyydddPPP===...222BBBSSSddduuu„„„‘‘‘œœœ¦¦¦®®®´´´ººº¾¾¾ÀÀÀÂÂÂÄÄÄÅÅÅÅÅÅÅÅÅÄÄÄÂÂÂÀÀÀ½½½¹¹¹³³³«««¡¡¡–––ˆˆˆyyygggUUUCCC444...777@@@JJJUUU___hhhqqqyyy€€€‡‡‡’’’–––ššš   ¢¢¢¤¤¤¥¥¥¥¥¥¥¥¥¥¥¥¤¤¤¢¢¢   žžž›››———“““ŽŽŽˆˆˆzzzrrrhhh^^^TTTIII>>>555222@@@PPPaaappp~~~ŠŠŠ•••žžž§§§®®®³³³¸¸¸¼¼¼¿¿¿ÁÁÁÃÃÃÄÄÄÄÄÄÄÄÄÃÃÃÁÁÁ¿¿¿»»»µµµ­­­£££———ˆˆˆvvvbbbNNN<<<$$$000>>>OOO```qqqŒŒŒ———   ¨¨¨®®®³³³···¹¹¹»»»¼¼¼½½½½½½½½½¼¼¼»»»¹¹¹···³³³®®®¨¨¨ŸŸŸ•••‰‰‰{{{kkkYYYHHH888333<<>>CCCGGGKKKNNNQQQSSSUUUVVVVVVVVVTTTSSSPPPMMMIIIEEE@@@;;;777222$$$$$$888EEERRR^^^hhhqqqxxx~~~ƒƒƒ‡‡‡‰‰‰‹‹‹ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŠŠŠ‡‡‡‚‚‚}}}uuulllaaaTTTFFF888$$$777CCCOOOYYYccckkkqqquuuyyy{{{}}}~~~~~~|||zzzwwwsssnnnggg___TTTIII===111000333777:::===???AAACCCDDDDDDDDDCCCAAA???===999666222...222===HHHSSS]]]eeekkkqqquuuxxx{{{|||~~~~~~~~~|||zzzxxxtttnnnggg___TTTIII<<<111...777AAAKKKSSSZZZ```eeehhhjjjlllmmmnnnnnnnnnnnnnnnnnnnnnmmmllljjjhhhddd___YYYQQQHHH>>>444...000222333444444444333222000...333===FFFOOOVVV]]]aaaeeehhhjjjlllmmmnnnnnnnnnnnnnnnnnnmmmllljjjgggccc^^^XXXPPPGGG===333$$$555<<>>BBBDDDFFFHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIHHHGGGEEEBBB???;;;666000...333888===@@@CCCEEEGGGHHHIIIIIIIIIIIIIIIIIIIIIIIIHHHFFFDDDAAA===999444...$$$000333555666777888888888999999999888888888888777555444111...///222444666777888888888888999888888888888777666444222///esdl-1.3.1/test/test_glfont.erl0000664000070100000120000002721512200143736015127 0ustar dguduucp%% Copyright (c) 2007 Klas Johansson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : test_glfont.erl %%% Author : Klas Johansson %%% Purpose : Demonstrate the use of SDL_ttf as OpenGL textures. %%% This corresponds to the glfont.c example in the SDL_ttf %%% distribution and is based on testgl.erl. %%% Created : 6 Feb 2007 by Klas Johansson %%%---------------------------------------------------------------------- -module(test_glfont). -author('klajo at users.sourceforge.net'). -include_lib("wx/include/gl.hrl"). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -include("sdl_ttf.hrl"). -export([go/1, go/2]). -define(def_fgcolor, #sdl_color{r=255,g=255,b=255}). -define(bpp, 4). -define(def_text, "The quick brown fox jumped over the lazy dog"). go(FontFile) -> go(FontFile, []). go(FontFile, Config) -> %% Init sdl:init(?SDL_INIT_VIDEO bor ?SDL_INIT_ERLDRIVER bor ?SDL_INIT_NOPARACHUTE), sdl_ttf:init(), sdl_util:debug(1), Flags = case lists:member(fullscreen, Config) of true -> ?SDL_OPENGL bor ?SDL_FULLSCREEN; _ -> ?SDL_OPENGL bor ?SDL_RESIZABLE end, sdl_video:gl_setAttribute(?SDL_GL_DOUBLEBUFFER, 1), AvailableWindowedSzs = sdl_video:listModes(null, Flags bor ?SDL_FULLSCREEN), DriverName = sdl_video:videoDriverName(), io:format("Driver ~p ~n", [DriverName]), io:format("Available WindowSizes ~p ~n", [AvailableWindowedSzs]), case AvailableWindowedSzs of [{_, 0,0,W,H}|_] -> Res = [Test || Test <- [32,24,16,15], true == sdl_video:videoModeOK(W,H,Test,Flags)], io:format("A guess at max video res is ~px~p:~p ~n", [W,H, hd(Res)]); _ -> io:format("Can't guess max resolution~n", []) end, SR = sdl_video:setVideoMode(800, 600, 0, Flags), S = sdl_video:getSurface(SR), Rs= sdl_video:gl_getAttribute(?SDL_GL_RED_SIZE), Gs= sdl_video:gl_getAttribute(?SDL_GL_GREEN_SIZE), Bs= sdl_video:gl_getAttribute(?SDL_GL_BLUE_SIZE), Ds= sdl_video:gl_getAttribute(?SDL_GL_DEPTH_SIZE), Db= (1 == sdl_video:gl_getAttribute(?SDL_GL_DOUBLEBUFFER)), io:format("OpenGL attributes ~n"), io:format("Sizes in bits Red ~p Green ~p Blue ~p Depth ~p Doublebuffered ~p~n", [Rs, Gs, Bs, Ds, Db]), io:format("Vendor: ~s~n", [gl:getString(?GL_VENDOR)]), io:format("Renderer: ~s~n", [gl:getString(?GL_RENDERER)]), io:format("Version: ~s~n", [gl:getString(?GL_VERSION)]), io:format("GL AUX BUFFERS ~p~n", [gl:getIntegerv(?GL_AUX_BUFFERS)]), io:format("SDL Version ~p~n", [sdl_video:wm_getInfo()]), io:format("Extensions: ~s~n", [gl:getString(?GL_EXTENSIONS)]), io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), io:format("~p", [catch gl:getConvolutionParameterfv(16#8011, 16#801A)]), sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_IGNORE), sdl_events:eventState(?SDL_KEYDOWN ,?SDL_ENABLE), sdl_events:eventState(?SDL_QUIT ,?SDL_ENABLE), sdl_events:eventState(?SDL_VIDEORESIZE, ?SDL_ENABLE), sdl_events:eventState(?SDL_MOUSEMOTION, ?SDL_ENABLE), ?printError(), %% Open font and render some text onto an SDL surface FontSize = S#sdl_surface.w div 40, % scale font with screen height Font = sdl_ttf:openFont(FontFile, FontSize), sdl_ttf:setFontStyle(Font, ?SDL_TTF_STYLE_NORMAL), TextRef = sdl_ttf:renderTextBlended(Font, ?def_text, ?def_fgcolor), Text = sdl_video:getSurface(TextRef), %% Move this onto an OpenGL texture {Texture, MinX, MinY, MaxX, MaxY} = load_texture(Text), sdl_video:freeSurface(TextRef), init_win(S), sdl_util:debug(0), Cube = {{ 0.5, 0.5, -0.5}, { 0.5, -0.5, -0.5}, {-0.5, -0.5, -0.5}, {-0.5, 0.5, -0.5}, {-0.5, 0.5, 0.5}, { 0.5, 0.5, 0.5}, { 0.5, -0.5, 0.5}, {-0.5, -0.5, 0.5}}, Colors = {{ 1.0, 1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 1.0, 1.0}, { 1.0, 1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 0.0, 1.0}}, draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, ((S#sdl_surface.w - Text#sdl_surface.w) div 2), ((S#sdl_surface.h - Text#sdl_surface.h) div 2), Text#sdl_surface.w, Text#sdl_surface.h), sdl_ttf:closeFont(Font), sdl_ttf:quit(), sdl:quit(), ok. init_win(#sdl_surface{w = W, h = H}) -> Ratio = W/H, gl:viewport(0,0,W,H), gl:matrixMode(?GL_PROJECTION), gl:loadIdentity(), gl:ortho( -2.0*Ratio, 2.0*Ratio, -2.0, 2.0, -20.0, 20.0), gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), gl:enable(?GL_DEPTH_TEST), gl:depthFunc(?GL_LESS), gl:shadeModel(?GL_SMOOTH), gl:clearColor(0.0,0.0,0.0,1.0). draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X, Y, W, H) -> gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), gl:glBegin(?GL_QUADS), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:glEnd(), gl:matrixMode(?GL_MODELVIEW), gl:rotatef(0.1, 1.0, 1.0, 1.0), case {gl:getError(), sdl:getError()} of {0, ""} -> ok; {GL, ""} -> io:format("Errors Reported ~p => ~n", [GL]), io:format("~s~n", [glu:errorString(GL)]); {GL, SDL} -> io:format("Errors Reported ~p ~s~n", [GL, SDL]) end, enter_2d_mode(), gl:bindTexture(?GL_TEXTURE_2D, Texture), gl:'begin'(?GL_TRIANGLE_STRIP), gl:texCoord2f(MinX, MinY), gl:vertex2i(X, Y ), gl:texCoord2f(MaxX, MinY), gl:vertex2i(X+W, Y ), gl:texCoord2f(MinX, MaxY), gl:vertex2i(X, Y+H), gl:texCoord2f(MaxX, MaxY), gl:vertex2i(X+W, Y+H), gl:'end'(), leave_2d_mode(), gl:swapBuffers(), case check_event() of ok -> draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X, Y, W, H); {mouse_moved, MX, MY} -> X2 = MX - W div 2, Y2 = MY - H div 2, draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X2, Y2, W, H); quit -> ok end. check_event() -> case sdl_events:pollEvent() of #quit{} -> quit; #resize{} -> io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), ok; no_event -> ok; #keyboard{sym=$f} -> Surface = sdl_video:getVideoSurface(), io:format("~p\n", [sdl_video:wm_toggleFullScreen(Surface)]), ok; #keyboard{sym=?SDLK_q} -> quit; #keyboard{sym=?SDLK_ESCAPE} -> quit; #mousemotion{x=MX, y=MY} -> {mouse_moved, MX, MY}; Event -> io:format("Got event ~p~n", [Event]), ok end. load_texture(Surface) -> #sdl_surface{w = SW, h = SH, flags = SFlags} = Surface, #sdl_pixelformat{alpha = SAlpha} = sdl_video:getPixelFormat(Surface), %% Use the surface width and height expanded to powers of 2 W = get_power_of_two_roof(Surface#sdl_surface.w), H = get_power_of_two_roof(Surface#sdl_surface.h), MinX = 0, MinY = 0, MaxX = SW / W, MaxY = SH / H, Image = sdl_video:createRGBsurface(?SDL_SWSURFACE, W, H, _Depth=32, 16#FF000000, % createRGBsurface expects 16#00FF0000, % big endian mask values 16#0000FF00, 16#000000FF), %% Save the alpha blending attributes SavedFlags = SFlags band (?SDL_SRCALPHA bor ?SDL_RLEACCELOK), if (SavedFlags band ?SDL_SRCALPHA) == ?SDL_SRCALPHA -> sdl_video:setAlpha(Surface, 0, 0); true -> ok end, %% Copy the surface into the GL texture image Area = #sdl_rect{x = 0, y = 0, w = SW, h = SH}, sdl_video:blitSurface(Surface, Area, Image, Area), Pixels = sdl_video:getPixels(Image, #sdl_rect{x = 0, y = 0, w = W, h = H}), %% Restore the alpha blending attributes if (SavedFlags band ?SDL_SRCALPHA) == ?SDL_SRCALPHA -> sdl_video:setAlpha(Surface, SavedFlags, SAlpha); true -> ok end, %% Create an OpenGL texture for the image [Texture] = gl:genTextures(1), gl:bindTexture(?GL_TEXTURE_2D, Texture), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MAG_FILTER, ?GL_NEAREST), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MIN_FILTER, ?GL_NEAREST), gl:texImage2D(?GL_TEXTURE_2D, 0, ?GL_RGBA, W, H, 0, ?GL_RGBA, ?GL_UNSIGNED_BYTE, Pixels), sdl_video:freeSurface(Image), {Texture, MinX, MinY, MaxX, MaxY}. get_power_of_two_roof(X) -> get_power_of_two_roof_2(1, X). get_power_of_two_roof_2(N, X) when N >= X -> N; get_power_of_two_roof_2(N, X) -> get_power_of_two_roof_2(N*2, X). enter_2d_mode() -> ScreenPtr = sdl_video:getVideoSurface(), Screen = sdl_video:getSurface(ScreenPtr), W = Screen#sdl_surface.w, H = Screen#sdl_surface.h, %% Note, there may be other things you need to change, %% depending on how you have your OpenGL state set up. gl:pushAttrib(?GL_ENABLE_BIT), gl:disable(?GL_DEPTH_TEST), gl:disable(?GL_CULL_FACE), gl:enable(?GL_TEXTURE_2D), %% This allows alpha blending of 2D textures with the scene gl:enable(?GL_BLEND), gl:blendFunc(?GL_SRC_ALPHA, ?GL_ONE_MINUS_SRC_ALPHA), gl:viewport(0, 0, W, H), gl:matrixMode(?GL_PROJECTION), gl:pushMatrix(), gl:loadIdentity(), %% SDL coordinates will be upside-down in the OpenGL world. We'll %% therefore flip the bottom and top coordinates in the orthogonal %% projection to correct this. %% Note: We could flip the texture/image itself, but this will %% also work for mouse coordinates. gl:ortho(0.0, W, H, 0.0, 0.0, 1.0), gl:matrixMode(?GL_MODELVIEW), gl:pushMatrix(), gl:loadIdentity(), gl:texEnvf(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_REPLACE). leave_2d_mode() -> gl:matrixMode(?GL_MODELVIEW), gl:popMatrix(), gl:matrixMode(?GL_PROJECTION), gl:popMatrix(), gl:popAttrib(). esdl-1.3.1/test/Boing.wav0000775000070100000120000003611412200143736013651 0ustar dguduucpRIFFD<WAVEfmt +"Vdata <"=ñ¿¸º¸Øú*3/+* øðÞÅÇÐÊÒòÿ #/'''÷ïâÌÎ×Ùè &.&òêàÓÔåçòõØÆïNT^SüÒ»¤³¶Æô$5SN<5ûß×¼´È×åÿ&.=I<(ÞÏÈÀÀÒæô&027+òÜËÊÈÍàô(+*'õçÕÍÔØãô#.44<-Ó¨¦™«Òó 3>@C? úÝÂÅÄÁÒîø (2050úÝÊËÍÏÜû(2+'# üïáÏÏÚÞï úáÑJNKAìÊ­®¼¿Ñ ,>SE4. ëÜÑ··ÔÜñ+1>I5ùÛÎɾÆÜïþ-/44# ÿéÑËÌËÕêý **)$ûïßÑÐÕÜéþ'1-,2$Û« ›¨Ññ /DBGI öá½»½¹Íéý ,:471ýôØÅÅËÌÛû .61)"ôçÛÌÍÙßð úÞæ/FFB+òÝŪµÉÍã$,@F3'þÞÙÏ¿ÇÞéü-0;>#ëÓÏÌÅÒëù!.,.(õßÍÏÓÕãù%)"óéÛÔ×Ýæñ'*'"&ñ´ Ÿ¥Îí.GGJG óß½º¼¼Ðè.<770ýñ×ÃÁÈÐßþ .93)"õãÙÌËÖßíäí0;?4õÙʳ¿ÐÚò&,;=(öÜ×ÐÈÑèó +,41úäÓÑÎÎßõ")&% ûëßÐÓÚÞð #% ýíçÚ×Þçðû #!ùꦫÏê,FIID# ðÝ¿»¾ÁÒé/;85.ìÙÄÃÉÒàü!062) óâ×ÍÌØâóéð*68-óÛ̺Æ×âø'+87" óÛØÒÎØìø"**.*ûáÔÒÔÕáø!'$!öéÝÑÕÞãö""ûêäÛÚáêõ!Ï·®±Ëã!:CE@-÷áÍ¿ÁÄÎåü#673+ïÜËÃÊÓà÷ *31( ÷æÚÒÐÙãòîð#55+ôÜνÀÖàù)-69" øÚØÒÍÙêû!,,-(øßÓÒÕÖãû#)% õçÚÒÖßåø""øèâÜÛáëó   è͏ÄÞþ3AA;/ûçÔÂÂÈÑâû .82*ñáÑÈÊÔáõ &00' úëÜÕÐÔâìÿ  ñë14.ûßÑÁÁ×ß÷')48' üßÚÔÐ×èø)+,(ûâÖÓÖ×áø '$!øëÞÖ×Ýäò !ûîåßÚàèñý õÓ¿½ÂÖó':?:0íÚËÃÆÎÛñ&11, ÷êÙÎÉÐßê!).+ñâÚÓÕßêø÷í060 æÖľÐÙï")49- æÛÕÎÑàñÿ&+.. íÜÔÔÒÜíý $'%ýðâ×ÔÙÝìý #ñèßÚÜãëø ÿáÇÀÀËâ1;;5'öèÓÈÈÍ×ãÿ *0+#ÿðàÕÌÍÛäú!++!úèáÖÔÞæóý ûï -50%ðÛËÁË׿þ%-82"ðÞ×ÐÏÜìú!(*-$óàÖÕÓØéø!$$!õèÙÕÙÝéú!øìäÜÜäéö óÕÀ¿ÁÕù ):=;1 þñÜÍÄÉÑÚõ&42'! úåÚËÊÕÝð*.&ñäÛÔ×àêö üÿ!-' óÝÓÆÎÜêü$+20 ñàÚÕÔßñý &'( ôãØÙÙÝíý#!þõçÝ×ÛâêüöêåÞßçíüÿåž¿Èë7@?9-õÞÏÁÄÌÕî$26-$úéÛÎÇÑÝêþ!)0* îßÙÒÕáíû üñáÜÕÛìù%%#ùîâßáåðü !òíâÝâéòú ñêåäâêöý  úòìçéìðü  ýøùÿ ÝÊÂÂÛù*:83)õäÖÇÈÓÛì,0% öäÛÓÎØèõ#(*!öæÛÛÝáïý þòùüñðòòý  ú÷÷ññ÷úþ ýôôôòøý ÿúùöñõ÷øýÿýøöö÷øúÿýüüüÿ $ïÏÁºÆæ 7<80ûçÕÈÅÍÚí#-/"ïÜÑÐÑàô$+'!ôæÝ×Ýéò ! òëëðõø  ÿúöóòõúÿ  ÿúöóòõøý ÿúöòòóöú ÿúöòðó÷ý ýøõõõøü  *Ѻ­¶×%DMF4íÒ¼²ºÏé#2<9#ôÞÉÅËÕô,4- òâÖÒÙæÿ ))!îäÜßïü  üôìëðóþÿóìèìðù  ýöðîïóû ý÷òòò÷ýýøööøû þøöõöú +Ü¿ª«Ðú0M[J'˱§«Ïò!7JE# áȺ¿Õð*99# íÛËÎäõ%0, ñáÔÔåö)( öçÛ×àò'* õãØÚéü$ýéÛÙáóñåàåðÿõêåèó  õëéí÷ ÷ïëñ÷ ôïïô 篱ØEYW:øÏ¦¥¸á@VHñÀ®µÎ#BD( ÝÈÀÍõ1;1úÝÏÒæ,+êÜÜéþ"öêåíú ùíçíøùíçëõ  úñïóú ý÷óó÷ÿ üöóôùÿÿúùúýÿýüüÿÿÿÿÿ äÍÎé8@( Ý¿Õ52òÖËÕñ&$ûãÙÝô íãçôõíìö  úóôú ûòïô üôôü øóôû ÿû÷öûÿýúúûýÿûúúüÿÿüüüüÿÿüüüýÿÿÿüüüÿÿÿÿ ûäáð&üãÝçö òêðú öóùÿû÷÷üû÷øýüùøüû÷öùòìêôôðôþ ÿòðú þôôü ûö÷þýúøùÿüúúüÿÿüúüÿÿýüüýÿÿýûúüÿÿýüüÿ ñæðÿ ëáíÿ  ýïëô ûôóúÿùøùþÿúúýýúúýýúøøúûíêïúîîúúòö ü÷÷ü ùøûÿüúúýýúûýÿÿýûúüÿþûúûýýûûüýÿüüýÿûìíùòäêû ÿôìò úõõúÿù÷úÿýûüÿþüûýÿûúûûýýïèìøïîúöòö üõöþÿùøýÿúùüÿüùüÿÿýûûþþüûýÿÿþýýþÿÿÿþýÿÿÿÿõìñü ëæñýüîîù ùóõþüøøüüùüÿÿûûþþüúúûüøäâð  öæéûòí÷úóôý þ÷õúû÷øþþúùûÿÿüúûþÿþûûüþÿþûûýÿÿþýýÿÿÿÿÿ÷òõ  ýóíñÿ þ÷ñôþ þùõøþÿüùúýþûûþýûûüþÿýúøü êÚÝ÷&&òááó ûëæôþñìô  ÿõïòý ùòóû üôóùþþø÷úþÿûùúüþüûüÿþýýÿþûûþüúùúþýûûýÿÿþýýþÿÿÿýýÿÿÿýýýþþýüúøöõû !%ùÞÐÚô-/ éÙÜë% ùæãðü üòìïû ÷óó÷ÿþøöøúÿþúøùüÿÿþûúûýÿþüûýÿÿþüýþÿþûûûþþüûûþþüûüþÿÿýýþÿÿÿÿÿüúúùøøööø-*øÕÉÌÞ 9=)ë×ÉÐì#00#òÚÔÜé%&ðâÚÞîýøçâäëü ýñéçìö  ÷ïíîôý þøóóõùþÿþÿúõóõùþ ùõôõùÿ ÿüùøúúþÿûúúüüýÿþýü÷õóó*-"ðÝÍÍßò$33'ùçØÖÜé#($øåÞÚáòÿ õèáàçó  õëååìõ  øïêêðø  úôððôøþ ýù÷ö÷üþ ÿüùøøúüÿÿþûùøùüþÿüøõôóôõ÷û&)$þíØÑÔÞô&,* ÿíáÚÜäò##óæßßãîü öêääçîùûñêæèî÷þöïëëíôú  þöôññòôúþ  üõððñöú ùöôóôøüÿ þûøõõöùûþÿüü úðèæéðúÿ÷ðììïõý  ÿ÷ñíîñöý  ý÷óððóøý ýøôòóöùÿ üùõôöøý ùíéåèóûýðëçèíóÿ üõïììðõþ  ÿøóðïò÷ý ÿúóïîñöþ  ýöòññõúÿ ýöóòóöû ÿøöòôöú ûøöö÷úÿÿûù÷ùúýüîçãäîúøíäâäëõ þóëèçíôþ úóîíïôü  ýùöõöùþ  ÿúõôõ÷þ ýøõóõ÷þ ûøõõöøÿûùööùúûúøøûýÿüûûþ øëäáèõ÷ëããèñýýóëéêðú  úòîïóû  ýùõõõöû  üöðïòø ûôññôû  ÿøôòóùþ û÷óó÷û þùöõöûÿ ÿüø÷÷úþýûûüÿ þðèäçô ûïåâçòÿ  òìèéôý ÷ñîî÷þ ùõóõûýýýýÿýüýþþýûûüþýýûýýÿþýýýÿÿþþþÿþþþÿÿþÿ öðìíø÷éåêñ  öîéëõþ ûñïñö ûõóóú ÿþþýýþÿýüüýýýýþÿýýþÿþýýýÿÿýüüýÿþýýþÿþþþþùööúÿ ûóòõú ÿ÷ôô÷þ ýøõöüÿüùøùüÿüý ûôñôü þöòóú  úõó÷þ ý÷ôöúÿû÷÷úþýøøúüÿûùùûÿýüûûýþýýþýûûüýûùúýýûûûýýüûüþÿýûûüýÿ øðíðú ÷ðîóü ÿ÷ññõû  ÿ÷òòöþ þùõõøü ÿøööøýÿûø÷úüüûúûýÿüüüýÿýüüýþýüüýÿÿýüüýÿÿýüüüüýýýþ üòìëïüûðíïôÿ úñïò÷  þùòòôù þùôóõù þúõõ÷úûùøøûþþûùùûýþûùùûþüúùùûþÿüúúûýÿýúùùùûüÿ ÷ðéêñù ùðíïóü ùóððôú  ûôññôû ü÷ôôöúÿ ÿú÷÷÷ûÿýûùùûþýüþÿüüüüþþýüüýÿÿýýýýþÿþýüúüþ  ýöðîðôü  ÿùóòòõû ü÷óóôøþ þúõõõøüÿüùööøûþÿüúùùûýþüúúûüÿþýüüüýÿþýýýýþÿÿþþýýýþÿÿ ÿü÷õõöúÿ ÿûøööøûÿ ÿûù÷÷øûÿÿüùøøùûþÿüúùùúûþÿýûúúûýÿýûøø÷øý þù÷ööøûþüùøøùüþýûúúûýÿþüûúûüþÿüûûûýÿÿýüûûüþÿþýûûüüþÿþýüýýþÿÿþþýþþÿýøöõõúþ þùöõõ÷üÿÿüù÷÷ùüÿÿýûûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú÷õõøý ü÷ôô÷ûÿ üø÷÷ùýþüúúýÿýûúûýÿþüùùüþÿýúúûýÿýúúûýÿþûûûýþüüüþÿýýýÿÿÿþþÿÿûø÷øûÿ ü÷õöúÿÿú÷÷ùýþüúúüÿÿýýýþþÿÿüûüýÿüûüýÿÿüüüýþýüýÿÿþýýþÿÿýýýÿÿþþþÿÿÿþÿÿÿýüüþþûúúýÿÿýúúûþÿýûüýÿýýýÿÿþþþÿÿþþþÿÿÿþþÿþþþÿÿþþÿÿÿÿÿÿÿÿþþþþþþÿþþþþþþÿþÿÿÿüüüÿÿüüüÿÿýýþÿÿþýþÿÿþýþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüÿþüüþÿýýþÿÿýýþÿÿýýÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿýüüþÿýüüþýýýþÿþýýþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüýþþýýýÿþýýþÿþýýþþþþþÿþþÿÿÿÿÿÿÿÿþýýþÿþþþÿÿþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿesdl-1.3.1/test/erldemo.erl0000775000070100000120000003515712200143736014235 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : erldemo.erl %%% Author : Dan Gudmundsson %%% Purpose : Show that erlang can do opengl. %%% Created : 11 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(erldemo). -author('dgud@erix.ericsson.se'). -include_lib("wx/include/gl.hrl"). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_audio.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -export([go/0, go/1]). -compile(export_all). -define(W, 640). -define(H, 480). go() -> go([window]). go(Mode) -> %% Init Wrapper = sdl:init(?SDL_INIT_VIDEO bor ?SDL_INIT_AUDIO bor ?SDL_INIT_ERLDRIVER bor ?SDL_INIT_NOPARACHUTE), Audio = audio_server(not lists:member(no_audio,Mode)), sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_IGNORE), sdl_events:eventState(?SDL_KEYDOWN ,?SDL_ENABLE), sdl_events:eventState(?SDL_QUIT ,?SDL_ENABLE), Flags = case lists:member(fullscreen, Mode) of true -> ?SDL_OPENGL bor ?SDL_FULLSCREEN; _ -> ?SDL_OPENGL end, sdl_video:gl_setAttribute(?SDL_GL_DOUBLEBUFFER, 1), R = sdl_video:setVideoMode(?W, ?H, 16, Flags), %% Get Ready for events initWin(), Texture = loadTexture("Powered.bmp", false), Bump = loadTexture("PoweredBump.bmp", true), Verts = {{ 0.5, 0.5, -0.5}, %1 { 0.5, -0.5, -0.5}, %2 {-0.5, -0.5, -0.5}, {-0.5, 0.5, -0.5}, %4 {-0.5, 0.5, 0.5}, { 0.5, 0.5, 0.5}, %6 { 0.5, -0.5, 0.5}, {-0.5, -0.5, 0.5}}, %8 %% Faces Normal U-axis V-axis Faces = [{{1,2,3,4},{0,0,-1},{-1,0,0}, {0,1,0}}, % {{3,8,5,4},{-1,0,0},{0,0,1}, {0,1,0}}, % {{1,6,7,2},{1,0,0}, {0,0,-1}, {0,1,0}}, % {{6,5,8,7},{0,0,1}, {1,0,0}, {0,1,0}}, % {{6,1,4,5},{0,1,0}, {-1,0,0}, {0,0,1}}, % {{7,8,3,2},{0,-1,0},{1,0,0}, {0,0,1}}], Data = {Faces, Verts}, BumpPossible = is_bump_possible(), put(bumpPossible, BumpPossible), io:format("Press 'c' to toggle texture.~n" "Press 'b' to toggle bumpmap.~n" "Press 'q' or 'Esc' to quit.~n"), {Time, Frames} = timer:tc(?MODULE, drawBox, [Audio, Data, 0, 5.0, {0.0, 0.0, 0.0}, {0.04, 0.05, 0.06}, {0.2, unknown}, {Texture,Bump}, true, BumpPossible ]), Secs = Time / 1000000, io:format("FPS: ~p (Frames ~p)~n", [catch Frames/Secs, Frames]), sdl:quit(), ok. is_bump_possible() -> Ext = gl:getString(?GL_EXTENSIONS), Exts = string:tokens(Ext, " "), GLVerHasDOT3 = case gl:getString(?GL_VERSION) of "1.3" ++ _ -> true; "1.4" ++ _ -> true; _ -> false end, HasExtensions = lists:member("GL_ARB_texture_env_dot3", Exts) and lists:member("GL_ARB_multitexture", Exts), HasExtensions or GLVerHasDOT3. initWin() -> gl:viewport(0,0,?W,?H), gl:matrixMode(?GL_PROJECTION), gl:loadIdentity(), glu:perspective(30.0, ?W/?H, 0.1, 30.0), gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), gl:enable(?GL_DEPTH_TEST), gl:depthFunc(?GL_LEQUAL), gl:enable(?GL_CULL_FACE), gl:materialfv(?GL_FRONT_AND_BACK, ?GL_DIFFUSE, {0.7,0.7,0.7,1.0}), gl:materialfv(?GL_FRONT_AND_BACK, ?GL_AMBIENT, {0.6,0.6,0.6,1.0}), gl:materialfv(?GL_FRONT_AND_BACK, ?GL_SPECULAR,{0.7,0.7,0.7,1.0}), gl:materialf(?GL_FRONT_AND_BACK, ?GL_SHININESS, 80.2), gl:lightModelfv(?GL_LIGHT_MODEL_AMBIENT, {0.3,0.3,0.3,1.0}), gl:enable(?GL_LIGHT0), gl:lightfv(?GL_LIGHT0, ?GL_DIFFUSE, {0.7,0.7,0.7,1}), gl:lightfv(?GL_LIGHT0, ?GL_SPECULAR, {0.7,0.7,0.7,1}), gl:enable(?GL_TEXTURE_2D), gl:shadeModel(?GL_SMOOTH), gl:clearColor(0.5,0.5,0.9,1.0). draw_quads({Faces, Verts},Mode) -> gl:'begin'(?GL_QUADS), draw_quads2(Faces, Verts,Mode). draw_quads2([{{V1,V2,V3,V4},N,Ut,Vt}|R],Cube, color) -> gl:normal3fv(N), gl:texCoord2f(0.0, 1.0), gl:vertex3fv(element(V1, Cube)), gl:texCoord2f(0.0, 0.0), gl:vertex3fv(element(V2, Cube)), gl:texCoord2f(1.0, 0.0), gl:vertex3fv(element(V3, Cube)), gl:texCoord2f(1.0, 1.0), gl:vertex3fv(element(V4, Cube)), draw_quads2(R,Cube,color); draw_quads2([{{V1,V2,V3,V4},N,Ut,Vt}|R],Cube, Light) -> X = dot(Ut,Light), Y = dot(Vt,Light), Z = dot(N,Light), gl:color3fv(norm_rgb(X,Y,Z)), gl:normal3fv(N), gl:multiTexCoord2f(?GL_TEXTURE0,0.0, 1.0), gl:multiTexCoord2f(?GL_TEXTURE1,0.0, 1.0), gl:vertex3fv(element(V1, Cube)), gl:multiTexCoord2f(?GL_TEXTURE0,0.0, 0.0), gl:multiTexCoord2f(?GL_TEXTURE1,0.0, 0.0), gl:vertex3fv(element(V2, Cube)), gl:multiTexCoord2f(?GL_TEXTURE0,1.0, 0.0), gl:multiTexCoord2f(?GL_TEXTURE1,1.0, 0.0), gl:vertex3fv(element(V3, Cube)), gl:multiTexCoord2f(?GL_TEXTURE0,1.0, 1.0), gl:multiTexCoord2f(?GL_TEXTURE1,1.0, 1.0), gl:vertex3fv(element(V4, Cube)), draw_quads2(R,Cube,Light); draw_quads2([],_,_) -> gl:'end'(), ok. drawBox(Audio, Cube, N, R, Pos, Vel, Speed = {S, T0}, {Txt,BumpTxt}, Color, BumpMap) -> gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), {NewPos = {X, Y, Z}, NewVel} = calc_pos(Audio, Pos, Vel, S), gl:loadIdentity(), gl:lightfv(?GL_LIGHT0, ?GL_POSITION, {0,10,10,1}), gl:lightfv(?GL_LIGHT0, ?GL_SPOT_DIRECTION, {0,0,-1}), gl:lightf(?GL_LIGHT0, ?GL_SPOT_CUTOFF, 45), gl:translatef(X, Y, Z-3.0), RotV = {0.5,0.5,1.0}, gl:rotatef(R, element(1,RotV),element(2,RotV),element(3,RotV)), case BumpMap of true -> Rot = rotate(-R, RotV), LightInObjectSpace = mul_point(Rot, {0.0,10.0,10.0}), %% Setup first texture stage to DOT the color (which contains the %% light vector in tangent space) with the pre-filtered height map. gl:disable(?GL_BLEND), gl:activeTexture(?GL_TEXTURE0), gl:enable(?GL_TEXTURE_2D), gl:bindTexture(?GL_TEXTURE_2D,BumpTxt), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_COMBINE), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_COMBINE_RGB, ?GL_DOT3_RGB), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_SOURCE0_RGB, ?GL_PRIMARY_COLOR), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_SOURCE1_RGB, ?GL_TEXTURE), %% Setup the second texture stage to modulate the previous dot product %% and the the base texture. gl:activeTexture(?GL_TEXTURE1), case Color of true -> gl:enable(?GL_TEXTURE_2D); false -> gl:disable(?GL_TEXTURE_2D) end, gl:bindTexture(?GL_TEXTURE_2D,Txt), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_COMBINE), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_COMBINE_RGB, ?GL_MODULATE), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_SOURCE0_RGB, ?GL_TEXTURE), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_SOURCE1_RGB, ?GL_PREVIOUS), draw_quads(Cube,LightInObjectSpace), %% Disable texturing for TEXTURE1 gl:disable(?GL_TEXTURE_2D), %% and for texture0 gl:activeTexture(?GL_TEXTURE0), gl:disable(?GL_TEXTURE_2D); false -> gl:enable(?GL_LIGHTING), case Color of true -> gl:enable(?GL_TEXTURE_2D), gl:bindTexture(?GL_TEXTURE_2D,Txt), gl:color3f(1,1,1), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_MODULATE), draw_quads(Cube,color); false -> gl:disable(?GL_TEXTURE_2D), draw_quads(Cube,color) end end, % if Color == true -> % if BumpMap == true -> % gl:enable(?GL_BLEND), % gl:blendFunc(?GL_DST_COLOR,?GL_ZERO); % true -> ignore % end, % gl:enable(?GL_TEXTURE_2D), % gl:bindTexture(?GL_TEXTURE_2D,Txt), % gl:color3f(1,1,1), % gl:texEnvi(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_MODULATE), % draw_quads(Cube,color); % Color == false, BumpMap == false -> % gl:disable(?GL_TEXTURE_2D), % draw_quads(Cube,color); % Color == false -> % ok % end, gl:disable(?GL_BLEND), gl:disable(?GL_LIGHTING), check_error("DrawCube"), T1 = sdl_video:gl_swapBuffers(), case check_event(Color,BumpMap) of {NewCol, NewBump} -> NewS = calc_speed(Speed, T1), timer:sleep(10), drawBox(Audio, Cube, N + 1, R + (3 * S),NewPos, NewVel, NewS,{Txt,BumpTxt},NewCol,NewBump); quit -> N + 1 end. calc_pos(Audio, {X, Y, Z}, {Vx, Vy, Vz}, S) -> NX = X + S*Vx, NY = Y + S*Vy, NZ = Z + S*Vz, Nvx = if NX > 1.0; NX < -1.0 -> play(Audio, {nx, NX}), Vx * -1; true -> Vx end, Nvy = if NY > 1.0; NY < -1.0 -> play(Audio, {ny, NY}), Vy * -1; true -> Vy end, Nvz = if NZ > 0.0; NZ < -10.0 -> play(Audio, {nz, NZ}), Vz * -1; true -> Vz end, {{NX, NY, NZ}, {Nvx, Nvy, Nvz}}. calc_speed({S, unknown}, T1) -> {S, T1}; calc_speed({S, T0}, T1) -> SPF = 0.2 + ((T1 - T0) / 1000), %% Last frame took Diff = (SPF - S) / 100, NS = S + Diff, {NS, T1}. loadTexture(File, Bump) -> Ref = case sdl_video:loadBMP(File) of null -> io:format("Couldn't load BMP file: ~p ~n", [File]), exit(load_bmp); SR -> SR end, Image = sdl_video:getSurface(Ref), Format = sdl_video:getPixelFormat(Image), Size = Image#sdl_surface.w * Image#sdl_surface.h * 3, Mem0 = sdl_util:malloc(Size, ?GL_UNSIGNED_BYTE), sdl_util:copySdlImage2GLArray(Image, Mem0, 3), %% Convert 2 GL format Mem = case Bump of true -> Map = bumpmap(Mem0, Image#sdl_surface.w, Image#sdl_surface.h), io:format("Bumped~n"), Map; false -> Mem0 end, [Ture] = gl:genTextures(1), gl:bindTexture(?GL_TEXTURE_2D, Ture), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MAG_FILTER, ?GL_LINEAR), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MIN_FILTER, ?GL_LINEAR), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_WRAP_S, ?GL_CLAMP), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_WRAP_T, ?GL_CLAMP), gl:texImage2D(?GL_TEXTURE_2D, 0, 3, Image#sdl_surface.w, Image#sdl_surface.h, 0, ?GL_RGB, ?GL_UNSIGNED_BYTE, Mem), sdl_util:free(Mem0), sdl_video:freeSurface(Image), Ture. check_error(Str) -> case {gl:getError(), sdl:getError()} of {0, ""} -> ok; {GL, SDL} -> io:format("In ~s Errors Reported GL ~p SDL ~s~n", [Str, GL, SDL]) end. check_event(ColMap, BumpMap) -> case sdl_events:pollEvent() of #quit{} -> quit; no_event -> {ColMap,BumpMap}; Quit when is_record(Quit, keyboard) -> if Quit#keyboard.sym == ?SDLK_ESCAPE -> quit; Quit#keyboard.sym == ?SDLK_q -> quit; Quit#keyboard.sym == ?SDLK_b -> {ColMap,get(bumpPossible) and not BumpMap}; Quit#keyboard.sym == ?SDLK_c -> {not ColMap,BumpMap}; true -> io:format("Got event ~p~n", [Quit]), {ColMap,BumpMap} end; Event -> io:format("Got event ~p~n", [Event]), {ColMap,BumpMap} end. play(no_audio, Reason) -> ok; play(Sample, Reason) -> %% io:format("eplay ~p ~n", [Reason]), sdl_audio:play_audio(Sample, 1). audio_server(false) -> ok; audio_server(_) -> {ASpec, Sample} = sdl_audio:loadWAV("Beep.wav"), MySpec = ASpec#audiospec{samples = 1024}, %, format=?AUDIO_U8}, case catch sdl_audio:openAudio(MySpec, true) of {'EXIT', _} -> io:format("Failed to open Audio, ignoring sound ~n", []), sdl_audio:freeWAV(Sample), no_audio; ObtainedFormat -> % io:format("Audio Spec's:~n~p~n~p~n~p~n", % [ASpec, MySpec, ObtainedFormat]), ConvS = sdl_audio:convertAudio(ASpec, ObtainedFormat, Sample), sdl_audio:freeWAV(Sample), %% Clean old sample sdl_audio:pauseAudio(false), ConvS end. bumpmap(Mem,PW,PH) -> W = PW*3, <> = sdl_util:readBin(Mem,PW*PH*3), bumpmap(Row1,Row2,Rest,W,Row1,[]). bumpmap(R1,<<>>,<<>>,W,First,Bump) -> <> = R1, Row = bumpmapRow(R1,First,F,[]), list_to_binary(lists:reverse([Row|Bump])); bumpmap(R1,R2,<<>>,W,First,Bump) -> <> = R1, Row1 = bumpmapRow(R1,R2,F,[]), Row2 = bumpmapRow(R2,First,F,[]), list_to_binary(lists:reverse([Row2,Row1|Bump])); bumpmap(R1,R2, Rest0,W,First,Bump) -> <> = R1, Row = bumpmapRow(R1,R2,F,[]), <> = Rest0, bumpmap(R2,R3,Rest,W,First,[Row|Bump]). bumpmapRow(<<>>,<<>>,_,Br) -> list_to_binary(lists:reverse(Br)); bumpmapRow(R1,R2,F,BR) -> <> = R1, %% Should be greyscale <> = R2, %% so Green Blue channels ToFloat = 1.0/255.0, C = C0*ToFloat, Cx = case Row1 of <> -> Cx0*ToFloat; <<>> -> F*ToFloat end, Cy = Cy0*ToFloat, Scale = 4.0, DCX = Scale * (C-Cx), DCY = Scale * (C-Cy), %% Normalize Sqlen = DCX*DCX+DCY*DCY+1, Recip = 1.0/math:sqrt(Sqlen), Nx = DCY*Recip, Ny = -DCX*Recip, Nz = Recip, %% Pack in RGB RGB = [round(128.0+127.0*Nx), round(128.0+127.0*Ny), round(128.0+127.0*Nz)], bumpmapRow(Row1,Row2,F,[RGB|BR]). dot({V10,V11,V12}, {V20,V21,V22}) -> V10*V20 + V11*V21 + V12*V22. norm(V1, V2, V3) when is_float(V1), is_float(V2), is_float(V3) -> D = math:sqrt(V1*V1+V2*V2+V3*V3), case catch {V1/D,V2/D,V3/D} of {'EXIT',_} -> {0.0,0.0,0.0}; R -> R end. norm_rgb(V1, V2, V3) when is_float(V1), is_float(V2), is_float(V3) -> D = math:sqrt(V1*V1+V2*V2+V3*V3), case catch {0.5+V1/D*0.5,0.5+V2/D*0.5,0.5+V3/D*0.5} of {'EXIT',_} -> {0.0,0.0,0.0}; R -> R end. rotate(A0, {X,Y,Z}) when is_float(X), is_float(Y), is_float(Z) -> A = A0*3.14159/180, CosA = math:cos(A), SinA = math:sin(A), XSinA = X*SinA, YSinA = Y*SinA, ZSinA = Z*SinA, {C2,C3, C4,C6, C7,C8} = {-ZSinA,YSinA, ZSinA,-XSinA, -YSinA,XSinA}, {U1,U2,U3,U4,U5,U6,U7,U8,U9} = {X*X,X*Y,X*Z, Y*X,Y*Y,Y*Z, Z*X,Z*Y,Z*Z}, S = CosA, NegS = -S, {U1+S*(1.0-U1), U4+NegS*U4+C4, U7+NegS*U7+C7, U2+NegS*U2+C2, U5+S*(1.0-U5), U8+NegS*U8+C8, U3+NegS*U3+C3, U6+NegS*U6+C6, U9+S*(1.0-U9), 0.0,0.0,0.0}. mul_point({A,B,C,D,E,F,G,H,I,Tx,Ty,Tz}, {X,Y,Z}) when is_float(A),is_float(B),is_float(C),is_float(D), is_float(E),is_float(F),is_float(G),is_float(H), is_float(I),is_float(Tx),is_float(Ty),is_float(Tz), is_float(X), is_float(Y), is_float(Z) -> share(X*A + Y*D + Z*G + Tx, X*B + Y*E + Z*H + Ty, X*C + Y*F + Z*I + Tz). share(X, X, X) -> {X,X,X}; share(X, X, Z) -> {X,X,Z}; share(X, Y, Y) -> {X,Y,Y}; share(X, Y, X) -> {X,Y,X}; share(X, Y, Z) -> {X,Y,Z}. esdl-1.3.1/test/icon.bmp0000775000070100000120000000110212200143736013511 0ustar dguduucpBMBB( m m ÿÿÿÿÿ"""""!"!!""!""""!""""""""!""""""""""""""!""""""""!""""""""""""""""""""""""""""""""""""""""!""""""""!""""""""""""""!""""""""""esdl-1.3.1/test/sample.wav0000775000070100000120000035613212200143736014101 0ustar dguduucpRIFFRÜWAVEfmt 2"V“+ ôÿÀ@ðÌ0ÿˆÿfactU°dataÜUöÿÕÕñ Ó“ñâ¡ðÔÐ0R C0@çñòäÖâô QñôÃÔóô;Ý ÐûïÎЀàìîïÀ ïÐÀÐÐÞîÝ ÓâõôñÓâÃÃæð . P=ÑÃñã Óãåñ> Ô‚ãÓ$#$$õ"ôä6òáñw"óñ/-=‚±þ±±ÿíÎìà€àîÏÜÿ¿ü ûþРßïÐÞíÀ±ÀàÒæ .0×òåòà P à¡ñ0ìÏîÎÍîÁ¢Ð à¡ðã2'òA"20472347 #ö"ó/Ð .ÂÔ@‘þ²àÛ+À±à ëàÁÑÝÜâÐ  Þþ °Ýþ áà‚ÁÃñðââ¡ðÓÃðÆÑÑÿâ ÃÔ“P×Óô07 >$çòåâ . ßÀ°€ßßÓÓ7!%ö#D43c!` Åâã×ÂÑòà³Ñýý²±ðоÝüлï°ð àÐÐÀààÐðá¢ÒðàÀаÀñâ³*úùm ¾50âAT3D#!ôóÃð ^ €Ïïßìüаïþ ÀíÿÏüÏÍÍ Ý¾Ðàóà. ×$5#$4$$ âBEó²ó .Ó ÍÀÐñÊÚþß ÝÿàáÝ ÑñÙ #¾ÍÒ±ÑâàÀ‚ ðNßP@0$°Õï@0²0á“ðó¾ò=îõ -íà 2â°Gðò/MÞòÙ-² Bý€ñ!ïÎPáß €ðíÜÐ/ó>€oôþQÝä?àåATþôa‹î?°BüÏtêì/Ð,Ðórýÿð0ðïóàJ>ÀÑ@ ð¿ð@óAì°R"ÎíÏþÿŸòœ !ÿÚúþÿ¯à°1ùð_ðD:ÐpððÐ?ü÷ÿ2TÀñ'.ïB°ó!6# ÌôaÎàßñÿqüß¿"ËÏïí¥@ ¯BÎà4!$aÝ%C®ÿÐààßðtÿîó(Ï>€ñ1+Ðòåàpÿ ñ ö/Þÿ %ÏÂ? ÔÐ÷;!ý@áîq"ü"Î#"à4Ð`1ðÀ>Ôþ 3Ø1Íñýûñïð¿1Ѭÿ’ î ÐAïÐÿÓO¸° %ï°ð!ìíà@Ñþð¿3ëþð±.àßÐ3áPÀÿ°%îÍ$BýØá$ÎàòQÜ.‘å ÿðÐÀðþ!> ÒDýïÏûìàð1 ³3ÍðâEÀ¿ðRà°B 0ßÛ í3À%"C¬Ð ÿÞÁB AÜâr¾ÿî20èðï2ð`ðáq1ìß"þ×pßà?àq2 íÓ5±Àï#ò!μüRÝÿñÌC¾°âÿæûààìÜ °Ñ#@ÏëŽíR îïýÃC €ð!Û²& ÿAàÞâR2úàá%pìñS à &ûÿ Ô, a/îÐRýÍ Ü"B»îð4A ñÎ'ßÑGèèú×ÿÿ~ñ5îÑ àÂýßÒNÕ3Ïð$ðîáPÛ 2¼àñð0®ýä$ÞÑb ÏÑaïÀàs ¾à!ýòòÌ"& °ð¢ ÊC°Ð4¿ðCà¯ððt¯ð#îð'°3.ðßád ÒrþàB"®ò'þñ7¾ÿàÿöÝ4 Øÿ! %ÿ¿Á4Þ°Bü¿ãßß²`0Ùà" °3ò"2ï0ðÑ4 ÝÀS0α3P ®!?ÿðîŽñQ1½Àÿìðà&Ð$4 ð ÐõÞà ßÁ6ýÜãA!ðþâD ëÏàb@ïïÑ'ÀA½ð0ðßMŸð1ÊýÝ@0òÜà$0ì Ð"ÝÿB0€ó2ÙððàÛá! Ï7"û ð*ìíFðëðàCÎà"ÌRðñ"Ú2ð¾Ðe0ÞØà!ñíßÀ×&þð ñ$? àðøA À'"ÎB#Œï3ãí®àát 0 õ#ð °à%Ñî±r îñ44,íðâ'w ®òbáÎßàE2 ÀàÒC,ï4#ûîïþpñù4­ñ34úðëݲCÚß#ßа% Ï ?éþÁÿ¡?Œ# îòÀôRì®à4 ÜŸ& Ð"íâ2 ¿ 0ÀÿÞrB»ÐA!°îåD Ü î" ¾RÀ $ ïþðáAîòÀìÞð ñs0üýÝÖ4 ¿ðS/ÎÝb?¿0î°Ïðb ¾PîÿÀàG!ÝíC ¯àÒuýï%!üñ1à° ÂÌðBÍíñV$ÿïÜ ððÐÐàd0 î"4ûà1ÿß´ðçèï4 Ü%5üýßPÐ ýà'2 ÜFÏìñàèÞ5 ìÞã"ïŽ6 ßãaþÑqìþB°àÿ îáìá5Aü!/±>Îõc¿ýð3ðÁ"Üñ’ðB,ëÏôaÞñïÑ¡S+ðýî"ïÏâ Õ#èÿÜ !áÌ"0ΞâCðà áAïãÖ ð0ïÏ ËÔ"ÁáÕ²Ð4!¾°$ð À!ÃþäÐÅá%Ð3ðýFÿ¡ûáä±ýòíñ ‘0Ü2¡ôïóÕýP"ÁÄàóA ?ô£ B-àDã£áð@>aÍAàõñíò1=ࢠ۠ÁðÑï° ÃäGáî'×0 "‘³!4 01`ñÞ7ðPñáóµò¿ðA0ýýÛÒbë ð%ÿó¼µðä @°îP.°ñ2ÀÀ pðB±:Ò=þb¿ñÑ0$8ÐPàÐó'^àä °=Ýõóú ¿ ðžïÐOòàsŸð° à"!ÁûâOß"€ðòéð1ý"øÐ%¿Àò`À!  ðÿþP#êÝ@û"ï ß%ëà0Þï ¿/ðŸ0ðÀÃÏS!øß%"ëÐ"ÿ2°¯!"èÿ Ð #½ !>Ž4ïàáéÀC!¼ÀíÏ"à à¿’5 Ðñà÷¯ 1! ßùðBþò­ÁUÝÁ ï!ÿèâDî áÆÝíä4ÁýôÒ­ 2þ®ðTÎÑ! ß" ú¡R/Üð!ärÝëD Ð#áüÏÔ6ÏÑ#` ð!0àñ&ýîäEìþ°&ï0A ÎS½5îíÐ6ÿÿðŸ"¯áÿð6þÿðï  ß1®½ò% ÿà ´"Ÿðà%¾ýCàÞ°7 À"ýÎ# ÍßÑ6îïó>$ ËÐþ0¾ïñq/à¾á7íßþÐÑ!5Pûþð5ïÐ"Ë"P ÿ ÿð!ÍÝU0žâ%üàþîÂ$a ïàDîþP ò43 Ï!ðÒå%ìïñ%ð0žá5 2 ÝϾðá7ï! ¡4ž4ý"$ŽÑB ìþ"CËÐóQ3¬þ2ÿ°-î6Ëàð%¯ñðó$Êÿ%ýàñ`0ÍÎA_Ý€ð4Þòë" °0ø %#ÍàîÐðE"ͯò3 Þï%ïðûð`"¯ñî ¿"Àà2üüñFí¯âàÍÁÄ7àð°3@ËðñáÝ,Š#ïà6 üàE1üÍà5@žÐB0.Ï0¾!ßì" Üå4 óÌ4R ½à1Øß$ßÁð$ ò#_®/ 1îÏ5ÿà$¯Ñ$4¯ß#2Q îð ïþ@ 1ùïð"î±3ûëô4ðí1!ŽÁ/ÝÏÿ#a!ŽAîîãq ò!aûÐýÐ'Ðÿÿ. ®€3 ¼Ð¾ßT ßþÀ/ß?ŸâþÓa ï¬!îÜS! ëëðbýÀñCÀÐGÏßóR î ÀÏ¿3ýíÏ#Þ½°4 ÞÑ àtþÜòcÜò/Á#PèÐÏ ïïÒ`ð¿'#ûþí#aààíÒ A'ÝÎ! °Ñíÿï6/ÝíöAðþíàïE3íìÜd4­à"aÛïþÅ%üððÏ@ÿð¿ÁBï ýý4"îòQß¾Ò$ÿñ Ôΰ âþäAí€ÿåÀÔ1°À#aÌÀ´ý÷ó¯Ïß7àÑýàs€ðâà? àŽàñàÀ£ÓñC¯Ð7ððïýÚòýðÒ²DÀÝP À0ÁóÕðäòú°ý @?ãâ‚°ðA";ýòðåôðã¡ñãÂÀ þ¢óÍôTÿþÝö àÆââÿÓ`´ð ð×±à óà.þÊôà ãã%øðñÿpÑ/ÁFìÎ5Ó“ðÞÐãAРáâ‘ð"ñ Žïåòàïÿ¡ÕÛþï ñ÷ïß·óÿÂó3ÿß A¿àÒÖ/ ëðú, "€±°àäãï±³òñ ÝÏ!'DáÐ@ÃÃð5Ïãr €0?â¢#²Ð'Ðà15ÕÝ#Ç áððàRÇ/ âòÓ.ÀÐÕÝ~¢õ€Ôðð"’àÀ°äÁðÒ¡Ñ ÞÐîѤà Ž ¯°ñ îáëÐã_A  Á>"!¡îá)Pàÿ ò#° !Ó ’ÔÒôãÀ ĈE௠33Òí±B%ñáó!Ѐî&*þàãW3 žÐ#ñ1íòð€2 ÛíÝáÐÀð!p"ÿÈþ4$ÍðÅ1¿à42ñï1€ïÞôå6¾¿À3QÿïÞ°ô!ÎüÀ7Cñàï°$!GAàïðàÏà3"ÝÞ5""Ûïð êðàÝ®"Óp'ðýúðò5a"î¿ÿ!'Þ­ï$1°ð ̽Îð!îŸßíŸÐàñààñÏêï/°±òàò7tðGÜïÃ'±rÔ %ýÿ4íü,²AþûÐa-ÐPÑîïÎtþà ã0ÑÝórýð"žá  Ï×!­ÞáAþßÍß3ˆ °þÞàQÝ"üÐÞc1@Œò âa ðò"'?þïÿU ñ ðR?Øðïòúíð #ØÁð@ÏBÿ"ò ô # BD°Bñ?Q&>Ç-àC @Ðáÿ ;×?ÒÏëàÛüЬ‰‘ÛÜÝÍÜÝÍÍÜÝÍÍÜÝÍÎ÷ÞðÍ °bðüñ¯aÿ"Bís2 &þ$@þ÷`Ï@þßtþû%ñ"àTbýD âa!ý"!TþQ à3sðQ ó+ñë3PÌÞ­à °  ¿ï þÏßÞÝÎÜÝÍÜÝÍÍÜÝÍÍÜÝôŽðÝñý¤ ð%Üà/Ò"úòO?Á0ðPðð üárðqÀ&4Pà à&ð11°#÷32`ä ô$>À Âþõ0ð®ðQÁ@ð@>âÿÃrð5 ñ"sññBÞr3Ù 6í0Ýãû°à%5Eÿa#B!sD%!å/ðBð4rñ#ùÑO ÜëÐà>̰áJÐÿêñïûî°ÍÎþ¯þ¾ð±.Û¿Îÿþñ¯ÝÌìÝçðÁO¾ò?0ß÷þcáð@Ë ½ Üú/ÐüÐüèÿÞÞÎþ¯ððîíÍ»ïðÝò,ÑÙëßÿ"2ûÞí'Oò/ ÝÃAràý²D"ð2@¾à¾7q€ð1Ä0ÝÑUñ>ñðA#, "!3 ãó@¡Ònâ0 ð@Õ2ÂRÁ ðá@ ô"þñ"ÿΰêýýð ï0ñð ¨ÿòð àè °ñ¿0‘ÏÀëòðïnð  æÜôòÐ Bôìðñ±þò¿ÓÏÁrð°Ó À O€2 ààâ&À@ã ß$àAáÇ!Á/ ïÐ"ÔÐ+²C à>ÎÐ@#€àýÃï1  à ý°ï Ò\â°0äàèñî×ã ´ÏîAüÏÀPë $ÚÒ$Ùò×ï üÿ?³@Àò"< Ó±#ã àýðrÿ$ÿÿÐ<×? !Ô //ÑÞp ãÐ0°oàöà /0À4þ³ò þ>¢/¥ïâ@þ>‘ ÀC²à ' âà1Å ðEÐíðÒ%ð ÎRîÝd± ÿ áâ¯ð0 ¾âM¨Dî¾.ÅíaðÿððQþqÐðå±îâûßþ;õþÜûþûàþàîÁç  ñ/,éðò!Ýð €ÔðâNýÿaßÓñ"ðOÐ0þîâÏ£"ìñïQ÷ÿÐò‚AÓã€ÂðO‘ð3ðàÏççâà@q²"Ô#°@ÿ@0ÿ0°#üÿ’óúñýâë°ÂýàÏÐÇ?ÂßäÝàòô 0nß’?/Óm5ÞФààÏ%ý°À;ð ãþà@0ñДð.þß×ðÒðÂ`Ð"àÓtó]ÿ& òð×"½Ö=ß¡|ÿ€ÿðÀýÀЭß#ÝèÓ²íÝ=çÏ#àþÒº ê%ÿý<Ã.ó óO¡ð¡>åâìó qÿÿóà´á€ðÞ3.ßôá&îñüN¢!òàÓð²õPÕâ'á ^à4ýÑР þà‘ þÔ½Àåîà~ÿðâΑðÏðÄÍâ ¦éè¡ñÂÏ‚ð0ðÏàëóO 1Ïó¾Ô4ïó/Öòðððêò1íôðþâÝo!ÿðmÒ0ÆÓÔqÿ³² ñ@ßð"!Ãôý'0 áÅâ "AÚ‘îÃ1àä¿á= óàQëàÐèÓÜ"¯ðíïÓ€Ó*ÞOóÒÂÆà ÿðÁEàý  ÐOß °Ó]óïГïpâÐõð Ðà"4øÆ ÿ á>á7þþ ÷àÞõ@°Ò0çðï`ð½$RþÀ/ü¿îG!оà@!!߀Á îÄP€ð /Ђ1 ìþå¿Â!  3c¯ðíŽå2íÞŸðü C#ÿÏÿ#¾ÀñFïýÎ7!ÞÿFðï $Ì1@ÜÑ<ðrýÚñD ÎïàÏïß70ܰ ¯àð"RÿÜ ó!$üïþ2QÿÀ°büþ!"íÏ 0 »ð$Ü SÝ®B! ÍààcìëP" ï"°ßÏF!°0ïàCaþý°" °ð%þï°qøÑ$Bìàð'PÿÙ1ÛððB`ýÞâ1/ŽóBî½õ2.Îÿ$ßúáQ!0  ò2%ýßá7Pþìà1 ðá 6þà¾B Êð"1Øðþ4 ¿ëó2ÎÝCþÝ€#Ÿã!%¿ðß%1ÞA îþ16ý¿ÒD  B ÐÂ!îÙà$ îÏÐP@þü¿! ÍâA$!ÌððÃqÍp°ÿ3@ÜÜÐ7¼" Ðïÿ%íèï! àïðTÐŽü°"P °â4ýËábÞïÿ' ÛЯá2¿àþrêîßÑ7/ÏÎáSñ1ý€ãýÐÐó&"ßËÐT ððð$`îß0ÌÀB"®ðòRÏ¿ãQÞÎ!íÍÀ4 Žò"Ÿà1 Þ  ÿsí¿4#ûAíßä6þ¼`ÿààþ6! íí!OÎà2$0­ÿðcü ½ î üFÏÎQ Þô$$  à4@ð¾ÀDÑ à5DïÏÎëÐ$0Øðá$.ûìòaïîñb@íÎð&#¸Ÿâ"2?$!àܰ%À àFÞÞô34û¿1Q ðð#?í®Ã5ððÞÒBû ÌÐA20žððCéìðàß"T?ÎÞSA-­5 îð40 ÙÐ5ÿàí±q ìàòB!ØÀ"1ÙðàB Þ¼Cÿ ÚG ýîÒB1ÜQ®" Û°%ðÎòtÞïâB ¯# ààB ïžâCáàý¿ð'@ÏàB1ÙÐQ0¾ða. Ïõ"ð  Òb?ÏÐÑ3"B "$ÿ ÛÐEðïþïrÀÐã12@À 4ëà5ýÌãR  á7!íϽÐQ!®àó6ÿÞ¾$0/ÿÝŽS.ÞÎã  #¿ÿ5 ÜÑbîÞr ÐÿCÙÐ1ûðâRÀ ñAðï°à6 Îÿà"A/Œã@Ÿý"ÜÞÍàr.Ïï$2#ùݰà$!þ®áCï­ '@þÀÝ"ÜÐ ñbíÍ`ìÞát ìïÐ@Ìã3_Î "þýÝ7 "îüíbÏÐÑ®{íì4W\Àð4ý½áDð0íÜßQþÐîáCC½"3 ðâRïÎRðïßâG íðß»ñ1@¾ðí!îÏßÏDÎ Ð'ýÎÏà6íïR à¿ý7#þßïáT$êÐ$R àÑqþíà46Þ°ÑC@ìîÝq"®Ò@Q þýîïÏäEÞðß$ ½2%ýÜÐ'OÿàÀCýÀßbßþßôc!ÛÝ !<ÁCÐÀÍ÷$þîÿýýt Øð €Ñ$Ñ?ìóbß°íï "ØÀÿã¾àCPÌð²"ŸPþ°ñBÑÿñÐ#Ûòr ðþÂ5ÁS í%Þ ½äaðÐÐ6Ïí Ð0ÍÞá1#ÏáÝcb¿á"0Àá&Þ5¯$À¯#!Ð@Î ý±!îàqìñAÜàÙáÜàbÐàâ&üï4ÎÐß7¿íð1° ¯þÐ!"ÎÑ1ÏæýÀ/ó7üïõðÐð"ïïDNÚ"üðÌ04°á :Î$ÐÏÕÚà#àÐ$/ëß"íàóÎàŽÞò$ÿð4þŸðB¿Ò" ÀÔîÌ"2ôÔð€ðG3íí4A/Íï2ÞÐñð°à ®ïAÐŽá7ÎßàíßðˆÎð32#/íîÀà4½î"F3ïßàÐç@Êá4"ðã'uýßð ú¼ÏC"ÞïA?ÝŽàðàè­ï#2E0u!íßàëÍ&B ¾ðCB ÏÑ&ÿýà2ÉÜSËî#B#a ®5ÝÞÎßîc¼Îc"Þá2ßò5ßÐʾDÍß3!!!ùß#2 ÜïððÐÔ6ܽ6"!Ýà6Îßÿòÿ»ÍáVìÞ4#ñ% Ûßðÿàë¾òCCLàâ ðôîýéþtüýò&ãè!òÝ¿òÏN0ά0Ñ+0Æ î°# ß á_2ÎÐÔQ0.ŸÀàâOàï °0ôà ÿÞý<þ  ïßsó€Ð q#ÐÂ1s_ðàŒ'ßðCÚ2ï½7âà0  ! ½pxvõ4=t²Ñ/"páÀ#ñ@€,îÍCÿ¿Ãéâ²€ ÞBÀñÿâ ²<û.€ "Ñõ àÙò[à3ý â'à±ð@àãO€ñ Ôî €ððà!ÄÐÞ=2Õ‘ï@þËð'þÃAÀ?ÓðUÛà Qï €àNî"äò êõ úÑ#@!¿"@Ù ð2ÂS 2þã 2`ÀÃT!+Þ÷" ãÍ5ßÜ0ïÙ` ßá3Âì±óþÐ.‘ϱQ¯ÿAýÒ(Ò #ýá #íÀ ÿó ÝïÑíÐï î°ÿýô~½ðþBá¢à_Àáï@ÑàèÑ  ñ" ãþ_ÐíbÎê% #ÿ $Ü‘ð’ÞÐ P&À¿ÿï$ß¿ñ 0P" îòLðí#Ð!5À  Ý3Ý€30Þ 0ÇàðbãÀÿïÔÒQà7ã\Ñ ¼& î týþõàé "½ðÿí ¿° üÀÓ"!¼Þû  ½ïö .À±Ýâ` ¾ÿ 1ŽðÃ.3 ¾çÞ2 ¯þ áúàñcð° ßFÞà1"-åàð6ôBà°cÍ!Ûûð '  °ðÿÿ°1?àò¯Ðc$ý?äíß22£Úñ4 ÉðüÀð$þ€!ÑŸÀ0 ÙîâòŒï0 óîÐ4ï¿ð9/Âíõ"ò .€ÿîÒ"4Á±û!"øÜ#/ Âþ0 @ &ðàÐ÷3 Ï$ !,¾ÑC B# ±3/ +î å0ûåï± ÁF"¿îRüà óÿÓ·¿ýíÀüâðÿ02O&íóÓwÀïáäÀ¿àìâ`ûþ¾Àá ñ Âáï€/¿þ Ú .ÿÎáñ$#ðÂüq3ÿðS#ÏÝ@ÎÀé$ñР °ìá0ìÏ ð²ñ3Œá#Úÿá €ê©ÜàB@ð¯ñ$P½ð"áÝŽðÞÒÐý¯ò5 °ðòó¯ñ%î$þ' ß1#ç°2Bðý3s@qìÂ'Ððð .ùà%!/ÐÐÃ&Í¢ °Ñ à#®ÞA î 0àÓíDñïàâ3!"Ðð€ÿ7Ñï"$ðsïñ%ì ðîþÏ‹â"5ýðÞ "#°ñÐð ãpïÐ12D_ÍÂAÏààáñÀËà&ðÐàôÞì ,ðÎ߀* "!½Ü'ÏÀà ±à¿Ïä3? ß ó€ð". ÞÒ2Þ°ò&ð##¯ðàÿçëïðS0 °á2àòÿÀñÐÐÑ €ø2áã2 ÏÐ7À@#¿ðÿÓñ° À5°ò&  î¡àã5±"ÀÓ#ÑòðÀðsà‘ñ#!ÏBîñÿ¿ààB0Àñ ð úÀÀ#ñÓpáqÝ×"Ñà ÿ×3ÌÀðB À’ ÒàŸ#ð-çëõàð ð'ïDòÍá6 °Ò0¢¡ï²4 ! Ý:!Dþðü1$²ñ ƒðïòà ÐÀ¢üý Ðï#°!øï! Ò2 ý7@ý¡ð>Žð1þòñï€ñð!â!®ÀòÏÑ1ÛÿÐàÓ®Ð$3 °ósÏàŽÁD þ± àÊPýà6 ÁÒ6?¿áðéê!aÀ ¡ðýÑqÀ0¾òB ùÐ0¯óÎ  ±tÌß"NâA@îñ2aìã`ð0tð@¾Ñ4áBÌÓbþ àÐ%üÁ2ììáD/ÞàÑC,ÐÒbîÞíó%ÐÐpÿÐÜàA+Ïòðžá#Ý­&ÀÀ"ðçÌñPÿðþä%ÑÛÐ þÐÂñAëì`ï ò €  3îïìàg/ ýÓqß Ä?¾!í àA þîQ@ÞÿŸ"íó:ïP ÐAÿèô Òoð " Ààñ#ëx>,Ê4 нà2 õ0¾ð/°#à61ÿßò5€!ßà05DýÕÝrŸ# ñú ‘ ß í!Þaîãñïÿ!VÏ0ðô Û 3 ðàE Ô A"-×pÐ/2Ï$&Àcÿ00ã@,ð6ÎÏÎFï ðþôÛà%Ý ïEð²@ýïØâPàïD#¾À1&ðð ýÒâwÿ ξ1Ïà ¿# P@ÐC3ðËðsß½ÈÐÞ àêààCð.Ìðèþî­Ð0þíÐáQ¼íñ1LâPñ B3Œß!1ýáï@Àžàb"3q %üÊð3"ÝžÐûËÎÐîÜÿðý÷NÐÁ¾N®ïÛð7ðìàðÀ!ï7,àB"që°4 ¿ïà4ðþ"Ò$bE01âC4% ¼à6#ð ÝÐ$ùÍÿü¾ßA ÎÿqËß5!ýàÜ'2 ¬àð"ÿàðéàððð ò`Íÿ2¬"bïð#  Bý 7 Ôcî¿âPBÿ³"ÚÂô¾ð?ãè ÿ ÐPý¿%Íò@ Þ'óñó>ÐpÝïÓsÿÌAðrþï1ßÞqáà4ð %ÝàDÀýáààþ#îñ1óuÀÐ0ð7ìÞ5üðû ÿóð€"à5 Ðà0¿ÏïîÏ"OÁó±"Âà7A ððР#?Ìà €á3 ÿñÝ¡Sð½ðó4ÁþÑÿÐàA þðGó¿0ÐAë R0°ðÿð7_Þ" ¡A#oï'ý ÝÞ1üïø"üûððäÕé!!.¢î Ë ÿþ6Ý0OÓ¢ðïìð°Íç ð Ÿ""í AQýq 0á^ÑàAìÂðÿÿ þ÷ûÓúñÑçÁ>°ÿ±2/àÎÍ-p%¿ð!ÞçAïÐõû&ÿã@Îððÿà2Ð!t$ á`á10rÎ0ýàûO ¯ä€ûàðÑ ТðÿøàÐ -(à.åÂÁ/²Aý$ïïïSÿpðóñð5ì%ßðä$ÊðâÝEþÀ2_åä;ðð <À£àý@í ³Àþß$þ$î±@â2ðOôàРð ò¤àþÐ=ï± þÖÁÿß•.Ñ4¿ðó×"óÒ4ð¯ññî ! À£ßîðìÀCЀðî’ÿàÀ íàÀà@â ûòýÓP ðPÌà7ÁCïá€îã`3 ×Ð?GÐ!=ðÀðï3Ààâï  ðÑàîÖàÑ+"’²²ãÐâPûñ^ýÇðÐ21€àäÒ4°ðí® @²áÓ×@à²!0ÿpð^#!"AÿæÃð ‘!ÏþOÞýoàà÷ù¯ð >ÿÍ!@þþþ×N¿ðò> ]ÓЀ# 0üqìâñô÷Ý' ^öð1Q"ð‚oÏð"â°î€ ÿñÀðÒþÀâà"ŠñâÀá Ûâ×ðà^öõq Bà¤×ðð!âáßÓ~£ðÑôN ÂñoñÒõòò"Áð'ãÐï@àÃðãÝ€ñìóï°ÑÝJÜ0?ÐŒñ@Ø0 ð÷ñàá±áÀÄÚ/÷îÿ$áþ "â¾Åð¶>ñÓCâN0`± €ÐCÑÀÓ¤óРòàÿ‚çþ¡/ÂÁñ ðÑÀíRó,.çÒ¡þñý²¡òôòñþÔÏ_¿ÃàEý Ô!Ò2±ó£Á"´ÂüÐà³ðРðÞÖàðýââP í3ÐŒ#âµÑÐÐÑóÃÐç°âôñþçðPàðqÿäáOÃÑ@=Ô# Ïpðàà²Ã ÿ ñòÄñÀï#ÂÐÔòð€#±Oî°ð?4ï²0åððÏ:ïääàòÁÆÓУà‚ñ ßÑÐ&ÿÏñàà¡Oßâà€öðãî`-Àâ÷Àñ´ÐÔý@ÀàÂ'ð1Úÿ&"ðÀÑÞ€ùü€òïðò"À°Ñ ï¿ò$ÿðaPà¢wñ ñ'àBÍÐ$ÿÄà ùõÏþ?€ð ¾ÝÞ.®¯àïíì­ÎîðРòþ òw"ÿý4#e_' óBþÀAà#àTÞ /  àq í7ÐðÿP¹0ã 0ÎàËïµî ú ÀÀð°ÿþêÜÒPÀÏûð ëòÀ?þÐôMçÿðSùMÀäÀpß%Ý 0ððáTrîÿýÿ7àPñäáp  ?Þ²" ðüà Sòú"4 E þ°°ðèàò$úðð ÎÓÈÀ'þñ# ®@î"õ,Ô#-A"Õ 0€Rí"Ò"ßíùÄ ° þñÕÿ  ?âÝ$&Ðü ê!à¯àß.ñûÁ ýíðþÃÜ íøï èððÐþÀ¿ýð€°1þÿè1ÄüóíÁ CqáÊ1ÁRàþqàE ÞñÀÜÚSìçï âñ<Ñîÿp ÀýNäáF"¡ 7 ÿüïãríåððPÀ Î 0€à"à#þ€!íüc á0ÞÀà.!ßÞ0Ã^ÀítÀ À#ÍÐõ!áœ%Ï"ÐÕ ÀÆ/À ý üïÐ!à¡ ŽÐÎüëððïðïÝà èüÍñ#Ñðt÷ ¿ðÔÀîãCþÿ/€?ÐÔP @ââçÖÄEÑàq @À ÖN3ÃQðõÑ$Ðp0À³°âÞ±6ÀðþMã ÜþôûAÂ@òðÀ€ðÿî-௼ó í ìÙ ðáûý² ¾ Ÿðáóøàà#àüÔ%ç$ÀÁÐç/ÜñÀ5 ' àðÒ'ñ¿Á!Ã@â±ð aÿÑñ½²0'àràÿðP"À¾°#7îæDðÒ߯îïáÿÀ á !òîÀ¡þü3U£ðáþúáÿú$ààí²°üÁîéñÔûÜáà>@#ýÞSïßÄóÓÔàÍu"ñ®;2åðÀ#AÔ!þÑO  %-À¿á°ßà?ÐŽÔõá²îîà°_íàÐêàåýÐ"c?í¡ü2 72à­!CÑòà‘40 ÍòÇ€à!áÞ°ó@õ5Àà Ò@¾¡5Â1ð‚"!!¯ñàð"Ñâ°$4à à½ñ=íPöà"ÐÐâ Ѐ²ïñÁñïä"ý R7Bà1´0%àÀñÀýíÓqþÑá$ÞÀÀ #ùðîóÀñÐŽþ Ñ¡þþбðÒ×ð3 þà âÓþ¡ñóÑÁýP6ñBà'. ?0>8îñÁ÷ÿ-ëþ#0Ù°ð4ñððó ÿåààÐàÃýqïåðáåð ¾äó àÖÑ¢0@.%ãðÏ  "4P @ó€þápÂððÛ#ãýþÛ ðá ¾ä*m€2¡þÀÎ×ñÍîä. ðôó=0CŸ#°Áñð ‘óCï/°ò%ðôÎï"ð±õðïÐr"Áð-4"ý M€ÑÑÅàóòò/3EÝçÑ ð 4àŽîõàá3ìÝP¯ àðáñ ÑÐâ$= ‚áà€äÑÀã‘ÑÑßÖÑ 1@òäÀ íð&"ðññÔ#ð°N ÐÅöÀÀÐòâC:ïÜÜô‘Ӱпð00¡ÓôñâàÐoðÐÅÑÓ^ à@sÛ¢±ð â¯Í"04â >еñóðÀ€À>ÿÀáò¡ñò¡@/ð0 Ô °áÔÐÚðãô æÓÑâóð¡àòâ-q àï â•òP €áñ0àÎ ²605ïâÔðà‘þÂåÑññçñA#4â4pñÁôñ í€ÔOáÁð çð°°ï@ðܰÁþ ] 3 M] <4£ñí€ð ò/ @×Ððà]±ñæÓ€ððåâàß ÜÝâñÍ `‘ð#ÓÓ‘â€â*úú ×ÓþÝ.0SðÝÖÓ£ÞÐ €ðàá0Ã×óÐñ0ìÝÇÀÿA!ñ±/p?òàã€33b"0à ýàÒñ°ÐÁñðÍЂóÑ÷ %ñÑÿ ðáô°ÒÁð’,þÿ þ¿ / 0æO¡!ÿ!á 7ìPà ­`òð:àÿÐÅÓÿpßðÐñpÐãýã þ@÷âàPåÓ/^0ÕÐåþOæÞ<ãŸâ°ÿ"ðâð Aá á¢-þøñÁ0a á!0ðýë á À ;óßà*ôí"¾û$ñ27à?Ò`GÃñëþà ÒÁoþî  ð+#  ò$ñ #´5àNÁäÓ€ÿáððá ÚÐÛïü²äþñð4"@pàÀâ37å"BàÄóÀá°¯¿á þìÓðï×°"þ´Òòâ°÷ .M1$P°ó4æÞÕÐî¡àà× î ñ#>ƒàþà!ôð'` æ"óðÒàN± _"Ðà .Àп¯ÒÑðß¼ýñÞóðä DÓD4óðâ÷3ß´äððm âí À€‘ í0ÿ 0EñãÔRäÓçò1AôóýïR3Ðõ¡ÐäÔÐ ØÐïÖàÓ·òÿ3üõ#3'² ðྰÂàÐÍþ‹ßðð îîÀðñïà/áþÓírr"æÓõòýÓAаà0€ïàßú-ûüõÄï ÿÌïþøÀñãp/7ñóQó¢öá>N€Ð~þðÊåà ÿô°Ð´ñ=áôðàaá41!ô!(/#C$â%9 @þàðÔÐÀÓ€ÓßBòÆôò$!×ÿ$A""±þ)ðãçÁÀРà ݰÀÿüþ¿ÒÔñÑòó[,ÁÒäóN0ã„¡ÔÔÑÀ±ýðà°äÒÑïÁ.¥ñÿâ0æ1! î$ÔôðààãÔ ÀÐßàà°ð¯ãâàëðæÿßÀÔâ£ââÓp!ìдñô à@ÿÿMÃÓñ_ ýâåñ¡Ð'À ^-Æð# ßâÜS¡ñðPâЂÑñàÍñþÕÕÐ+^Ã×ñ0âGñ±0â£ÿ..ÂçÿàÍÅÓ ÐààÜв3óÑ×óÖâþ Ôóñ;÷ð/âò°îÀ ðÁÑý N Ó‘ÐáõñÃÑì ñ0N0äÃÖâ PÑà¡âÑð. PРÓ×ð³ÔñÀ°Óå ÐÆÕ5ÐÀ€ò00 ÓÓÀ°’â¯à°ò =Ià òòÐÀ=CFðÔ@À0  `ðàÒãÀ ²ÃÓÌÑòãáðÀáôÿ.ÓÌÓñ @âçðç B6ðá Ã×õââàÐ аà Ò€àâ àÅÓÂî ðãó0Ð]0 =ö¤â.Тæðí 3ÁòÓ“ÓÄÑ0ÓРÓн0DÔÜ%õÕÓÑ0pí Ã× ïÑðÃóñà²à€à æñðÒìÃP 0` áñ×òäæâÓÐСð.Íðí *úú€°àTÓÑâ1@1sðP+04ñóÑà0Nô×à°Ü=à!ÓÃ×Òàð ÀÀÐ0³‘ñòâ‘àÐã ð=ð¢ãÓâ‘ñ1 Ó‚°ã^ð×ðóòÀÔÓ@аÀð Ó“Ñÿ 0°à ‘ññôñíÀÂãn×ÓÐ=L0P£ññÀÕÑ#3ÓâôñôÁôñã‘Ñð .ô€ï вãÃÀ×ã‚ãñâ¶ñ!.=1¶ àÐðP ÃÃаÂ]“Ñ/#Ó 5±ðа4 ìÒ×ÑÔð_âàÇñðàðâÐ×ÑðóÓñãÓàÀ×ѲâãÇññÃÔ3ôóðÐÃÐ0`£Ñ àÒ£ÓÁôñü ÐÀÑñôÁð¡Áññâ¡ÑÃÐÓß ÃÃ^-¶ÃÂ20×àÝÀÂà=ùÐÃÆñ#ââÔÓ×ñâ×ÒÃôñ0Ô’óÁð¡ð¡ðòÓÔ×Ñò´äãÓôäÑòâÐ@Ññùââ³Ó‚ãÃñ>0 Ó = ¡ðÒãÓ ðÐàÅÑZûûÑ€ðÿýİá@0p><Qà@öãðãà SÔáG3AòòõòÑòâ<#3p"37EõðÀððÔà ƒƒÿÑ¢Ñ )ÿïýïáþ퀰àïÀÞà°ÀΫ ðÐþ°ß¿àаðÄà0Á ä¢0õ’ññâ ÒÄ‘ñâæóòí !°€ ÐÀ°Áï ÿþ±ÐÏñòŽxà.âð?”àMÃÐ ñâ Nôñç/óç ô,Å ó/¢OÏ Ó°ßÐÞ- áÀ*@ó¯- çñ?;à#ý@C±$° >þÐòoýPàï~åññ^õCÝqÃ>×_ïP0Ý,Æáÿ/ÞÑoðç,ÐöÿúñÃð°Ð Üÿ€Î°ÑÏî Ðí ðϱÿýà?Ü$&Þ21`ó#aÃ@ÿ# äPð2q 7:ÔÔpÀDÐP0ñ`ÂPÿa"$#12>÷ò$@.@ï Àïáð½ÍÀ ½Ýížÿà ¿îþÝ쵊ˆoÿò.·ïsÞâr.ïò2à!>Ÿß&ÿðV0íð!&ï3à#uÀB!5ÿ1 Óq/"®5 ¾à"âßÐqôáð î0B½Þ¯Ô ðÀýýpßþñPíàÿ~ÀËñBÝâR Î4@þÐ61ïô@QqÀ2Í4à7ñ4AðôRÝñò©ððð õÀý±`íðÜ»Ý ïþîÿ ÝßÞ­ÏÞÝþÎϹÑÿþà¾ÿÑëà !½üñB¢ 2.ö ÿ0ÿ$Ö-ïÐr#ßïd¯í2ïÁ¢4"ðàüðuýáGï0Õ 04qïRÒ# ñòÄ5 üð0%àýá#º!Bà#Tÿþ%ÿ ³rïF áaàÕQ/Eþ OðÿñO°Ðíô Üá8àà'à!ÏÐS  ðþ îÒéÀïïàBÖoáâ0 ò6ÿï$ÐÜÀó€àîñÏÐþïßî¾Ð íñìêðððÿîÌá Žà3UÆÇÿ?Cñpð"ð0pã"ãÿOà% Ñ"òá'_ 60#ÔQ#ÓO?Bâsâ#rÁó%î6 ë±ð¾Ìàëýðà €¯í+à°à€î#N’ñýà0Îä¡ÿáØð í€ïûïà$á¿ò ±ó`àß#C‚ÿÃ.ÿ¿Ð>=0¡óöêðí ±ôàÀ€áõ@$õàuç!ñ@@/îPÓ>þ#Îí_îÝrñóÀM#ýp o3üÑdð ôB%Á ;ÞõÝþáÑðÍïüäÍñóõÑÀ’ÞÄîÝ’ "ñ€ ð#ÌÔðñÏð аàÁúòàðêÁñ±ñó¯âã"ã@0^_1.=µO)À>çÀá-¯ÿ-0±°@ÍPþÆ# ñÁôæð >Qðòãë½%áÞäó€À ýÀ¡àÀÏàPð€"30×%ñ,3ÓWðçÿÿáô$ü Ó‘¡ÿ.Дâ²Ná'áCñð`-×@Æö!Ð#å³!í±þÝâà€ðÁà/ÕðààÔ VñÇ?Òþä ±°áðàðûîÐÐŽÞð @ð×ñôñ±ô"òÓìÁÓôðÖðâà¡ñ°Ïáýà΀áðûàÂÜ 9 ><4×âôÅð`0Q%á áN °ïÑÿ¾à Àðò± á³ ò¡_áòÓŸòâ@¯ð#åÑà×ð*À€°ððÀЀððÁñæðá% "5ñP##/"a#`%þ1!=ÀÐ7ÏЀðÐà°ÀãİáÀß‘/áâÇðO@æÑ> CÓ•ñí-8þá áÐÐý°ðÔÑÀÒ×ÁÐ Õñáð ÔïÇñð€âð àÐÂ1€B ôöñ$ð#¤`?6ð^CåÐ`ð²Âí.Ò à  à³Ð .Ò.Âï³Ã×Ñòàððð åÖððôÑð €Àîà žàÀÓ‚ò0Óñò± õÑN!p @0@×óÒâÐ$ õCpðññ.9°N‘±/ “±ð > çàî òÃN1Р Ð]Ì üÁ Ñò°üüÿ*ÁÑïÀÀ°ÁÏÐõ ü߿ҡàÐ À²â±ÐðàíÐþèþþÀаÿîÔÀÏ "ûðÐжóäÂóà0SäçóòA€ðÐ ð°û °Á²ÿB³àÅÓ¡ñ_ ó×ã4C"&ò"A Q"%ôã""30ç÷ à#òâ PðO ƒ?ÒÑ_ÓM¢Òñ ñ°-Ò/À `ÿ Ò î}×ð0Ñð:Ý òÔò€0Ïà×ñ¾N  ÿóÍ@þàïßÙ0 ÐåþPîÿ>ÂÙ!ÐPÀù"Ñ.Çò¡ü@Ð?1ÂÄ`â 'ïoÀ:î ÿ 2î/â_þÐ@ñâ;ã`Ð" ñ(ðÀ!ú Ò"ÎAÿÐ`ÀLáß  %ÿõ $àÐ5à.mä 1ðïþÐqÿ ÕÀ# à‚/Äþ1ð¤®_ó±/ñ .À2éÿ $Àÿ=qСOѰ ¢ ß]æàî`С1Ï Õâ.Öá0ð(Ñî`àÿO‘>ÁpÀ!àÞDïL@¡ÿ0Á (à/àæîí‘KòÎA ¢ À Nñ¿AÐ1ð/^ñ!  ã ÕOÐ1À&îÕ ¤á$Ø ðåý!Ô Þ N³°_ððþî"€0ðÏpðáÀpÄÿLâßÑóå ó 0Áì ÿÏ@ð Ï"øÑÂ@¿ïðöèó0¾@Ñ!¯Ð/ðøÚ_ÿäÜLÖ,ð:àñ=±3Ÿñ]ÿ±à“þpàíàOÑ=Äñ ·ð/Çà ð!Á0è@ïæýNÐ"¯#ýãpßÓ*ÓK öà ç/ÐPÝSûð‚þ!°@Ôý?àÄâ#ôóèóÐ㣠Ñ`ìá1éÿí0à‚á-‚/±=Ãç ÀC  ûAàò.ãöð Bëà,³_Ñ ²?ÑêìCÜßßNÑ ÒoÑ ´²ÿL ÀôÐ!î,÷Ó °ÐOþïpà/Ñ>îAð×/ôÓIÿ7À ð ?Â-ßÿ£ÓKÏÃOÝBа@±0°=•óÎ@Ö-òÓ pâÐPÑ>ÑM€!èôÐûÝ à0ß ÏÞ]àPÁ@àöÒ\öðð! ìRï ðÃ>ÿó!ÐÕ  Î7ïîp¡Ò !æí#þà`þ²þRÑ ?ÓÁ=Õ  ?‘.""ï,0öàð±!° áâ(1ÀýÐðÖÑà@¢ð ßímößÑ ê$îòüÑpà óà?(äÅíÔnð²ñ :ÕÜóÝ1 çýPÀâALðð+ò ú?×ðá`òßЃû$°Nåà "ÿãß6Û!à/â >,×  ÐÐâîA×ð3Áà°ïç/ÐQ¯=ÐA.€ å  !Ð#° ³ <þD°!0 á_ÓÿO‘ ßÉ1ÖÞEß/Ðüþ÷ðþPñ3À÷à@Äô¡ 3âíó€þAò Oà&Áì!ÔÜÆýàÐõ $¡‘0à"2€!Ñ ÓÐà'üCŸ,áoàìýqà+äà!±±.Qïã;à'ÞqÿÐ"À!Ôì0î€PÐñò[ò>Ä ã=Ö¯ ïñó¿" Äõ ð`ð²Ð3Ý3ïáÚO àöÀ?ÀÐ Ó Ï ¶$ 2ýå>Öû`ðÐà`ðþóèßßpàð@Àÿò à$ÍPà ý`ð.‚ãmó€ò Bþ Ä¿"îüâ0îòQÐí`âàÐoÑÃK=ôÀPî@ÐÿÞ!ÇýÄðí0,ä ñ¯ ÓÑ.ï ?±nð$‘Ô,ôáü$Þ*à ƒÜðÑóM÷ 1à o×Ó0Ì6ÿÑ Ñ`À0 äâ°@ÿîåÀpÁð ò_!Æà0Ýó}€2 ò ßÿ!Âг+á$íüöÓ Žpóâ=0&õ1áNp/á ß0À ‘ ÍðÂï±Þ޿ϳïïÝÀÛÑÍ îíÝÏ ÝÿØßÿÞþÿÿÏíþÍݰ€ ÿÿÝ ðÐðü±ß!ßÑ>æàá"°äÔðó(ðÿðàû!ÿ·ðÒ ÇáçÐ"þÐ ná±-ÑÓøâÐÀþãîãÝþá² ï Ò€ßÀï€þð³àï"Ìü!ðåA`ó Dò`2"  ãÎÎÚÛÀ¿ÞÎí¿ßÞ°îþ ò_O .pó.S"q$06AP30P13$!b%#q12"5P5âB'@@0q"AA3Q4a043#@$`#ÿ ¾_ÐÓÚí072#@#0Cânçîáûü × \öà°?òOó¿ £0²M,Ñðþ±oàóÀ°?þ! ÓÑPá2=q#þÖ!2pØ ! Ýðï€ Óî° ÐA  ܰ0õ2í þ$ü ð ½@п/v@ëñ€ ÿ@ñ Ó ÊàÝSý:DîÐ"`°0qà?3ñÝM¢ðØÑ /Ïáâ^€Ïÿþ(À  ÐÀÿû"àÐáþÐ! 1²`ð44ÑBNŽQòÐp"..°"@/ïcþíï3ó3!@r@.Ç".ãsð5/ñ ¿ 0ÒôPòâàëðð¸àïÞ ½Ð üͯÏðÎ.°ýÿíï1¿àÚñýà9À>¼ñ á Ð×!Þ Ð ¡-N°%À@ Óñ#ÿá_ðP à=W íüVþþíò0ó ’Qßñ0½%òó@€ó>ÔàÿúÏ$Ä>< AâRðÿö ñ42Â1`ò`$Ð0"> "S/"&`ð3RÿAS!DñqñAá05>Aîrîa% ð3áÎðúÑ0èñú°Ò Óüìßúâ ÐððíþþŒð Ð Àð à àïïýêáßëßÑ Ý¯ëðïó©ðýá þßâúܪÅÀa Þqý ". àÑ Û Àaß Ï;Àñ Ï1õ0ÝÀ3Í í$ÿïÿ®òP01Üñ$Éß# õØûÑ1þ°DÞ!2¿íï70àA² Ñq# ¿ò0ðýP¾Ó%"ûìð% ïÁB ÌÄñPÖÐBñôþÖÀ7°îÞQÝàÀî'û-àPîÑáQ/ë€ðÐRÌËà"C.ÜÐRþßð-×-2Š PàòWûñ/ÐTþ Áñ#  °áCßà'AÐ0ñ !²Qýä³SÂ0ÿáñQÐB`ÝðRÍ .€òà!êáAÐ á`À!à°AðÛìðö ðáíð" èó/¾ÿ!À ð1ïãtüð þðÃ0°ðÀ`íï±Bÿì&"Ïñ0î°CÎ!ìDS ÍäàðQQÐîã)óqZðåÀýõÒ ²qðòßïôBN  ò÷ À0ñíÑ7`ïÐñ!®qÐÐ á±#Àÿ:Ð$ð7Ðà€ÿaßÏ À/À"íñÿðýÖàñ°À"Â0È!Ã0"ÐNÑPíãçÒ)à ý;ÿåO²/á ñ$Ð0Ð%ëàù?àã¡NÍ"‚ñ0Ÿùá!ÿðBû<Þ±0Бò#¿£Þ ÐÇáÿ â°_òÀ/ð_Ñÿ!ÑÛ5ã,ôÑíö-Õ$ëà¡àüAðäOÑ¢ðìÕ áÀô Õ Ãðæã=óçÀü!Þ'ÿD ÿ‘@ÿâàüó;ï5ý"Àý?ÓƒoÐá^â âð PÀð%ò 3ì#é3ñà´=Ð CÏã/ ~ààçï'îâ Ó€@ñ,ò°ôÄþãäÀ¢à#ýÝãþÆÿ Ó‚ßÀÁòÓwÐáÍ?ÃõÐóãÀãýõ¢ðÃÓ€.ÒÞèðàçÿóëá/ìô¡ÔßÞñá%ÐÞ€ôà¿ÿ ñÐî^Á0à%Þ#àÓ€ç Ðñ Ð4ÿAý@Á Ô/â òÚ ã±* Ü¤çöý"=/ëöþϰQ/ðÑèírëàî ð²O 2ÿ ¿$ï6ÿïðós>Ñ1ðsïâQþÁóÑQÐôË Àsàìô`°ð°âò0  ±Ý€ ßðþßÓEðÿÛÞðÅÞÂŽð% ðÏò‘2óOð/ÎÌSAàÑ ñðþD1ÚààõÏÐ@àâêÀ ðâà¿ì¾í ÿàðð"ÿß¼á1àÓ02 ¼ÿðÕ0ñVÝðÿè.ÿýìñЯâño#ü°ø ð/ÝÔÂoñoïÀ0Á@ ïß7ûóýÿÏ¡óEüäàÑ â¡7ßðPR€ð ðàQáb /¢/ö Àßqá ³ 2×Aý"ÑçÐ0$Ìà' ðÀòü±ôÝÜÒ>4 L°Ëð" à1 î Àÿò'íñ ½4ÂB¯ïðÓ +¯#"Þ¿ßT ¿ñþ°Ð4÷þÔ `!ìÐÁ@ý'íÀÀrÞî'áßîÎîqïððÂøïÍÜððB± "÷%%"!î3P°!2Pß"ðð&!Ðã !Áþ°þÒ4ðíD ÐÁ¬ý°2ëÐ,üÒöàðÒÁóCáÁ m€3ÀÏÐ ÑøêÞÿÿÕâÑ ¡6Ü&@301ãÁ¾?7ð =€à ÎѰÀ¯ûðþÐãò¤" ¡ð=×ðAï¡à°ðã0àÎÍ %Þ¿üî"ò&à ÐGá Ð= BÁ@â/Û`àÍþtàð$ÐÑ@÷  N°ÀÍäøàŽûÁÒ ðÀ0ß!üÿà#ö ¾ð õð3œð í/Û#€ðþ"Aðÿ,ÐôOWððð/Ž3Ð ÿBÐÌRòÿÏ$üPÀðÎåÐ`ÞÚöàà#=€Þ°ïñ =À4î/à`Úßô//0àà_$ ðßCê2àã Ò.ßàPðÐPÿÐ  áä/P²°ð ¡!Ò_Ðÿð'0ò¿•üû?€Pá@à¯ÂpðþÑ4ûðÓú!ñ óBŽ 0 $°1ïáÒÏ ¿!BûÞnäð Ð £àbð°ÐàPÿüÞÄ€ððð àOß0&°òPàâ/ Þá0p€ñàÒýð+aÿÁôÜÞ/ÄÞà 7Àà±äÑp¾1ÁÀMôñ€%Þáâpâñð×!á òðà â€@ßÜqàá€à!ðÕâÞïþB°Á²ÿ¯àðÎÞ S ð"ÀÒ±Árðñ0"Nàþ¿2 P ÛÃÐà sÊðñÒ#þ½¾ñ b!ÐÐá%a °àáõó!/2ீððààð&ôî€1î ð/.Ü€BïÐÁî ¯àöÐÁñÐÒ"ñ˰à01 àFð! €ðþÑ÷A"Ïß ñ0°ëá÷ þý„2ã þÄ@õð ðà6½þÂ$ FñÞìïçñÝ ôÑÿþoï.° ñ `à¿ð" dýü²)ððâåï-qа ñ°ð?> Àðü=PõÀíÿÃ%ó °ÐÁ$4N`±æ ÷àãÔ°?¡Ð@ðà$°Â5.Àƒá°òCü>ÿãÁ¢4 áÐÿòàÂÂñÐ-$âÐL Äôúð0öô/Þ ÒPâ²ÂÀó:€1ðࣿް#óüŽý'àßð0à #² öàåòÁòçþç%Üô 4OãÀ°ð =vñÀîÿ'à±Üàð6ò°ãôð4ä°ââ'ÐÜÿD>°áá.ÞÑ× ïÕ-0ïßððB аӵóáÝ&2þ€ð3÷ðþ°âåB0&àôÂðG#ßð1ð!s2à°ðî,Ò õòÐÀÐA/àðŽÏÑÕòýßî 11ñÀüÜÿ$ ð²Ð€ñÒ€ðð 4ïLÂÓÂ^ÎÄþ Òæã  PâÑÄq/ ÁñÐöóáÎî>@ÀÒðï¾ Ѱíë¿áâ"Ï€@ùøFðÒàp.#°à0 7Þ ññ'üá rôÞÝ¡Õ0$Þýðä&íÞáà0tââ®$àóíÂã€ñ 4à€à0NÒ€Ðíâ040­àâ×ðááAâ³Öòàá4±ý¢ @0ÓÀÌв =qàÙð!îÒ! àQБà23¡ðáÿáÁÑÀä/ `ÎТÂ@ü±²ò/ O Üáñô àÐ"Pð?Ò áñ"ôÝ.°ÐÐÃ@ÜÂÁÐà4â“ó¾äÓô³Ô±þÀ&ñ°á>×Ó£âÐþâ¡ôÁÁðý Üo?ñÁ03Ó0Ýï0q@ Ž "%àÛîÞÂç"#àŽð 4C×ÑÔÑÓÄÐóâ£ý‘â¡ð±Þ 90. àßà6ð3É€} àoá.Ï"1Ò ~÷þñûEî À ôî=€ &û ä Þ=! Ï?Ò #ãì *äÀ 1ÐüOÖñ 0à!¡,-æà?¶ñ/ÒN(*Pñ @À02 ßî° ðïŸíÎî ÏÞ±Ü °ÐðÛÕýû0çñ_å0aÔ1ì1ðþôpÿá!"C(ãý×PÿÀCàñPðM¤@#Àa1#$ßSÑ#.', RÑøñ¿à>¿Ð#îîàžàÍý ¡üþ þÿ ðÐÀ ÿÐÎííÎÎÝÍÜÝÍÍÜÝÝ2-ÒÀ0¯ð/2ïÀB7.p0ð b!r$.3Q#=D2A '!"î #S½à-ýÓÝ#Ž °.ìò@ð¿0 ð$ðF $C#2`!ÿa-ó`2ö".t$CB44!A4B#"$R$b"$ "%!ÿ4 ì Ò,íÿÀ¯ïïï¯ÎïÝ àþÙîßî­ÿý¿îß ïÜíÀÏÎðÞÎàïàÛð¿ßÞûÿПïïûþßíÛݰðïÌïðûÎðý¿ï¾ýÑŽà ÐâäíÿËðî ÞÝ þÿЯÜÿÛàþîÀôìÝ÷/îáO@üù€öbÐâ÷í"í°2ÜÃþäó,ïCî1ñaû#Aðñ<Pðâôà.tððíÏ# ‚Þ$ìÑ+Üä!ÌðÒ àÑ7äá1+óóËÐÞ Ìà àîÿîÜâËÁ ÞÒ¡@÷3’Ï`ÿ°ÿõðñäÁ\ýõàÐ2À¼ß"`áò@¼ð$ÒÐÓ2#óÀ°6ò%%ð &ÿ ÑÁ  ãðÒ±ñ0#â4á7#0sð0õ àñÿíÂŽýð ¿ïàÐì€áïáß¾ï½à Qåþ‘ñÓ>í#7ñÜ@(ñá.à°áà.ÌáòQÑ 0ó@¡ñC° p3þ'å@óñ0ãÀ3­îýÀ‚.Ü$3×pïõó2þ37ñP ó0Kï÷òðàˆÿñÐìôî"4.á   Á/0 î? à ËòÏ ï²нÐðÁ ÍòÕß²ÞòâгР_à¾à*ôö 0@%À.à ÖÐá3±Ý ÜÖÞ°á4Þ{ò#0páòÐ àæ ð€/þà ð °ðßÀÁÀáÑà€Â$ÀõAóásñûBÒâ°áã7ðãŒðÿñáò3Õ Àðã°$ 3¡Á"àWð4ðð³ô$°ôñþó ðàÒ³Ñ;ýñ.$S/äððÐ`ÂR@ÑôMÀ±ð Ðã¿Ñ ð€.çî&ññqð..`tþÜáÎ ÐŽ 3Û€àÃýŸðà‘À Ñ’áâÿòŽãòÓ@¡ ÖàÕ.pM =¢ÑðÅÖñÿ ã’á"  4Àð PÓðÅðÂÀÁñÁ¿î Þнпüÿâ¿ áðÐðâ3ïp0ÿÓD>uòóÑQ#/R >Ñ0Ðpã "ÄÑç0Á°ã.p à@°0¯à#¯ÞBàÓÇ ÀðþÿðÓвÀÀ ÿÀ ßÃ@2ÁÃðÝ%å oâæþá3jÃýÒì‘ñ¿ ÁüðîAôÑôaP ' 0"ðQäíñâãÀí=7ãÀà×РððÂÞ¡ð°àñÞÖðÐܯðµàðÜ¢áñD°PÿñÒ^ÀáÁГññ0oÓP3çàÒ.oñP@ïâ0à€€ÑðàÏÀÁ ÀÀÐàÐÅÑ¡ðÑð¢"÷ÿò /Co! 0ãOòæþ²àÒÔ@ØðÀ.ß‚2¯ñÛ"óý ³ñø$üÓ ‘à/ /ÃÂþ²BúÁá@þ± 'â±%ârÿärðÐ?Ð2åQ!>½´0ÑÁÃþÐá¡þ ðÒÀ.#s¡0D°Aã@õ àrýÓ.à6¾2/¾ó°¢!îF Ã@íðÓ à@ÎõÝæ/ÂàÃ:òýDÁî+"ðððÒBê3Ýöððýý" ¡Àÿ "â€/ú"ÿÕÐß Á€$Òí-µ ÛðAêòQßâÀâ#úïã( à°Ö*ü®ð0!±óAîpÔðmð'ñðÐà¡?€Îáîóp ±3Î\ñþÑC  'Pþâ ¾A' ,0Üÿða"úŸ ÿ?Ýö.¿ïC!Íà?ÐîâS!úÎ1ï#Ýá#ï3»ÓtàùÐ3<¯Aîð®Ø ì0þá-ž!6ÞûßAñPâpíÏÓr0Íîä qþïð'! žðAð(á?óÜB"æ- á?¯4à@ ÿ° á0€#É4ûòð×NÑÿû¿ï ýDÞÔ±@#ŽÂ)îÔÿqàÓâ=AŒð bÝ$Ÿ3º°+à!°ã ý@Á" à¢að PÏ ÎàA'1ý -ãTýà0pýÀ!ýríDÎãAðNà.€àpîÞÕ0Þ Ñ ð ¿ýÁ`ï$ ¼ÜC1Ÿðüãp ð0ÒüãA ð!Láÿ0¿ò ïÞ?€/àΰïÛEÿ>°0ÐEÎò6Í|ýþp÷qââÃq/ïßCaðRýð õ! ‘ðQŸò þÛ°RÝ °D ν1ÜÀ"Ø.ž0Ð 7ß1®äqþÐEôq$ #Á%Áíÿß0ÝŒþÿàÝÊÏ þòÜߪðñ_ÓÿÏ!ÁÐñ" þAb à  ïÐð0¿¾®â °Tã Ñ`2Ð ðå0Á1ŒÑá#QìÐ%ìàÐ!²0RÞÃëáAüöAÿÀð%?öô#A!À7#ÿàBŒÿ$îÚÝð ìî ÍŽÞ3½Þû#R@À!ü"'Tðð÷2ÒPñ#R°áB!"¿ÿÿÏ#A ¿BíQÎáÿ%â®àqÞþÓ2=ËÏ Þ cà®Ð!ïÌÎ7ïßW%! ÿBðñ0Ä ¯½à íÀŽíá.ÏÿßÿñBî€Ý1 ° )Á/ñ‚?Á ãýñCîàÔ4ÛÐ ¿±Úð3 Áð°øàÀëóÀPà ÂO@ÿéý$Oβ3  þ°ã ß. ís‘à ÒáñÂ1!Ï'ÐàñÀð+ãÃû´ðÐÑ”ðÐ _ ! ôâ@%þðà#! Ža ýð2°ð 1-úÐ^ýôûâ0ñüÕ%ûðýÕÓð1ø0 òßCKÐß×Îþåß"°üþ! -ñêñ2à#žà@°òäÁÀî! ïàïðÌàÓò°.À$.Úð’@ïýÔ0' ñðà ú"á5íó ÀpþðñÒ î@!<°â7ñÞáçO$þÿÀ7ðÿðÿÑòð9 âÒ.ãâ€ð 'ðá½âöÕ à@!ñÔÃýC ƒàòÐÖðíø¿N° ðóÛ°ãå°!°$àÖá !þÞ °"ê" áÓ€ïþ"N×Ôê/ðÔì ß"ÀàSû³Ôáý#Ùâóð ÑLýÀÿ"ä‘ðâô<°>#°âðáS°ãìçþðÐõý=Òð°ò*ñïpþàÙï3îìÿî5Q ¿ó2!ñtð$ÐÁþЭþe2îÏ®Ï"ûßÒÐÄ'î!à¢R"õñÐa4QÜÐ@ïÏóóQÌñîÀÁðûÁð®à'ì$þÀ¯ñ3"ô ßà³Râîáò«ÓÁñ]­á$¯ðí?¯°#&Áð!2ÒtC?ãbÏ0çEð°ÒíÂÜ2rŽïðâPÀ€ÿâ3B Àý72äñ1$CÞŸ2BúïáþÂØÀ-çÀ ñ%2ôÿ2ñóú°2QýðDý÷ïà`þßïM¡ÞíìÜåÕÿ®áò  3òàÁаòã3 Ð&þ€ð #ðÝÁ€ð4 þÀÝÀ¡2úðß áPr¯ï òÃ6î±Eð 7#¿ò$þ÷þßâàÞýÞðá ³ðÐËñîB¾þÿ@ðà40"ÁÔ Ÿÿð$!Ü¿ÒîÀ×ݱàB7ò‘ð# ÐÞ£õB¯ñ¿ðÿUÿûcÀï"ÎÃõ#Q/éðb!âÁ#3‹ð° °² BŸÎ ÿ°ððçÞÞèÐ 2±âîäsór"Ó¥A$-ÎþÐÐñ'àáþè à## ð Áâ7þ ÎPîßðà 0P1OììîYõ °î>ß×ÿ*÷ NÓ¢nññ. Ñßp@ ÷þ?ò  "îrÿüÀ>Pþ¿áíƒDÄ /ÒØÐà¢ø ðÿý pã .ñ²@Pâã#P60"ˆÑ0î7õ<ÔDž0ðÝVð @íà3á3'!ÁÓ Ÿð.þàŽ Þýá éüßQþÏÝÞðE Ñ­#½#ðÐ_â] $ÁQþð1$aß1TÜ!þðwîÁ0°æ?ÝâïOîð ðíÎ@Ò°"°0"~ =à 7 äëÞ.ñMîþód ðÿÅ0Ý ß îÐ2 2œþ$ ý6€ Àr_#5ðR"Eò" ðüýþ!Ißϯð.ðýëàîÌÝò»ÐÍÎÐÿþÏаìÐDðþÃ2á€0ðÀðŸðýÏÏÀÀÐ(ý°ðíÿÜôýð¯ÑàÐ!0Í'±@ Ñ/1?°2 Ì ¾ßôaý ÍÓ6 à22W#.Þ'"ðÏï$b ðòÀÿ1-àèøï¿ñïØàþà°ÝôÌá@0ôS2ýÔ5 °CBõðþ!Äð"qðà >A ®ß6Bðâ@Ý¿@ì‘òïùï ôC`ü$CÐã QìàáÀ°ðÎþ°îÖîüðá½àí®ìÁïïýÌÀØÿáþÞЀðàÐ'Ðá¿å÷ïùðïðâàdüãEÓ@ 3cò"q@ñÿ7 òð â/±Ý ¹ÿð$7ð"bB@ñ2° #0å°üÏϾàÿ¿àÐßêþýü¿ßÞòì ÐìðÁô"$#6"ðàå;ÿïÁðð±ÿÀÀÐÞµ€âäçAäÃ%ÓSÞÕ½ï7 ÿ ðòÿ2ðÀ¿c!0%àC0òàÐ=tâþÒ€àâñÏîÀü>€ÿð ÊýýÏ ÀîûÞïà¢!ó3Q26#$"ñÕT'ïAñÑÛÔFàñ0Îáþ²&Óþ½ð0. ¡öàÐàÃÒ0ÓàÞ !"ÿã×cñÓ"& Ð8à€ ïàÿðÁ®Ïàëð¿Ðÿý€áÿüÜïí Ÿþïîù ÿô 6?"QC 0Cbâ’%Ð&ó!Óâ±=rôÐÓðUðßî쀿þ"/°°ÞðÓ%ñb@'$##4 á07&° í.Ý ð°ÐêÀÞýþ ûÏÐÐÏ¿êñ ì >´#!aE"5÷ð! RáÐçîïî òáÐà$óôD"ûàí }€¾ @ ã6À$ /ð #òÑðíòÑÞ ßï àü¿îÞà®ð¿ÞÀÐþì ÞÀÏíÍ¿ÿðòðÐЂÐ7B$A#PvëéäÁðã¡ÄÒ¢Öðáð äÀáøÁð´à"²Âóóòð"³Ô×ðá!•Òñÿ-×ò KCÿ2Cÿ<^=2(Ôï0üÄÀ üà ; @ ðââ±ï ßÀ.°ÝÑ,àðûóó‘Âÿ.¡PÁâñ &²áÀ Ñ+îôäòï .o.~à CÒ·ðÔñöÑñ½0ÿ ²þ`ãbÑÇðð .åÓômðPÿ!!äÓç !2ãà0ÖáÒþÃó‘Ö¿ßô“Àð>ÐÖÐÑ ôò± ³àñã!ƒ0±_ÿÀðOñ [Ô±ðæÔáäÀñþöã²@O!£ðMµÿ/?ÀðÆóòÃð  3+#Q4_çðäÇ0/€³Ã²þïý°ÀÓâ ýÔþÁ þб ÿ í.Ô± ë,PÂÕðñ ã¢àà2‚Òá0àô£â .ðÆÒÓþ@ÐÂ>lM/^ßõçáò£òãôàóõ×Ö/ãä´âðÂáÀãÌàÀUíí¯à®ýþáâðà 3B$ðæñA@ÐRòâ7 Õ0_Pòã 30îsã°BãRáÀÒ_áNÑòõï `Àð ÿñ!3âÒöþ"!ã$žòÝÝÏ_à -îÍýÐݰ €àÐ+üÿòÔññqòKõð#à3OðR²0.žàARðÓÔ !ðàÊàà€ Ðü¯2öá1Ð`³óÿ÷#22ñ×3ÕçðòðýáDÞpàòàþ±ÑŽÏï°,à ÍáЂÐðÀÔðÐ×À â.22®ðÁÃÐÐ’þBôÏâ?à'.Ü Qðàà€Àð 'áý÷!"à0VQà#ÔѰ ðàï_ðá °ÜÏÐíê° ðýàÀäñæ ô!žÐü¿½ÝïÝÌÜàñ!2ñ%&2AÕ 0Bbñð+ÑåóÝ ±Ð"!@ 0‘õõàõQåÓñãÓVóÛ 2­àãÄð#G6#$4U?;à²Ñà;ð×ð ñáÔ ~ïäô’àãÀñ "Õñ=±âóþÃÖðÀײðÔ± ÓÄÃðÑ>¡ñƒâÒµáòò*,1ð …ÿòíAðÓ$äÔðãà OñÐàßÃN!CçÓòä*À ýåñð¿0³ IÐ$ýÄÒãà.Pã ÀëÓƒáÔóÐPÀM!Ãñä±àà"ÙLLÄàÑ ÖÂñàÒâŽ2 $;çÑÓÞn³ÒÖÕà /ò’áààôá£ÞH á~=ô°óÐÑà8øàñô±õÒÅÑÀçÓáÿÑô×ÀÅâ²óÓñÿ ^MÖàÀòúðÿ 1PÕÔÓÿ1ƒóÑð]ð×ðæáÄáN”Ðä“ÿåáÓÔÐîPÐ "²ôÁ‚âÒôÔûO“ñÿ=.ó×Õà“ð±äáð¢;/ááòÓÀ‚ð±âÔ£ááàñ¤ðÃÒÓ£Óáó£Ñä =./ P-ð•ò.â×?ñ„ÔÓàðâ¶à ÿÇáþöÃáñµãÒòñ-ÿÕÑñåÂþñÁð÷ÕÂ=!ÐLä£â²ñÕÒÄð´ñâäà .Ò| æÑÖñð³äþàÿá ð‚í>0 .¤ÁáôÑâî r£âòÔÖðâ³ÿ!¢ò·áòáâ Ó8@ÁÒƒÑ0¤ÿUúù¡Åà ÖÂñð=öÒ×áðä°.=#á“ÓÔ¤ÒðñM?-ÇÒòЕ³ð.0×Íâô¢ÿàåÀðÏ^ââÔÄÐ]à²ðãà@×ÃàL óÖðò³á^L ñãÃô³àñµãðã°=ðòÿæÑòÄÓÆÒáÿ??„áòÁÓü"Åñ .<=†ÑÄÃÐá Ô×ðï£×âÿà.=²ÄÁÂâ ;ò²ß%ÂðÅÃÓàðÒ°ÕÃà PÔã¤Óðã@Óýð 1ÆÓÃ×þðâçÂáòÁLOà.ñ£ñÖÑMÃÐð×âòÖÒàÁó¡ï/.¤²äâå²áòãÃðð’/]=<öƒð ÿ’ó’ó£Ãàÿ¢ðâþÒ†ÃááÕÒñáñ §âððå³Åðñü@ãÑçÕáòÐ?ÒÐB/ñ×ÿ²#³Ó¡òÑÒ³ÁÆÔáð0ÓðôÃð;=âÔï à.”ÒñôÐNçÓï·ÃàÕïL=Ô¶ÓÒð PâîÖѤðó£Ñ²Öáòò’ðò2 !Öþ/ þððfÐÍîÞÝܰÐü ðïÁ°ìþÀÓàÐþî°ÑßåÀþ°ÞÞØ ÐÐîßîÝì¡àÁÐðð Oÿ.‚ðÑÿ±3=0c"35S4&#$35$$336#3"3C#Ï ð ÀîêîìüþÏÝíΰ¿ÞÏÏÏÎÞÝÎϾÝÝïÞß̾ÝÐðÛÝÍìà ÞÝÏÝéß°þîëüýðÐàðàСþñÂÝç ðÓò b3RBA2$õ#&Bp¤PÖÿ ï"Á!nà!PÒ-ð mþÒ(.‚ðPÑ0ÑÀ=_³ð åý¡ß¿ïÍü¿íÐÞï±òü ïÕ>Dnä÷m-'Aíà àA0à*ÿ>â;þ‘0àðøÀ ß ¿à®àÿßÝÑ[ñ°ï$õ@O"@?3' b$02#Eå÷ðñà`Ïsé.ð±Cüð ð ñM×0à2 å"`!5$Cúòîñ ÛðàÌïžñ! ­þà¿þðíÏßÝÎÝ¿ÏÞÎÝÎÎÜì€ððþðûíΡíÐñè@š™Lå5àWð>îUîóqð'#ðÜ-ßËñÐ"`à¼"5ò%/°@Ð¿Í 4ÝÀü¡3/ØÛÞá ÿð üÿÜ4ýì@ûà4Ñ3ïE2r#ÞDU!þïïÿOðàëðCRðñ1-&ñéò Ð1ýPÀ³b ß%$Þ¿Í ßïžîÜãT îàñÒî×éñн»à ìñ ßVÿðÒA4üÛðÝâàï ŸüD@ëîþò'ÎíÑ÷5 Ð"T2í41ÏðïíðóP»ññRBàáDáNÚðQî€4ûðÿ%à%4ßÙÿÿá' þ 7$"/ã"@  üÄ2ÞÍñDŸÿäCqþò%3 ÏûýðÂí#0ÝãA!ÿâ4ô ¾±ï6þüT ¯ÿàCQ0á @ ÍÐð-½ ð$AàÒðî ;ŽáÿÓSÿSã+a®ß¿à  ËÞïýR°þïà¿ÓÏï1¼îÿrðSAíØ ÿàAÚî1# à'àÉñïáíP0Ûð ß& ßðÁþ0S!€àó1.'þô!ýqÓàpÐ%í"Ãêñáp0Ôð%" Ïÿ ã%Þ€ àðâ/u ã‘ô€àö âA²ððñ/žñòàÂ+¿òÐ^ÂîÏÏÐà°ã&ÐôÚðàà°ñüߢñ>!ðàÐÃÓÁÙ2Ó£åàÀâ@A ?ý÷Ï!ð#ÓÒ÷>áCà´ 'ßp0±$ðÜòPåàïå2AÑÿë /ß‚ГöÀáðÓ'1àíÞäâó>°Ò EÐÿÿ±åþ àÅîÀñÿðÀô` ðàóÐý€àðàÞ>èàòÒÄÑÏ$Í/Ïð1 Ìó'!îìÓåïŸÀðRòî0Я<ÔðÐ Üÿüÿ€2ððàÒÿ °ð!`ßàPð ïNÃàðбõúÂr¡ð$þÎàÛ¿6þCÿ/øóÒíü7ÁÀ'/ À$6þÀáàá  Àÿ 31âÂñ£ÞÝr5üÐ$ðàÔ0EîáÅðæР3Oÿþ" áâÒ1ëpðàïbÀ± @ýÐïÔ²àóÔ>½ °ÒðÃáÂþ $±ãà÷ðàÔ30=ž, ò‘óο%àÒßÖãàà¯àïòÜÄýÓ'ìò0ð Òñî°ó÷ ì 0!ãÐîÒÑÂ!€àð°âPÐðÑààÿî.²ÀÑ` í€ñþÅñ0’à,á!ó ã2\ BÒuþàÄð€þÀÀ  î“óâ³ß+ÀÝ28ïò!NìîÖàáð÷ÏÓ%Ð "ïÔÿ×"ñáÓÒÑ·ðÿðA óo ÿ'$ÿà! ÀBÝ=ÐÅBî‚ñA±ó" ±áPà`@Æ?1&ÑÐBò‚âÐà@/ð 0ï‚óÕÐüâ³ÿþ-LÔó/‚ðþÑ 2 ÓÐà þðs¼ðÿþòïøòѰáæ7ðáÿ2<Ú‘àïÐ1Kåðnúø³&ÿà50½ÐÜýÄ0@б þÍÏíÞ¯ÁÀÎíëÐñ ÝÎRãæÿìÍááàÙïëÿÿÀÞí7R½À#/ÉÿÐ#àí5ñ @@`ÀÑÁ1ÄŒßÑäРÐßÿàðññëÐT°ðQ– ß#÷0÷ð4ðpñ ð? QÑ ?#ƒN"‘;ÿÑNÿ>à ÓO05Á_/Cà!Q SÐ0³_ ï²þ °ÃÏÛðM4ààA(Ð@Ãÿ ñÖ.7ðNä#o% ÿãõ-p3âõ"#/ € õá//Ðá /.€á!ï '5 ðü!­ÿ& Rà ð233÷ " ßà±þŽíßC$ÜÿÃ#øÐðãàüÌØQ46þìž6îíTïÏ2!í ÀÔì/0 ÏðôC4_ÞÔ%ûïï°ÿà1àÍòR ÝÑ -€ ÀÙþÜÍîö4A Íâs  ½ððÛ$ðÌ /ï³ßÿÇÿâðÕÏòíì óú#Àí°2oÿ ô ðá ‘éñðà qà8ò áý=Íž0ÐðââqÿÓÄÎ@ÎqÏ ¯ÃPñß.âäð $ü½Pðïàí! 1±ÂÀaß/À!ü¡?ÿ¯ÐB ‘îPÔ ÀÿðòóÎÒp0¿Ñ#.À€0î.± ;í ! ð²±óþP ÿ'üÿ3å Öð/ß ßPÏðÑþ¢à“Þ!0€ /Àð$ëï4³ð ò#ð<Ùóî"b ÏðÇððõð=µñòPÚ ¾#/Ü"=?ÛÓðòWÀ 4òñÒç ÐnàAÐó`í QàÝßpòÅÿB 0° ÑP"¯ÿüþÐ2Pý!ì±òÿÿÝ´q3ÚÏ"!qÿàý7àð#0Ž".ÛÀ! ð ÿû7íîäñÎýç"ÿñß}üõ°H° -Cß¼7ÿÀà@ÁOÝ Þððÿa áðÿrÀÁñ&ÐÎ qÀà"÷ÿ ÀUÐëòaÝïÂ÷0ý× Ò/ùöüÿÐßð#ã!­ÏñáÞÞß×" /ÂÒðþîC7€ÿ4þìÓ$òô²%ÌPÿìàÒr ïÁ°<à³ü ò%¯ó"@½0þõónô ÕÔAÀûòÓpîð°@¡ CÀ“ÎÐ!òúðàñóÐ@40¯àÀc .ÑÏ¿ãC.€àÁ>Ñ€OðÀ? áîñ#ŸÔÑB°ÿÀrÓÿ€á#Ïíýàb áL" ‘ïðÓ-ßþð7`þ ðüì#³þ€ððà ± àà0? °3øðÀàñ4'à ø  àß?¢àNáýÁ2±ÿðÀà&°Òa.À°=áéð#Õ±ý#ÒôÐ?€  ðÆßÃCô -=¯2»ð ÓÞ0PÀÀ#´’ÿ#í²âó@—øúá ³í7A¼ÑPàÑþíG ¯à5Ñý¢ñ0Øß°pàá0ØŸá/ØAÏÔþ.Üó RÿÝ10pûÀ2%Òò1Ùã4 # °Ñ àáÂ+þñ0°óîÍÿ^Â0¤ýòÏñ20Þ÷@¾å ×þðîâï @Ïýó7ÀR€ÕýR;ðàÑ%ÑÔäŸRÁÓ ;€â/À³<ãøòü0¢Ãàþ pòáóà:ÿ ÐÑáï‚ ôÔÿóóâ ÕàÖÑ¢Ðáïøï’ðò³ ÒõðѲàóò³àÿñÕÿû2ÐK/Ðãà £Àñ±Ð`åòÞ"  ×ïðÞ$ Ñ/•ðñÀÐ÷âÓüþ~ð-÷àðð'ò±á âçÐ/á „@Àãµÿ.ðþ·ð×ðãÑàà@ßÒ¤ó°þ ð£@Ñðï#€‘ÒáÕ  âßÐ ÷Âߥòþ=0$°@ðôò‘ âòLÀòõÐÞ%O/pÃÐ-h "€àÐüñ¾ÀÿàðàýÓ ÿ”úðïøëüï°Ðá²ýýîR&þöâÕìàçòÀÿ¢¿áïûýôàÜÛÿÏÞÞÛ ÿ¿àêÿîÎà¾ï Îì°ðôá>!÷á5ABÿððõþ1¤ãà^åOñâïàã âñ0`>102734ñqò$òô42@óïòGð òÖãàR²ð ò\ÏRð¡p€@ìÒ qñüÀ1½ Ï!Ìð0%ýðð5 þã` ÐÉ ñèñA¿ ðþ4ðýÀS Üþ'î0ð¯ð.à7í / .ÏÔ`-Ð%ßýÊòrîÀüÜ7 ïBýàëð`ò=° °@-Ä=°3ÿï øåðÝ00Ï"à0½Í<ì€ÿðÍÿïîÞÜíÍÝÍÍÜÝÍÍÜÝÎ8ÓíñpÀ3 2ãð,Ápð.2@@’@Àq / !"#3%#43C44$$#435#42C$ @ópÕñÀà°4 ïêÿPîϼ÷òO¾ à€0Ïàà ðÐùá îÞ ð¿ÞïÞÞ¿ÞÜíÎÎÝÍÜÓpÍÀÿþç, Ýá!0€.#¡0ß&.2ÐrÀ s ÀÞ#.€ ÓÁ' ÐuÿÿðòŸ@®ò %ïÙ ÞäA3q"E@QA %$ "öPÿ" $à"Ý%ßèí¼ÓüÐAÐs ÐEópqñ ðS/ÁQôP0>ôë2ào àÏ À0À»ÏÐÎÀËÿϰßÀ ÿÿß  þáÍÐ-€Ûð°àíÐðüà âþ®Ð0Ð PÐb3áp!@åàBŸþý¾Áà ÿý ïÀû¾þðÞÒèðþ®ý4ðÓ qüÃr+ïbPÐDï#ÓBq *.0 5 óO²s²2bâR1ÿ Õ4"ñ4C.ÕP5ð$1SóG ðòRc1!6!!S1ò@t2òì#!ðÿ€ÿŽÿïþŸïîÎîÙð¿îþÎÿÞÐ ÐŒí"ýÚò0×ÚA°üõBÐ"è!þ0ð /Á6?ïB»ñ!ßPÀþïö5À Ä"3!¿6ëðTá/TÓ ðQàÂta p¿ ÍòÐà€ðÏû¿ðîÞ­ÍàýÏÍá­ÏPóOÒsð4àîïs2ýÂBìî&$þàGüóÿï 'Þ  Dñÿ°`ÐÁdô à7OÓ/^îáÌ!¿ð!Óö@ïþÂ@4`$Cÿ%Bÿ4ðRý€Î$Þ°®ð¾ð1Žð à¿ÜðïÀüÝßðŽï#ç!c #ð5!b%ðá0í7#"Á ßÀ70 ÌÿÁïõCüÑàÃâ$< ¿ €ÐÏÏñ@±  ÑÏßâÆÐÿpÞîB%íá3S"!ò73sðRðÀ ìþŒþÀÏüÀÝ®Íï»ïÝÝï îì ÝÏsBAä"`B33 ác5 1°0€ñ#%þŸáðã=޲ À1¾’DÀ/¶c úÖàî&ÿ.ýN PÁ3!ÖÅ¡ñCà!!`àB µ±0ñ$Ò½ððà1ÿœÿðÏ2¼óîðñà±.Þðê Ô=óè!àðåâ ï`aß °þ 2à°òâñ;/$èÓñöãÁîPÁïâ>µ¡Ð0;öòàåòá¤â"ƒ ¡>çñOðC!pâ@“ðñïÕðñ®ð£ïïÒ½ñ°°àÓбÚÁþÂÁ*ñíÂðÃ0ÌýÔÖÿ.¿ÿ"¾Öð0ë?°Ï_ðóÓàÕáà×þ6íôãñÎÿ 6‘þðð¯!ðò Ð>UðàÂ!£>¥ò?ó1ö`ààòp ã² áðó,0ÏÓâ‚ý.àãÿðÏ ñ߯ÏÃî€2°ðïóƒðàNð#À±`àá0ðòá÷ýñ à1ôÐÄ`-À?Äôþ´ÐÅÿ²äÿàÀpîõñ€óØ!ô/¿/±!ë#`Ààá A1qõà0Rñ1À’ã,°±à-°ÒÿÐ.ÎìãèïõþáÔ€ þ²âåãà¢Â0ý÷÷ßðáaÿõá"¯Ò@ðòÕÀï`þÿð²±âàpðß.ðßôàò‚ÑÔñðäÒñ"?‘?ÿ/ üQôOñ rÃÑ8!ðÓÐK.àá ±âáñ~à÷Þ0 >.å“ì0Ä#¼ÿò?à_ ûäð+"¢þ±ôððÌ£ÿðú$ß'п±ðO𤠣ð? ?ôáàoãàã0ÇÏP/àëBð¾@Ó 1×Ó¼@, âÑ‘íOÓúÏÎöÐ×à=äü!þ• ï=ñð;-´ÐâÑÚ&¾@¡ý0Ó€ÿÑnáàÂóìÒtñë À" Ò2ã!³÷/à î±^ð/Ð ñ`ò">àìà@ÓÐÞpT.ð ï'üð þÐÜðR Ï0 ¾ ò.îØâb-Ðâ4âÝ÷-Ï!Pð04püÐ1î&îß!3ßï¬ã>ïárÌð"6 ýü¯ïþÝ'pà°ðß Ï"Ì2ÝÝP‘7þî# Á/ÍÀ2ÛÐ2ýýþ ×tíÀ2î ð3ð!Žá` û0Þàâ7?ÀÏð3ÐðÝîAóèß!í¿#ÐïÅB íÎ%1ûýîòE½à5!üÑ@ üÞrîÝâR ßÎÐ0 Ž0®0" ÜïàrïÎ ÒëÞàS äúÞ% à#1üÞñúpààÐ32ÐàÝ &ð0¼ðB!ذïà7=ÝÎä!àþ®Ð`!-¾ îï÷qÿíþ$3 ý°# A¼ÀB"ÜÁ#èàÿPÀþá@ÁÝÐa^®1 ¾áA/¾ÿÿÒw   ð Þ  ÿþPïýï52ߟÐ%¬"ëá"@ΰîVÐÝóP0À-¾õ Í¿1$ÿ°ÿða ÿ°"á ðý±!  Ð$0ÝÝÑGàßÑ`0Ѿïa Ÿ10Ûã@ÀàïC Ý&óìïß'"Û°! ¿Ïaî¯Ð@Àî°#"ÑŸ°®á#ñ@üÁ °þåC  ã1ð­ÿ4Ž1>Îå/ÌðñϰÎßâ0¯Ð$ À@!ß°ðý'PÀÿá@ÿ/®àqð ÀÂ">ûîuÿïíòðúàÿÞ Þà&_ïìàA#à0ŽÐC0¼à%$î¡ àïUÿü@ð120Þ ½ó%ò¾rîíÛ$/õúïáûà" àðT ßÝÂR4ÑËðC# ­4%ìá@¿ßÄA Íå>ðð#Ï®P°à 51Þï#ÿ3ÉÿñBÌÑDò!ýÏ$!p àâ6Ðèñ00à?¼þ%®03Êð2ÉðSüÏÖ/þ¯ð@2Ï.°# ¾ÿ'`Ð ï3Aó°¾Â"ð1 î$!¾ÐýTÀùâ!ï?à ñ  žA>ÚðrþÍò/ò+Ïâ4ò à€00 Àðñ ßí ##ýÛ !Ëñ@ëÑ6!25¾àFàûò"!ðOð"ó/2@½1 Ý #Ý Ÿ à Ü2 Ï0 ß$0ì°À6îüà3îùð#èð#0ÎÑbÍþïuïÎâò`ù@®!â1¯ïþ6þÿßäð/À0¿.ÜðáGýÿÞâ5&ð ¿ðûà ðåÍþòSýíìÏ'2ðÁ "èÑAîá4  ¿Ð!àРïìðòAÊð2¿#÷@ÍÀ0О2 ûßÐ ¿Ñ$ Ÿñ!qëþQÏÝÓs#ü¾ðî6ÌâB 2ùïð'í í7QÌà30ßï '`ìñ3âð0»òtýððïb1Øà0ïàöBûÐ%ðÿñq ð$Ðáð6üÎ!í ÐQ¯ îð'¯üà$­ÐR/ ï$àÙðÏð?Ÿä =Ýv!Ùþ"ãbüðÐäûÀ$ÐB¯#2 ¯þ!ΰ'ß Þã@ð€ ¿0 â#ºŸñðîËÞ%¿Ÿñ"ÑTïAþb%!þà îïïrà áD F4àðÀÌð Üïñ5¾þÏà ¿ÐD/ÜñþÔS4üÀËÞð6ÿáݲ$ üÎîÀQ Ý€àÝΰàAî Žïðݰñà°ð®à$" Ý5 ½¿ñ"ýßð!ðB б#ì®à$ðݮѠàþÿíÐðßÀ(çð?=òÂ.4àaõ,0ôó=$ƒ}ôðPðÐn&ÞðßD±.ó!ì4þäƒpà á ðßá_×á$úí0‚M°ß øÿüÐÐ PížÞîÏ ï°Ïïßð@àÍüÝóòî À-Qôð00CôÐrþ01' äR ðRôì ð4B" Bò1233CC43CC  àþqîÛ>à € ¿ëïÌîà ßîÁïL/ßÍßøïûá íŸï޼ñ @ÀàìîRýÀà""PðßàaD/Üàþ/ÿíÏàs"!‘ ó-ç?€  Ú4ÐÀAÑ)ã  ×ïðÕ Ð:¾ÿòþÀ7,ÎOñ¾$ÝßÛ.àá6îPÞòË3ßñÜsï¿!Õ á ÿ-?á #ÂBÂ^ñAÀaüÿSÛ°CÒ þð!Öó ÛÎâ`ý ðÒAðÿ)ððÑ ϳ*Ò  óP îñðÐÝ1¿‚=¯à°ϯ$ðþþ²àøà@þá¸îì°"!Àâý÷"ÎÏ"ÀÓ3rÀ!ÁÃÐãç-ãHÀ4/ŸïýIàB-ð í#€ï4ðíç Ò  #8°ðD@ì##í'-àUêä#þþÃàð!ô!ñüPð±?Rì°4#¯þÿñ0Þ#sâб& ÀÐQàÐ+að¾ó ŠðaÀÀ"ÝÒ@ëÐpð¯àúÿþÁ#€àýðÏØÀ7°ðð#0Ññ3ÀS1ÂÿðàÐà'2ÅíóÑD°Þ%êÎCA2îôߎ1Þæ óQ$üîðÕ2À°ðõðþàuýÝE2í¯ñ6àÿ# ¿2`òëàðï&þîðÀðÏÂò¬î50ÝÌà4¯þ"ÞÂ^Ÿ2êíð!Ð0èÑàðQí/è ¯ÐAìÞÞ#Ëà2 ÀÐå!ìàDðÍÐ 3ðPOùÒsñ1ÛóEðÿW/¯ðÞ‘3!ðâîC_€ñPïÀáá".òâNà&ßÐ#7P°Ð3AÏÐ%àô2ûðCñ°ð$0€ß' Îô5íðð3ùÞò4ãÏÞþÑ'ýM¯"#ÿ®ÀÏÑàÁÜóòaÞóB"*¾à1ðËá`òï°##ì®þÀð.€ñí €äúÏâðÀçâð#\ÐÒcðÜ¿ôó¿à°àâ=ŽÀïý à0¾ÀÑü5°ð°'Þ°1ïâ2"%îõá×BÐÐÒ ïã×à`¾ð6úî Ý &  ²âS ðñ$=:ðFð?¾QA &.'QÀ€â$þÿð&þðð°Áðâ Éà4OýÎ#Сî€$CÀÀAÌßÐÏàOÐõ²ð%òÓ#Þà!àñÀŽò -Ýó ' ÒÁ%þð÷Cò¬5! í€Ðî*þ ëëÍ ÑC½î¿ßïþá6àëâï¯Ó'ë1#àã"ôÜî×óÞ®#ñ²°ðR ýßôðÁܽî? °îãnñ°óüÆðÀâ6ÏA5ï¾Q/ðÝÁïå ðîÓS Áñý@íñÿôàþ ßô°õð ï2!1à±°ÂD" ¿òÐP!ßà±ãDñ°å2ÿpîäâþ=Ã6ñÀÁa?ÿËðsñÝðð$°ÑïßCBíì3¯ÄÒì´Áòý" ±€%ïÞþÜàðPó òïBü ßçñÑ1) à½îwÐÐ5ÞÎÀ&ááDàà ±"» Ð'à à°áQ"°²¿Ðð0îñ ÐÎÿG ýòØ÷õÍÒîÀÝÈÎÏÍÝÝÎÝë à îÑðG3%#AðàÏÝÛÚÜÜÜýÿïÿÝÞÞ€ïþ¿ÎÛíÍÛîÎÝìÜìíÎÏïÿÐî#5ðàóðÑŽìÿ4T4$$%#$!12B3à ûÐà€°ñðñòa®ÍÛíüüì¿Îýá "D!"CD$3BR34%$5$#B6"3$""4%ð!3% %" ÏÎð/ àݾÎËíîÍþûà°ñÍŸîþíàt#5#2Sr"D ï0ܾÐîrWP!ïÌÎÎìÌÎíßîà¿Þ°Ïð*ÎàÏÏðìÀ 46à1sðä%Fð?áE%"R1"# à¿ð#ýüܰ ±cààöbAB #bâ ÀE2S÷I!ñõÿ ô´ï þò '€ °á/ŽÁþãÐÒùü îñÒàæþ2!Àïr0B@õp0î€ÿíBþBÐM¯ïðþýíèÿ ßÿß.°Ð Ïð&üÀÚðþ@Ð< ÑLöàèÞ á "Ô tÄÐañÀÐQ ÿ' ò<ÜÄî ÃÐ-°1ÞÓó9ÿñoäðí?é" /ÿâpÐðpþ ñ01 ó=°OâPÀ»áÿ?À7<ò0!Â3üµâò4ûøò0áÁñA  ÔÀ!ï äQž$ðÛ!0àØòEÁñ"ð/¢!ÒóÀBÏCêïô!þà €'î¡0@ÿÒp0à0/Åý!*ÿÀ2à9òÿÝ5Bûÿý/Pð?þ¡/ð€@ °°?ÑÿGïþã" Î ðð#ø ÝÀsðï±4þÑÀ@.ÒCü# ÷Ã2ð ° 0ïð ŽT°þ0àùýàÐ'ýÀCÝŽ°!íðÑ#îžÁqáà@¾`ÿëð30ît 0éà& ï0 ŽP! ܰþÑR0ÎîÑP íŸ ð±!í€!žò "í]Í5þýâ@ °3!ëþ/ßTþÎ$O  ñS!ÝÐðS ÔÚpðÀpþAéð1àOß¾ ï/ßåï€@²"ŸA¿ÐÁ@ë5þÐá_üû1!ÿá å/ àp í"$úð°53úð"ÐÿÐ ý'aý Ñ10°í¢EÎÿ!êú!ÿÐð2 Øàb°ÒA½7`ÿÐà>ÎÞd/ àù" þ°! ê6þÿ"Ž"! à"ÿû'ÿïàa €`àÏ í7 ¿ÿ¿%íÐñq­òUíðà&ðÙ!" Ñ ÞàtýŸñ0!ï  " ÿ $úÐ$0@Û@ ÐÃp.íÑ0­­âU Û!ÿá À& À.ÒìÁ& ï¿ÿ2à ìDÏÿð Àþà7áP þ½ï4PÐàÝ 7`ï!ðïÃdó@Ü/1üúàGîÀðÀAÿÀñ ¿1Îëâuýß2ÎÓþ2à`ýÁ6ûÞð±ïîæUüð PðîðbPÞÀ" ß1ó3€Ñ âS@Íà ÞÐÖ2ØÑ1@Éà ýÏðÕ%P ß°"aýÕ¾ÀB0á!ÊÐ%ðÏó0âqïòÀB àØëñáRÙî /ñÿòðTïýÏ/+ž$°ð>¡2Ëí" ¿à?7"ßï ð ÞîaB@ëòî!âpì±0" ð ÂG?ÐÏ!"qîÞ%ßðâñ.ôºÀ á ÿ'à-Рàâ1éàõñóMúîÞ Ž1ßãï E ¿`ÿÝó .΀!/þÐ22 ÐöS ².±à³O°ñþê Øðà@ðï ÓðŸíþ£ÑQ ðÀ RÑ¿pñÅÐð"pÏþócñ¯Àà"0²ÿ G!ðàòpðá0 ï" .€  ûðÍì&ðð ÿàÀAðì@±ðâ! ê!óÿ5]à‘±ÿÐÏñ÷ßÿ@÷pÿ 4ý³P%îâ Ò½Òð×íäÏÔò;ÍÐPà#ÞÏÎñ`Ãàèñ¿Àñ##®ãÐ$Ñà ð%ßâà ÿñ2ôÛÿPð ýRô. &Ò Ûÿ1UoìÂÿ À .àðçðÁòù 2@ЀÅÿùà¡ÿâ ïü4€ ÐÕ2üüÑSüþì5/Ý€3ðîö/ò¾ðQß‚ñ3á€àæÏâ±ÝÂ0>  "óÔãÀß%=ëÐ÷ÐÂÿ%àÀÓ/‚Ñàï>ü% ß‘à.þá²ÿý!!àߢ 0Þÿ Pá0,â. Ѥ a !Àñ7î£ï.ýŸ1ÐÏá4ó °âàóä.à€Ò#/Õ/ ÛÃð´äý¡ð²1øÿ@¯Ñ0ÿ'ßEÿàÐ1`ÿïÁîBÑóðüñÆð?.€á# Ñãínì.í×0Òð°ã3߀ý°;àDÑð$üÃðÔ@°ñ þ¯âFàÿã!ß±À³àÚ!à±ðâ6ÜãÑÂ0üï 0ÃÖðÄàðñ/L'¢óå¿àÀåÀÁ² á§ZMñåÒ0Þ/ýÅðIà~á ßà ø"/ð ò?°"à?&€>©»Úàñ ÞÞÐîðºïÞ?à^òÞ°ð'q Šð'Ówí2àë7âðpÂ!C+$Ñ`!2$"%O $ñ±@QÐRãQì¿Ý»ÌÏ@ÞÜü ßààûþïÝÞÍÝÛÞÍÝÍ à îÛà ïíîtÛðèðüñðÏÐs îâñ<Ü¡ö0 " Ä'ÿð#ræ%Ï$â@b$B ï@@Áã#0½EÏÁŸ 2оÐ@sÛàÿ žñøïï "Ø â"Csà7r1!S!&"1"V!&17 '@ %71ñò'0 ï02àËÐð6üËàÞï­ÜÍþíËàß Ûïí¯Îí î¾ý¯ïààþËÀ Ýß¾þÐÚÝÿðÏ¿ðÛàý¾Ëðùÿïî ¯ïàï½ðûÝÏÎþíØðÿÿÜŽàß®3Û @þÑë À°ðAßRCsÐÍð$ð% áðA#Þö$#51Tç"úÓoò/4Àóý÷Ðàò `þ$ÿOß@!áÒö#ÿàbàÒ$îãq>ÒÔ²àâ$üð"ôðÁä ñðKààíÒÇï€ðîà ÁÛ#íÀà1£Íð!ëýÐâïÐ!ßaüÞä0ÍôòÓ; !¢<ÓCÏ ñN½î32çþÁü$ÀàO°0/ð7Òáçà.áñÔàÿðrððððÂ`¤ÓÿçòàNÞçÐ6Ð Ô æ¡Ðð×ô+ÿÀ28ÿ×ãàÀÝÂÁ’б/Þ° àð¢¡þß'ÿáï$à ðOáοР;/Ïÿï÷/ð2 àñÑLñ Äíñà@ÒóÄ ñ1C€ð#ÞÑ×ÿ/ÿ%ýÐô5À ÑÒ÷PÐä¾õ$ÿ Ò SàBÿ€!1Ð#ÔÂñðááÞq!- ôð¢/ÂãO#‘PÒ ð%P ãðÒQÐá3õÂòÄÒ°pòñÁðòôÎòýL0ÏàÒ.ÿÿþƒÁðá“óÒØ!ñ¡“ôóPÀðþ£×áÎÁ ððàeÎþ ìò ÜðòïÜÇàï?ÿÃ,þÿDÀÍç  ýÔ@Ýãã#ØâÖѳâÂÒ2Í/Áá à@íâ¿4®Q ³Â° ý/ï@À ^³‘ñ/³áâï–Ð"ðà0Öî±!Pâ¿öÿà1Áò ÿðCâà×ò%Üñ CÁîó´äÿÓþçþñßÇ1ÿ²ò"€â0ïÖÓÅò,òŸñÐ ðâC±0”ï°%à àáÃÐï/ì &áþãs âðýþã÷îÑñÖϲöñâàÓPÿüÆõð°ãóàä±Á@Ñ ýTÿÎ-M.ÑÁçþÿðð/o °ôîpÞÐáðÒ MâõõÿÄñÿÐÑ=-ÿâ Þå¤ð×Ãà$ÕãÞÓ! öÁPí×àåáá“à 9 2îâÇÐ$äó±ÁðÄÁÑàýñ¦àÀÿò@ð×áÑ!_ÂñíñÑã"Ôá*Áÿó3ÄÑÞÿ÷qÐð >R€ÒðM ÃEQ>ó‚ò 7ÿ ?ÁRÓÿäßcÔ²>Àà¤ò.òòÕïþäáðÍÄ<ÄâàÍðÑ × P ×â?Ôï×ô°2ü?/s“áð2òÅ’ðÑäôÂñþ@Pß•ðó±/ôÓñ1ð  à ?Ø ûÀAþРàÿÁÖð àÄ/ á Ý ÷ñ°á!'îÀóþÀÒÃäÑßïð ðQþà°ÿñÒ÷±ßâñáÿÕ¿Ðà’ßþ5ó þãððÿõÖð°áðÓ'B ð!ùQï¿ñ@!Ïñ ±qò áR@ ÏÐð ͯ! îðÎàî0àÏÿ7A-Îð@â#Þ‹òB¿þAúâ?ÍásÀïU@ ðÎàC1ÿíŽ2 ÎÛ0 üþ à¾dýíáB œñ@2 ð1°ÏÓQÒíÀ'aý à>° "ëî1ï!pÂøOîø.ÀÐàAð¯àCP ƒ'Ce4q õR"Dà$ý¿ýÏÁPþû ñ°î­ý!@ðÏð­ßìðà33>õ²7"4ÿï±1ü¯Òp1ËþðÍ ïà0ÒíG$$ ÿûÔÍït%" ñ' ÿd2?'24Ý ì¿ÞÊÜññ`ÿÞÀ½¯ýïý@ÿ Àó`&þð þð-®ßÎÍîê¾íÞÀÀïßíÿ7#2íßêîÐO ß2$Sðüÿà0çpA/À ÏÏÐ Íßàîùïþ ÎßÍþÀîý ÒQ$!ÛÝßÐ7Üî 3ï@ÉàÞÀîåðïÞ¾$ØÐÞ°íŸàQ6?¿í1÷D""&CC@þâPÚîPÏðÉðîÐþ!ðv1àÀðEîæCb"!4?°þrR4ÀïÍìðÞ îðâÐúðïðw"2ààcþ âpÞÞðÈÞî¾þÐ îà ìB#/îíîâ_Ìï'!ÀþëÿßàðÀ!¯Þ¾ÞÎÌÌð0ðRîïÏþßïórpqWa"!"íÓw2"2½àÍÞß@ð þÐt0üï®ïÐøîñPBÐðÏþÏþò` þ'`! ðÿßí‹þ# ÐàþŒþíßÞðòt"#àÞîÑS  å"Dððê¿ýÏÀÀ ý¯ãýžÜÞÏÑŽÐ#!ð ­ÞÛïÐ!óu!îíý°ÚÎóAbÿÞ켿ÞÎìàîþìÍô »ìßÏÑžà#@0"ìñïàw!!#s#3Ðàî"øîPA!Ððë¯ïÏïÒRàt#$îÍÞÞÁ.‹ð1ÿÐïŠÿíîÏãàÝÒrQÿÎíà±üÏõ3s  ¿þßÏáaðF15þÞÏÞÐ,ŽÀðííÐý‹ïìïÝÏócýÝÍýþ7ýÏ÷AD!!!$¯îíÑRÿàG#ïÞÐÀá à&!"ÙÿþÐÀ#s2 ¯ÏîìÙÝð0ÐaïÎÎÚ¾îÎÞÀÿþà#ͯïàÑNÊðAó!ºïíÞÎôðàs!` íÛ îÊÝà@ð6îïú®þÝî°"Døî"$Þ¿àA®Á7$"/ïO»ÞëîÜýþïðDBîîü¿Sr$¯ïÞÞ°$%@0>ŽÝÝíÎü­°ò2ñüüްßÞì@ïS¯ÐáíB&¯ÐÏÞÞC0à3s­®þþàîÎ/äA °á ØÝý°Ïñ3%"#Ûïq%îÝÞ a2ÿÎð AøÐ!Ràòè¾îÏÎÐ0üàÐíîžÝííÎü¯Ð$ÙïßÎÝ72$7ðî#FÀ@!R!! ÛïÎìà" ÿð5íÎàíߌï"Ñ#è¿þßÎ@!&"ϯÀàîÐúÍà#'!ýŒÞÞ¯ÐáCQÿ àß®ñ@BÐú¼íÜÎÐ"ëÿ4 ÞíŸþQͰT"%4 "BìïÝ $ðþÀ°Ñ žÐBßÎßÞ¾­ŸÝìïàÏà@ ðÝïüÝø¯ð#E"#ï½ëþ3á6 Þï Àоñ"#E1  ýÏÐà`1  dŽÿ!ÜíÝÞW3íÎÿBþ½½ïS"Úð52žð3ܾÞãt1ÞÞà'1ͯÿBþÑ4%ûÍð4Ì¿ÎÐD1ÜßÐ%Aë½ð$2 ûð7Üïñ52ÌïÐDí®Ðð#ðè¿Ð!1ÍÎãf#ÝÜÿ4R ýÍð&3üÎÐ52Ÿà#ÃëÏñïÞ4CŽàí€à$2ßÑ$ððñ1ààÐÇ7#þÎuïßC#ð½¾#$ï ðå.ûÑÁݳ63"Îð! ÛÎßñR ݾîð0 ûÞàÞÞëܲQ%ðÐÝðï¿þ¾ÑD"îÐðí½ÍÐ0N®¾ÞàŽÏÐñ# Žïÿàñ4 ÍÎð4îÛ¾¿ð"ÝŽàÐò4c2 ÞÝÐ' 3%!Ð3"Q¼ðDàÐðì Ø­¾îïÜÜïâB!Ï÷!ïÐñsÌñBC?ïÀD!!å#Qïó%q!Î%DíâFðýF4" Àðò@¯Î® Ç ?àO ãÀåùpà ÷ñpÐð:ßÚò°Aý! rÐ1@î à þ0ýÀþ@=ðÀîþ?ÏÏÒîøÞ15óåP0ñ ÓB°ð ÐÓRä0ë= Àà0@à½ò Ž Ñ `±/ñaòÿ  ópëÜ Áâë÷ñÿ@?±þÿäðpïrîÿ2OÞ ?ÌðÓo!ñàøÀ€ìá ààð5 îä øÐÎ?Ýàð"*îBCE#âR1þÿ$åÿ ã,ïâqŸ'ó æ0Ð/°Ràð1à ß0à 0âð¸ÿðí°°à! ñ6ü¾"6ì ÖþÑáp1þàò Ñ'ãÑ€0"Ô  €ðððõûßððá±QñðÐÀòàþ'½@1ŽÁâ çáòÜ.â°€ÿÑåð 1 òÒÿ»ÐÐòÊÐÂá0ô°ð!¿ÀÎÀcððïâ0óð£Ðù±¾Ñ#×Þ ñ%ßûñ óÄöñM0ûÔ ïïÏ0êñßò!Àç>Áóàì‘òPÑ28àÞ˽Q/Á!à$ô¢°í ò"0ÐÓt# ñãôâóŸá!âñÁÀqòàãEþ0Dz?@ ÇâÜñP Ñ þ îAäÑäÑ&ïàã ´3b@ïÝ!@ÛN/ò Ü¡ à!Òñð+áÛòp>ÞÆÐ¿þËà#Þ€äþ$ Î07ôô±7€ð’þ.Ð& ÀA#Àïò è‘! ÐÂòáòAíá%ð´ÿÎ$!ÛáÒà‚0êô ñ?ÝѰðòÒäÑâã£3 Á4 À"@ÂÂÐæ0ñÒà°ä ðâÄùÁ*ÿ ¦à°àð /ü!?ós@Þ± °ïì/Ð÷àÿÐÑRÜÁ2ÏàUðàç€áñã^±#Ó×ò áá ³ÁÑÑ3úáôå" áÀ ÿßSÁð #O  €äÑàòDð€ïâ þ%ÀuÍîÍÐ7Pð@üà 2ТÐûÒSÐñw/¿ð!üþós0ÜþÒ$ðòô¯óî®2þÀ sÙà"ð¿Àá7ÿÐñD¯ð2 É%ÿûáRÀÿ"üžãcï S®ð2îŸß0ðëð5!üÑŠñ3"Îà'°óÊÀóDßðÀýß 2Œ°QîàôA¾î¾Â%0îá a/Ïðó P ÐòR ïîÓP`À ð~þ !1. ïïÃrÐë/PG B""Q$$Ñ/òrðã¡ ¿þÞÛÛïîàA 4%p °ÿòS!#T%R0Î àAPñ1 ÑËàÝûðáâp!$"Ó/6À®ÿÁ3P!0Ú1¢ûÿÿà71%2ŒàßÀÂÝ/úð°ÜüÿßÙìþÞíøÐàë0á>ТêþÿðÏŽßíîá1C'20! ðÂ3pQ/ÑàìŒë ýÐáýÐò2ºïïô!@B$! Ãá^ïݾñ ÐàBTP5!41A13¿ÀÿÏÒAÐàpAÐÐÏÊÌÀîCC!QA%ÙÌ ÝÏð ïÂ0ìí½íÎŒßîìð1BQýÏ ¿ñÜ!NÞÐÝ‹ÍþÎÀþîÐŽà¯îìððýà3À¿Ï®žÞí¿à ððÜþ½ÞÀÿ½®ßÝÞóÒ6&#!AÌŸý3$@ðï Þí°ŽÞîÎ %"Q2žà à%B#0À01ŒÌþÜîð75 1! àØûã 75$"!à"¬îí¿óÿ&%! %ÝÓÎw!#43"51ëÜîÍßýá'%CC¼ÀÐß&6!C4#1Þï¿ÞðÎï0üÿ ÌŒþýà"ôAî@Žð ÞÈýíîÏðýÏÐBBÎØü®àÀò"7! /Ñ7žÞÏÞÿÜÐ×2PððìÝŒÎíÏðÓ# îÓêüÌÎàîíât!C2þÐŽïð2ÒÐÅ"ÐÜÀ"u1!"2ÌŸà3%'@òðÜû®ð!eA%2 B Ðý"$cî"МÎÛÍÿàÑt# 32ÒB  üàïŽÞ½Ïðüïðîa#3àà6À"ëF ïàëÞ¾¯ÐÞàðD7ðÜà@Úñ $aáPàýÞìÝàêîþ1 ÝñŽ ÐÚÿðF&1 ÿÜÑŽàóE 6ñ ò?ß7NÝGQàîÞð Àí&!÷"ÿð €ñ­Ðÿð5 "á'ì ÞÍßï¾ÿà16 ° ¦àê' Ýßïó!ÐÐÓp ÓAéSÝîC°ýÑUïÀàðàÏ@/“à0óCÀö1Ž!3À¯ñTÐÞà/ÐðÑÞ%¡2í€Ð#@À- $ÿϱ#ðÁðï Ðíq¿".ÓD Ü¿à'! àÞB4üÌQ¯Ñ-Τ àÔ®7ðáðò7ÜÀðàÀ@P±ããþGéò/ÐòÆðÐaþ%ðÐÒ²ÓæíÔâàðÀ àõÑó±ñ/.ïÓ’òìñ³²áõÿ¿Ð@±Âáò òßÿ÷2ßÁ¢×ðýðŰ?^³ò !~Â@)3ÄÀß1` þÓã× ~î ÕÂò×á åñ4 àÐõÅÒÀ! çðáàðÇð ¡áÑ0Ð#N ñ Á Ãàá=ðÓ¢Ðóÿ./ç³ÒÔãï HÑçÑàÒ' ÞòÒÀððÑ¢ð/=Çáà4àð¢áàð$°Ñ¡ðòñÀ£ÁàÏ¢á¡Ñà0×°"ÄC€ 0‘3ð‚..û3Dðàóÿ/+þ7CÀãäÑ?O"â“ÖÕàððÄùÔãáÏçÓáãïp?&Áð$oÿ”ñå°òÁàòSÐ@ÿN¡ðý`ÃÂñââ÷Þ~MÓ ÷ðî Aóáïâòp #€â÷ ä² ì!3±Ñ í,/ó’NþÀ ÂïÐàà`Ñ‘ÁÓÞîÂÐð-±€ÁòûÐðòÄ’ðóÁ@-å’Òó.PÐ÷òðIJñÓÐ!o¢ãý²ÁðþL!8äôñÏáãïÁ ãöðÂòóıßò@ôÖá²Òï“ð >=Ã/ôàã'áÓ‘ó PïÔáðâ±ÔÿàÓâà‘=ãÀðáåÅÐôÁâÕÂüóУ²òÔÔýòÔÀÕñ^-NôÒÂâÆñ²áñ4×°  ÐçÃÁàóðààÿÿt$±áòÃó²&ññî çàðÃÄòöâÀá#ÿ°ÔôÒÆÃÂðà ò‘î¤ÐÔ  pðàâÿnðïÌìþ‘ÏTQÌ¿Mv° ï¾#íöA!Ë à=À0ðOŸÀR îòýòr °B2êð áïþ1­ŽÐ1ßÕ`üÀ0¿®/ßï`½ò À¿ÞÜä@à!ïÞB Ðâpì#vï! Í&!p!ÿ=ð 3D#.‚? ³pÐ aàá2ãþ?¡sÿRá"SÐ4$ñqðíC-ÕBà<âÛ ð`Žÿà.ЮðÎþ°îðßÍ¿þî௠íÞÁ¿þà°-þþä ðÝ6-ÿà2aÿð @°í7 Qï0ÀÂ$írï2óPÀï4rûò%ð7 ð@Ô`1îÒ@ÓsþâPá@áÿ6ëþ°#Ûà@Àÿ àÜÏñE¯òð Ý#&PÝàßf23tS0ñC!S0 !u2ß& ‚R3R2S5 'ñq"òFOî °ýèïÒÙÀÞŸþßÞðØàÜïþëëÿÏßìî®ýáîÓ¿îîÏ à!èÀçÝPÃÊ5êÎúð  þ°ï% ð?ç/þëqþýî'à$1òAÑ_ðã#tà!/€0ô-âÁ2QðÝPÜäAîì ÿÀr+ #Ë # ä #àVþ ЀÐB ÞáÊýó-åÈòPîîæ î°4 ŸÐ6ðéñ °ú@Þâ!ÌîÁ.ÝA° ¾ºð àüîôϾràðûßbÔC!/ À'0î\®ô!àÚîîÿñذð$! 3°*À àE$í¯a þî&1ð!A"üâEÐà ¾"ÿ/ 6ýÜò@ðÐ'0 Ž4áÜsùP îð!î¯Ð ó,ÿü¿ýûò!4ö=Ò€"ðÛáì,ß3Ï?ëC!Úò/Ò3b½ò@ Í2®%Î#á÷ ü5 =Ñ%' T!ÿð&CÐàr1ëñðÑ0ðì°¿ ð¾¾ñ$!/áëâC3éà!Ð Ðÿ ÿòþ½'1/àÔqÀâ ÿÒ1 Ã' 1à0ì× Ððîåð#ßïÑdþÀáO@×á! #Ó$Ñ€ýqÿðÕ0°ÒÃþÀqëð<ïPàÓ!èã ðÀÓ3ÎÜFïðàñ¡ïááð!ú¡á¢Î '>ð¿/ð$ïå¯ 0ÂîóÃ/ÀP Àä0€ð4ÀñýRßp° ÏÒ! ñÐàÞóà ý;ï P ï2üáAéððí"¿Тâþý€!@0ñþÀ/Ó÷Ýû3Îõá Á7âÏàöáÿ./ ""ßq ß5'@Ð&ï%ýÑQí à\â01àîð"€ìâ_òþç>ßá%Ðå!ÍaÏ!! Äð°/@ÞÃÀä À Ð 0‘ÿÝðÃüä.ÒÛñ^Pð3_rÿ ñOOäôÿ°ÿæÒ ÐïÇð Á@Ð ÀàÖ°þàÐ #0€ðÏ à±³ñðþ“ò±ðîå á"Âý1ïÑ 2äÂÐM4ï (ÖñÐaÓ$%%ÓaõàñÏ îàï%ÿ½ñ>À>°âÂñîà‚!°°¯ÁðLþõÒÐíÀràÿÞ6î"3ŽðÞ¢ÁÂê2 ðâÉ0ÐÓ‘°4á $/ðÅð' n03ýô1M!"ê#ÓáñÐ@*ð/ñÑâßÃ]Ð1ÿï’õÐ0°Ââ Â@ð€Òîÿðá/Ï'ðï'ý°àRþÁõÒãð ÿä,çä°òàDA 0ò%ïP=ðä0çàã ÿÒîá'Àïöà²âã?ß+‚ î±îä$î“ðäêïá±îQðÚííÏöÐÃò°ò!ÐàÓíàÑóMð2 1P"¢ò"îäóðEîçðáÔ°.€ðÀþ‚óýïô/Àó+ã£ð ï@ @ðòÞ#Ð1ÿòÀ!×ðï£óîÁà*õàð !‚àų.`á@0³&û#ð´àoóý _¤ Ð "Âã!ÞÝ`·ý¡ò¢ß2Ýýõú¹üû€ 1ÑmÖàð=ÑP‘îò€.ÂàòÓàòôïÑ?$ݰôð,á/Áçôà8óàòÐP¡áñ q ðåÞ &Îñ ÜpðpÀä âÐöþÂñÏÑóåÃÂ!oñï³âæþ 2Ä ðô3òÐ!·ÿÿ#Ãòîpà#èñâ PÒä×ÓÑ ñÔ ¾$ÅÁàòà7/Ñ QðâÓðð$Бápñ!Þ@ý÷ Ô"ЯÀõá ? ðó±òï'àÂøþî€àÿßÔñ #6ÏòÂG×ï@ñÔoÁ0Þ_ñЃð³ в îñà÷°Àî5ÑÏóüðÿçýãð,îÔàã05âuï QÁ2óÄüð"Ã×]à Ðî€òïû îM²/±AÂëóÕ €0Ã=Á14ý¢2»#¡ó ±óþÄþƒ àÐC‚ÐÔÕM°°ÀäÑ0q¤ DÀñÍ/Á%Ððìpþñ.îäëoàîLðñ*ñðÐÐ ãràâþ0‘Âï,€ýâ¿:ð ÿÀç-ñ3àP" #ñ=ÄèÿÂáQ`"&#ï +­Ð0ýÐÚ¾ÏïÞÌÝ3731 âOðÓá(€#à'3þï@í/Òý ññÜòð1îÔ¿ à/'íÅ  Ïßà$ñä@Î/ÿsà4qð"1ÓrîñàýŽüñðíðŸëþÌðÐüÏÿô÷2BPàïR34ý'ö"èðÖ >ÿ`Þô¼ã/€ðûÎá1ð ðܳPï0íÿA²EÐ Ùð$0P10BCëð àÀ¿ÿéÍÀàÝÊÐÒ5C#C#öñAàî1a"2þ0b#ãÅ.Ò@Ð' ð ÎðàòëÞñîç=ÐðÝDý`àüà Ð ÷BôÀï¬!W1$3A¯Ðèþî þðËÞ»àììàÐð#ï?$33oOÀD"0÷ ÿÞàöî4` îàð ðÌÞÝãðQîoðð1`+ÝÜàÛâ72$)71Õ åò äÕðÐ þ¢ñàî@ÂÁ2 .´ÐÀ²Ðð2 òöÓàñäà!2ô7Ô áñï±Äþ¥ðàüü0õ¡à²ñÑïã²ÐÓ¢ÿð-ëåò pÿññàôÂà>°Ñï Àý ðÐîP=0Û°"æÀÂ?àð ñáã¶"ó Ôôñò1ðï€ÿðþ/ëÖúà ð#“ÐÀññá±èÐOöÿñ$ðr2ñäôÓñÒ²ñÀòñ,Ú¡àüТó² ý9=ïõ÷ñÿ?× ôPò0ÝÿäðÁîðpüÁ àÀÞáÁ¾øã° àõѳöñ27ç Ð#pà'>³ðæ?€õ!Âñ+!9àÏ%Ëð ÕüàKÿâþßqñ0¾=Uð11ƒ ñA0ñÀ0úðÝôïýð / ÷ðNþïàÞOþþ1#ØðÌâÞ3Ïÿ #ß°¾ìâÈñûìâ 9ðßÏ  òà0€â2@"ï'AÀÐÚÓL¾Ò€¯³.qÐà›ÐCÐ! Ä ]ã,ÃqÒ 5ñÔ.ä@ûÒpð±#å@Ð.pô þOá à,@ÁÁêMï!>òB}ãñAB-ÃÒ1$Õ ðÕ0?ã€0Oð 0/pÒ@ãNï¿îìÕ °âþ Óí ó01³Að À ç & á‘þùàñ ÿàß à¬ õÐ>ðOÐâÿ/‘îÎä-[²àÿ ÀOßÞ+ðÒ ÜÁcÕóq ó EöîPâ 0Æ áá÷ïPÐDá<ðÐCD!Câp3ô"&. ÂÀ ñßÎÀðÏû!î~ð°,à !ß(óíÁ @â$ÞÌ’ ¡ÿà‚ ïŸ!ç0òɲ ÎÜÕ âàÀàA  ã Q3»2â­ò€1 à²ð0Ž à;ÐÁ3 ñ!²ÞTÓ- 6ñ"Öñóï4ý¢ð@3°ó!4Öî?áð¢à1ýÿáù €áO@!#C@À <çîâÁ°ÐáJ°àÐðíÖÀ /à.òî‘à¢à"€°ÿÐò±ñÀÄÝ ÐÿâÀÐ#4×qäñÒ.€äÑí € àÐà âûà0°âàpÒ" GñÓ .^Ðaðñ<’Âìþ- üòÞaáð3ÁæááÏèñÑÀþÐò(ñ@Â0ðp Sñ8òÐò$ëã°  ÁÛñþ³$  âÐPÓD$ïÒààÒàµÀ#Áï/ÐÐQ@Ûð6Àï¡òÁOý ?Ô-£à ×ààþÒàÀ8ñ£Âp@а0€â°²Þñ"Á ððâ ÑÁ R!-@ý°ã /çî±°Ïî ­ÿÿ ?Ù²/³AP"Ððñï€ ðþýÂìÓ ÁÞÄñ¤ !Ð?"à àà à ñð®¿ïÑ ðOðàæö òå°àð.×ðôþ =ÓóÄÐÿ2óöSò/çó2íÖóý¯å Ë €ÅóáâDà¯òáð.0 Ó?àЀð à¾Ñ ¼ðîÀáÿÐCŸ Cò_àá;±ðâþàïíâ2òoÖð0=0Ûp" ý*áð¡áõâÿÅÏð"?Uà á Ñ ÑÞ Î ï ¡ÓÓ±P5 @âÓ‚àÿ=Ì€ÀЯ°ð Еð%@$óôñåôÒÑOÒï‚ñ0éþðÐÃC @rðí M0:À¾ÐŽá/ ±ðí#Ü€!#óÑoðôõá³ñãÓØñÒàÁͯ ³á ?0=ÃßÇñ37àóððÜÂíø°òÿÒ¿ÀÒôÛñÑñ±ñüæþ pðäçÁñ-à= Ñ@Ÿ´ãàò0òÀÐÓ“ðÒÆóôâ ×Ò 4¡÷áäð2 å÷ðÒìÓèïÀŸýààò°í @7 ð#æóðîàáÓKðð€ñÁ Ð×PÂ@0qÓ@Fñð 6ñ¾þî@Qûñ° à$àO á ðÞ ±ÁÁÊÐá%"ñÑþ ÃñðÁñòÓpÒâñþà×Ó²ààã áôý°-0Sñ.P0rP"æóäñð Ã4ñÐ 0Ô‚üÎóêÑБðÁ Þà mÜÔÖñâàŽ0íÚê#¡ññã€î0Ð À`ÐÒ0“óôñç4þ1ôàñîOÀàó6AàÔ³úýÜOþàßÝ'±1 ‚/à$Ñ@@à¿Ý Ü.šÐï½ÿýððí×ýäã×p "ñíPÁ0ñîaüÂþ‘ïãCþçQÐúÀ .ðå þÐòý ñ`AOÎþS¡ˆÐ1ïL®A  0„ .OâåÐÀKoîõß-ï` Ñ4òóEí òD àðÛâ2í°Bßü‹/ÐÐ1îÕíÐ)Ð0À#~Ðót¯#ü@ö/â0 R ó ðuï àõ.àÁ6 ÿÐ ´ Û«N°à.üÔ_Ð2ü"ÝSA!/2B"33CC1FñQ"(æ ²û/ß¾ñÉí/ïÞ5¿ñïþþïÔ€ÿ@úàïpÀáN²>ðÔàaüàQíñ.î0é!ÞðQÎ@°ñpàòê €!Þ7îA ðÐQâpÕÝð #ýÑ¿ÿ DèòâÅ Ï`¯! âLó Ô& ÑRN²0 òpâ žný3½1ìð éþÿ!ßBÿañPò ¢0áp²ò_ð.à’  )õðïN°þ/Òü,30¡/ñOÂýú#°Ná 1òîHñï$ð°>âN° ÐPîÃÛð0ѽ`àç ïð ýpà 3Ã. Þö Ý!.ñ¿/ÀÑè þÿ»òýà Ð=Á@°À_ Ñó,  ?¿7 ò>^Á Ã.?Äó C±"à@òPç Ýaþ ?¡2þ"½5 QÀ Ôöþ0Áp AÐ_ð6!n  1ÀA ã ï±Mã Ðím¢AÞ3 -Â?°!úý2àÎ3 @Ð áøðàÐ-Ô¬ÿÏðMàÞ}×ðý1Ï °ô aî#ÿðæä,1 ýþ.â0®1á` Ð@à0ïQÔ)ð! '°@â .÷èÐ_áàÞðèëû ð ýO°!ð ì> ?Á.! OPФü3½òîq°OàîÐ'ýmÂá æÚ"ð/Ôô€@ÿ Qáî!¯@Ä>î Åá!(ó àåï2!ç.%ñ"B¡0€%ìÜ01À?áò!® 0Åà.ã-/‘>à@î/¢PððÄõÑR ?àðBî´-ïàïÀ0Ïì€0ò!ÂN¿ñ/Ó^Ò2 P>±"ÍÒvÿÿâ@ ã=òL÷ñMÁ@ýPòÁA.4ã[/ ðÁðÔ8îÑ/òP°-Ñ@¿àðå ‘ðŸ î0à°ðÑÿá!ß%Ý~ðJýõ#ñ 1ðÿâ:Áûðñ-¯ñÐ?î+°/Ãþþ@ððÝqäAÓrïâ$NíR2Ô¡@ó v õ"â'  â/ ï?óàOžàE ã>þñÌQ0Þ"$Ï,òúáïþñ:ÿ¾ð°+â!Ž þ0°"°ÀqñqÿÔ`ðpáßM @Ð.!âÂ#îBÊñ1°Pð0ÿñ7oá À@â,ãN 7""òsó9ó+Á@ÐOÀ-/ÿ¾1ûÑ ÞôÑ}ûðíÐÜ! -âøáÝ6ïî?°ñ}Ó#þܰüàÆ-°ìàBÒ €" á àO áPþôÿÀ1ÿÌÒ@!‘1ïàvÿôý'ð×0ÝcýOÐ îE þ'à â?ðã^Ü%Ïü/ô>Ÿâ/ à1øñÿÅððÎÞAÎÀB  á0Ð+ðÕ Ð=ðà€@ÿä+âQäNþðMÇý3ß!Ð"A ±A ð!¾òQö=ãûð_áA!ð€ /e× 'âP.ð& ½/îðàNÀÒ<òÝpÀïü0!åìÁü7Î!ì¿0#÷:Ðaîð3ÞÁìÂ-ßþò0áØà¯ ñ!ðà0Àò_îqðAÚ0 ñ@ò$ásÜðë$Ï>áƒ.ÞAèá pàêó@â=ÖÌã &árîÿâ @ðîñ+ ÿýÎò,5í6ðÒmÃïøñ"Å ä@ðìðí)ÿ× À Þtý ò Qà öð@Á0òNÔ+þ/¡ ãP¿ Ü þðñ> ô=á¿0ÚÑt ýã1Tòa ò1ÀãàpÞõ!Ðù#ð ± @€à@ð"°/ïüÄ(ÿ,Ã1ÞÐMÀ4 >Ð’á[áRâ AÌ2ð¡PÍá ÎÁ Æ /Ð÷ðÎMôà à ÂBpÍðQ >ï1Í@õ3ë!  Üó?Í0 íã`Ï ïð ,ôBð0ÀQðíÿcàþ%òOЀ0dèÿàqìAÎàqñúMéà€# Ó\¯!AÎ>ìÅ.ôàOòàà FNÐð ݞ߬îÀÞÛð¾ýÐýü!'èá!µäï Ô0#37$ôCô 'Ó1B#$$#4$#C3CC43CC44$#BB2ÐÃ` Ó?þÕïï½ ÝÑàðÝœùÿàíïßüð ìýãÙðìïàßüŸ ÎàݰýѼêàëÐüþÜ À'íÒB°!?0Î ñÑ õ-s""ED0ñ&A°#æ.°ãàBèáŒðî¾þ?ÌÞâð ìþðÿÌ ²0ÓAA ô W?ó!0ó°aò!'<"pR$& 3ãRc±@C#@344#a#PðDòpà½à ¿®à ÿÞÎÞü¿Üÿ¾ÞíÝÜÜÝÍÜÝàŽïîÎ ðíÿí°Ïп/®ððÑ ñáËÿñ;ßà  ðñîàÛíÝŒ ¿Ï о ‘"ÂOÛ6ÿðþþ€Üá5Â,æ!51€&èðrÀàÜÞ2ÍqÏÐ0€üß ¿í`áðÛòÐà#<ä !0Áq á0 @àÿR$àÁ ÿ´0à/.ò€1úà¡@ð\Ð0ÀÝq ã'.ÐáÒí',Ãþ#€!üÑ"3páá-4ÊÒ@àúß¿ð®Àð âÊÿâðýÿ Þ$ØÐBÞ QÀPòÄ0Á CðóPrõr óðý³D×$ð"ÓØqàÿðíÑþ@鸞! ÿõ"³~0×ðaí< ¡aÔ ¾à,¿ÊðÞÐà °ðàÐ "àâÏ[àá mòò@ápà-à#ƒ/Ѐ°0à á!ç à$#èõ ±$!QÏ1Õ^ñPþ6Bñã Añ2 îGÿ 5ÿ!3Wðð ± ñà`áàú ÐÓ>þ°îýÀ ¿óíÃpÑÝÏó!p1òì7  â"Ð0Àîæî!ý0졾ô1ùðñ.‘ Ò AíÁpªüý÷ã é°#ðï4¯7 ÿÖ ¿þð€ÑÿóJàÌâ¼ðÞ°àø ðí¿> ¿Á`Â@ñQà"×FíðžÏüððCìÐ.°ñ â%ðÃ7ð@ óPò"Î?¤ÒRßÿ7AÓ=ö DÃÿ1/ÿåÏ Àÿá ü¾ Ïîÿ¼ßÊ-ó ŽñÐP à20Ð2Gãð³`ÐC!àÁc@¡üC! ð î#ïÃÐ Ñ ±Pð°/ã#üçàã ð@ý¡!ó3S5##î60çùñðÐ Øàï°îÿËÀ?Пðâ;ÀààC â.#òaòPÃð#êüÀ¾€à àð Þ%îð-à #%2.Ñ ×oÑQ€O $ÞðFÑðàA1&òíñâoÓPúíÂÝœ»à ÿ­èþðôÜ`þàA ÞPoÝà"4 <æð!ðÿð=çÀàp¿éàÀð ÑAÑ@ô ÞRÐ#¡Báþb'ò62ðPB0àA$Pîýÿÿ Î  Þ°ßûàÀúîððÐûÝ?Ý¡ àßDÑ5ð"àð$±2Q°p0ï5ñÿààA±.âDÎ@ÎÀÀ ²1,ÁÞ Àà 1é`ïðâßá'á$@Ó2sOÒ1  ÐÈþàü°þ ¿à½ÿ¾îÐòŽìàÓ¢róíôW!!öðó3oÿ°0 "Ìþþúð4îÏÎáÜMåðòÕ àO`ö ñ ïF0Ó£ @ß à÷ ò@.¢ð  ë Òá(áà ð/žðЂ1@à . ÷pþððÒ÷OÀÝA0ÓÝSûá"üô_åßì÷ëò pðð? Qð ŸÀáüÃÁC½à6þ¯ñ îÝò/ Ñ.å àðøßð ðT"'óÊï7þÝ@ã@óò åÿ@Óðñð4ñØàCÀð04 õ÷0½ñ7ßÐAÌ$,àýðà Œáð³%à4þÖ.ÐóÐî3Ç<°2'1!ÝàAð€ñ.ð ÂÞ 3ù¿â ÝýÕÏ? 03ß. à7CðТþÐðqÐë° ïQÐ"òÀ°ð®ðÐâ@TÑ ñb÷!à "ðÝàA ¡2`ð@Å-îá_Á=ýôð¯Î#àÒêååïÝÑ×ÐB0Ó% pÿ& ÝòàûÐðüð Þÿ±¾À ß¡Õ îò@ÐG/sbñ041>GàÒ°ÐDð/Ó0O @"ô÷ïí Ðá÷ÀÐb!âìô@ÍÒþR½ýßà!Å ^ ïóòa Sï @îØðÀÀæòàÂëÐ ¾ñ ÀàßÿÝàžðïùðÿ àîÁ0ŽEq#Pýþ Ð qÞ 3Fà€/4°à0ñó Tòàãžß€o.×2À $ r<B ßBO>`ßñÚîÀñß¿ ®à®ÐПßîÐÎûܰ?å$ñ àð¿ç" !b T ß ã0ð€$!í ,ç#þâ°ð.³öþ óáÃððÓ›þà?°&ðàæ"Ý÷/ñÿ'ßß Ð  °Àþ À€ýÿðÿî¿ÐÑàÁŸþ0÷"@à@àcðññ±Ôá-"²3ÑÛñ"Ñ #âðR-Ñ%2.ÒþßÐp B$"b!÷Rïÿî6N€ðàßÞð  ØÞÿïÁ.¬Ð¾ÏðÞ¿ÓÜÐðÐàÐ#€p` %# àrà%îòü ÿ/ Ä$ÞR²âQßã°Ô@/Òâ€# âÓGúàáó¡7 Ðî6 °Â@€Ðà  ÜýӽïßëÞý¿ÀÿÜÑ"òÂA0¡ðäõþäb1rÜ!<€Rñôó7 U¡ñRî± 'Ñà Ðá$ó ãSŸðá _4îÞF`Ðí`1' ,~¾>À  ã¿ï ðßÞÑà à ½ËÀÐÀÎðüìÀþý:â×ó "ôp#a" ýîì4Ðàâß%p2Pí°'ÝÔñá1³Ó_Á"BÝ/ôäAr "èòðîoêÀ°àí°ïÞýÏêïÛÿžàÿþÎáýŸßÞæñ1a$ #=4çE!@0Ý×îëCÞßí¢ ñô£Òô0ÐQ@Ôà#ÀÁð’  Q0ðäÖþ7°ò  ïÐíœÍÀ ëðÀð¿ßßâÜë ¿ Ûÿÿ¾ÝŸðÐæ$Óóuàâ44#ðÁa à0åB oÐÀ2åÐîÆñ3â‘ Q ÐÒt´!ñ#’õâ.ü' ðò"ÚàÐÀ¿°± ®íïÐ,°íûÀ  ðÿ  áÞdþðRàÐP€èâcpý@ûòð?Üà>!1ï¿Ñoñ$ÿCÒB"ß $±ðÐNàðqÿÄ0Ð1 á_Ññ$á3°ÿ àÐ3 L¯OÀâèÿ à!Üð/ ûÀàA-°àÛ¿ðL¡ÿô>ž àQþ%Ñ/ð!ð0à Â$ à#ÿ‘Ó ²ÐïÔ"ßp°&ìQÿï4þÏRóòS½áC-Î ÛA°!Ð3 À0Üô¿í¯ÞRíÿÎÒ? íñ$®ò þÓ1ÜþÂS>ò¿í4pýç"ë2° ßìÿàáÕ á0ÖÐ ÀòC ð%-$!Þó%ä î@¿#âàðPàqò? 0àà4@ðÛÂ-æì àááï à&ðŒ0Ûð,Üà@²ðÂþ²Ú­âPÒáLØA°.ó¯oÂñ@ð-.“þð¸/² À0 Ñð$ ðÿ@ 4 ôÀB P Ô€/+ì1Ðï@ÔñðO.ëÅ ð0îà@ÓÎÜ8öâ 5 "Ðëþ#í50‚þ=Öð+Õýé¯àñ,@ÂÞQïì ÿ Ý/¿Ò ãs`Ò À1Þ0ðàQðòðGp±OðàrÞC ,Où0ˆ€îÞ‹#à í€ñ ïà þÁð ýÀàð^sƒ íóR ÿ4ò@Ì üíÔTÛÜÍúSÿ!6ÿ(àq ЀAÿ.½Â. A±ñaàßc$àÛà!°?±P Ð0äêÜC"C" þðüЭâb!ßÞ×/ñøð/þ Tà0ÔëáA"Ð0óø "çPð°ðRÍœþõ!!!ÐþAÉíð!1ð /æî¾Í ?€CÀüÏãòp ðPÞõ.€Pñß/P/Ó°P Üàð$<á & ïàñðwRÿ àô2÷ Ð#à²P2½ß !®ðô @7# ðñÀýð@5@òà@,ÓàðÐðp%!"ÒÝ 3é©>9bõ ÌÀÞàp"ïÑ?ûÌððàï0çAãpßÑÞÃØB3#/òýÑsê'A ôë!ü±ÌÏS á0B‹â3ûòrßÿÙžña3"ï ¾@P ÿ €Ñü­ÿðôð 9ÿíàà ð ìøàó0e0þòß5CR`í,Ñ<@ð"ï2-‹ÿó2ð$#SIÀ0ÚÎÞF"Aÿ îF1!  à  QÑ+/ðéÀ#îä' ÞÏÐûîÝ­þãtBðÿëàîëß739áûî äîS0¿ Ýðà2í@òì/ ÂéÐ#r!¯/ÜF¡ ¾ñ sCÀßÿ þBÃ+â A°ÈÐC/6ðÜð" ás!ð+€ÿßÒpBððàžð ÑP3&/M1AÿÍá72PþÿìÑ‹A1 /Ðý!¡ñ`ÿ00ððîˆ? 5þð ðPñð êííñøð#N@ïëÀñP0"ÌÎ #2 àïÞ.qÀÓØðß@ó`ðþüðü/áÔ& 13ẠðRà@Úîñ4à:Ý Ð Ñ/à4Ó9ÿ¡î Àc&!ð°0\ãÀ`á8ðñ/ÿŸþDìÒîÄßqðö" °îÏC+!±N ÿï Qïâ'ðÌîÕÏ A0¯ 1ÿ/Á/àŸðþÿRA@ÎÄÿ»ðñÑs"à@.ÎÀáÜ "$NÞ©àB!Î ýÐÔ1 ý0$1`!ãðÌíú6:ï°@ð!þ²MÝ€ò¿JÏ¿ñ ðàE0îÛÏÜÒ‘ >GúðBõ@ðà­à/àÀsðÏü^ÏC4áϯð. 6!øð ""@þï@¯óð^ß/°îâAÐÐ@7 ÿàüâ ñ2@Ñ1AÖ?Ñ2þÖê`ðÝÉðòúAþ!ÍÞ þþ# ŠðC#"=Ò2@=’04îÁN à#>°à !ÄØáC0"Tà ’! ÎÁ¡-ïàRöí?Ïàý 4À‹3AÊà  þãÐ@;ãç@þþÔÎò rð ãð`Qó2.sñç-ð ÑßoÔÁP/1á±À þ~áà!±úýàR"â^ îîÃó}ý®ðÀá/oÑ#øÿ°þÑ ÿ,12Œ°!ðRÏ";Þôø#óîØ¿ðþ áà"5$QÁ Àò?ŒA! " <<¡þðÌO÷ÿ Aá±Î @’)þ!%ö #@áãópÎpÑüÀí7òñ0p×.ûððï,N’C á0í3&8’ °þ! îw/üð%ðï/ÀãMºÐ`  !^þÒïèà.îá&à"ý²~îÌðð?Ðô,ÑP`20qôÐù¾îŒÐ/ß;òð/7Ð?&°çáøð Íô é Ñÿ ð2³ÿ`ÝßåØÏòQAÀ SðÜC ãí ÓAà '"ÏôðO€ðè!1 B 0/Ô2¥ @ïàŸïý ¡ã`#¯ €ðÐ|óìàà%PðPð0Ôûà;ðÑPÞÛëÐî÷"14.õÀŸà %ï 5p5à1NÀÿÿ>Ò¢›ýâýá!àýOD6¡ý ¡ðïÞÉðD#B"À7 ï  ñ @øÎÿà°Þ0s$Þ sî¾ð0Ü€ðC3 R32à Ò03¼ŒÏïýýr0ðà2ÒqàÍ ±þøòP4  "ß äžÌðìñþäG"àð®0¯àûþÿÿ"RðSÐ qÐݰðêðñ ÿñ3qð± ý !àï ÀòwAá`ðQÀþðßéþðSð./×2sýpÑsðr12Û! €/ Ñð€ÛñáàóŽ0"&Ñ/DÅ"2Û5ñ "Ð7 Ú¼ ° €þî°ÐÓžSÖ  t0 Gàà &îÌàë àÛî ðàà¿*òþ×& â!.T õ/àqñBÒíP@ÑúïßëÐèïá#ïàÊðýåQT2r±ò`?àâÞ8Ðî ñ¿í­¿à4 0 °$&0òå1' ²èïâïÍ#»ðÐ ŒðÀBÐ@ ñø!ð!#/÷"ñaïþèî¯ð ÀÐ;þŽîÐ×_!í@à &á1¯ŸïËýíåÒªàþòàqâ}Bò"TOAô@òAÒ@¬ÜÐð°îá <žòMò´7áQ% °P3¡!22‘ÿþëâÿÐîï ÿìáìðÁ2ð7@°`ä#ÛñÞP b ¯ðîøþÀÏð îÿàÐEBbt?ôB"€**ý& àýî߀ð ëîáüð1 Ð4 ü÷1Óa0Áb0À á5ÿLÍŸðì ðìÿ€îÏÐ>ÐçA  4/ùÐ%0Bàâcþ6ß#âr ì¾½àÎËðþíÍÀ,Tðá,Ò4?ã¤"1D4Ñ<ò&ô3¿Bá¿ Ïâ ß ÞðÂ,àÿ°¿ï€0ã g#û !$ñaÿ!€éаýì¡ë Þà` !7óÐ'0Q1àSàð"û î¿ÎàÝ*Þð÷ÎþÞÀÜ$!ðÿ!ðÄ 4RAðR? A Ü¿ãßîàÐÛòüÞÜàìÿqá&òAa?öü3@?æàŽðãì ýߎ¯ ÛÞÀUð4 Ó#Ç#Eò%Ô a'"ðÏííÝ€ðþݽÀýúáRõ!3ëïR&#òç!13 žÿàìýÛÐíðÐ ðŽíáÂæcÐnæAr#C4 üþðÎàëÚÎð¾ÀñªÜÚ6!ÚÓ4ð7ÿÐC"ÒsB"4ò/ð±ìßð ¼ïÞà­î0Àïàãï4è5ÿ² RS@57!á =Ð ¼ðüÜÐßÛÑëήàðÞ‘!Ï%/‚"D1Còð ÎA üñÈàìïŸîïïþðßàÝÜ "À/tóa$#$#r0ðÝ#çÿ àÏí€ìýÿë°ÿàýñ ðÒ2?cCQA!%r""óû½ðþ®ïߎïîï ÚíààîîÄ ààò'C 6Q#C"@#½ÏÛð̰ïÝÐÍÞàÔëÜýÎàüàò0sTþBPdB$40ñr"1ÕÿÐðÁÞ ŽîÝàð¿íëßïâß/¤ïàB2ÿçDa$R2à6á1P°à€ñíÜßœÐò°Ì ÏÿäÍñvÿ%ð b"UAÀ  ÐðÍÀ\°þÝàéð ¾Ûá)áô-5ÀT"!û5"à.Ê òíÿÝ ¾ÁÚÛ2þ 0ñ"êëpà/5ð"Bâ -àa!à°ëààþ­ïá,Îà1ß®àþ!€ñï7þ.–+Q  àÀD ³<à5 Ðó\ÐýþëG/ßßð% rÐDì@qÿðÉ ¿ìÿ"7ý¯' ó.ôá0ÃþýpââáŠ@ˆîð!¬ þ¾<Àðïð4 ÏNÀý3¿70ÿâ;4Ü< Ò0;1¾$íïÐt±ðàB`À%Pí61úà@ïð»üòî²ïïÐý¯ Ûcëñ]Ò4 à@$#Ý2:/#1 ÁÐRüÝÎáüä ±2(Àï2 !ã!ñ+“0%03G"=å/ÞC ŽÞøððÀÿ<ð0 ÀôB42ŸïÝuð ð€$ Ýí°!¾ðÝ °0 ëŽÏÛã@áìß½òKá!!ö"/â.²sÐðð»ëïèð"ñ-ÑE ï3Ÿ/ åè0àð>ãÛ!ÓýäMÜýð»ðà%’ð0éèÓpÀÓðNÖ  "ð-ð§  á ßàïôA 1òÑHð!°^ÿÓþ÷ ÿ0ãäMõ @Àñ "ñ"ðNÐN'ðòS ÀMð "ï4 2Ž  ü°ûÏþ~òÊþî,ìçà±Ò@Àî&Þ2 !ñ -Ôð÷]àà±=ëá! ÁPàÇà¢0ͰOþ?÷ÒM ð@°/á@ÔÚ/ÃÐøðO¡ òäýñ0Ü#ŒPÑ"À ä?ÞBá#°]ú à À Ò1ãIàäý $ѯ 1ïžBÃ!ðí2Òr°$ÿï0@ñ€ÓD½ ç Ðøð× ÿ°?ó<òÿ$À0 ÑÁMÏ/€ð3üàäðû3ÿ9ãÓøðOÔÿðÑç÷ ànñ $Àåó¾åíPÝÆ/1ÑMM÷üö!Ï¥ó!ð0òðãøþÄð"  ÁµÄ*ãóÿ PáßêQòû*ÿãòÎpòóÙ2>Õð ðþЯñ?ñ+#îþpàðÖþ²€NóÝRÕ1Ð"ò>wÀ!ÿ=¢ßð5.Ì"Ò¤ñ(@ðàÂð ]Àâ±, Öðâð"ãüpñÿ‚ì01 àñ0“-?·ðÿ ý ”àLïï;$ÐÀpðÝÒÏnÀ! áEÀ žPã€ÿ,ôâ Áà(òñ0 ûðí±0 Â`Ððð×îå;Ã.¡"ó+ðððnòõþòÅè2 .ð?ýó7ÿàð{ÐPñá@ "àÏ/(à÷  ¯â-¿ã/´ðì_pà°áð=ÿöÓÐ0‘>àð!ã²ô]ÔôÒ[äåÏ"Ò%þ Ô$--ÆòÐ[ñ ïÐÿ0ã%øð¿æí!øã Àï>ÎQäüÔð ,Pàв>ÁüO$Ýűü#áãÔß~þæà/þþ`ôïÁLðáÀL(ñðàN A 0"'!3BRðØáïÀ0ÎNÒßÅ? ÿ¿°ÑÎ ^ÃÀð?ðä_Âô@0õòÒðÂÿä2þ×òôþ@îþa='ð,"!C4óBa&ÿ â ûÿÄô0?QÜàáäÑèžÑ2€ðÿ ðÐõ2ðí/uàá0 þÀðü áÓar Ð!S'ý îñ“/Ä`aÿñ1Pø° ààPâð0qòb!ð2pÝÐÇÿß(ÿ1 ð01îrܯЯÿÉàÏíÐÝ Øðõ@þáð °ñ÷ã@ @çþÒCBÍÿŠðÞñûÿ$7E$B ïóqað0òáp0EÿóÁ îè°à ÿàÜïÝ€áÝ#Í¿á7æ0`ñð`5ß A"“.Á&. €""ðèÜïW/áµ>Q$!ñA×a/$ñõP"ç #òà²ûí#ÐÐè¾ìðЕßÜP*ÎÑpÀÀÔ`"¡ñ#1ñ®#@Ô@°ûñ îß‘ ?Dòß+ñ?ÞPð¿0Ó5à"?ÀÔÿ #vÐ ôP4Àêñðó&üþàáøà0ò °í°°àðп ±ðÿ ò>ð@€ó #°"Åñàs"Ð0"$ +Ѿ 0Ñ/Ÿñ!B ßû Ðç#"pÀ¿î3ðÿÝB¡Pð/àÎüþçðîâ€ï ÿ/ð Ð ò& àÐ#Pü!à7ÿÑÕVðï¢0CÓþÏ"Qà ÔÁû!ÐUÐÜàÁ ÑþÐ/ç ?ÛàÐaë" îô@¿pàà ÏäòÀ$ðáî¡éþÝýá!ŽÐ  sÞ71âÓñpðåü%íòñ"A`ðà¯1߯^ßÑ_ Á-àÏÂá`¾àÿŸðåñ௯ðÜðÌàðÀ Ðþã € ° #ñBð60ÿA&T ààÐ2 sÝ@##JOà%Î>¼ð$ÍóÞ Î3cÜÑ Ñ_°à:þÿߟñÁ þÀà ÿ ä½ü°ðÿ €DóS "'/ò2p4 7à.ÁþÁ®¡Òñ+a@ðà ÀÑMñ`Íݳðî0BÞïÔÿÁPïùíÍÐ °ÌÞÜïð ÁÂà€âððß"Ñcóa#4÷4!3ðV1ðä <"@Ó76ðÂðïûþ°üÏð-€ò¿áðþŠßðð ÝÐñ¯þ ïÀ Á Àÿð àí }±ãÁþáV"2*0'DàÄ0"ò%@ã&." #a à”â061 ðÐ%àßð  þþÞÎÀßÐñÛü ëÃБï¯Þ°ýà"‘á /ÛCåà%/ð'ïýÿô@ðþ¡$Òÿá÷&"A%P#âáB10 ÐSÀ3>u ð õ'"ÿÿͯá20ÎÞ¿ÐüðÝà0  ïß°áÀÌÌîÀðòñíZàâ³ÉÏÂÐÃÕÂýPàð áàò ðáä¤ý BA%á â#P ó ÑDÀðQ2!\ó/`ô$õüOòãÕÿà1þ ÿÝ3~åðüòΣÿðµâïààÑÏ @ ñìÿò~þ°ÞÓåÓ€ð ÁNá¥ðàÿð08ñôòßT£åÑà0ÀóÄ ?5åã ÷@O à@ðû?..åý"À ÀÂà¿Ò1΀þò¾±ý² €ðàóÝNðþ. £Õã´ÿòÑ!ÅàñÕãðE²äâ "÷ðñâÓåÒý1õ!pâ×ÿ÷ðÒÔóð/ísÐòÓð‚àìÕÑâûÿ(ÿàÐàÐü ¢ðÍÏîúðÿ>ýAþâÀ?±Q¯ñäðáÐð>BÞ^< >Æðà|0Ò' $B#Á7ð/3÷ðà0 ä"ñÀ€ÿî€Ñþ ® ìÀ®/°ÃÏ Ñþ°- ÿNÂKùàñðÒ @<2€ÔÿÑÔ$ÿâ÷µÕÃôà@îAð#áôåñ¤ÿÐÐ^°±ðïÏ /ÑíîàÿøÝ¡áâàõ àä±ÿôô ’ÿïï/äÒãÔÔÃâäÒï&ñôöÒÇ? â"óà6ðb?" ãæâÖÿMРáÂûÐÿÀûòï¿ðß’ðÀýÕýáÏà* €0ÿãòñâðÝò²Ó?ôæÂàñð=SÓ‚>àãçðÂòÐ@$ò×ñçAãM?p3!_.æÒäà ð!²ó°Á? ÑþßçïÎ €àáàîþ’á±° ÒÂþÐ*ò€ïÀò¢ñà îõ“ÿÐ0€æ<^Ò ðL`@ çOóöòàôñõóçðâÑ ÃÀÑ¢ð ; °Ò¶ÑüìÑ?øÑàßà°ä ð-±ÏÿEÀÒ²ÒðáÐ}Áåß1àô%Ó2°ðÿ~Äççñ1õN ôõ ò×?àp×ð@>€óèáà³ÛÐ;?²³ïtÌÎϪïÍÛÿàÀß î¾ÞüÑÞøð/àð2pò÷!/1ÀïrÕò55&ATp012b'AQ1"ò½äA0S¯ýá0çïJÀà:âÎàÿ âàê±À°þJðÿÕ Ä|Ñ  ?ð/².#ô Á/pðç?ÿ çð-O0³"40Eþ%ó@pð Gðó%ùðý3 0á¿?°þ/ Ý ýì°îÿ¯ÐìÏ,ôаõ ðèÄ/þð Å/ äñA0µ4 ÷PÿÐqÐ!ðPñ""Õ !"##5343CB!!50ãÐpåü-ðýѯî"ìÀݽðÜÙðýþÞß ÝìîÎÝÎÎÎÝÜÑžîîÜðŸÌþàñ Îï ¢/ŸO°"âQ äA#ïQ×@ð=`Ý%B3û0ï$ÿèþÐï#a. Ò5pñÒ"LÓ$ð/aÁüå,°ÿÎìüâ1¾ÁáP@ÞÑàt!!4D4"PSR352Uww£ /à°9æïð ¿ ð€ðÀÐËàààÎâЮëðÞãÓ­îÒ- îê¡àìðîáßÿðò0¿Ó dÂÐ,Oíò ä ôqdàN.3±rï1Õ 3Að!CÕþq öÀ0Q°û!ÓûPÀàÞ °üð 0Ïßà7ÐMçÛÐaÿ #ðìßñKð T°/A@ÄïÜ0¿±D+°"&ðà#_^æÒðP0ãô¢Ð ~à"ÒÑðoÿ Ü ðí/ÿÍÁî!ýÐÕ@ŸÓÿònÑÍò0žð0¯!Ï ± ûÓïçþýß@Ÿòá^ P±-äÀ; òâ:þP±1PÐ&ÿð%1Ï'à s õ?ÿ"Tá rÓ ÒP  ÁÑ­ìÀ°ÎÐ àþïìñýüïð»ÐòóÎÿçðñð€!þ3£0â0°ðð? .Â#ÜÐ0üýó¡ÑLýÖà0 þGÐ eÔóÀ$âóÚßÀЀÿÀÚðáèíÿÐ ð¼îð¯ààþí÷äár#'22"?óp%0Ò7QîqÿÏññ3ÜÝúÑCÿÂqAá"63QD!$/6áA/î¯ïÀá­íÐÞîÀîëî¯ï¿ÞðÜßò ÀÝÓØòáÿDýàDÐðçûÐÿðá4ðàä?Ð%ÿŽàñîÌþáÐÁóGñ0!ôtE3P 5"56!ÿ$A7òB/Ïîî¾ÍïÜÐì¿ààþÍÏ ÚÎëððÀßÀðßî³Ã ð3@tþ'&2âínð_¯ ðà1å7ìñÏCà ñEÖ#P5&q4p"'$P%#Þ®ðíÁCýíéÐïýÝáÀýðßìð ààñO¯¿áó À€°óM’ó4üñÀ½ãß(ïê ðBR Ð Ð03Èÿ1 CÏGR!/6#bCýâAA°ñ/°æÿ  íì ð°¿ÎÝÝüоìðýÍÍú°ÏÑ3•éçøïâ?äð÷þî2þæÑ­€ ÐQ ÑàÞÔPßöñÂòô06B#4R"Q#ð'ò=Ê¿ñÑñÁÑž ýü Ûþûßïë4€ð ðâ#:î àÀðò0CCÜ9EàBðÑÃø² Óö ð@ýò "7M# 0ñ3p!"2 #!$ðð-S„ßíÙîÐÞ€ðÀÐÞÜêìÝÀÿ°ðÐì¿üð$âò¾Ãíó#0Ó“ó@°á°Ò@O/þÓ ŽúÀîß5ð%ÓÝ7#ò`0Þr412$>'R1?óòÑÇ!1"åóöò/.(ñ¿Àðàì¯þí à ðîí»ðàÞÿàÂã€ÿ îó€ð C@.ùÎðäP`ð¢ ðС#âµb$Á òÐ^'R0â ô"04µ@ðñÐß‘ 2íð€þîÌî/²ÒíÀf0Íá¿ëÑÁ€á`0"öþÂ/ÝáÞ/ñÌôóÁÐÏà ð!!òÀå °Ñí.Žð À0í ñáu#"$3 &$#Q!00"ò#@Oçò dB%"#?òB3÷ ÖþÏÄî®áÍí°žÿÏ3 6à¿ýäÁïڮݿÀßþÿúëý ÀðìÏþííÀÏïÿ!ÐUòEòO4`àå1Ïá0øÐóèîÉðð!% ‚As ÿ°3  '/Ñ0ñ ð/߬!ðÎ.Ð#üÀB1ñ1þàA<À"ÐDà¯"ÀÜðûÿò ãd€4âðB¯ýòRó dÍðû'!! óûíP1ÁR 7àAìQýíøÐþÛ>¿îß%1/®@Ð/ÒBOóN°ðòéà0Ð  ßÀ¬  !Ô0ä0ûê0ñ ÐðÆ`ð#ëáòBñ`Ò-ϺíðÿÞŸîßa×þ 242DRñ"áØñ-üñ¢/à 2ý.ññ0çbqóß.QDqñ ýPìÀòÛÏî¾ZØà(ÿòÀâàÀ{,!²âÃ.Ò)@!óÁàï~à=çáððM ,çÒ)ï ò0ÔBþçã*"ïQà!Ñm×üÅþð€þ!ë"õáïòpõO’ M óñÝUÀBÐàþßPÿKôà 0à#± ìöÀðñôÍý0±ÀÝNààÛ?Ð N×ïÐ ±äß0=F³ðîpÐÓàó± ƒ °ßÇðÒ ñ¢.@Ñ4çï#àð} à:/ðð âÂâ]= `òåâþò<ïß0€à  Á ’ÏðþÂPÒ&À o¿Òð¡ ï /À@àý °8òà³Ñ.ûPÿçð òÂýA0ÿà ÃâÐ÷ ñÀòDþ-rãðîDðñ ðÃм`ÐÞ@âåðÀ @ÂÑÎ^ñáá‘?þþ2°à . Çà ßO@ âÿô0+^ÔþNï`ï*ÿ&ÀÐ  ÁòÐ=]ðò`Ó.î` `ðÄñ#Sáõù"?Ð5¸@CÖÇ Ñ_ ÑOòo°ÞPÐüá@°±Á Ÿ ÃíÔ òîpÐð³.ÐàÕð ßòõíð Àîãä ä^ósÿó´"ÁAððq²ãðׂàÜ ÿ°1Ýñç 'âà.tÐÿâ 05>ÓðÔÐô¿Õý?¿åÂþ2€áà À`Ñýñ²°ÐàãÝr âàäò_þ×  äð Ò7ï0à-ÿ×Þò ò>ð×Móqàâ€=O7ç!àp"ñâñÐ3Ð4@ÂuÐ"`ÿ ,²à? 1ÚÃÑ/) áþá(þðÐâÔ°ð!ïöáò â² î“>ïìðÕÿÆàÓüpÑãó; DÞðÒ"%îÐN³ ‘ä¡>¢òð. 1rð =î'¤/$-²°à/ûßÞЯîLýÞ »ðÒÀÒðÐðß ÿ.óÎæàÑû@¢ó.pàóïà?ðM÷±ÒOú?Ñó¡ ÖÑïä øÀÒQ³ûü`ßÓ-ô&áòÅ/ ' ^âÇ ð3Î70àrä@àÿ8àá °áßÞ›ÁàîÐЮ,‘á,á£ñÓÁà@ðpàÃáá@ÀàÁ.÷àâàÆï#ò áÀàÕò,Ó âñ ,.@СÝ`Àã´íOPÿðïö^2aÓ"#à³rþö€ 'ÿ!ÓÒ`ÑüÏìððÿðàОîùî?Œï£ðåÐÀ" _ïöáà0þNàÿ£çíþòâñÓÒnÀ_òõ¢ð’ðà ݵðN°Ïæàí! ðñàp/ð6ñô ?Â?HÐäðß7ÿ´òÀ?ä5ÐPóOà'5°ÿïPñåÑ/!‘%ÒÎ0MÄâöô²ñôð0ÑAá¡àÏààM ðàýÒ å òÐà9òâëò ÐÆÿ€ñà°à£Àß"βÃðâðÑäôðð?ô€2"ÿ‚#¡ðî £ó¢ð/)#î0{#âÓ‘=ñ`ÀÃÒƒjýýþ°ípðóÒ3ap B`# °ÿ ððÁ°Ý°ÛíÎÀðßð#í#0àò7Cþãð&¯ÐîþpþðÐΞÎíïðÒ#í¸ððßñå%!a"Ò P@1áÐÖP1#óë2‘ð Ð1O$""ñ×Ðò îáÄ$äì¯ýý íð¼ÐÿàÏß!@5"0á¿Àâñ-(´<¿ ¾ïð'ñÝ¿ ðÄà½ÂÀÀ"ûÒãÎHü °Ý°þ ãô ðPT%?-ÔÂôðåRwáà²Að"BS Üÿ»Ò Áo±.1ŸÐðí] òìпûñ ó0¤ "Q0÷ÿ$O²CEÿÿ`èä ß! ÿ' âìÐávøþàÐrýà Ð0í4{õ/À" Ò$þìòíãÿàòý_ý ð¯àðÛ7ï!0½1 ÜÐþ Îúþððw-!PSù ÒOÂrÿðátîððoô2sà# Òîîð>A0ÿ þð¯í ÿýP#óÅð“ð%ßOõÔÁ1°ï Óp?²â" @À`ýßð7 Ð àààOà0ÇàÐ! !1ßRþ´/Ñ à Â70á2#3R3443CC%"B$ËOÐÒqnâ@Ððä#àð"ÜÔèÀáçà/"¢¡! àð àüÿ áßýáòGÁÐ:ÂÐÓ³ 0â €Ð)ýáà°àíÑ òŠ"ßÐð žàÚÐ/óÓó_° Î0Ü3ñ ÁÐ âP ÷Ð4;!àb  ÔðAÍï?ŸÑ^àPÿPÁó&à-ûÕó p×2ð1 ÷âÀ?#~àÿîç ÿð? ñ.Ò\ïó à1Ù¯âð pâð@Ð-2 cî&3ßÕá?ÂÀOÀ€Þ âÃà7 0á.²âÿÝðá ðKïñú0€ÿ! ñÔ]àßÍCð ß,ÐБ ãñ0aãà³Þòãà¡ 0!âà-¢Ýsÿó@±ÿþîÖá!Á ¯ÜÒf¹Å à=&ìÅý=# ‚þó¯ Äò^ÿÿ³.ïPð>Àí3€ð(À "äï=ä Àá"/óÁêíÿ¤ ýñóñoÄÿ± F?çï‘ï@A° áäî/à_± àíÑâøÑ¢0àçÀî_SÐ )üðàÝNAâ ü6ï@òòÀÿäý0Q%ó%Íà9õ0âpðáîü"Oã Àóá ÑMôþp²ððA" ñ;à.7@ òï¯õ" ˯-Ò9á-äúýßÒ çñÂüàв#'õ ÂÓä@CàP_ÿáïîQs‚Âê!Àã.ô1¯!ß ó 1Ò@1 ïÖñ/Pð€â/Bò2Ò8ý´ð@B$Њ à×ÿ ð_ãàÁoðï’/à5á ðÞÐBÃ0b-óÀ îß àEñ×ðÐíÒ”ýPã )"òäOð×ÑâãÀ-â+1ýdò" á°#/@çÇ<1³ ~á‘ð $Ññ/ï) L_á]âàÄCÀÁÀÜ!6ðTñÓï£Ð`A'ïáÃÑ>ôííâ \ðâïÃ=*þÁ° äÏPÐý_þú1ã²~ ±îDÒP/ÀÔ´ý.#¡£îಠà,PÔÁ-ðá±Ä¢,Òø0ÂÂ?,Nÿ× `@#âá³ÎñÆÞnÒäß* Öñð]"ÓÃN QÖàà ÆÓÐN!@ÀÃü ï>äñ=.¶áý î þP‘ :.à°ìpâñ^ÕÁ>@ÄþÿCÇóôðá´ð@äð"E 0Aãÿ!¥ÿÿÂ.Åàæÿ `ñê>þ="/Ïæâ0â.Ä@²/15ñ&òð/•ððý1À°ð‚ þ¡þð¡ÿ°Ñ íà‚Ôíààß`ñ I2°!ðõ4.pÃöñ0àõàİðíKðîâÖÀáàçàðð‘þp/³âã×Þò`%ð¶òãa#ã@óáÒ€ÓôÂÖà@€=ÐóçÒjøöFð/ îÞÝíà ðÛ¾¿¿Ðÿß""ÔŸðâïÏÞq!#!2ó@ñSààîüÑ3€ñ"A0qð4!°D#â$ ¡ðá°ÿðî€ÐÎ`ïâ÷! ‘ €ßÎ ÛÐß®ûÞÀâþV#å!BC!õ!úàÓÁ'!!àûëðòÐÃd0!1AÜ ®ÏðîÞØßðàíðFýCR44@ò?Bä'ñâ¿ÀPR@qäáð'"ÓðÀàîÀÁë îžýîðÐåÝà'ó3aAäã&rà ñÑÌ*çð/à± ²ïðÿç:ÿ ð¿þÁ>± Àí Ð À.ôà0²a0'!ñ=á? $ô€ ÀàÎñ Â0* ûàÐá­ÿ®Üïì  àñ ² $!"2!5á²þâõÁ#çÒ1$$-dã. ò-   ÿПáþêþЯáðàÿðW!2Ä='ïðã½ ýÓðÐq?ÿðjüþ#tò!Ð  Ñïßè ÿ вÞóÝ~ ÷@33Ôä@ô ÞËÒð°ÿ€à/@_qç T ã5ó/,MÀÑ  à î ÔÑð =0´ñð/ @çÿôßÛðÒ‘ðá¢2Täð#@_!Öá /r!ñï è ÿÁÐðêáбð å²"1@ äõã02#qÄã3C"ÀÌ Ð)ðÂß,>ðòää>1ã1="„Ð+?ÕááÃ$‘üâ&ðO$$0bÑðõT €ÑÀýàÀÿÁüó°ðÐpAç"0¢Î>ððÍÀ@Ñ%!0àã´p2ïðŒ àüÀÚàð. ‘ðà3@0#´ú.òÿïáè ÀêàÐ, õ²àOP1õîpðß4ÜÚ óðþÐþIàóÒø0ààDp#àî@Cá>4ƒïàqòÐÃÎ ;ÿP "0'ðÉ&#^ç.0Âþm"‚Û"±=ó¡Àñ~Ð0‚- ïOÃ-…ÿÿ/á/Ä #‚"ý1÷ñóð-|"Òóãm"£ÿä ²Ñ²²#¿KñÒÆàL ðåÁ–àâ ò³î ÓínÔñÂ>@?'òàN'àMà/ò!€-ßеÐà¯ï&ó¡ "ÑÙÑ‘ÓïÛ?³ðÿ×þð4³ÁçÂÑ áÝ¢ïð ЀÓÁ:ßäÕß!òƒ² ñ^ýÖÕÂÑÖâá0Òl1çòñB÷pðñ_ðàó_Ï€áÿðÖúñ íuðóOÚâ!, ×Ããð^ãÃÑñ.GÒ!O1²-NÒ¯¾ò’Âîâ¡ÀòÁÓ£ãðãäæ°<1ôðÀ£Õ²àãá/Ãð pOä`á3±ÑÆÂ ðÔðóŵñðòíå>"G³ðóÃÃ#G"ð³ðßÁ€òÇááÒò±ÿÅàà!þA”àU¡â-oã Ñôâ\ÅÎ.£à<0Çÿñpô”Ò/ðÇÒ ôÁ±àâõ¡#DòþUÂíá@ͱâlàÑ1¼ à õàðâ ¤ÑÄÏôäÐàçÖÂàÂ×ñà ?Pï04ÁæããïÏm0î¡´ðí*/±àâ€ïàðÖÒÝQÓìѰÓÂðÓüçðð±ÐðÛµâðÕðñÒð$jrðÓ€ÀÐïží±þüìðßBNðå2p"ô Ðà ÿÒ̰âñþd41 Sÿáóð2rPÝýûÌìàáàÏÜïá ¾ð #%ðô A"_òô @àîàÚÝ ó  Tô" à° !D4à8 ÏŸýÀþþ ð€ýÝ¿ðѱòA@ñaÐ!d/%"Ѐþï  ðÄó÷ð!rðî ŸÐÀþ þ¯ÜïïîüÒá `&òò÷ þýíãÝP ß±ÁÅñ #&.@Ô`ÿÁî¿° ðÁÍ Ü¿2€/ðÆ Pò¡1=Â'ßñ‚ûðÂ÷#P2ÿ2àâ'3ÑséÝÀ>Þ¯€Üûð =î õî@Pñý BN®'ïá¿ñã///ðÓU>04pÁôðÞ±°Kà .ÀáÎ.ƒÐ>_Ñò> ;bÀ-ôû?,°ôÝ.=ðíp ! # -Çà ¯õì €! çâß\ =ð÷Á1ì pÄà /ÐÀ.ÿ7À û0äÒè0âòÐ.Ï]ÂáÍMîÐÔ°8ðÀ?p¢ñðMcüñ?ðýDß.Â/£q½Qà5ïÕóÿòäð"#3C43R35"B3y°/ÂÿB‘?Ï0áã!ñìýÓ'O€ðá ñþÛý à/¡ Ã@àÀàÿàp€/ð å þñ àTèñÿðM³/å.°ý áðþðÓAÞ b±ðÿ.`ÃÐ1ì=¢Â’Nä óÝA,õáÅ àQÿ/þïï0à7ÀûþTÏ ðÁMÿAþ ]aðôÄ#Ñç 4£ð á& î0vþ/óô÷ 1ó0ÒBß5ÿçð>páå #ïä^2±òLÑ.€//ÂþÁÐmÃþÿ ?ÓÞ’,¿ÜìÂÒÏ ððÞAá€ððë"àÎ÷þ ð á þÿÕð8ð óÿÿ-ü² ï0Ôß ?Ýð ÐÀ!ÔÀpÿüpïñ €#@õÜÿîŽßðð 0”àpñ /²°.!°B2ÿ±Âoòà ñèÄAT"ÐþøÞò@Q1bÐðêà.ñïEÿâðPàà^°ðÁ 1% àðcÿ í €ðA%!+ýÎàÏÎS3(íÎÞŽðäMÁàð -öRÐâ°Úñ"7!Ÿá""±î ¯ðà3c̰#s ¾àÏú2ðPý°î#à&00""àŸ à$0! °à îâ2 ÊàÞ4 ÏŸÿÿ!ÍŽÿÝìñíä­ßpÁ3 þ° ÷!þÎCŽïýíÁ%$13$ð¿î þð!B5àØþÀÀ'!à0÷" Á À.!Rñüí$0òÓüßåBB!ÐÜÉþòàbóØîÐî/"äÓ@Pä $Òím0õóa%²"!Éîý¯##!aÐÀíÎο!B_îð¾ ä¢_îáÕÿ% ÝÏæÿ 4ð/Ñð?Àj#Ÿþ ð€^¿ìßÞäà /ðO-€áà¹òÐÐO-à1PÕ ð0=áõý@Oó>2 ¿Ñ ýð71#@ïà€îïÄß!±?ñý­ýÓ¾1ðJàî1#/#Ópñ.Ð~Âò>4#?bòR/³àØ## íÌþâ®#sôá0Þà €á-3€òR ò#Ý\4ÿÃñN&ð!ÐÇ àð °ïîÐÿâ!@€Ë,¡ð>ðáêòPã0ððròýO÷à -á0OþÀ !¡øàÂâ0Aüÿ áïðòÌÙûðððò"Øóð4° A/õÿ ?'.ÿÏÿà Ðýa#=5òïî1Ò°Á 0õô<ëÐàÉý # Pã³_P¿ ÓÑ@P3^‘/Ì !D@ôßöð.ÞìQÑbÑÚ ѲÑ€0àÅ@?à3Vð$ @Dï°øðýàûÐðT##½ò¾þAà²oþÎ+Ÿ¯àþ°žýÐðàjâáqÄÑÔ#<%ðôAô ÑÑóýÐãî'.ÂýKäPå@âü¾ ÿíéñßÉÿðñ.ÕÂPò!qôðPäÑ.á°ðÿÏòÞCÀ.°ðOð@/Ð"þŸïþ ð¿ÿðþÒûü]%22SaÑô¡!@â<Ѐ1Oä£à s52!°¿À°°ðð ¾àÏÃðð@Bÿ?C#36#!" Òæçß°ìáðP/áåÐвçÑP@0༠üàÀßïíÐÿððàñ " ñÑÁ‚#/íаÁßÿ Rð04ð€Î äÎÚàñààB '!4^ ñ0-Õó. ߯Ýâ à±áå"00SÞÚð€ÐÿÀòϯßÎÿÐÀBR%1D#rAô@!òïÆñ°ïÎñ¯ÿìNð°à`îMc7ÏÞÞàÎýÀŸËýäðÂ-ŽïðAq%>!¿cÓÏðPÏãÐ’/èðñþ¯J÷øðqïQ_®°ÐAPÀàþúýý ¿ê± âàìï>póâpÓ?!1÷0ÐGà?Oòòð@¡ôð.þ0 Á! µ ðñžPÐðÿ°ÝýÀÀ ïðЭàðÖïà1±ÞÓ*"ÂðÞ`óQ°âáÿ 3¾à¥þÔ ÐÄ:ýàèá ÿ ÎÍó=Âç!2/7/1@óâ_4á3îCOÅ þO?ä=ÂðAÓ . àó)óŽï ÒÐ<ûÿP2îP¤0&ð!ð2Mq¡à×ÞþÛJÐÞõýp"ßFàNÿï¢ ýðàð òðÕ $AôåBAã"!²páqïá’ÿ^ûñÖïPþÂÕà,0žßøðîûò¯ýóÞßðO'ðñ;ãò!üð Ð ÒÄÙý þñ ÛÁ@ð  >‚ë  ÿýïéðÐßîïî¯"'ðPò0ä PæïôìàÐ 'ððr ààòã+ÿ±üÀÞÞï âÓâÖ¾ûù|#Ñ>þ çÖ//=×4ÀÀ<¢àÿñòPÀÏ+Ñ*òïëð¤üðÁà°!!æ¤À1ð._#þp÷<¥ððô Ò ð æâ;àà‘Þpþ1ãÞó~çþ0 òà7?ã óµðçþ"²ðñHî Ãß ðÒ± Àÿ ¯ÄÐðÀÓüÝý9ñâÅà/ó±=nð@㣠0ß_ãñÔ×ð. ×àí~òðö±ààÂô¡â/â¡ @ð³ Þo×ðà â\ãóÅ!?S çp ñ@aòáÐM=,¥ýàîÄ ðð± ÿþððÁ ±âïÃÎ`Ãàã  _ãï"ôÿ?ð¤ÿ+0£à0ÐáÐ ÐÄì ²° Ó"Àð,ó¢íLâ£Ñ ðÂM>ñ ñM'ññ "Ä0ó×á!òO³%Äð:ÓÀ ?¢ßð° Ðí  ±üàïÛÁþ áð”±ðÂÅÒ/ƒåñöþ#öÄð _ñõàñÓ‘*þÿ Ü'¤þ@ðä ×ÿ^À< çÒ #ï2ÂA´¡< ãðòÖàñÿðÏúá±#Üâá ðä/ÔÂâñÑO³ÐÐ]0Óâ÷Ñ~ó×ÂÄàþ@àßÀLöá(ñÔàÁý3*±ðã€1±ð.ÀPÃN÷ÿð&ã¡ññü@ÐÁïÖþÅáÒ<ãàÑ 'ùLñäò’â>•ððÓþ<ðL;ámÕÐ>ÔrÒ±Ò×ÐÀKàòÄÑ>¡ÂâûPã¢ÒÐ( Ô±ý0àÔßÀ×Õß/£ð ÓûAòã°öàñÁÒ•ðòѰ/ð‘> PÑlâàû1µï0îN’Õþ]òàm ó¢àð @òЇâã 3à<<ÁàÒ(ðMæàãó<ÓàÒÀôâ’Ó ´ðïÔç?ãoñðóÃåð ðñí Ó0û=×ñåà ÿá#ðÁ£ÁÔ Àãçïòoá´ð!ñÁ.ÂS´ýM³ MðÁÀð€¤ ²OðòñãÆá;ÿ€òþ¢Ðß ’þÁ/çÒüNçÓðOä#’äCäã072ô"ð ä²ÒÝ+ÁаÜÀêáàì ð²ßðÖÁàñÃð _ðóß$³Ò/×à> Õðô×ð.PòÔà0Âñà à+‘ß°À€à ä²>O¢ñ >÷Ò¤àâ×ð"ò'0QÕñNò.³ï,õÏÐá®àÀþÀÿ € ÁàþðÐ Ï Ã²áýÖ â. •ðãñ&BñNMòÒð,Nÿ‚±±-Ââ²ñÁó±=÷ÕÖð0ññ$L_?1&ò"0'!#P$ñ³ ½9àþúÃý áòÞûïî ð°ðåÞ âü×ÑâðàÒþŰ0×ïÓ-÷PâÔàæÓíá/ÿ  ì €ðþôÁþòóÐÿ1m³ðá.ñûäÓm1²á!ëpôÔó5r ð?ÁáÐ×ÓíÒ‚ Ã|äí^äÐ= Óê?ã Õ,"òä°à@ðÐ s§ð _áþ@ Çñ,à} ÄÕÿ*óã/áòÿî _óÓðã!- ÿàñë.çðüñà(!ðÇ MÂÞpðàÅð0ÕÃÓî;.O¢Ð!þ0ñÏm×áð=Oäý¿ïÑ"Ï3¼S° ²À>À@ð¾RÿñÐ/Ã@ïøïPÀðpÐ/òÔÑ0Ðq¡NðÀó#í0°@°.äOÀ3Îîðì0âÛNòò@ó8þÆà1=þÔñ Q¿1ÜQýñøå.ÐpÐðžCÒì<GÎ$î Ó í.ç¢1Ì4Á÷ÕÓ>ì?NÀ$Ááåð12C3D#Cç¨MKñòð"]°0á ÒHñî+äàïß°ÂáÓÐ(`Ñàóï]Ò!âoÔ(ð0¾?ÎAÒøÐÝ ­ãÿ’/Ôô Läÿ?åï?±1ÀÂoÐC à`Òð÷ð20?'ÿí íïŸþ=€Að1`Ûðã/Øÿ0ñQ.€ïÿñ(ÓoàÛða%!à3=Ò!' 7 âC/þþüÐ5#"ú#úôàP5#´ @$Þ"Aqà7òRÿþï%þô5`ðïýHààë ¾ïÿ ÏÝ@Žàþ à  ðþŽÿ ° þ®ñ Ü$ÓàþÿFßîOÙîÀbðîòÿŽÝïB3î€î5Íï î1"Ýb®ÿ4"Pÿ$ýA$bïÚÀÙÑE !ðÀ0  #½ð`"Ððaþðí7ñãpþe4B"#sßórQ32 ðÿí±áp" à' ýþ¿ðBAÓr #î0ï+öÝýÀÐDà>Ð6ï"#rà  ­ïýï%!ð ò,êò¢0€ ð   ã Fë" í¯A$7?ü5¿?á° À.6" üÓ1 OÞÚï>à "" ’ó±ýÐ.õþ  0'!BÜ¿2þÇa0Òßßèßñ ïò34½ñ<íОàóBò"ã °ÎîâÐè½â_ð%Êï1ðÓDq-ÍïßÛN®í!ÿ Î¯Û ôÞßq$å­Ûýí2#3 1ÿ$0óas"ÞÒ+ûò Ðäa0ïÒ!Pÿ Ð/NàÖ1_¯ðËÐ"502/à ÎÀ#ûG ò*Âî 1-¢+ýíëÐï ð!á!R?¼ãÓ þýËíÀ!B2på þðâòGqÐ Þûÿí³(ïñ2/ % òäÝïïMàŽÿ,Á Ðpðð¯îŸð"þ70ðP°à àG@ÿÁ2Nì êþ!àóa°ëï¯ð°ï 2Pâð KþüÀý !¯àBDñB°#ÿãsBðûõ  áMýóEí2ÿà þñràD!Ñ  ¾Þ1¿%&ð$!ÞU#" E¿ñòÚÿààs0ìë ãHî r ýÓýOñÏ4þÑB®þîoí°A3àÀr°ð!Ð"`>`ÏŸ!ýà O ð"<îÂ0®ðá sàà?~þàä,ÝÂ"`7Ý5! ÐRQ 1ÜÜ"0ËîÞïðÿÀð1ñ/áþÿó)ÔÔûã¢/´ÿÿñ# Jò/²taÿ!úðëü òÐÁ"À ÓÐBÁ!(ÿÑ ñSðùÿóýépðï`4 á%Áà$ëŸ Í]Q¢ÿ/ ÒÐ!Áð4Þ âÞ,`¡?¡,ñ#Q ðÁCbÐ$A? ÏBîíOÄÐì ÁË Pð1Ðîqàð¡ñ-ðïàîŽà0Pÿ0ñD bàò1r@€ñ0 ÎâóZïñðþJÒþ .$ðÞ-QñîðÆŸÿï2 °!Bðîý/ßpð&Cðá0ÕàÜò@êÍýý€Àý±2ýЃРò$1^àÅðÜíð€ìÁ° á"ÑŒî0iøüqƒþàp±ðßÔôÂ?±â ÀÂ_îóÀððÂÛÿ0ôÁëæððïóà’òoôà Ã0á`ðÏR±5ÐèÕý4æðãàqïâ'ímòÿM"ƒÐ/ ƒÃþOò±?Ó.Ö 0Âñ2‚ Páðñì@"À±@ ÐPðßÓAð õþнòŸñ@ÔÀ²óùÿî&àoôüÝ1Ïæü ò‘ ó.bÿÁÑ@CÎ?€÷àýäåÿ Ñã(± ð‘!¡ýüCðO@¿ßBðü,×ðìàÎp Ð#.‰" Ùí¿ð0à6ÿð$àã 1íÞ0nÁýÒô »ÞAìÿðñ3<±ä÷þî þïó6Þ   üÿßðs ¾â #ÏËò#¿ÀS¼ÒQ-Œ1 àÑ"úîS ËÜR ïÒ OéíÀR ààN ïÑuïð! ð&þñr¿ðP ßïÐpÔÎíýÑ£üŸñ4úì@þ¯ð þ¯ îS€þ0 ÿÿ%Ýñ2ãSÞÀr ÒP!®0ÝàOPýÐpâ/ à&ñ Ðà€à¿ïòÐÓt0üÎ×_ÿ ñÿâàpîà2 0áEÏQá#'íÁA >Žðàáp ýïâüú@Ðâé#ï0ÀòÝÑPîñòaÅþàðQ30¿  °óÞ¹ð<à¡ žð  @ À/$ð€àò"íþá÷ãö àÿÀópÑ'ÜþÔ°Ñ#ÎC2éàoß'4ÞÎàRÎàÔòÜüà%ÝràíD?ÀD°Ú@îÐßþ'@ Ð ó@ŽÂ QÿÒìràð3OŽððà3¯Ðð²!0€ÿ¯ñ`Þá\ óÁþí"´2áÀá&ð°'í!þ3€à6Üï2ìÌàsûðÐãSúð2áQ®PÝâð$öáLBßQ!ÀÐÕëÿ àô ñðÜÀåt þ/ð"Ò¢ï4ñ3ÀðãBúÐRzï4 îñPþß3E ÎÒDìýâòPNQïØÂ"@ûÐã ØÑÐ"ÀçÙÿ% ð.ñ3°ó dÎa Ü7ÞîÀÏ7Ïà3ìÍ@!0ØÞ¼ßñä!2À3#ûÏ"M€áÑ'êà°òðã@òa_°ÓA¯Þ$2;Ýí ÿïSÎÀ"$ðì’#ì€ðîÌáï0àB,%âËòÝ Ôð`Ý¿ò">žïïâþOu ï# οÒ"CÌà !/¾ÿa Üà% Ѱàð!OîÿòÑÀ'Ïô"ð®ðâð Ñ0íÏD!¬ßå!€@/° Áa=àÏðA,¯ñ!ïáß²4¾ %à 10ñŽQ@ ÐñÉÿð0ðÀ çÑað ðÒÀM±í.äß ×<±ñ@¥=á 4ߎ_ÀÁ@ÐñÃÔåà îRëî!nðòí×! ^"¢þOâÍ¢ð 1þ°ààÐ5çæN³ßí7àN ë ìð°ÿ/€ У-î 3€0DÒî ÅÐÏ4@ÅÐàò-¢áý^<öàÀ0í ‘À@DÑ¿ oÒü ól á@ð Ñ,pÏß$À =âáQúðð ð‚ïp Ó0ñÄþ ýþ]ÅòÝ~òçîÀ.càÐà+#²Á#,Î"qâÛù!$ÿýàòÿÍ  ßã~íäÿ0À à?_?¾±ï#"+þàäB= £±_Âðð)à  1àÏÞP³ ÎÁo àÂA €@âà!þáPÑëQð"B¡ÿ_ð?þ±*ðð°#`ïÃ#Î=±!üý 1‘à=òãmñ Âî^ ” °ð!0  %ÑÞP/‚ð, àßM"åÀ=!ðâ ALïÏrÒ®;ß2 Ò"nðíÑPÅÿ .ÿ/áðñRì#?ÿpßÅÿ/¢Á0áÌ3.×Ñ;!àô+0ÒëáâC. ÷ ôýå'b áòKð0ñë0Ô°¾îsðÞîðÝ ‚Fð"0Ìò/`ûÿÀ0ÒÙìêR ðáEBÎ ¾Û3 ó "èÿÞ!ñüþ¯ýÝ6!Ý®ðÿ0Þ%Ë¿ÿTp*5à! À ßÀ à^?ñà7ý?ò ð ÿ  â°0ÞAòÂ]àÙÔî~òáþq2Ѳ.Å % ðAßqнÐ@Üß}Ðà¿ þqÿò ó¡/0Àͼ2íÿ€ßÿ Ðûà2ß  ðó Ïðøðñ3Àîw+0àNâaá0±@!!¥!#$$"4#C3CCBB3C>çOÖëѼÿüÚÍá àýí°Ïà òûÐà °àûà€ OÐñ³ôý¿0^þÀÿÝ8"ÐÐò- 5Ð  1èàþÜÒ] Oð@"ÃõaðP %óð,ûñ 0?'Þ1ݳ1%_0ÐÎÎߎÿ@ý€±»º1p 0ÿ²@ÂÃ? ð²!+ð@ß.õ²Nãàøöâ ì5ÿ$ÿÔ/#÷,~äðÒ9#ñ±ÿ""ó£àKä Àðú@,² ÿûã ÛÖ @ð" ïÀ;Ñïåü$Ò+Þîô¤í; ÑïÿðSûîA ¡Ѐñ. ã±Ð;#ÎÐ;â[àýNòð‚ñNÝÝà#÷þëÂà]Ò¢ _Ð1ðíþá ðÍ]1“ñ àq£ðÒÄ"Nî7Æþ0ÔÿÒìp@Áõ >ó¥ðNòð1€ >±à. ç>1€!ñòÀqáî`À ¿3¿òð Pò¢qàñPÃÂ/<À°ý\ñï5Þ Ð,ðá^ÐÑ"ëïïÔËòý ÿÿð‘!àþÆ Ò²ï °'à>=¶² /ÐñO/Âç/’0oßñ# ßpáï1>’ðáA âÝR¾;@ðàà,`-Þ±Q!íýþMBÀà@à $ û/Ón‹@ßáñÐ.þµÜ"æà-ðÒ_KãôÁÐý~0ÃÒ1=ÚðB°/ðMÀ`Ü Ó ï@àHòã àÒ3üý0o/ ß&þ%=¡ã0l-á¤ñ> ÁÀàòP„ 11ÖÝÿ"úàÿþ10Á±?9à?óåòá<çÿý4ÙÐ Pà0ý÷áûp/ÀàÑ0oÀáAðå "Ô ÐèÄ;!âÀ åàÌõ*ñî!"ÓùðRÂûñì0ÀÀê!îà à°@âðë "€ ãçîЀ0_àò?ÖðЀ"?ðððpìàõÏðî@"¯P°Pÿà@ ÐÐ!õ;ð âýáp ðºò ?Æÿ ¾ÿ! òEààð_/¡+@Ó±?ü GÐþP à þâðñ(!üóâ OþÀ'N± °@ @ðáÞr²=î !#à¡ÿpþ±4íð`ãÎO!ýÁ#,Ùäÿ áð>0ûßô2Á+ÿ Õ0ÏùôE½½ñ4Î"4 ÛÂüBŽþ ñ ñC-ò$<ò üå1ÜÐŽð °5 Rð#1 Þöà?Ÿþ!¾Ïð.ý?¯¾à2Òc0Ïà"!ÞÉðS Ýð"î =€&ý1°þíP ÀQ273üàÍ'ð qPÏàAÐ *ÒÑè"áóqñ àP´Îý-Áô Ç/ ÿÒ@Ö Œð" sCðа 1ïŸÒ'3ìî þ°ðÙ Þ2A ¾ç  $!ï¯ðQþÐbÐþÐFPìàý±@á#ECþ° ý°"@óÀ?áÜ!@þ°4ï\@ðáRàóóÌþë? ¿+ñò0àà0q ÒòÑÃ?pÑÞ€üÐô ð`@Áð!±î# Aíó¥ðnà/ΰ ÐòÑ944!ÐÙ ò,î /ïí4Ží0%ð° @!€ðÏ1%<ð%Ãñ0âð] Ñ ÌAáð& ,Àö#OŸÔï áÔßÛ# N þÎåâÞ€áð_!Ìô@ÀîBrìÿàÞéÿð-°Aò4þ1pÐ3p_á 0ÿëþ#ï  "Ñž!DâS.r # ðŸâØ1Pá0P6 2€ÝP Ïðñÿ @  àBíßDÞñÄ@*áà?è°ÏÕD$%âð°ÙÞ"þ߀ò-ÜAÚð®ïðQ ðþ¾àÛÚÿ¯ý@Ðá0a&í1°!´>Ý¢0ÂsýòØÒ>ôoà1Ð! ÑqþñêâA ìáRý,Þ°"ã@Î!AïÏ Ý!»ð +°ðüÏ`°ðP½'àó â30EÝê3ÿsïÿ®!'12 À1€25òý»ó.ÝÀñ0½ ÀSäðÝ]ï%ÔPíæ/$ öÝ0Þpô òNò/ïCÿàA#ðþÙþð°À ÀÊò áî;í0Pîíþ# Í'ðOÀcêï"ÁópàBïQàÿ6ÿ$U'ŸÿÍ×þÞ2)àÿÞr°`Ò  C@àíë"‘.$à#€ 2à ÿ,"ðÿ°ÀÍîÿ0îïþ/ !/à7 52Î#pýà "ïß Pñ/€"0ñá'Ë2!äÿÙòÿ½ÿì ðÄ P á!pÐAÿBÿ2°.üÀßÕÛÀý2t2óáÔ~íòÑIàðBßïêðà°øàâU ÐrÐNâA$þðáoÿñ!ÿ±@ÁBò~4Ð" ÿÌ@Þ!Ðëüî ëñð) ÿð%"Ôøþ 1ÐCÜTÞ€ÿôâpïà ðâäå!ë° ñã0ݰPððîÿáðØíÿ"þÎ#å2ä»4°!åP3àQ0¾ EÀàÏE Ïpàí¾ðCË"ýò3®ü$ÚÀÿþÒÜðõà¾ÐïC 42òœà$ýŒ#Э" îŸ"Þžà0ÓA"ᾟï €à2¿•ãÜ7Qàð6ðS#Ÿóïó#à½rаð Ÿá%1þïÀíÛc"ßï Ýìÿ¿þ üþþðâÍf!BÚÑE!Ðóøà ÏÿŽÝ7!ð%ñþñ&üñ ßÃaÞòñâ3Œï #ïä áC ²#=¦Qÿ! Îî#©ðÓÀÞ Ðü¯ñ3á€ððþï Ñ Œî0ó×pï "SàðÿoÀÐÒð#êáÏáB ÿ ðás/îÓcüD$A! òžì:íà QñÜßÒ`Dà  ïðAþ6ÿ²Àá àB ë ñ À5ß%ïár7þϾà°ðõúþñáÞBÏý°"K$þÐÿ Ûà4ðð%"dÿßæ# ð±DB  á"0ãR& ýÔP"¼Ð1à âàýÐÂAÜð OÃ!Ü6ÿêà%ð ±R1Ñ7Ð1@нÓ#½¿ðá÷3 áQð ÙñìÁøïþíÀïýï°ðð!Žï#ÓÐØÏà0òßÏoôïÃðÀ7-¡  Bí¢ñP°ÿbÏà &ï!&ïï !?îÕ°âàÐ=M]ÀÁ °õàOÀÔÿà" íðpððòòÐPþÑ÷ßò^.¥ð±²áðÁÿ3R½ðâÂÐà^Á.à/àêÂ2 á Ð ô:áôýõ1 õÀÿÐaÔ±î0êò<à$ÞÞvðñþä#ÿÀPì"!þð ×ÐÔ õP°Ò° =¢ÃÓ3ž0ý&?°=çâMÝÒòÁÄâÀÿ°ð‘ô ° Ñdï°ðSÏÒÐ0sß°àï± ^¡ð ÔððâÆþåâÃõýQäPÐ Eð± ñ ¯ô0ÅÿÒâ×Ñ 4  AßóBó³2 °ààßÐP¯ðÿ¡Âð àð÷ñïÀ/ ÐâÌ-ÖðàÏ.(ÿó’ð±àåò6°ðáõÀòâ/Í6àëAðñï€ à õ>òðïÿçÐ Á!ÐBÑ$ðÿ‚ò"éà=*×cÿí°ßà B@êÍÿíà3Œÿ°ðÏËî¾ýÉðàýüÐÀï±áîÖ®°ðð Ï$R"P#%#A Ýà%àA7Îà%PïÎðA@ ý'5àÿ01ÒÓ`¾3.Í òMýÂÍ®ÐàÜþŸî ýßžÎà¿ ¾àïέà" íÐÐáÚð¯ÏÀFR!$ð01â’pÿíp1ðð+Îþ#üÿ°ïýîÕî¿#ûñðrî3A¬ß#@ì°R!ì%ïì4Î ŸÙ4®#À ð2ùÐâPþÜêïòÑï ÑÝ4 }2÷1@a!ÐÎDä12'` =àÞ 1 ÿ â P±.òpÐ íßÀñ+ãà²o1â0Aû  ëñÿþÏÝÙðÿ ÐÏÞ ð€à ÞR ¯$Üóqþ2`ñ D03Á " Sñ3O"`° ïÎsòê ß ð4?bíTòßsvq ÿq-× ÀpÁð3Îâë"ð¡,àBÙå¾ðµïðàðÐÿÀïÞíÝÇðño’ðþ^Á/ß° þó"0¯ò- 'ÿðý.åðBëðí>?ñŒ Öýìðþnô OÔÐýP%¡0ÿ°#^Ô°@Ìïý>Š<àôÐï=¾û±ï$ñ'ý!² ÿÑ,ýfÿï0À]M1à .nÑ@õðÔ#.óÐÀO1¼6Óßo ð’â1 Ñ ‘=âïÒ !ñáÓ/ôÊ" ÿçÐÜý1 ±à Ð0 ÃïÝ]à/ïðýíÎÝX$Ñ/ípÂýþsý²à!Ù" à Ô/±>Ò,rÐëÐððïAÿ± $Àá!þÄ"ïñÐ/uðþ %ßÁpðÐ2  6à ×ðoÒõ.ì'ðÓþOÒ þ @/ .áÄë#ðð//óÓÓˆ àÿ 0Ñ`ï° PòÓà áj&4®ðÐ Ëíî òÁ1C2aêÞóþ¾0áâpà ®ð1@ð1'Žð0pþð#ÝEîëÑn¾âR#ï°10 ‘ Ôð¿/( ÿóa1ðßùÿ ñ/7qà!ßþô%Û  ð@q!Ãà(ÿ€áÿÊÿÎï$RÿþþaôÞíÐí÷`ü!Ïðß2 Þ®ò!R$2°7îð ÐÃ5ï°!"Ràà-ú¿ð ö?óåa á?£P#&â1PØüä-¡Ü-¡#* Pà îï0÷0ÿ ¯ÍíÛôRB Í 7AëÐ>ÓŽòóÀqþ ïðÔ^ô Ï"OÁÀëÒr1oàþ¾Þã@í*ð¯$!ùàñ Ò5ê?ßÀà1@àÿÁï“%/#°/ó À ÷þð À À!$ÞîB/Áï ‹" Ð S3ðÌ ¢7.Î ïð~ÒOÝ&Úã!A ðß  à5 £1!ïÑàP! ópòñ,ÿàsáU Ø‹ò LA°îC ² ípÐá ôKþâö _°"þú Ð^/ŽÐ@ððâçOÿâü!ãôÞÛABÒÓ_/@Ïãó$!\ð-òëôÿàëèä èÑ  ÒpÿO ó.ßb!ïa=ïðÓQ€5þÀ! ÏêððÐ àñ±ìóèðò°ðϱ#Þà'  òð>5ÕF' àç"ëýüÝ?0“ñ`ñÑE5Þ÷˰ÿÿ°Þ Þó÷!å2$ ðìϯþñàæà¯ñõãbâÏÐaö,àöñÙÐíÙ ݯßð0àÿrà6ÐÐèð#à#ñÀÝÒwýÀàÑTîëûààÿÎñ’ã÷Ñ$þþËÀá ÁAáãÅìá66@áñàÐ"ð² #±û&ãÞ CFðà' ðкÝÎïñþ0 3ذóàïþ²ÔáÀS3ÿðÐðüáÑâãÀÀŽ5Q14!C˜Þ°ðÞÒ0q0ýñ> u%à5A#ã"#750"&$&"22DAâÄp4þ½ïÁŽ°ß üü ñÞÿÞàð½ß°îãÊðQ ¿Ð ½ÜÿîÞ€ïݯñÝêàñ®îßáøìðÀëí¯ððÍÞíëÿìïÝü!ÜŸìÐôî¿Áàît#%25!Ra5!Q#%2c#$1 ËüßÁà îÎà üìý¯àÿ¿ØÿàðñâÑõ$#6#65#$  Яà Ü¿ðAòîÞú ð¡À'àB#rô#QábA=áRñ"bàì'á3S'ò?ñ$#àèðôê äßäà;óèÐ/ä "²Ð?ôºý äï¡/$îóGý @ ðß+½@Á®@ÿï0ðÑ ðP0Áó'.Á12žþ2ÿÎ,à1çÎ0AãïÄO ð1“òÔÑà³Á.ô ^ÓÑpÑK!âÑpÐ ! æðñ2@!Ÿñ>Ê 0äôípªðÑ@ ‘Ûà/?ðßð 0 ÜþÐî_Nõð ñ0ÿ°1ÞAðà;Òw48ò óáSàÞPÜÜê ó à à ò&Ðq$ÔàðÏ@ãä@J«ò ÐGà4õìþ¿ Ä þóÛ¯0êô€ Ѱ€/ÐÀòÀ 1.çò@%#ðâô0!÷R  ±PÐáœïê²á@ýAÔ°`Ãð..ðá!0pâð=ÏÁð `óÃ!à#P2ÀæÐ(ñü0íÃÖ > àùà®/äÝûð ó‚ ÿ21à³!Ò S/eðö"@Qñ „йÎàá îî@@Á7Ñà@!/÷ Õý& à&!ÿ1>à°Àý1ÿÏý P1À/% ÀþÁø°ñí° ðPÐïð3ĉÿàÿïðà"*ÿÕD#òî7pÿ3Q""7 4¯ðü¼Ñí ÿß ¿ÎÐüÚð2'Cèå¯å³Ôïrþ$ !þB÷õñ4Ñn×áÁÿnðÓä±ûðÐ ä¡ á³ñ ÐäÓ ÔÂÃð À ×ÒÿäÐíàÔ ®Ôãï °Å çñ.Õ ~oá%Ðÿ çàÐ ÏÄá-ÍâÿÀ¥àÒ°?ƒ ¡A%3ÐBq$ãòrÑ.à"ÝHÿññÒíý â ,ÑïÃÖÁïá$â’ãàñ¢Óüƒ²âñáÀOÍï!ôÝ(2²ÖòÀÑ!9òï =P=Aä´ ² ?çþðâîð ð1ß8"çÑ>ò- ÷2ôñòð1€¢ ° ±þþâνý%íþРìà,ÒС àÛ1Òý~ÿôð@ð0ô@åàÿ òoðÏð=ðÅâ/íâðêôñ×Ñð@£ÐPò°à/'Ð àͰ°Áðã>&äÁ _Õ ð@1L#ôß“Þÿçà ü°Âïß ¡ñðÓï×ëò Þðáï wðþP#@$"€Áà›`á?ÿ®ü íà€ññ¡ âåãóÀpðôPó’Ôð-5³ÃÔÐ]=!Òó% 0l0äÖ.ò/õâ.æÐ=N“À À€<ðàóÑý ±àß QÀðïÎ2ÐÒLñôÕáóÿQäÔ0÷ ÷<Ð ³°ãðÏ€Ñß ð°‚â/îå0=@à0†ð=1-C÷Â-ðâ# #°ÑäßPÕâãТM Òðàâ“àÿü^/ ýÇà  ãþ°ý ѱÂÿ âÓï³ðÞã3„ # à%ôóÔBO_Æàÿò;Mã‚ÿÿÏæ¢ð==Â+"æà01ðóô@`ôð/à~OñôñâÐò;+ ¶ðá àõ‚à ððí ÃþÀkâåÒþôß0äÁàòÀ.ýàÚ ÖÑïåÁ?åÒä-@ o"ôô×ñP µÒ?ô¿ ÔþÐ î µá 0Pã´ð2PâÔ/%.3ÿB÷] çÑNAð€ÑÀ€îàÒÂêáìóµÀ Ó×ïÑjëè% Q3a"àØÿàþýñòÀãøíþ&BA4ð1Cÿ@3çÿï õñÿžüпÜðÓ¡ ð ? Åóq PôSApD.2܊ݯÞþÛþîÜîÍíݽÍúõ &"Q""%"T4ÿ ÿýÏÐððŽà Íãäÿ@rAÑ"Pò@¿0ä%óÀGq!#ÿŽý°ïþ1ûðÿ8ï°À R6"0õ5 "'òê0ÞáâxïÏëý±ßìÿÿÛàà;Ý "#&!`R!'á_ßMóáÀ`.°òàí!ÖØþÐýþ ¿á7#áq>ð"°²Ò çð/ ðè%àU°þ òLðàñ#MŽñà á+ ÿð/1#â Àpãtðàâÿþõþ.5 ô½Ý °¡þô ñQ vñ#÷ó`0  à@  àðÛâÿÐñ ààð €ìýà¯Ð ±ñ½=$à#n"òp0Rï!#%J€2þ  Árá3=Ýö ôo€ ÀAÚ# @à@"Ó ý ÿß²Ý ïÊÞÐï Àä/ ­$éÞQýŸà$ ðþ° ÿà~â°Nà$ ÀEO¾CÍ  °ÓBrýð% ÷!DÐB4ðR $ ÐR,.‘4ÀôïðèíãüûïÿÛíü¾Þñðð0ÍÎôP¾ñB0àß Ðßq#ÿ°3 Ñ#,Ÿñ2ðÿB °Dýð6!ýñ30íô6!à òUì%Ò$ñRAÑåë1°Û>€Ý"ëÎØÿà1øïàÎÝëñý­ÐíØÐ¿ÐP ðÐ0ÏÐÞðÞ’ nðñþ Päåð^2±1>Ôð`à0& ñb¿3ð2 ³ê!à3p2òCpðâòaö €#"  Àð.ÃïÎêñïÀ0ßíâp@£Nöð.Â0Bäoáâº,òâÀ;!àQã`@ 2åó?àÑTCQü(Ñ¡)ñðð.4ÐÃ#p.¡ ?±À>ÑÀ 2#  Û €Ì¿îÑ‘ å 0ç!@=ÿóý¢ž×"þ`óÑ( ôÍ;Áþ-î@ó0@!æ!Bô?2åíÁ3s2@ à(à° ÿ ðî>óá 1# áþ Ðí-×a@%ðõž<Ðß.ê>²à1ó q#3 tã==Ÿò¯ àÐO¤ $ünÒ€ü/±à Ð.$õA3AðÞÀ(îï×`ð(òŽ ÑÀ ßÁþð? ô3P%.×þ?¢ý 6a@5.0ÂØÂÐ =ãÝ!€/0õ23@ @Þ>ŽÖýNá0b 2ä.`/ðÒ € ðòþÂNðnÑ#ðòOÐŽÝÀ Ñð`ðPÓ/ €Ó° Р àÜÏîà×ðá OñâP ×îÿ ü±-ðA×#Ô.@Õò¡.á ôÏ+ÿ;#ãäp0'5"!"óq@2 ز°,áüñŸðÿî ò€þàÐ+ïÁÏÍ }Ãß ±#Â-ï ³Ï-ááý‘ .áçððCä"O_‘Â?!$a0a0aÂ*1òÒ_á,Ò%ä_ !÷! Q#ãñÑä€þÀ/²+àïà‹+Áà /ÏáÏá±NôNB$kóàà àô"p£ !åÿß ðÒübóp1a$02ÁQó/3@D$0@ãƒÞ^òà ðÜ+ïðßüòÐ !Ðï’èÿéÐþß:ðýÂõà€ ð²ÿ-àüÏðïÓ=> à 3å0^ñÁÉÑÒïAÒ PâÀI âàPá /á"2n&!#!@.ðÆð ÿÿ2Á0×~€ àÐÐàéßðàÿÓ İ=â>¡€-¢íæ ÔýNð_õñ"/`á‚í^ÒÑ àðõ/3p#!2 âO'ò"3P5!&B" !)Âóîòð2ÂÑ]Ä 0〠Ó8ñ‘ÿãÏàÂ=ÃÎÄŒ9ààà ÐáîÅ/àÃýoðÐ.ý?°à P@(²=Þ€ ó>AæO"P%ànÑn"`ñðÓ€ÁîðÍ àÿ ѱ _â>@ôò 2±ó‘Ò^Q@ó.z±ðþô°ð$/25p àpôð!.@×#a2è=çà ?Ï.¢ÐÂ,âðL@àÀ±Ðß<³üâ BÖ0³€ ?Ãßà á/÷ A@3@ÿð>ôÛB²O6!"Cò/Hó ÔÞÀ,á $â!p1#0Oñþ 0£ôaó_í8Ðà >À ðíÿá‘=çð1>ëçðNðáO3%%_‚ÐKñàòÀ1Ò ð qþÔN 2í¶_ã€.B02ä#„0ÆÝÀ /òÎ ÐÿÿÄÑCã pà oõð1$ Qbä Â) ÑáàÏ âÒ äýpò0â//rÃð=q õ43î àþñâà úÒóëïÞ à ®ýÎà°@ݧ$ð/ðP.%ðÃìOà 0ã÷ð¿ÿÞïÞ€Îðð à½1?ްà¾ïî€íà°ÿýÐðP³ Ã2pÔñåðÐÀá±ðððþ “ - ýàßâþSáS&@ñ€ñàã°¢<ðãD@çý!ãàÿ àñÑ8@ €Ëñàü 3÷>ÐÐõãîþ€ÑÿàÏÝïÐÁßðA=q"0` #ô/Ñ Óá£AôA?ÓÇÒðÐñ#Ð2s óÏ#äÿÐà âîÜñ ÿHìáã°ÐãÑÏð2á Cp!òÂàݾ Ýì Àí߀îþþþÀðàñ/cÇü ÅòôÒ1ç1j Ãñ†ïÐ÷ÃÐã`óñÁòåñ÷ÿÁ  ÿÉáàåâ "ñ· þã ðþàØÓB¼ððá³¢àïu2Ö"ñ0×â±0=ŸÃïâ0p"ò€ä"R×ð áÓû °ð ðëOÁ$ñÔ°âà<Í´²ñÞ ÕâðÇðÑðó îáßþîð Á×ó$"03åñÎÜ༠‚ócñññ2°ä±ñÛ Âÿ¾_BæÃôðàÂþí­òñ _" ðþàþ°þíàÐ03×Påó2>Ð ‚ãÁôñ#£Ð7óÑ47ÂîßëáÑñ~â" Ð í ³ ÐÐàâPaðä.0€°îàÐÓ€ñ±ð2ñà€þá ð Añó3/‚ôß àÐË`õòð1BäôóàÓâ ïòÃÃÐ ÀÓÓÇñþÐÝÀÀ¡°àð²ãñF" âóÖâ êð ðÐ!BóýÀß ÒÀÐï"ñó"åA*rЂàþ âà€Ñóý=õÐÀÐ’€ÞÐ ÖÞ&añ37òðâ þò±þÐÍ-@Û. °áâ °ðãñ0Ã×òò .-5æñÑññð±Ñ#ÔM0€ÐÁÐà Òí Vâðàó“ðâ¢>ÑÀ’"à‚ð ôÓТ³ÑÜÀüà°à±2#4@A BÒ#À° 0Ì‘àðà²æ10qÿðÒÓ ° 0Ûì â±ñ3â“ÞàÀá‚ñ343F"/ ÐÁÀ +îúÿðñð.ÅÓÔñå/ÕÓ0ÓÀ¥×ÂüÐôáñáð±ñóÂåõÃð³ÑñàÛ à‘ЀÑðàÀÐ5à¡@0_ãÃÔñà àÀ °ÍЀÐÁÐ .qp00£ðñN€ÑÞâSN_  áÓÌ0ÃÓŽáòï5PÒ³/@âåÓÄð?@ @Üñ/ó“/Ô ŸÐÿÑѱÒÿáâÐ×ÔÓaò@c7ñòÃÁÑÁò¡!ÐÆó0‘óÑ‘ÿ3u5$###CRA!âÍÊ î¿¾ïÝËÜìÜÍÎííÝÌÝÞÍÎàÝ ÐD71îŽÌÛÝÍÝÎÜÜÞï&$4445#4C434#"þÛÜÌÜÎÝÍîüÌ­½ÜÍÍÍÍÍÜÝÍÍÍÜÝÜÝÍÝÍÝÍÜÝÍÜÝÍÝÍÍÍÜÝÝÞÞà&5CD44444333 v %20P6!25@ A"E5@4P#"#q1&@@P=pÁ0à³áÜ/Ð ÐÀú.î¡ï Ïí/‘ààÿ+!áä nB@Qõ2å._&Ñ 0#böp!6â/1_#æ?ÖCÑð|äð#Já PÐ} öá@2-Ųþ ¿ ÁðÀÀ Ðî°ý ÀÍ ü ‚ï /ÐÝJ‚ âàOQä‚; ÐÕð+PåÒL0ò"³2M.$ÂæÃ_ï^?ãîPâð*/ôÑNâà‘Hãàá  "€ò Ï?ïðð±°îî¢î Âð-Õýð `à3€#Ð"1Sçµ Û?`á<Æâ,/ñõà*!ààMþ>‚ú@Ñ0ÓÑ-;öÿððï_À! OõÐîPóî0¤>ð^¢ðKð ÕÖ ðâà.9" à.àE¾`à ¾PìNïâ`âçî K$ß_ àDðàß ïóõþ 7ÑîÝF-çðÝïq0ðñ0ÿàPòêíç ðÐQð±pÐßû FïÎ0CÀ@÷Ñ. ‘àO_âÿñþúÕ.@ÀÀÝOÐý$ŽÔ;ÒÑó~À Àà~OäÑ#ï"}þFâ$ðÿQ+€. Ÿ$ÏBàñ@ 6‘òAýÝ7ÏQÔï! ¢ñññ òˆ‘+ã ¾ì½õüí2àŽ@î ?Ððñññòâ?ßuÐÑ.gAGþþ0ðÿ'ýô<ÑoÁ/ðÀ" cëÐ%þEü ò a!Ã_åA Aã!üý7àÑÀ-€Óì Û!Ð1Ž•øó¡ð^ïÐ-Ê4À'ÿ -ÀÂ@`ÏÀ!$ÿ 5ÞæbÿÒÐ! páà  20 ÿäý:ñ@ÿîá6_äÿÏ1 Î2ÍòŒÿ<ÿ ß¢ëþ²_ÿñÎMÍ‘ òÿ¾ ï ð õ#¤.þ OÐ Ï`àв" ðNA€ àóPà1ó(#@ÒÿDðýÔÔé ¡ Ìÿ° ¢ ÏTá/Á ðr!òïDa ä.Ï'Ð2ÝàÎ"®Oî&ÀàâP-"ýpðð!nà÷1ô À/ÿþ ò¿Ÿ ßÔî -3áÓ'ð°nðãÝþ3^î ç! àÐ`-Ñúá¿NŸÐ$ à °ôAüý&"Á° Ðr#€ !!ñž#° ¿'-À0-2ó‚$/ÿÎî ôÀ:`âë $ãÿ®//ï"ÜÍPÐà1pñþ@BòD² óNÝ!'1ÞÞFûílÒ ì>@ï€ü3€€ÓÚD"Þ 75ðûcàþÒ!CÅæ= PÏÒçüþð0ðý ð.„ 1þ± *ñíþ.rñÕÿoþâCð¯à1!ÏÑ33Ú&ðóÿ!% m ÖcðÚï<ôõÝ^#Á°@à ñ2Ú<À@ðQð4âß Þ-ПÁ!oÚõðüA/°Ñï@!â×/ï0A2AQßÄ> !3ÿûÑ'íqóÒÝÎpѰðàPßÝ !2 þð/0ðá.Ž0ì_ÎÏ0@ÀÀ?oúòäð -ýÝ€þì1 ÕÿpOÕ‘  Àó ÝqÿaЂ+ìàÀ@ þ0!°@&^ÿçÿðUò â,]ôãéýã ¼ÝÎ1ýüÚà! ð@à€ /¿Aá 8ÃÝÕï`îÕ íâ÷N ð,Ý'QÀñÿ BðãóúpÐ`ð°#Ü @ÿïÁÿ0<€ñNÞñ;ò/ûòðë•ÁÒÂÝÿÏb  ëÀÐ@0 íÿràÑpñq!ÂàQâC ÀFïCÐÞô°ê00 °"üü&ÿÏð"? úðàü.0Ѓô  "°à#3€ ðÐèÍî@°°#Ûÿ`1õ! 3%ÐòDÍ!òÜð& ÁOÞ€  áö þU7ÿïaÑÑ4Ií÷ðýÁìpî°ìÿã! ßÓ @àä7sÏñRðÔ$?ýÓp 5ýÿ/ðÿ @ð¿ïþ^ Õ àS.Ñ1/Çð P°/îpâ!ï éDÏ ÐÿPÜÀ ½ààû!Êááâsé=ï‘ åáÖ~á!ä ó?àóÿðÑ>P-üôá P-.ÞPå Ò  0Þ¢qþÐÊ $àÞÿ Ð ñò6ðý[ÄàpÀÂü'ÀÏ2øâá/8ÿÒKÿÑ7Ñ@2 ! P°õPðð€ÁgUûóÿý°.pÿÐÁ 0Ñàçpâñð "€/áÃþ>ÿðý#-ϲ¯!õüÝ@ÿßÃð/$ïNOoÂ#%ññpÒçŸð :ðð#àÕþü ýì%ãáÏ@Q1òÖ #'ß 1`ïÓÀ>#ýðëÐÛàß;üì 26ðÄO&ÿRÐðpâð.!ý ‚þPíÐ °Ú àúþÒ><çàpßÓC/ òó$mÁýÌ.sÐÝï £@Ïà Û?Nðîñ !+ûÕAß#ó@"Pÿ !øÒòà!À2ânó6íýâ#ô Éò ßà1 ßÕ.¢4ó¡ß?®/±÷-2Oâ0áä!MïñðQŒðÐÐ0Ïõü õ' ÀÐÿ~à¾2!#ð63OÿïAàðÖû<ãïñMËï/ëÿî ðð ÄÿMñó3Ã1?1tÄ@à2~ô ûï ψåîêàã» þÚñàþ¯ñpà Ð6Qá$@"7#"D3#0FRÞ 5ÀÍýN¯ÞààÞËïÎ÷ÿðÑ ¡â0 ú2àÓSP"A%÷ìÿ‘ÀþÛ àÐàÝÁü  îуРLPñ#TC0q$r0ãú@Ðó!Ç;óãòÿß,Ýþ® €àÿ ¿ ÐàÝ45,Ý7ýAÝëáà àòðúààOíòðÀ°Ѐ ý°ÿÀùà àâÔ@¶Pàï4 /çÃþmÿ "1P 4ò/åà‚! /Ó?ÏÁ"­Ðïþ Úý¯ð  áðQß ñ ÿâÁ>Þ ã1Ësïü Бî /€ÿüðñ/í#C±R $#4%@%B#"p#"òb.-×,Ñ üðáûüÿ°àìÿÏÀß qáý#^Ï€2á pÓæ_à±-ûâ® ܰ® ràa$P0S#71%B5ð0â  * "â Þ1ÌãB*ÿó^Ôì@ÀÂQýà³=b0ãQ"€ á€ý ÂÓûíú3 ÑÄ1D P?Ó&$òàkqôA R#ÿä`Þ ìÓÍÿ"½À/ï±N®ðAàÀ0Ï/îÂÓËRñ á >€à þì³2è/APÑ O5ß½`á?BOðPÁð Бþ$ À@ 0EüácáÙ¿/ßä,~#²nñÁá8àÞ ïоÐP1Öï2R #2ðÌ7ò¡>à-'ð@B@íÁrÏôú ð°ñ.ëñðó3=´ô a2!æ 5þ-îÿEó°î!6Ñ"nð‘ñý€þ.üÑÔÍà/Î@€âÿ"p3÷ê?3ÂA<GñAÏÐ~ÐÑ=Ø Â/pÁ!÷ð`N±#`ñBaîPþÐí°ÓÍÜoÒÁýÒámíâððÍîA5ïðøÂaðð0àSÛ ï°PÕ ð Ï#¯ÅØÙ8ð>òö3 QÁQ÷ð ‘3áð9OàPÑpÿðÐ ®@ÿÂÿéÎ@ ñ4Ûà2í Þ0èúÑP± òð>@þÐ-6¿ ïó½2ðÿ 2Èÿô 1Î0Ëà%Ò0:Õð@±/\ðñü@ÿá]²4Þýqðïõ ã^ÿìÐ4ð$ .‘/7€ ðí`€=à¡ãÝðoï²-AÃà-ð$Àp²0-ÒqÏ0À& óñ2°@ 1Ó¢> åÐ#ì#Ïoá!?¢+ÿ3€ ðÒ.þKÐ ÀOþ>Áê0Òì^öáà-,²ôñþmàõ"±NÐO!×Á^ä áH!ÒñLà;àÓí~óÐ'þ @õÀ@ßBðÐ0zÒN÷Ñ(ðñð:OðòÁ.Å ÐÕÀ? ó  ñû1Ðçî@àã:4’ÿ^ðÐ<ìâòðý`äáñ8 ôÁâm áÖÿ<Lòó À^À MðCò+ â-À> 'ðà Ê D#ìA óî@´ðìPñ²NÒ×ï/ú@ÿÄÐ/Jðî`àÑÑnðmæâíPà=Ó~åà 9Õ/À!+ú@ÿñ£: ãÐÀ\ ðóN 'ÿàPý÷òû>óÑ>ÐÂNð óê3üà`þæ @îö ò @ý3€+-Á/-’ñÿm±ôü_Ð ôà×í} Âï# MÔÿLÐðLóÐ~ñÁ> @Æà~À.MM ÕâðO 0 ò€.>åA‚âþN-0б0à¤ÒÄ/ðñ´ 2âÁ/‚Òრ=0Ðçÿð ò À,õàþ>þ-ñ€ @ðÀnòïMnðàKôâ Ò<'ÒÐp 0Àý'À0ÿÐÿN`¡  ñ8Mµ@ãÒ·ýOóÒKðÓ¿@ Ð+ à àpÒ!ê0ñ4°/+ñîß_í-Ò>±(óÞøñüäoÿÄ!?ÑÓÛ%0 à0âaà2ð A "ÑÄÐ0ñÈ1ñØ €UJ¿/þ ìï±ûõ 'ßÑpÓ9ô/°€ñ<Ðíðç  à ðÀ?ýFÏð?òÑþA Ðñâ8% °0 4°ü ò?  ð`à7ÐB=óÿ6 ñ?Ðãí` ôÂðÎ@áîìàNœð.¯øòà-íîÐO3àqAÃp ã @.-%²ì0÷pðàpÿüÒÔôþ±""´NÒ0&ã@0áDþNÑ0Aý 7ä @"àìÁ ŒÀÐ ÒîÝ»þÀÑ>ðîñ0Ô^à7ÒP/ã 6@ñï%ôïê°-ÑÞÝnÐúá¿=Ðð Á\ñ/ä Dàôþ!€ +â óÐнÓް îØð¡ðàà æð1 &ñ"P!öOó1 á@$ Oóé.ÕýO,PäâÞ ¥-Ð@  Ñ Ã"Nãâáoãßññ0Ü÷*à²ï+àà ÀÝðŽíðážà Àë²þÐ+àá@ÿÓTÀÀ¾.v _RÐ!-#O"ÕÀ"î6 òðð9#ý'ó@ÒG!.$2ç>ñPÑb Á@ñúäîÿ€ð:Ðÿüß°ÛüÀîÿÿÎßËïÿðÐ" wð0Á4ð!'Á"ÿî ñ<¢ìOþ 4òàà×[ñ0 ïâáÍ'. 1 ô0' $ðñÒpÀÀ?ãü ²€ßްпïþÞØâÐ ±Ðà±á°!^Õïð/4¢3Òñ5 "ðå;á> ÖýÐTÁ#à'$Bð'0ó?€0 àÁq@à0D" ×ò1ÿ&ïoððÀ!ú?ÝÒ€Ðÿ¾à€ÿïÀíúðîÀÞÞÏþ#¯ñ"²Ä`0Ñ" àsðâ"%ðÑàAáñ`ÒñîR!&$#,òP$Uå 1 õ Àßü ÀÐÝ€þý¿ÍàïÙíþãï ð€Ðÿÿ ÿáò -æ.?qÖ 0PDß>‚ àðÔàÂ"ôa*ñò×PÁ.çð?%@ô#`0À'Ð50Òñ Þ ²O÷ðÑõÐÎàÏþ¾üßÞ°ÀÐаó ÿã)î!Ü"°îÀ ðÔ4‘ð#&àÔaq Qð ô2að1#CÅó0þÕ°+12¡0+"@äSôü°Òüàáà¾Ñ<ßý¿ÐíèàÿîàîìÞøþ ðýâ?À>ñ'ûôñb@ñ`qQñýŽâÒùÐ. óCàPÓÔÁþB°0ARQ@ àЀðÿÑÏììð¡ÿýìüïßËþïϰÀî/¾àÀÐÔîÀ! ! ó#°òÅ ãCó3ãôóÌàíБ'ðÿ²óòq"ñ#çáþcÓôÓ×Ñ4ñtà%àÁ/ Áû ÚÀ€ÿÐìøðà.°Ýî±ëððþàÞ€ð/äûñô"`ÖðàáàåÀÿ„_£ 2æ Ïðñ0ðœ$àÎ) 2@4òÔò"b»05 à!5"Rÿ R#ñ"òà0åðà£ó û‹àãÑþ üðòòAðÀÁ@îð‘îó°QàìðÀpôÚÂõ /Á× 0c ààuð CÃØïÿþ ä' ü@Î.! ïà¶ð ßâ£s$ñ, ¿áð1ðÀÚÜá1 õ0ÃñÝà7üà¡ðï ÷ûÐÿÁ 1O³ž ¡àÎðï*Óë wðüÐ/ïpÐúï@  æ.Îà4"üÜÿò.Ÿ!àÿí$ þà ÜïŒð1žáÿ½ñ # þàB"Íü ñ#4àNúÿñ"rí@ÛñðÐsPðýîž'à€#/à7Ð2ìäPí þÄC`0ï'2%BðQA0ô`î?æÐP  äðîÐï®àÞÝ òî¯"-Ðâüà ïŸðAÁ. Ýÿ@ÐéÀ ; Ô1€ ÿïÐ@½;Áý3Á ŸæÞq¿ÝpÏMÞ72æ_$Ã1DqÒ@>ßà ÀþóîÎ@øÒ üð€à.ýðЭÉÀþü÷à@îëæ#/€0ï ðñ €ð.TþðË0¯üï×ÿü-ÿ ¢PðñTÝÁp"÷0 #0"ò7!ûCð`Á$ÌÝôÍÊÁ!ýêàÙð ®ïà8 ýð3Í&ýâ7ï`îð5à ð!.Ò èãPðÐ ¯0‘ð"<íÝî±ïöòúï #pà4!ôR@4 20'# D4 "1 ¢D íí ¾ Ìÿÿàíàü­ÏðÍÑPíâûÜ9 ñD Ñ40ÍAÐ/ÝÀ4Øà!Ùàîàòžüý3¡%ðð 3gðAÐ'36$dðQ!Bðp!1 úâ`ÿð9ÐÿÑPí®À Ýÿ®ü¾ýëàêýžápüðñ/Ïî1ûþãíËï¯.óóÝÇw¢ý@Oçïá?ïP|á0/íôÃ|ãÀ}á0ÿçýÿ0ð î(ðà"@;#"Ð07*!pà#³#íÐ0t ðôð °ÝÏìÞ×îßÒLñ°ñ1â â]Ð?Õà&ýä À  s¡ÂNôá ð 5ÁÞ#Žà-€äíòÏõ°=þïæÝ_óçá0ðF.ÃÿñÒ0bûñ@€Ôð üÑCû óé òá[ðÞ/²±ýÿ^õÐëðûðÝ$ ÐÖÿ ð0?ñ“ß ÷/г ÃôíÐòðOçþÒðrýäñßMõ ïô* ïð=çõ)ïà1îo×ðÕ/1 à@Àá/páðï± Nð²>Ðáù.²ð=ò³àN Àó .ä³ßÐ_ÑÖß=ràê0Ç!à0ð°/ËA ÑòÅÑ+<ò°0 õóÀ Ã`Ò!ápá/A°±>ÑãPÐ@ü å0· 0Ò! Öý? àñ /ðÇÐÆÁÿÄ‚ðàûóÁ<ðÀ>ñ ÿÙPðáñOïâ±oßÐ@‚Üò^ÔíûÑNÓÐNÐ&üôÎMôÀþpð0ðÓ)ãÀOòàöÓ,ÖÔ,òà>1“ó.!ÑÅîá£ý£ êÒÞ5þþ'Þ^°?âÞN¥ÿ/áóê"ßñ°+oÓðâ00"â)ÿð <Õ€ÿÑà ÁŸðòààð¤ðì@ðà×€L#ïò<àpÐ@,¢!ÿ³ @°à<Ã/ð´ íÑ`ê$Ðþ¡ P°/ë#Áßqáà"BÀÆ 1ôÑ> ÐvÀîÅñáü?í5àO‚ý"üS²ÿáÀOí>Õå á¾B  Ñ ¤.ðò0üõÿæàñ   ´àæáà6ïàõð÷àÞóðJÐäðØ ‘äð;"À ôã Õ2“ïñÁ/ ôì³±.óßrà Ñ‚Â_ óÀãá;ÿÓnâÀô±..Õí3M¡öý0á$ÅòÒâ æûì>ô³î?Öð zÿúF8Ð@ÞÕ í  àÛòëp4à S2ïüËÕà51»àîðêýß ÅR ²±ðC4 p$!ùòÿRÑBûÀì äðæ@òðîã&bþ ïã¾s" ÐïŽþÎîèÍþàÿ 3@0ã°"Q2Pà= ÊàðÕ /Ôþ °Ð46ð!q `ÿðÜüžÀ"CÌð"½¿ ðCîÐ@ ÂTpà qï ïÍŸðñøî Á@#b ðF#ïÐï òå à° ìÎÑÐÎîóÚâïí1w"#D`òðêðTÒï0Å>%àð-Ç^ ð,ð_ ðð Òì þç> PÂðð0þ€30®óìÂêÞÞ ÀòJáÑÎR ò_í%/bØ Ð!ðü.Þëñ0°têÝ?à-Ð2 àò@ÿ" âð‚ø(Áäá®  ð¯îâAëð Ð.¯êñ ðîPàïD+°! à@·®³Lpî 3;ÖRð%Eàð2ô ð?ñÆ Ð +ÿÃñâþíîàÿà¿ ¾Ò#â¡Eóõqà P€#pÏ!ï #PãD ÿðBÜ ðŸ ¿!ðÒA&Ýòc=äT4>àî.(æ À!pô=5± üñÀ¡ àòîê ðß² ÀìþûÛÞýаí½ÿ°ßÚÿ  âßîèòý,ë. ãöàW0Ñ`$/5.B!a1  û"ÝB.â1à?òBÞŒ" ñ´îÿú2Û0õ0ó2V QÂ2 #E1!qò-¿€ýÿ½àï $ßËîЯîêÎÝÛ ß^Àßÿ2Ñoâÿo$ 3Cà $Ô0âÑ¿$øá4, àïàS €ÿíà!äý€àñ ÿÐìãúþÂîÀ€Ð=Õ_öá  pïîà± ÿ±ýÝ ßÿ¡ ÿýÕî íî±þLÒ!¥¿½ á'ðñ4q$ ý7Ýô&33t3C#"24#!õábÿ0ï£à /í Þ àá€ðð¾ÿ !ð àîí÷ðâS G 1ðïà¿Ð+ôØÿïþ àüðÀéðÿ ÁÃúÑÞ<ÝpðÒï"ðmåà/?ðƒî`!à@& ?ñ5ÓN´ð2å._Õàâ/0þà``¥  0ÿþCÁçüìMçï?òËoæÒ-M?õã“ _Öñ-äàÑÞ} ÖÀî>Àñï  Á°/àMàƒý öÐ× Nãð?õÂL=“á+0ðóÿƒÐ} àå 0Ó0Çÿ þ\áäÒ9ðMâã‘?ïßp±ð0ÿó+ð0’þpÑ"ìOåà.#¯"àQÝpâóÀ~ã,=‘¢ù0ãÄ  Ãá /Lòàð ÏáÆÿ@´-òôÐ( ± ?ðà 04”â ./*”; ãðãNô >ó*`À 8öÿñïJ/;àã(/Á<ä²þ,N;ÓÒï}.0ÄÓðoƒÁ×ôÀ/* ñãà:/ñµá Oý`Âòð£8 ðòòâ  Õáññm$ /áâlñJ Õý?Ų oâäüMŸ#ïþ4 =÷óà]/ò+÷ðñ-<;1²çð /á<#)ôÓ8ó   ƒ 0ÿÐ%àû!±OÂâÒpþÏ6ï,#áÕý^$ýïMãîà_°AâðOâ²_± LöÐ(ðð/Á0îôûÒPþßmÀ5ñî0ùä ððî&ïñ>Àñ !þà- ãúò_ "°þ± ’@ ñÄñ àñNàððÀ? "/ÁðÝB3ÂçOÀ à3°Dï Kà,÷à "ý!`òÿâþ/p @ðÐÝbðÐ!ÿ€ Ð>>€ Ñ-ß$ P/б' î²CÝ£:àßQ ð#ðÏ. ÀN ÓÓaÞò¾ðü"> Ò ='aý² 3ãÞ'ñ;ÿ7òÐ<¯¡àP0 ÔÑq°ïÒ³ÐoÑ2Ð-$öÿLðòú° ð!øþÏ~ÔôàîÐñóÒ p0À½°áüðHñûòî¿/±áÐñPï²þpá 'ã à’?2îžêáà~òñðá îð áO áð?âÓN`þ!Ÿð2 ßõ?ÀÛò"àð× ï± 6Ð1Ñ£ÀýßSÇ ,ó. ô²0ûÒ€BïÀí/n±ïàÜ`.á/0 åðpñ àñ0Õ°oôò] õ  -ñ"ñ]Å0ÕáÀÒ>Ò½ÿþäðã°`/ñÍ @ólC±?üpñÓ²O/!ò@3³Õ+ñÿþ°°ß .îÐͱïÓ³-"à‚ð.>@ðÞðíí®Ð¿ÀÜàøðñð@ÿà°áã=מ ½ß°üïþîßü⺠¿ýâ"qòÐ Áñ'2ñï À®ÿññà*ïÀаb21"4Tá@2SD#"€ÐïÞä íÏëïß>ô6_ÀRD"°åâ20áÒ±ò@P2×2`1C2.Âëð ÐÛßß ÏðÓPñPñPðܰÃè ð4Î5îÑ%#ðÔñu$üCCüèÿ°þÐŽûïÐ þáOb&.ìâýë ÿÐ ñϰ¿ð À%Ñ02b$Àâ /ð¾í­Îð!ðôìÜñ2Crñ ÞÐ@ý¿ïßÛò ÑSç0$ò2C3&$5%#2M ÿ!/±ÀŒþñ Âÿüuðÿ&½Î6ññÙ%àQB0cÎ/÷ ßÜîôÿ 753ÿ/ÿÍð$ñî€ÿ6ß¼á@Ï ì¯íA2P þáúÜžÐ"?ààÑ0Ás1üÏ ÿ­Ð0ý¿À !U ëþÐ50¯ÿàþà #' Í 722`ð ý¼ ïíΟ!ß  "QÍÀóþÍúÿàâA Ìñ@Ðä ìOÄ=â¯Ð/°ô?0##&" ðÓa ÀÞÌèàþäQð'/Ð! ÞÑŒ"¿ý$ó7%°ÿðÁpÀà=MÕã!P !þï;ýïÂ(íðóþí#ÿÀa@ °ð …ù÷a ±Ä sPÀÀñ,ð+Óá`òp3%à ð?þÞÈðà ÀÀ.ÿâààýþÉÏ¿þÂÁo1C  ð^üíåýOëáð.#€ÀìàÅðá0s0ñ#0âðÿ°ìòÿÝÿñ½ ÷"@âÎ! ðÐÞî ÿÛþÀËÐÏþ¿ ãänãð! à%Î4ûÀ°Áí€Íïü@ò€ÐÝoîíQ 㲿BüÞARSàñC` 0áq²4òPíïä-ýõÀßpÀà1q!ó>àëÿ&àÓ Áòôû@ÅÏð/oÒRäÀ &ÿ Ð ®OŸðÅÒ ÐäÁpÐÔÐpáѰà!þ ãì×áÑ ¯ ð! BÇAD× ÐÑ΀ð°ïÑ."ñO0S‚ðáݱñ°²ãÞíçÐñÐÿîáàŽ;Ðð`à° `ñòáÎ $­OÂíbòÓ ñqP" `Ÿ#ÔòÍàÔÐPÑ¿±îüÐð÷#&à ]²áâßðñðäÿÏðÐÓ€àð¡ Ò¾/ã¡Òârç çýÑï.Á‘ðìà àQäРààƒáò.çÑñð0,ß"þí°0ðÐ&ñ¾rÁÕþ/.@¢â :á#ä°OÐõO$ú ñäÀ7ÿ#Ôž",à.  íOÒŸ. ð]ïÿßàÔþÎÞŽ ðà°ËïàB ¡=Ósñ#ßqþ$25À !`!aÿÄ þý¢Pðÿ0½Uã ä`ï°4 ß1ß0 ^¢@ #€xvÃÓÔÿ ˆàíýÊ õì. ßðáÚÞð'îþ° ñ,ãKÒ0à Ï#p¿îæ.& ð€ ÿ&ðÐf Þ@ðôÿwð % ÑÆÝ<â! ›!Þ× Ño  #¾3 þý ñ%Üа Oàÿñí!ýŽñB  í'àþ> ×!2a1RÂ7à2@A ÓSBÛóOïÅ1þÀrà ðõ MÛÐ1ïOŸÓðØð#ÞžÞÛÐAëÝàò0ÐØÀÏ ®í üìÑôïìò°þ5ÄÿïÕðòøð àÞ¾Í!q þÐ0À04/" 5"ïþ#76ñÿõD! ïÀ2/àΟQÍðAî° Þöà ÐùññR/àU6!07`ð""ÎÁ1¿ °$óä''  æ ß/àØï$ ÿä ï ÓSŽðCï3'í2QÜÒt±ðð0-0ì°ã÷0ìñàÿŽ0U),=’àî°ìÿà­âðíÀîÀþã îïã%ðÐ×Ñ=€òпÞ0ÀáÿßÐî)ãÃÂÂü~äÿÐ#A7õ!!Ap!&ñ!/6óà?°"OÓ ðÐPоáÿ+à. ϰ/ÜÐÍßíîÿ àÿþ" Ô.ûïÅò@þ¢ÿä QðÞ5àÝÎÝráñóñ/ éàð<°þ ¡ðàþï±íãЀïNóq0Â÷C!%r!SîðôC"î€!/ñ/çÞòðÐ×`ÀA/'0³! 4Q±#-ÖOÐá= úò 0°ÿïàÖ°ñÏP°ïÎìÏ ýð±ñ¯þàð/â±p.ß"î à’/ñ×àÑ=ÓŀРþÌAï Àþ½Ðð`ðÀíãðÍÐÍ]7Ó !ð#!ðà` ±ï/ñâ:üÐΰòéðó°ààäÄ- À¾ý‚ ±ðÜ Öðññåñà"243ór%j6  ïò ?Iîð‘ð#°þô7ààðGѳ=ܼðòÌÑ ¡#Cq0146òPóó€ßïÃÚÑìêâ ðêÿÝ Ä¿ÏÀñ‹ÒïÿðßÁï ° Òõñ#7ô""Õ#´ñþûáÁâèÎá Üüàï߯ îÀïý®¿Ò?ß ÿâ¾ïÂä€ò1ñA4t!?AT"â317Ñ0ÃÊÀðïãÑÎðâýò°ß‘ü¿îðïÍžá½ßÝ€Ðï AqSRó23õ!/F'âãíÏÁòQp/ñ òè aÜÁ$Rþr"ó"àÁÁ!> ÿ¿ÀðáðÀÀìÿëþïýÍð>½ð! ± þ Íß°OðãüñÍ÷` ñ51à`?1ÒàÀþßï€ó Üò ñÑâp>ÏŽ.ùßî¿/üPñòè#"6ðô5 Qô&á#áÓC¿¡Ò Ñ ÝúÀïÂàßß5Ï€áüñþööÜÍÍÝÍÍÍÜÜÜÜÝÍÍÝÍÝÜíÝÎÎïÿïî$DD4$443D34353C3S#334"$"!ñÿ®îéþßÏíï'b55434C$4D3R#444443CCC444443D43CC4443CCC3C343C33C333#ýÿ½½ÝÍËÜÞÝ®íÛÍÜìÜÍÍÜÜÜÜÙàÿíÝÜÝÍÞÜí¼ßÿíüÞ½ÝìÞÎÚïìî¾üÜî¾ìîžÐîÝÛÝËßþì¿îàüí¾àÓùÑÿÿ*âß À!Ð!Ä" pòÑQ A!C'"0BUñ 0_à_áOõ0@Ç1P0D C%N#ç O#¡2ÁNDà/ámƒ?-3ÑÇ ðá|ñÑô*$À.3’õ!ä%0Npà0×!0s±3?'.RRð@SDô q öñ2ì@× óñmÐL Á/³ý Ý €ïÿÀÀ$¿áþ’ðÐíÛà€ °Îí àð‚ îÁàpÞÿÐ`ÞàÍì ý’þÝÐ\Âï1Þ W óû!` ±Ñ~â!Ï-B  ÒÏ ÞóðÀ3€. áñ î1ø!å0#ÿOàNÑàë/ òÔB Rò Á=ð/@‘ðßCŽ0å î1€ .àÅê ð, æ^ðôÒ^òMâ× 2¯?ÿÃþÑOý}ðÑѰðê.Ü Â°Â `Àðnôò1P´ð!ð]ôßTáü=ñÒ/Ç/ÀP#+ó5°=ðïà<á IðÿÿÓ<þ€òÀC  G0ðqñá`ð£M/öÀñìÛ0ßÐëî/° Ð Þþ#²ÐÀ<2¡@ãíAP5àíðT!Ï  ðÓ~ðþÎOß <Ôÿà äö `àBàÍð"â"'Oq"ç!Àítà!Dð± Ùß1Í`Âí àòÎøàÀá`ð1BÔ0žà#A ì×0 ÏOþüìAð $" ðàq òÑ2 RðñîN €ðïÐN€ "`ðí *öó:þëÓ0-OÑ"#Ðàa,4ðåáPPO þ²Í?/7íŽì Ú°Ýÿ òñ' oíúñÒ_ï`àÿQ !*@Ð ó0Áï7#a ýßÑ#ïZÿáà00.÷ TïÌàß0Â#O?À 1_ÐG1Ð$`%øà÷>üÀŽñ íúí‘ÿ?Ò-ò× ýì äAÿ@ìSñ@0ßÒîóØ%â "#üÿ.äÞá?ãåt`°àN ÍÏ,26 áá]í¯ñ2` Àãbïß/W ÿ $Dþîà2óÝßO> Ÿ Ðí2#þÀ`°àO$Ðì" 0BÍÎCðrð àñ3­PðÐ÷"OÀ /Âì ¯ß@ñ0'û À"?Bìß7ýï!á@þñÒßtñ/P  ðáÐ2t® íúüìÃ0ïðp#¿úÞ6á6PÐÝô3/ àN“ À3æ í /À Ñà3ýs÷esdl-1.3.1/test/PoweredSmall.bmp0000775000070100000120000001124612200143736015171 0ustar dguduucpBM¦¦(@@m m œœÿÿÿ!!!)))111999BBBJJJRRRZZZccckkksss{{{„„„ŒŒŒ”””œœœ¥¥¥­­­µµµ½½½ÆÆÆÎÎÎÖÖÖÞÞÞçççïïï÷÷÷ççïïï÷÷÷ÿÆÆÎµµ½½½Æ””œss{çç÷{{„ÞÞïJJRBBJ!ïçï÷ï÷ÿ÷ÿÖÎÖJBJ)!)çÞïÆ½Î!)ïç÷÷ïÿνÞRJZ1)9½µÆœ”¥ÖÆç­”ÎÎ½çÆµÞŒk½„cµ½­Ö¥ŒÎR9{kB­c9¥Z1œJœB”)çÞ÷œ„Æ„c½{ZµsR­cBœR1ŒZ1¥R)œ9ŒB!Z)s1„­œÎ”{ÆŒs½J9ksRµkJ­cB¥R)¥J!œB”9Œ9”!c){1ŒÞÖïÖÎç½­Þµ¥Ö1)B„k½ZBŒcB­Z9¥B){J)”!Bœ9”1Œ1J!k)„­œÖ¥”Î{cµsZ­R1¥J)œ1”R!s)ŒÆ½Þ„{œœŒÆ{c½9ÖÎïÎÆçµ­Î­¥ÆZRs”„ÆJ!Bµ­Ö)›››› ›››››››››››››››››››› ››››››››››››››››››››› ››››››››››››››› ››› ››››››››››››››››››››› ››››››››››››››› ›››››››››››››› ›››››››››››››››››› ›››››››››››››mmmmmŠŠŠŠmmmmŠmmmmmmŠmmmŠmmmmmmmmmmmmŠFŠmmmmŠŠŠŠŠŠmŠmmmmŠmmmmmŠmmŠŠŠnŠŠmmŠmŠŠmmmmmŠhmmmŠŠŠmŠŠmŠmmmmŠmmmmŠmŠmmmmmmŠŠmmŠmŠŠmmmmmmŠmmmmŠmmmmmmŠmmmmmmŠmmmmmmmmmmmmŠmmŠmŠŠmŠmmmmŠmmmmŠmmmŠ‚ŠmŠŠmŠmmzmmmmmŠmmmmmmŠmmmmmmmmmŠmmmmmmm››››mmmŠŠmmŠmŠŠmmmmmmŠmmŠŠmŠmŠŠmmm››m›››mmmŠŠmmŠmŠŠmmmmmmŠmmŠŠmŠmŠŠmmm››m››››› ››M]mmŠmmŠmmmmmmŠmmNŠmŠmŠŠmmm››››Š›››››Š›J€› Šmmm››5ommmmmj›vŠmmmmmmm›››Š›››››‘Kmm› Šmm-Xm~›m››››fŠmmmm#im ›G››››š›†Š›mŠm›9`g‡Šm›umk›WŠmŠmm››››››€› ›››››››  ››››€›››››m››››››››››{m››››mŠ›››››››››››im›››mm››››››››››››Nm››mm›››››› ››››mm›››››O€mŠŠ››ŠŠŠmmŠŠŠmŠŠmmmmmm››ŠŠmŠŠŠŠŠmŠŠmmmmmm›€›ŠŠmmmmmmmmmmmŠŠmmŠ›mmmmmmmmmmmmmmŠŠmmŠmmmmmmmmmmŠmmmmmŠŠmmmmmmŠŠŠŠ{mŠŠmmmmmmŠŠmŠŠŠŠmŠmmmŠŠesdl-1.3.1/test/testaudio.erl0000775000070100000120000000220412200143736014572 0ustar dguduucp%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : testaudio.erl %%% Author : Dan Gudmundsson %%% Purpose : Test the audio functionality %%% Created : 21 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(testaudio). -author('dgud@erix.ericsson.se'). -compile(export_all). %%-export([Function/Arity, ...]). -include("sdl.hrl"). go() -> sdl:init(?SDL_INIT_AUDIO), {ASpec,Sample} = sdl_audio:loadWAV("Beep.wav"), Obtained = sdl_audio:openAudio(ASpec, true), io:format("Driver: ~s\n", [sdl_audio:audioDrivername()]), io:format("Obtained: ~p\n", [Obtained]), sdl_audio:play_audio(Sample, 3), sdl_audio:pauseAudio(false), timer:sleep(2500), sdl_audio:pauseAudio(true), sdl_audio:freeWAV(Sample), timer:sleep(500), sdl_audio:closeAudio(), sdl:getError(). esdl-1.3.1/test/Beep.wav0000775000070100000120000000410012200143736013454 0ustar dguduucpRIFF8WAVEfmt úô9dataþþÿÿüù "þÑèøö,(ðßæïæÙÝö&# çÖßìèÜÜô'%"ìÙßíêÝÛð&& ïÙÛìêßÚê"& ôÝÛêëà׿'øàÙçëãØáÿ' ûá×åìåÚáý(!ýãØäíçÜáû)#æ×âìçÛÞõ'#!éØàëæÙÙô%# "éØàëåÙÚô&%!#êØàêæÚÙó(& #$ëØÞêåÙÙñ%%!$ëØÜèäØÖí%% #íÙÝéåÙ×í #%" ïÚÚéçÛ×ë #&! ðÛÜêéÞÙë "&!!ôÞÜììà×è% øáÛéíâØä& !úâÙæëãØâý% "þåÚåëãØàû%! #èÙäíæÚÜö&"!ëÚßëèÜÛï "# ðÜÝéèÞØê !% óÝÜéêàÙè %õßÛéìãÛç&úãÛèíåÚãÿ& ýåÛæìãØàý%  !ýäÚåêãØßû$ ýäÚäêãØßú&  "æÙäëäØÞø%! #çÚäêäÙÝö%! "çÚäëäÙÜö%!!èÚãëæÚÜó$!!êÛãíèÛÝô#  ìÝãîéÝÜò!   ðÞáîëÞÚí "  óßÞìëßÙê#õßÝêëàØè$ùãÝéìãÙå$ üåÝçíæÛâý#þçÜåíçÜÞö# éÜãíéÝÞô" íÜâíêàßò !!ïÞàìëáÜì " óßßìëàÛë"õáÞììáÚé"÷áÞëìâÚç"úåÞéíäÚäÿ#ýçÝçíçÜâû"éÝåîéÞßõ"ëÝãíéßÞó!îÝâìêáßñ ! ñßáíìâÜì" ôàßìëáÛë! ôáàëëáÜë  ôààìëâÛë"õáßëëàÚé!÷ãàëëàØæ÷âáììâÚç!úäàííâÚè!#þúøöõõö÷øúüýÿÿþýýþÿesdl-1.3.1/test/Powered.bmp0000775000070100000120000020175612200143736014207 0ustar dguduucpBMîî(m m îîÿÿÿ!!!)))111999BBBJJJRRRZZZccckkksss{{{„„„ŒŒŒ”””œœœ¥¥¥­­­µµµ½½½ÆÆÆÎÎÎÖÖÖÞÞÞçççïïï÷÷÷ççïïï÷÷÷ÿÆÆÎÖÖÞÞÞçµµ½½½Æ””œœœ¥ss{çç÷kks{{„ÞÞïÆÆÖRRZZZcJJRBBJss„))1JJZ!ïçï÷ï÷ÿ÷ÿÖÎÖÞÖÞçÞç­¥­Œ„ŒskscZcRJRJBJB9B)!)çÞïÆ½Î¥œ­B9J!)ïç÷÷ïÿÖÎÞÎÆÖνÞRJZ¥”µ1)9ÞÖ罵Ɯ”¥ÞÎïÖÆçZRcµœÖ­”ÎÎ½çÆµÞ„sœkZ„Œk½„cµkJœ½­Ö¥ŒÎRBk”sÆR9{J1skB­c9¥Z1œ1ZJœB”)çÞ÷ƽք{”œ„Æ„c½{Zµ!1sR­cBœR1Œc9­Z1¥R)œ9ŒB!Z)s1„ÎÆÞ­œÎJBZŒ{­”{ÆŒs½„kµsZ¥J9kkRœsRµkJ­cB¥R1”J)ŒB!„R)¥1cJ!œ9{B”1s9Œ1„9”!c){1ŒÞÖïÖÎ罵ε­Æœ”­”Œ¥½­Þµ¥Ö”„µ91Jœ„Î1)B„k½ZBŒ9)ZcB­Z9¥B){J)”!Bœ9”!Z1Œ1J!k)„­œÖ¥”΄s­ŒsÆ{cµsZ­R9ŒR1¥J)œ)c1”R!s)ŒÆ½Þ¥œ½„{œcZ{œŒÆ”„½ZJ„{c½sZµ!9B)„)k!c9ZÖÎïÎÆçµ­Î­¥Æœ”µZRsœŒÎ”„Æ)!BJ!BƽçB9c½µÞµ­Ö) íííííííííííííííííííííííííííí íííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííí íííííí ííííí íííííííííííííííííííííííííííííííííííííííí ííííííííí íííííííííííííííííííííííííííííííí¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÀx¢¢¢¢¢¢Ì¢¢Ì¢¢¢¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢Ì¢¢¢¢¢¢À‘Ì¢¢Ì¢¢Ì¢¢¢ÌÌ̢̢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢‘¢¢¢¢Ì¢¢Ì¢¢¢¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢Ì¢¢¢¢Ì¢¢Ì¢¢Ì¢¢¢ÌÌ̢̢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢Ì¢¢Ì¢¢Ì¢¢¢¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢Ì¢¢¢!¢¢¢Ì¢¢¢ÌÌ̢̢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¢Ì¢¢Ì¢¢¢¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢Ì¢m<Àœ¢¢¢ÌÌ¢¢Ì¢ÌÌŠ‘¢Ì¢¢¢ÌÌ̢̢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¤Ì¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢œ¤¢¢¢Ì¢¢¢¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢Ì€¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢ÌÌÌỊ̢̀¢¢ÌÌ̢̢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ªÌÌ¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢e£¢Ì¢¢¢¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ€€¢¢ÌÌ̢̢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢eÌ¢¢¢¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ô¤¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¤!¢ÌÌ̢̢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢‘¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢‘¢¢¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢£ÌÌ̢̢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢Ì‘!¢¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢¢¢¢€¢¢Ì¢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢žÌÌ¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢ÌÌÌ¢ÌÌ¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢Ì̢̢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢¢¢¢¢Ì!£¢Ì¢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢ž€¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢ÌÌÌ¢¢Ì£Ì¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¤¢Ì̢̢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢¢¢¢¢¢¢¢£Ì¢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢ÌÌÌ¢¢ÌÌ¢£‘¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢ ¢¢¢Ì̢̢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢*¢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¤¢ÌÌ¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢ÌÌÌ¢¢ÌÌ¢¢¢!¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢a¢¢¢¢Ì̢̢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢Ì̢̢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢¢e¢¢ÌÌ¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢ÌÌÌ¢¢ÌÌ¢¢¢ÌÌÌ¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢–Ì¢¢¢¢Ì̢̢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢Ì¢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢¢e¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢ÌÌÌ¢¢ÌÌ¢¢¢ÌÌ¢‘¢¢¢¢Ì¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì̢̢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢ŠÀÌÌ¢¢ÌÌ¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢ÌÌÌ¢¢ÌÌ¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢Ì̢̢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢¢*¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢ÌÌÌ¢¢ÌÌ¢¢¢ÌÌ¢¢¢¢‘¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢¢Ô¢¢¢¢¢¢¢¢Ì̢̢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌ<¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢¢ÌÌÌÌ¢¢ÌÌ¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢ÌÌÌ¢¢ÌÌ¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢ÌÌ¢¢¢Ì Ì¢¢Ì¢¢¢¢¢Ì¤¢¢¢¢¢¢¢¢Ì̢̢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌÌœ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢ ¢¢Ì¢¢¢¢¢¢Ì¢ÌÌÌÌ¢¢ÌÌ¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢Ì¢¢¢ÌÌÌÌÌ¢¢¢¢¢Ì¢¢¢¢ÌÌÌ¢¢ÌÌ¢¢¢ÌÌ¢¢¢¢¢¢¢<Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢ÌÌ¢¢¢Ì ¢Ì¢¢ÌÌÌÌÌx¾¢¢¢¢ÌÌ¢¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢Ì¢¢¢ÌÌ¢¢ÌÌÌ¢¢¢¢¢¢¢¢¢€¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢ÌÌÌ¢ íí¢¢¢¢ÌÌžº¢ ¢¢¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌÌÌ¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì̢̢̢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì̢̢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢¢¢¢¢<í퀚r˜d¿ŠšÍÌ¢¢¢¢ÌÌ¢¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢Ì¢¢¢ÌÌ¢¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢ÌÌÌ¢ ííí‰Y>A,<¢¢¢¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌÌÌ¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì̢̢̢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢¢¢¢¢<íííí ¢Ì¢¢¢¢ÌÌ¢¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢Ì¢¢¢ÌÌ¢¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢ÌÌÌ¢ ííííí9íííí¢Ì¢¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌÌÌ¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì̢̢̢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢¢¢¢¢<íííííííK æíííí¤¢Ì¢¢¢¢ÌÌ¢¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢Ì¢¢¢ÌÌ¢¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢ÌÌÌ¢ ííííííí_Ì¡Ÿííí퀢¢¢¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌÌÌ¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì̢̢̢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢¢¢¢¢<ííí íííx¢¢½íííí¢¢Ì¢¢¢¢ÌÌ¢¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢Ì¢¢¢ÌÌ¢¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢ÌÌÌ¢ ííí ííí‘ÌÌ…»ííííííí¢¢Ì¢¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌÌÌ¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì̢̢̢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢¢¢¢¢<íííííí‘ÌÌ¢„íííííííííí =‘šº¢¢¢¢ÌÌ¢¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢Ì¢¢¢ÌÌ¢¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢ÌÌÌ¢ ííííí‘¢¢¢…ííííííííí íííííí  OÍd𢢢¢¢¢¢¢¢Ì¢ÌÌÌÌÌ¢¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì̢̢̢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢¢¢¢¢< íí ííí¯¢¢¢¢íííííííííí íííííííííííííííí!Ý¢¢ÌÌ¢¢¢¢¢¢Ìº¸¢¢¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢¢¢¢Ì¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢Ì¢¢¢ÌÌ¢¢ÌÌÌ¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢ÌÌÌ¢ íííí튢¢¢Ìíííííííííííííííííí  íííííííííÑr¢¢¢¢¢¢Ì¢‹ÀâªÀ¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì̢̢̢¢¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢¢¢¢¢<íííííÀÌÌ¢¢íííííííííííííííííííííí ííí !a’º¢¢…„ Ï\𢢢ÌÌÌÌÌÌÌÌÌÌ¢¢¢¢ÌÌ¢¢¢Ì¢º¢¢¢¢¢¢¢¢¢¢ÌÌ¢¢¢¢Ì¢¢¢ÌÌ¢¢ÌÌÌ¢¢¢¢¢¢¢¢r¸š¸¢¢¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢ÌÌÌ¢  ííííííííaÌÌ¢Ì íííííííííííííííííííííí  íííI*Œ¸Ì½æ9!¢¢¢ÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¸€ÃÂhŠÂdyÕ¯n¸¢¢¢¢ÌÌ¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢’êªÍgxš¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢¢¢¢¢<íííííííííííí ííí-ÌÌ¢Ìíííí íííííííííííí ííííÊ9íííí‘¢ƒ9íííííí  ‘¢¢¢ÌÌÌÌÌÌÌÌÌÌ¢¢¢œÁ"# `Š˜¢¢ÌÌ¢¢¢¢Ì¢¢¢ÌÌ¢¢ÌÌÌ¢¢ÌÌÌ ‚á_¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢ÌÌÌ¢ ííí ííí íííííí<ºÌ¢¸íííííííííííí ííííííí ¾½»9íí)¤À€¢¡Ÿíííííí ¤€¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¡‚zííF Ý¯š¢¢¢¢Ì¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡æííííª¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢¢¢¢¢< íííííííí ííí˜Ì¢eíííííí ííííííííííííí¢¢¡ƒæíW¼µ¸¢¢…sííííí*˜¢ÌÌ¢¢¢¢¢¢¢¢¢¢„síííííííí9íííí<ÝmÌ¢¢¢¢Ì¢¢¢ÌÌ¢¢º¸šr¸ºŸííííÑ¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢Ì¢¢ÌÌÌ¢ íí íííí ííí‘¢¢aíííí ííí ííí ííí íííííí¢¢Ì¾…¡¡¾¢¢ÌÌ¢¼ííííí혢ÌÌ¢¢¢¢¢¢¢¢¢…‚íííííícÈÊ‚æ9íííí !ãr¢Ì¢Ì¢¢¢¢š{¯Š¿gÍg_¯{ÖííííÀ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢<íííííííííªÌ¢a íííí íííííííí íííííí ¢¢¢¢¢Ì¢¢¢¢ÌÌ¢ƒ9ííííí €¢ÌÌ¢¢¢¢¢¢¢¢¢„Ÿííííí Qn¢ÌÌ…ƒæ9ííí!ª€¢¢Ì¢¢…•ÏZ  ííííw¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢º˜Æ€·¢ÌÌÌ¢ íííí ííííííO¢Jíííííííííííííííí íííí !d³˜r¢¢¢¢¢ÌÌ…½Wííííí ¢ÌÌ¢¢¢¢¢¢¢¢¢ íííííg¸ÌÌÌ¢¢¡ƒæííí`œ¢Ì¢„»ííííí  ííííj¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̾r©-O <€¢¢¢¢<íííííííííí’¢ ííííííííííí ííí ííííííííí  OJX‡˜¢¢¢¢¢¡æííííí ‹¢¢¢ÌÌÌÌÌÌÌ̾¼íííí=d¢¢¢¢¢¢Ì¾„‚9ííí£ãº¢…½Wííííííííííííííííííí‹¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌʶ ŠÌÌÌ¢<ííííí íí ííí w¢ íííí ííííííííííííííííííííííííííí ¿¸¢ÌÌÌ¡»íííí튢ÌÌ¢¢¢¢¢¢¢¢¾»íííí<¢¢¢¢¢¢ÌÌ¢¾ s:ퟹµ¢Ì¢¡sííííí3—ƒÚŸíííííííííÑÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢„9íííí Àš€€š ííííííííí¢ ííí ííí íííííííííííííí ííííííín¢¢¢¢¾‚íííííwºÌÌ¢¢¢¢¢¢¢¢¾síííí ‘¢¢¢¢¢¢¢¢¢¢Ì¡ ƒ„¾ÌÌÌ̃9íííí_¢Ì¾Ë¼síííííí_Ì¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̾9íííí £-Oíííííííííí€ííí ííííí ííííííí íííí íííííí y¢ÌÌÌÌÊíííííª¸ÌÌ¢¢¢¢¢¢¢¢¾æíííí ¯š¢¢¢¢¢ÌÌ¢¢ÌÌÌ¢¢ÌÌÌÌÌÚíííí!ÃÌÌÌÌÌ¡ æíííígÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢…‚íííí  ííííííí ííííí gííí ííííííííííííííííìííííe¢ÌÌÌÌ :ííííÝrÌÌ¢¢¢¢¢¢¢¢¢Ÿíííí -©wò€š·ššš¸É¢¢¢¢¢¢¢»ííííP²ÌÌÌÌÌÌÌ 9ííííª¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ íííííííííí íííííííííííííííííí=ííí íííí íí ííííííííííxÊííííÀ¢ÌÌÌÌ„9íííí¤r¢¢ÌÌÌÌÌÌÌÌ…:íííí ! £\aë^‡{¢ÌÌÌÌŸíííí’¢¢¢¢¢¢¢½IííííªžÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ„ííííżWííííííííííííí íí»ííí ííí ííí íííííí ííí íííí Ã9ííí`¢¢¢¢¢¾Ÿíííí£q¢¢ÌÌÌÌÌÌÌ̾Wííííííí t²Ì¢¢¾:íííí²¢ÌÌÌÌÌ̽9íííí!ÝžÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ íííí ‘¢„Wííí ííí ííííííí¡íííííí íííí íííííí ííí ííííííí íííííííííííííííííííííííííííííííííyÌ¢ƒíííííííííí íí¢æííííííííííííííííí íííííííííííííííí íííí íííííííííííííí íííí㢢¢:ííí ííííííííí̾íííí íííííííííííííí íííííííí  ííííííííí  íííí ííí íííííííííííí d¢¢¢‚íííííííííííí ÌÌÚííííííííííííííííííí ííííííííííí íííí íííííííí íííííííí 9ííí ⢢ ííííííííííííÌ̾Wííííííííííííííí ííííííííííí íííí íííí íííí íííííííí íííí eÌ¢¢ 9íííí íííííííÌÌ̾‚WV  íííí  íííí íííííííííííííííí íííí ííííííííí ?íííí ‘Ì¢¢¡IííííííííííííÌÌÌ̾¡Ãííííííí íííííí íííí íííí íííí íííí  íííííííí {Ì¢¢¢ííííííí íííííííÌÌÌÌÌÌÌíííííííííííííííííííí íííí íííí ííííí íííííííí¯Ì¢¢¡íííííííííííííÌÌÌÌÌÌÌíí ííííííííí ííí íííííí íííííííí íííí ííííí ííííííííÌ¢¢„ííííííííííííÌÌÌÌÌÌÌ íííííííííííííííí íííííííííííí ííííí íííí9ííí {Ì¢¢½íííííííííííí ÌÌÌÌÌÌÌííííííííííííííííííííííííííííí íííí ííííííííííííÌ¢¢½ííííííííííííí ÌÌÌÌÌÌÌííííííííííííííííííííííííííííííííí ííííííííRííííyÌ¢¢ ííí íííííííííÌÌÌÌÌÌÌíííííííííí íííííííííííííííí íííí íííí  ííííí íííííííí‹¢¢¢‚ííííí íííííííí ÌÌÌÌÌÌÌ£í ííííííííííííííííííííííííííííííííííí h¢¢¢Wíííííí ííííííííÌÌÌÌÌÌÌŠ íí  ííííí ííííí  ííííííííííííííííJÌ¢¢9ííííííííííííííÌÌÌÌÌÌÌÌ ííííííííííí ííííííííííííííííOš¢¡ííí ííííííííííÌÌÌÌÌÌÌÌ íííííí  ííííííííííííííí  ííííí ííííd¢Êíííííííí  ÌÌÌÌÌÌÌÌíííííííííííííííííííí ííííí ííííí¶íííííííí¢¢¢¢¢¢¢¢ íí íííííííííí íííííí íííííí ííííííííí ¢¢¢¢¢¢¢¢ª íííííííííííííííííííííííí ííííííííí9&¢¢¢¢¢¢¢¢¢  íííííííííííííííBííí9íW‚¾ ¢¢¢¢¢¢¢¢¢íííííííííííí]íííÞ ½…¢¢ ÌÌÌÌÌÌÌÌÌ  ííííäíííÍ¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÍíííísíííg¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌííííŸíííí`¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌííííŸíííª¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢ííííí!íííí㢢¢¢¢ ¢¢¢¢¢¢¢¢¢¢‘íííííuííííw¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌÌÌÌÌÌ̢̢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌ¢¢¢¢¢¢ÌÌ¢ÌÍííííí”9ííí ÌÌÌÌÌ ¢¢¢¢¢¢¢¢¢¢¢e¢¢¢¢¢¢¢¢¢¢Ì¢Ì¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢¢¢¢¢¢¢Íííííí¡ííí퀢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌ̑͢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌ¢¢¢¢¢¢ÌÌ¢Ì ííííí íííí µ¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢¢¢¢¢Ì¢Ì¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢¢¢¢¢¢Ìííííí ¼íííí¢¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌÌÌ*¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌ¢¢¢¢¢¢ÌÌ¢Ìííííí ‘ÚííííÝÌÌÌÌÌÌ ÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢¢¢¢¢Ì¢Ì¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢¢¢¢¢¢Ìííííí ¾síííí|¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢g¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌ¢¢¢¢¢¢ÌÌ¢Ìííííí¡WíWÚƒ¢¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢e¢¢¢¢¢¢¢¢¢Ì¢Ì¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢¢¢¢¢¢Íííííííë¾¢¢¾¢¢¢¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌÌÌÌÌ̢̢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌ¢¢¢¢¢¢ÌÌ¢íí¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢Í<¢¢¢¢¢¢¢¢Ì¢Ì¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢¢¢ÌÌ¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌÌÌÌÌÌ̢̢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌ¢¢¢¢¢¢Ì̤À¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£!¢¢¢¢¢¢¢Ì¢Ì¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢¢¢ÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢Ì¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌ¢¢¢¢¢¢ÌÀ=ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ£¢¢¢¢¢¢Ì¢Ì¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢¢¢¢œ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢<¢¢¢¢¢Ì¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌ¢¢¢¢¢Ì<ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌg_¢¢¢¢Ì¢Ì¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢¢‘Ò¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢‘¢¢¢Ì¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌ¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢€‘¢¢Ì¢Ì¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢ÌÌ¢¢Ì¢À¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Š¢Ì¢¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌ¢¢ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ÌO̢̢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢¢¢¢Ì_¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌŠž¢¢¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ¢ÌÌxÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌOÌ¢¢¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢¢¢¢Ì€¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢£Ì¢ÌÌÌ¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢¢ÌÌ£ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌeŠ¢Ì¢¢¢¢¢ÌÌÌÌÌ¢¢¢¢‘¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ <À¸ÌÌÌÌÌÌÌxOg¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ì¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢‘Š¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ esdl-1.3.1/api_gen/0000775000070100000120000000000012200143736012507 5ustar dguduucpesdl-1.3.1/api_gen/gludefs0000775000070100000120000001153012200143736014066 0ustar dguduucpenum { /* Normal vectors */ GLU_SMOOTH = 100000, GLU_FLAT = 100001, GLU_NONE = 100002, /* Quadric draw styles */ GLU_POINT = 100010, GLU_LINE = 100011, GLU_FILL = 100012, GLU_SILHOUETTE = 100013, /* Quadric orientation */ GLU_OUTSIDE = 100020, GLU_INSIDE = 100021, /* Tessellator */ GLU_TESS_BEGIN = 100100, GLU_TESS_VERTEX = 100101, GLU_TESS_END = 100102, GLU_TESS_ERROR = 100103, GLU_TESS_EDGE_FLAG = 100104, GLU_TESS_COMBINE = 100105, GLU_TESS_BEGIN_DATA = 100106, GLU_TESS_VERTEX_DATA = 100107, GLU_TESS_END_DATA = 100108, GLU_TESS_ERROR_DATA = 100109, GLU_TESS_EDGE_FLAG_DATA = 100110, GLU_TESS_COMBINE_DATA = 100111, /* Winding rules */ GLU_TESS_WINDING_ODD = 100130, GLU_TESS_WINDING_NONZERO = 100131, GLU_TESS_WINDING_POSITIVE = 100132, GLU_TESS_WINDING_NEGATIVE = 100133, GLU_TESS_WINDING_ABS_GEQ_TWO = 100134, /* Tessellation properties */ GLU_TESS_WINDING_RULE = 100140, GLU_TESS_BOUNDARY_ONLY = 100141, GLU_TESS_TOLERANCE = 100142, /* Tessellation errors */ GLU_TESS_ERROR1 = 100151, /* Missing gluBeginPolygon */ GLU_TESS_ERROR2 = 100152, /* Missing gluBeginContour */ GLU_TESS_ERROR3 = 100153, /* Missing gluEndPolygon */ GLU_TESS_ERROR4 = 100154, /* Missing gluEndContour */ GLU_TESS_ERROR5 = 100155, /* */ GLU_TESS_ERROR6 = 100156, /* */ GLU_TESS_ERROR7 = 100157, /* */ GLU_TESS_ERROR8 = 100158, /* */ /* NURBS */ GLU_AUTO_LOAD_MATRIX = 100200, GLU_CULLING = 100201, GLU_PARAMETRIC_TOLERANCE = 100202, GLU_SAMPLING_TOLERANCE = 100203, GLU_DISPLAY_MODE = 100204, GLU_SAMPLING_METHOD = 100205, GLU_U_STEP = 100206, GLU_V_STEP = 100207, GLU_PATH_LENGTH = 100215, GLU_PARAMETRIC_ERROR = 100216, GLU_DOMAIN_DISTANCE = 100217, GLU_MAP1_TRIM_2 = 100210, GLU_MAP1_TRIM_3 = 100211, GLU_OUTLINE_POLYGON = 100240, GLU_OUTLINE_PATCH = 100241, GLU_NURBS_ERROR1 = 100251, /* spline order un-supported */ GLU_NURBS_ERROR2 = 100252, /* too few knots */ GLU_NURBS_ERROR3 = 100253, /* valid knot range is empty */ GLU_NURBS_ERROR4 = 100254, /* decreasing knot sequence */ GLU_NURBS_ERROR5 = 100255, /* knot multiplicity > spline order */ GLU_NURBS_ERROR6 = 100256, /* endcurve() must follow bgncurve() */ GLU_NURBS_ERROR7 = 100257, /* bgncurve() must precede endcurve() */ GLU_NURBS_ERROR8 = 100258, /* ctrlarray or knot vector is NULL */ GLU_NURBS_ERROR9 = 100259, /* can't draw pwlcurves */ GLU_NURBS_ERROR10 = 100260, /* missing gluNurbsCurve() */ GLU_NURBS_ERROR11 = 100261, /* missing gluNurbsSurface() */ GLU_NURBS_ERROR12 = 100262, /* endtrim() must precede endsurface() */ GLU_NURBS_ERROR13 = 100263, /* bgnsurface() must precede endsurface() */ GLU_NURBS_ERROR14 = 100264, /* curve of improper type passed as trim curve */ GLU_NURBS_ERROR15 = 100265, /* bgnsurface() must precede bgntrim() */ GLU_NURBS_ERROR16 = 100266, /* endtrim() must follow bgntrim() */ GLU_NURBS_ERROR17 = 100267, /* bgntrim() must precede endtrim() */ GLU_NURBS_ERROR18 = 100268, /* invalid or missing trim curve */ GLU_NURBS_ERROR19 = 100269, /* bgntrim() must precede pwlcurve() */ GLU_NURBS_ERROR20 = 100270, /* pwlcurve referenced twice */ GLU_NURBS_ERROR21 = 100271, /* pwlcurve and nurbscurve mixed */ GLU_NURBS_ERROR22 = 100272, /* improper usage of trim data type */ GLU_NURBS_ERROR23 = 100273, /* nurbscurve referenced twice */ GLU_NURBS_ERROR24 = 100274, /* nurbscurve and pwlcurve mixed */ GLU_NURBS_ERROR25 = 100275, /* nurbssurface referenced twice */ GLU_NURBS_ERROR26 = 100276, /* invalid property */ GLU_NURBS_ERROR27 = 100277, /* endsurface() must follow bgnsurface() */ GLU_NURBS_ERROR28 = 100278, /* intersecting or misoriented trim curves */ GLU_NURBS_ERROR29 = 100279, /* intersecting trim curves */ GLU_NURBS_ERROR30 = 100280, /* UNUSED */ GLU_NURBS_ERROR31 = 100281, /* unconnected trim curves */ GLU_NURBS_ERROR32 = 100282, /* unknown knot error */ GLU_NURBS_ERROR33 = 100283, /* negative vertex count encountered */ GLU_NURBS_ERROR34 = 100284, /* negative byte-stride */ GLU_NURBS_ERROR35 = 100285, /* unknown type descriptor */ GLU_NURBS_ERROR36 = 100286, /* null control point reference */ GLU_NURBS_ERROR37 = 100287, /* duplicate point on pwlcurve */ /* Errors */ GLU_INVALID_ENUM = 100900, GLU_INVALID_VALUE = 100901, GLU_OUT_OF_MEMORY = 100902, GLU_INCOMPATIBLE_GL_VERSION = 100903, /* New in GLU 1.1 */ GLU_VERSION = 100800, GLU_EXTENSIONS = 100801, /* ** GLU 1.0 tessellation - obsolete! ** */ /* Contour types */ GLU_CW = 100120, GLU_CCW = 100121, GLU_INTERIOR = 100122, GLU_EXTERIOR = 100123, GLU_UNKNOWN = 100124, /* Tessellator */ GLU_BEGIN = GLU_TESS_BEGIN, GLU_VERTEX = GLU_TESS_VERTEX, GLU_END = GLU_TESS_END, GLU_ERROR = GLU_TESS_ERROR, GLU_EDGE_FLAG = GLU_TESS_EDGE_FLAG }; esdl-1.3.1/api_gen/conv_glext.erl0000664000070100000120000003330512200143736015367 0ustar dguduucp%%%------------------------------------------------------------------- %%% File : conv_glext.erl %%% Author : Dan Gudmundsson %%% Description : glext specific stuff %%% %%% Created : 10 Jan 2003 by Dan Gudmundsson %%%------------------------------------------------------------------- -module(conv_glext). -compile(export_all). add() -> [ {"glDrawRangeElements", {[{"indices",{index_or_list,"count"},"type"}], []}}, {"glColorTable", {[{"table", pointer, "type"}], []}}, {"glColorTableParameterfv", {[{"params", 4}], []}}, {"glColorTableParameteriv", {[{"params", 4}], []}}, {"glGetColorTable", {[{"table", sdlmem}], []}}, {"glGetColorTableParameterfv", {[{"params", 4}], []}}, {"glGetColorTableParameteriv", {[{"params", 4}], []}}, {"glColorSubTable", {[{"data", pointer, "type"}], []}}, {"glConvolutionFilter1D", {[{"image", pointer, "type"}], []}}, {"glConvolutionFilter2D", {[{"image", pointer, "type"}], []}}, {"glConvolutionParameterfv", {[{"params", {undefined, 4, xx}}], []}}, {"glConvolutionParameteriv", {[{"params", {undefined, 4, xx}}], []}}, {"glGetConvolutionFilter", {[{"image", sdlmem}], []}}, {"glGetConvolutionParameterfv", {[{"params", {undefined, 4, "pname"}}], []}}, {"glGetConvolutionParameteriv", {[{"params", {undefined, 4, "pname"}}], []}}, {"glGetSeparableFilter", {[{"row", sdlmem}, {"column", sdlmem},{"span", sdlmem}],[]}}, {"glSeparableFilter2D", {[{"column",pointer,"type"}, {"row",pointer,"type"}],[]}}, {"glGetHistogram", {[{"values", sdlmem}], []}}, {"glGetHistogramParameterfv", {[{"params", 1}], []}}, {"glGetHistogramParameteriv", {[{"params", 1}], []}}, {"glGetMinmax", {[{"values", sdlmem}], []}}, {"glGetMinmaxParameterfv", {[{"params", 1}], []}}, {"glGetMinmaxParameteriv", {[{"params", 1}], []}}, {"glTexImage3D", {[{"pixels", pointer, "type"}], []}}, {"glTexSubImage3D", {[{"pixels", pointer, "type"}], []}}, {"glLoadTransposeMatrixf", {[{"m", 16}], []}}, {"glLoadTransposeMatrixd", {[{"m", 16}], []}}, {"glMultTransposeMatrixf", {[{"m", 16}], []}}, {"glMultTransposeMatrixd", {[{"m", 16}], []}}, {"glCompressedTexImage3D", {[{"data", pointer, "?GL_UNSIGNED_BYTE"}], []}}, {"glCompressedTexImage2D", {[{"data", pointer, "?GL_UNSIGNED_BYTE"}], []}}, %? {"glCompressedTexImage1D", {[{"data", pointer, "?GL_UNSIGNED_BYTE"}], []}}, %? {"glCompressedTexSubImage1D", {[{"data", pointer, "?GL_UNSIGNED_BYTE"}], []}}, {"glCompressedTexSubImage2D", {[{"data", pointer, "?GL_UNSIGNED_BYTE"}], []}}, {"glCompressedTexSubImage3D", {[{"data", pointer, "?GL_UNSIGNED_BYTE"}], []}}, {"glGetCompressedTexImage", {[{"img", sdlmem}], []}}, {"glFogCoordfv", {[{"coord", 1}], []}}, %% ?? Guess {"glFogCoorddv", {[{"coord", 1}], []}}, %% ?? Guess {"glFogCoordPointer", {[{"pointer", pointer, "type"}], []}}, {"glMultiDrawArrays", {[{"first", {const, "primcount"}}, {"count",{const,"primcount"}}], ["primcount","mode","first","count"]}}, {"glPointParameterfv", {[{"params", 3}], []}}, {"glPointParameteriv", {[{"params", 3}], []}}, {"glSecondaryColorPointer", {[{"pointer", pointer, "type"}], []}}, {"glMultiDrawElements", {skip, []}}, %% Not supported %% ARBs {"glWeightbvARB", {[{"weights", "size"}], []}}, {"glWeightsvARB", {[{"weights", "size"}], []}}, {"glWeightivARB", {[{"weights", "size"}], []}}, {"glWeightfvARB", {[{"weights", "size"}], []}}, {"glWeightdvARB", {[{"weights", "size"}], []}}, {"glWeightubvARB", {[{"weights", "size"}], []}}, {"glWeightusvARB", {[{"weights", "size"}], []}}, {"glWeightuivARB", {[{"weights", "size"}], []}}, {"glWeightPointerARB", {[{"pointer", pointer, "type"}], []}}, {"glMatrixIndexubvARB", {[{"indices", "size"}], []}}, {"glMatrixIndexusvARB", {[{"indices", "size"}], []}}, {"glMatrixIndexuivARB", {[{"indices", "size"}], []}}, {"glMatrixIndexPointerARB", {[{"pointer", pointer, "type"}], []}}, {"glVertexAttrib1dv", {[{"v", 1}], []}}, {"glVertexAttrib1fv", {[{"v", 1}], []}}, {"glVertexAttrib1sv", {[{"v", 1}], []}}, {"glVertexAttrib2dv", {[{"v", 2}], []}}, {"glVertexAttrib2fv", {[{"v", 2}], []}}, {"glVertexAttrib2sv", {[{"v", 2}], []}}, {"glVertexAttrib3dv", {[{"v", 3}], []}}, {"glVertexAttrib3fv", {[{"v", 3}], []}}, {"glVertexAttrib3sv", {[{"v", 3}], []}}, {"glVertexAttrib4Nbv", {[{"v", 4}], []}}, {"glVertexAttrib4Niv", {[{"v", 4}], []}}, {"glVertexAttrib4Nsv", {[{"v", 4}], []}}, {"glVertexAttrib4Nubv", {[{"v", 4}], []}}, {"glVertexAttrib4Nuiv", {[{"v", 4}], []}}, {"glVertexAttrib4Nusv", {[{"v", 4}], []}}, {"glVertexAttrib4dv", {[{"v", 4}], []}}, {"glVertexAttrib4fv", {[{"v", 4}], []}}, {"glVertexAttrib4sv", {[{"v", 4}], []}}, {"glVertexAttrib4bv", {[{"v", 4}], []}}, {"glVertexAttrib4iv", {[{"v", 4}], []}}, {"glVertexAttrib4usv", {[{"v", 4}], []}}, {"glVertexAttrib4ubv", {[{"v", 4}], []}}, {"glVertexAttrib4uiv", {[{"v", 4}], []}}, %% Skip {"glVertexAttrib1dARB", {skip, []}}, {"glVertexAttrib1fARB", {skip, []}}, {"glVertexAttrib1sARB", {skip, []}}, {"glVertexAttrib1dvARB", {skip, []}}, {"glVertexAttrib1fvARB", {skip, []}}, {"glVertexAttrib1svARB", {skip, []}}, {"glVertexAttrib2dvARB", {skip, []}}, {"glVertexAttrib2fvARB", {skip, []}}, {"glVertexAttrib2svARB", {skip, []}}, {"glVertexAttrib2dARB", {skip, []}}, {"glVertexAttrib2fARB", {skip, []}}, {"glVertexAttrib2sARB", {skip, []}}, {"glVertexAttrib3dvARB", {skip, []}}, {"glVertexAttrib3fvARB", {skip, []}}, {"glVertexAttrib3svARB", {skip, []}}, {"glVertexAttrib3dARB", {skip, []}}, {"glVertexAttrib3fARB", {skip, []}}, {"glVertexAttrib3sARB", {skip, []}}, {"glVertexAttrib4NbvARB", {skip, []}}, {"glVertexAttrib4NivARB", {skip, []}}, {"glVertexAttrib4NsvARB", {skip, []}}, {"glVertexAttrib4dARB", {skip, []}}, {"glVertexAttrib4fARB", {skip, []}}, {"glVertexAttrib4sARB", {skip, []}}, {"glVertexAttrib4NubvARB", {skip, []}}, {"glVertexAttrib4NuivARB", {skip, []}}, {"glVertexAttrib4NusvARB", {skip, []}}, {"glVertexAttrib4dvARB", {skip, []}}, {"glVertexAttrib4fvARB", {skip, []}}, {"glVertexAttrib4svARB", {skip, []}}, {"glVertexAttrib4bvARB", {skip, []}}, {"glVertexAttrib4ivARB", {skip, []}}, {"glVertexAttrib4usvARB", {skip, []}}, {"glVertexAttrib4ubvARB", {skip, []}}, {"glVertexAttrib4uivARB", {skip, []}}, {"glVertexAttrib4NubARB", {skip, []}}, {"glEnableVertexAttribArrayARB", {skip, []}}, {"glDisableVertexAttribArrayARB", {skip, []}}, {"glIsProgramARB", {skip, []}}, {"glGetVertexAttribPointervARB", {skip, []}}, {"glVertexAttribPointer", {[{"pointer", pointer, "type"}], []}}, {"glVertexAttribPointerARB", {skip, []}}, {"glProgramStringARB", {[{"string", pointer, "GL_UNSIGNED_BYTE"}], []}}, {"glDeleteProgramsARB", {[{"programs", "n"}], []}}, {"glGenProgramsARB", {[{"programs", "n"}], []}}, {"glProgramEnvParameter4dvARB", {[{"params", 4}], []}}, {"glProgramEnvParameter4fvARB", {[{"params", 4}], []}}, {"glProgramLocalParameter4dvARB", {[{"params", 4}], []}}, {"glProgramLocalParameter4fvARB", {[{"params", 4}], []}}, {"glGetProgramEnvParameterdvARB", {[{"params", 4}], []}}, {"glGetProgramEnvParameterfvARB", {[{"params", 4}], []}}, {"glGetProgramLocalParameterdvARB", {[{"params", 4}], []}}, {"glGetProgramLocalParameterfvARB", {[{"params", 4}], []}}, {"glGetProgramiv", {[{"params", 1}], []}}, {"glGetProgramivARB", {skip, []}}, {"glGetProgramStringARB", {[{"string", sdlmem}], []}}, {"glGetVertexAttribdv", {[{"params", 4}], []}}, % {undefined, 4, "pname"} ? {"glGetVertexAttribfv", {[{"params", 4}], []}}, % {undefined, 4, "pname"} ? {"glGetVertexAttribiv", {[{"params", 4}], []}}, % {undefined, 4, "pname"} ? {"glGetVertexAttribdvARB", {skip, []}}, {"glGetVertexAttribfvARB", {skip, []}}, {"glGetVertexAttribivARB", {skip, []}}, %% 1.5 and 2.0 {"glGenQueries", {[{"ids", "n"}], []}}, {"glDeleteQueries", {[{"ids", "n"}], []}}, {"glGetQueryiv", {[{"params", 1}], []}}, {"glGetQueryObjectiv", {[{"params", 1}], []}}, {"glGetQueryObjectuiv", {[{"params", 1}], []}}, {"glDeleteBuffers", {[{"buffers", "n"}], []}}, {"glGenBuffers", {[{"buffers", "n"}], []}}, {"glBufferData", {[{"data", pointer, "GL_UNSIGNED_BYTE"}], []}}, {"glBufferSubData", {[{"data", pointer, "GL_UNSIGNED_BYTE"}], []}}, {"glGetBufferSubData", {[{"data", sdlmem}], []}}, {"glGetBufferParameteriv", {[{"params", 1}], []}}, {"glShaderSource", {[{"length", "count"}, {"string", "count"}], []}}, {"glUniform1fv", {[{"value", "count"}], []}}, %% {"glUniform2fv", {[{"value", "count*2"}], []}}, %% {"glUniform3fv", {[{"value", "count*3"}], []}}, %% {"glUniform4fv", {[{"value", "count*4"}], []}}, {"glUniform1iv", {[{"value", "count"}], []}}, %% {"glUniform2iv", {[{"value", "count*2"}], []}}, %% {"glUniform3iv", {[{"value", "count*3"}], []}}, %% {"glUniform4iv", {[{"value", "count*4"}], []}}, {"glGetProgramInfoLog", {[{"length", 1}, {"infoLog", {"length", "bufSize"}}], []}}, {"glGetShaderInfoLog", {[{"length", 1}, {"infoLog", {"length", "bufSize"}}], []}}, {"glGetAttachedObjectsARB", {[{"count", 1}, {"obj", {"count", "maxCount"}}], []}}, {"glGetUniformLocation", {[{"name", pointer, string}], []}}, {"glGetActiveUniform", {[{"length", 1}, {"size", 1}, {"type", 1}, {"name", {"length", "bufSize"}}], []}}, {"glGetUniformfv", {[{"params", sdlmem}], []}}, {"glGetUniformiv", {[{"params", sdlmem}], []}}, {"glGetShaderSource", {[{"length", 1},{"source", {"length", "bufSize"}}], []}}, {"glBindAttribLocation", {[{"name", pointer, string}], []}}, {"glGetActiveAttrib", {[{"length", 1},{"size", 1},{"type", 1},{"name", {"length", "bufSize"}}], []}}, {"glGetAttribLocation", {[{"name", pointer, string}], []}}, {"glDrawBuffers", {[{"bufs", "n"}], []}}, {"glGetAttachedShaders", {[{"count", 1},{"obj", {"count","maxCount"}}], []}}, {"glGetShaderiv", {[{"params", 1}], []}}, %% ARB Shader Object %% These have different names (and types in 2.0) {"glDeleteObjectARB", {{use,"glDeleteProgram"},[]}}, {"glDetachObjectARB", {{use,"glDetachShader"},[]}}, {"glCreateShaderObjectARB", {{use,"glCreateShader"},[]}}, {"glCreateProgramObjectARB", {{use,"glCreateProgram"},[]}}, {"glAttachObjectARB", {{use,"glAttachShader"},[]}}, {"glUseProgramObjectARB", {{use,"glUseProgram"},[]}}, {"glGetAttachedObjectsARB", {{use,"glGetAttachedShaders"},[]}}, %% These don't have the same functionality in 2.0 {"glGetObjectParameterfvARB", {[{"params", 1}], []}}, {"glGetObjectParameterivARB", {[{"params", 1}], []}}, {"glGetInfoLogARB",{[{"length",1},{"infoLog",{"length","maxLength"}}],[]}}, %% {"glGetHandleARB", {{use,""},[]}}, %% These have the same name and type (skip them) {"glShaderSourceARB", {skip, []}}, {"glGetShaderSourceARB", {skip, []}}, {"glValidateProgramARB",{skip,[]}}, {"glCompileShaderARB",{skip,[]}}, {"glLinkProgramARB",{skip,[]}}, {"glUniform1fvARB", {skip, []}}, {"glUniform2fvARB", {skip, []}}, {"glUniform3fvARB", {skip, []}}, {"glUniform4fvARB", {skip, []}}, {"glUniform1ivARB", {skip, []}}, {"glUniform2ivARB", {skip, []}}, {"glUniform3ivARB", {skip, []}}, {"glUniform4ivARB", {skip, []}}, {"glUniform1fARB", {skip, []}}, {"glUniform2fARB", {skip, []}}, {"glUniform3fARB", {skip, []}}, {"glUniform4fARB", {skip, []}}, {"glUniform1iARB", {skip, []}}, {"glUniform2iARB", {skip, []}}, {"glUniform3iARB", {skip, []}}, {"glUniform4iARB", {skip, []}}, {"glUniformMatrix2fvARB", {skip, []}}, {"glUniformMatrix3fvARB", {skip, []}}, {"glUniformMatrix4fvARB", {skip, []}}, {"glGetUniformfvARB", {skip, []}}, {"glGetUniformivARB", {skip, []}}, {"glGetActiveUniformARB", {skip, []}}, {"glGetUniformLocationARB", {skip, []}}, %% GL_EXT_framebuffer_object {"glDeleteRenderbuffersEXT", {[{"renderbuffers", "n"}], []}}, {"glGenRenderbuffersEXT", {[{"renderbuffers", "n"}], []}}, {"glGetRenderbufferParameterivEXT", {[{"params", 1}], []}}, {"glDeleteFramebuffersEXT", {[{"framebuffers", "n"}], []}}, {"glGenFramebuffersEXT", {[{"framebuffers", "n"}], []}}, {"glGetFramebufferAttachmentParameterivEXT", {[{"params", 1}], []}} ]. init_erl(Fd) -> io:format(Fd, " %%% OPENGL 1.2 and later with selected ARB's and extensions %%-module(glext). -include(\"glext_funcs.hrl\"). glGetConvolutionParameterivLen(Pname) -> glGetConvolutionParameterfvLen(Pname). glGetConvolutionParameterfvLen(Pname) -> case Pname of ?GL_CONVOLUTION_BORDER_MODE -> 1; ?GL_CONVOLUTION_BORDER_COLOR -> 1; ?GL_CONVOLUTION_FILTER_SCALE -> 4; ?GL_CONVOLUTION_FILTER_BIAS -> 4; ?GL_CONVOLUTION_FORMAT -> 4; ?GL_CONVOLUTION_WIDTH -> 1; ?GL_CONVOLUTION_HEIGHT -> 1; ?GL_MAX_CONVOLUTION_WIDTH -> 1; ?GL_MAX_CONVOLUTION_HEIGHT -> 1; _ -> 4 end. ", []), ok. init_c(Fd) -> io:format(Fd, " #include #include #include \"esdl.h\" #ifndef APIENTRY #define APIENTRY #endif #include \"esdl_glext.h\" ~n", []). init_hrl(_Fd) -> % io:format(Fd, "#include ~n", []). ok. init_h(Fd) -> io:format(Fd, " #ifdef ESDL_DEFINE_EXTS # define ESDL_EXTERN #else # define ESDL_EXTERN extern #endif ", []). esdl-1.3.1/api_gen/conv_glu.erl0000664000070100000120000003506212200143736015035 0ustar dguduucp%%%---------------------------------------------------------------------- %%% File : conv_glu.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 11 Oct 2001 by Dan Gudmundsson %%%---------------------------------------------------------------------- %% Some knowledge about lengths of arrays and similar stuff. -module(conv_glu). -compile(export_all). add() -> [ {"gluNurbsCallback", {skip, []}}, %% Not supported {"gluNurbsCallbackData", {skip, []}}, %% Not supported {"gluNurbsCallbackDataEXT", {skip, []}}, %% Not supported {"gluQuadricCallback", {skip, []}}, %% Not supported %% {"gluTessCallback", {skip, []}}, %% Not supported {"gluTessBeginPolygon", {[{"data", {const, pointer}}], []}}, {"gluTessVertex", {[{"location", {const, pointer}}, {"data", {const, pointer}}], []}}, {"gluBuild1DMipmapLevels", {skip, [erl,c]}}, {"gluBuild1DMipmaps", {[{"data", pointer, "type"}], []}}, {"gluBuild2DMipmapLevels", {skip, [erl,c]}}, {"gluBuild2DMipmaps", {[{"data", pointer, "type"}], []}}, {"gluBuild3DMipmapLevels", {skip, [erl,c]}}, {"gluBuild3DMipmaps", {[{"data", pointer, "type"}], []}}, {"gluCheckExtension", {skip, [erl,c]}}, {"gluGetNurbsProperty", {[{"data", 1}], []}}, {"gluGetTessProperty", {[{"data", 1}], []}}, {"gluLoadSamplingMatrices", {[{"model", 16},{"view", 16}, {"perspective", 16}], []}}, {"gluNurbsCurve", {[{"knots", {const,"knotCount"}}, {"control", {const, pointer}}],[]}}, {"gluNurbsSurface", {[{"sKnots", {const,"sKnotCount"}},{"tKnots", {const,"tKnotCount"}}, {"control", {const, pointer}}],[]}}, {"gluPickMatrix", {[{"viewport", {const, 4}}],[]}}, {"gluProject", {[{"model",16},{"view",16},{"proj",16},{"winX",1},{"winY",1},{"winZ",1}],[]}}, {"gluPwlCurve", {[{"data", {const, pointer}}],[]}}, {"gluScaleImage", {[{"dataOut", sdlmem}, {"dataIn", pointer,"typeIn"}], []}}, {"gluUnProject", {[{"model",16},{"view",16},{"proj",16},{"objX",1},{"objY",1},{"objZ",1}],[]}}, {"gluUnProject4", {skip, {[{"model",16},{"view",16},{"proj",16}, {"objX",1},{"objY",1},{"objZ",1},{"objW",1}],[]}}}, {last, []} ]. init_hrl(Fd) -> io:format(Fd, "~n%% Available ESDL Tessalator callbacks" "~n-define(ESDL_TESSCB_NONE, 0). %% No callback" "~n-define(ESDL_TESSCB_GLBEGIN, 1). %% calls gl:begin(Type) " "~n-define(ESDL_TESSCB_GLEND, 2). %% calls gl:end()" "~n-define(ESDL_TESSCB_GLVERTEX, 3). %% calls gl:vertex3dv(vertex)" "~n-define(ESDL_TESSCB_ERROR_PRINT, 4). %% Prints error on stderr." "~n-define(ESDL_TESSCB_COMBINE, 5). %% Adds vector, and adjusts user data" "~n-define(ESDL_TESSCB_GLEDGEFLAG, 6). %% calls gl:edgeFlag(Flag)" "~n-define(ESDL_TESSCB_VERTEX_DATA, 7). %% calls various" "~n" ,[]). init_erl(Fd) -> io:format(Fd, "~n-module(glu)." "~n-author('dgud@erix.ericsson.se')." "~n-compile(export_all)." "~n%%-export([Function/Arity, ...])." "~n-include(\"esdl.hrl\")." "~n-include(\"glu_funcs.hrl\")." "~n-include(\"sdl_util.hrl\")." "~n-include(\"gl.hrl\" )." "~n-import(sdl, [call/2, cast/2])." "~n-import(sdl_util, [bin2list/2,bin2list/3, term2bin/2, term2bin/3])." "~n" "~n%% Internal datatypes" "~n-define(getPointer(REC), element(2, REC))." "~n-record(quadricPtr, {ptr})." "~n-record(nurbsPtr, {ptr})." "~n-record(tessPtr, {ptr})." " -define(ESDL_TESS_VTXDATA_MATERIAL, 1). -define(ESDL_TESS_VTXDATA_TEXCOORD2, 2). -define(ESDL_TESS_VTXDATA_NORMAL, 4). -define(ESDL_TESS_VTXDATA_COLOR, 8). convert_vtxdata([{normal,{X,Y,Z}}|T], Ops,Acc) -> convert_vtxdata(T, Ops bor ?ESDL_TESS_VTXDATA_NORMAL, [<>|Acc]); convert_vtxdata([{material,Face,Pname,{R,G,B}}|T], Ops, Acc) -> convert_vtxdata(T, Ops bor ?ESDL_TESS_VTXDATA_MATERIAL, [<>|Acc]); convert_vtxdata([{material,Face,Pname,{R,G,B,A}}|T], Ops, Acc) -> convert_vtxdata(T, Ops bor ?ESDL_TESS_VTXDATA_MATERIAL, [<>|Acc]); convert_vtxdata([{color,{R,G,B}}|T], Ops, Acc) -> convert_vtxdata(T, Ops bor ?ESDL_TESS_VTXDATA_COLOR, [<>|Acc]); convert_vtxdata([{color,{R,G,B,A}}|T], Ops, Acc) -> convert_vtxdata(T, Ops bor ?ESDL_TESS_VTXDATA_COLOR, [<>|Acc]); convert_vtxdata([{texcoord2,{U,V}}|T], Ops, Acc) -> convert_vtxdata(T, Ops bor ?ESDL_TESS_VTXDATA_TEXCOORD2, [<>|Acc]); convert_vtxdata([], Ops, Acc) -> [Acc,Ops]. %% Func: tessBeginPolygon %% Args: TessObject %% Returns: ok %% C-API func: void gluTessBeginPolygon(GLUtesselator *tobj) tessBeginPolygon(#tessPtr{ptr=Tobj}) -> cast(?gluTessBeginPolygon, <>). %% Func: tessCallback %% Args: Which, ESDL_TESSCB one of the callback functions defined in glu.hrl %% Returns: ok %% C-API func: void gluTessCallback(GLUtesselator *tobj, GLenum which, void (GLCALLBACK *fn)()) %% Desc: ESDL have some predefined functions which must be supplied as callbacks funcs, %% see glu.hrl. New callbacks may be defined in the future, input and or %% implementations are welcomed. tessCallback(#tessPtr{ptr=Tobj}, Which, ESDL_TESSCB) -> cast(?gluTessCallback, <>). %% Func: tessVertex %% Args: Tobj, Coords[, VtxData] %% Returns: ok %% C-API func: void gluTessVertex(GLUtesselator *tobj, GLdouble coords[3], void *vertex_data) %% Desc: VtxData is a tuple-list of extra data supported types are %% [{normal, {X,Y,Z}}, {color, {R,G,B[,A]}}, {texcoord2, {U,V}}] %% Use ?ESDL_TESSCB_VERTEX_DATA callback to call apropriate gl functions %% on the extra data. tessVertex(#tessPtr{ptr=Tobj}, {X,Y,Z}) -> cast(?gluTessVertex, <>). tessVertex(#tessPtr{ptr=Tobj}, {X,Y,Z}, VtxData0) -> %% Sort here so that we know that all data for all vertices %% come in the same order; the driver depends on it... VtxData = convert_vtxdata(lists:sort(VtxData0), 0, []), Data = [<>|VtxData], cast(?gluTessVertex, Data). " ,[]). init_c(Fd) -> io:format(Fd, " /* * Copyright (c) 2001 Dan Gudmundsson * See the file \"license.terms\" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ * * * GLU wrapper * */ #include /* malloc */ #include /* malloc */ #include /* malloc */ #include /* malloc */ #include \"esdl.h\" #ifdef _OSX_COCOA #include #else #include #endif #define ASIZE(a) (sizeof(a)/sizeof(a[0])) #define GetNativePtr(res, T, s) \\ do { res = T *(void **)(s); s += sizeof(void *); } while (0) typedef struct _tessdata3 * eglu_tessdata_ptr; typedef struct _tessdata3 { eglu_tessdata_ptr next; GLdouble data[3]; } eglu_tessdata; typedef struct _tessobj { GLUtesselator *tess; eglu_tessdata *data; GLdouble* freep; GLdouble def_heap[64]; } eglu_tessobj; #ifndef CALLBACK # define CALLBACK #endif #define ESDL_TESSCB_NONE 0 /* No callback */ #define ESDL_TESSCB_GLBEGIN 1 /* calls gl:begin(Type) */ #define ESDL_TESSCB_GLEND 2 /* calls gl:end() */ #define ESDL_TESSCB_GLVERTEX 3 /* calls gl:3dv(vertex) */ #define ESDL_TESSCB_ERROR_PRINT 4 /* Prints error on stderr. */ #define ESDL_TESSCB_COMBINE 5 /* Adds vertex */ #define ESDL_TESSCB_GLEDGEFLAG 6 /* calls gl:edgeFlag(Flag) */ #define ESDL_TESSCB_UDATA_VERTEX 7 /* calls various gl functions * depending on user data */ #define ESDL_TESS_VTXDATA_MATERIAL 1 #define ESDL_TESS_VTXDATA_TEXCOORD2 2 #define ESDL_TESS_VTXDATA_NORMAL 4 #define ESDL_TESS_VTXDATA_COLOR 8 void CALLBACK errorCallback(GLenum errorCode) { const GLubyte *err; err = gluErrorString(errorCode); fprintf(stderr, \"Tesselation error: %d: %s\\r\\n\", errorCode, err); } void CALLBACK esdl_combine(GLdouble coords[3], void *vertex_data[4], GLfloat w[4], void **outData, void *polygon_data ) { int size = 0; int max = 0; eglu_tessobj *eobj = polygon_data; eglu_tessdata* mycoords = NULL; unsigned char* combined = NULL; unsigned char* datap[4] = {NULL, NULL, NULL, NULL}; unsigned flags; flags = ((unsigned char *)vertex_data[0])[-1]; for (max = 0; max < 4 && vertex_data[max] != NULL; max++) { if (((unsigned char *)vertex_data[max])[-1] != flags) { flags = 0; } datap[max] = (unsigned char *) (((GLdouble *)vertex_data[max])+3); } if (flags & ESDL_TESS_VTXDATA_MATERIAL) { size += 5*4; } if (flags & ESDL_TESS_VTXDATA_TEXCOORD2) { size += 2*4; } if (flags & ESDL_TESS_VTXDATA_NORMAL) { size += 3*4; } if (flags & ESDL_TESS_VTXDATA_COLOR) { size += 2*4; } mycoords = (eglu_tessdata*) malloc(sizeof(GLdouble) + sizeof(eglu_tessdata) + size); combined = (unsigned char *) (mycoords->data+4); mycoords->next = eobj->data; eobj->data = mycoords; mycoords->data[1] = coords[0]; mycoords->data[2] = coords[1]; mycoords->data[3] = coords[2]; *outData = mycoords->data + 1; flags = 0; ((char *) (mycoords->data+1))[-1] = flags; } void CALLBACK esdl_udata_vertex(GLdouble* coords) { GLfloat* datap = (GLfloat *) (coords+3); unsigned flags = ((unsigned char *) coords)[-1]; /* fprintf(stderr, \"Flags: %d\\r\\n\", flags); */ if (flags & ESDL_TESS_VTXDATA_MATERIAL) { GLenum face = ((unsigned short *) datap)[0]; GLenum pname = ((unsigned short *) datap)[1]; datap++; glMaterialfv(face, pname, datap); datap += 4; } if (flags & ESDL_TESS_VTXDATA_TEXCOORD2) { glTexCoord2fv(datap); datap += 2; } if (flags & ESDL_TESS_VTXDATA_NORMAL) { glNormal3fv(datap); datap += 3; } if (flags & ESDL_TESS_VTXDATA_COLOR) { glColor4fv(datap); datap += 4; } glVertex3dv(coords); } void eglu_newTess (sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; GLUtesselator* tobj; eglu_tessobj * eobj; tobj = gluNewTess(); eobj = (eglu_tessobj *) malloc(sizeof(eglu_tessobj)); eobj->tess = tobj; eobj->data = NULL; eobj->freep = eobj->def_heap; /* fprintf(stderr, \"New tess: %d -> %d \\r\\n\", (int) eobj, (int) tobj); */ /* * Send back result. */ bp = start = sdl_getbuff(sd, 4, buff); /* putPointer(bp, eobj); */ * (eglu_tessobj **) bp = eobj; bp += sizeof(eglu_tessobj *); sendlen = bp - start; sdl_send(sd, sendlen, buff); } void eglu_deleteTess (sdl_data *sd, int len, char * buff) { char *bp; eglu_tessobj *eobj; bp = buff; GetNativePtr(eobj, (eglu_tessobj *), bp); gluDeleteTess(eobj->tess); free(eobj); /* fprintf(stderr, \"Deleting tess: %d\\r\\n\", (int) eobj); */ } void eglu_tessBeginPolygon (sdl_data *sd, int len, char * buff) { char *bp; eglu_tessobj *eobj; /* void *polygon_data; */ bp = buff; GetNativePtr(eobj, (eglu_tessobj *), bp); /* fprintf(stderr, \"tessBeginPolygon: %d\\r\\n"", (int) eobj); */ gluTessBeginPolygon(eobj->tess, (void *) eobj); } void eglu_tessVertex(sdl_data *sd, int len, char* bp) { eglu_tessobj *eobj; eglu_tessdata* coords; size_t size; size_t ndoubles; size_t nbytes; char* extrap; GetNativePtr(eobj, (eglu_tessobj *), bp); size = len - sizeof(void *); nbytes = sizeof(GLdouble) + sizeof(eglu_tessdata) + size; ndoubles = (nbytes-1)/sizeof(GLdouble) + 1; if (ndoubles <= eobj->def_heap+ASIZE(eobj->def_heap)-eobj->freep) { coords = (eglu_tessdata*) eobj->freep; eobj->freep += ndoubles; } else { coords = (eglu_tessdata*) malloc(nbytes); coords->next = eobj->data; eobj->data = coords; } memcpy(coords->data+1, bp, size); extrap = (char *) (coords->data+1); if (size > 3*sizeof(GLdouble)) { extrap[-1] = bp[size-1]; } else { extrap[-1] = 0; } /* fprintf(stderr, \"tessVertex: %d %g %g %g\\r\\n\", (int) eobj, coords->data[0], coords->data[1], coords->data[2]); */ gluTessVertex(eobj->tess, coords->data+1, coords->data+1); } void eglu_tessEndPolygon (sdl_data *sd, int len, char * buff) { char *bp; eglu_tessobj *eobj; eglu_tessdata *remove, *temp; bp = buff; GetNativePtr(eobj, (eglu_tessobj *), bp); gluTessEndPolygon(eobj->tess); remove = eobj->data; while (remove != NULL) { temp = remove->next; free(remove); remove = temp; } eobj->data = NULL; eobj->freep = eobj->def_heap; } void eglu_tessCallback(sdl_data *sd, int len, char * buff) { char *bp; eglu_tessobj *eobj; GLenum which; int cbId; GLvoid (CALLBACK *cbfn)(); bp = buff; GetNativePtr(eobj, (eglu_tessobj *), bp); which = get32be(bp); cbId = get32be(bp); switch(which) { case GLU_TESS_COMBINE: which = GLU_TESS_COMBINE_DATA; break; default: break; }; switch(cbId) { case ESDL_TESSCB_NONE: cbfn = NULL; break; case ESDL_TESSCB_GLBEGIN: cbfn = glBegin; break; case ESDL_TESSCB_GLEND: cbfn = glEnd; break; case ESDL_TESSCB_GLVERTEX: cbfn = glVertex3dv; break; case ESDL_TESSCB_GLEDGEFLAG: cbfn = glEdgeFlag; break; case ESDL_TESSCB_ERROR_PRINT: cbfn = errorCallback; break; case ESDL_TESSCB_COMBINE: cbfn = esdl_combine; break; case ESDL_TESSCB_UDATA_VERTEX: cbfn = esdl_udata_vertex; break; default: cbfn = NULL; break; }; gluTessCallback(eobj->tess, which, cbfn); } ", []). esdl-1.3.1/api_gen/glfuncs0000775000070100000120000012276312200143736014111 0ustar dguduucpGLAPI void GLAPIENTRY glClearIndex( GLfloat c ); GLAPI void GLAPIENTRY glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); GLAPI void GLAPIENTRY glClear( GLbitfield mask ); GLAPI void GLAPIENTRY glIndexMask( GLuint mask); GLAPI void GLAPIENTRY glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ); GLAPI void GLAPIENTRY glAlphaFunc( GLenum func, GLclampf ref ); GLAPI void GLAPIENTRY glBlendFunc( GLenum sfactor, GLenum dfactor ); GLAPI void GLAPIENTRY glLogicOp( GLenum opcode ); GLAPI void GLAPIENTRY glCullFace( GLenum mode ); GLAPI void GLAPIENTRY glFrontFace( GLenum mode ); GLAPI void GLAPIENTRY glPointSize( GLfloat size ); GLAPI void GLAPIENTRY glLineWidth( GLfloat width ); GLAPI void GLAPIENTRY glLineStipple( GLint factor, GLushort pattern ); GLAPI void GLAPIENTRY glPolygonMode( GLenum face, GLenum mode ); GLAPI void GLAPIENTRY glPolygonOffset( GLfloat factor, GLfloat units ); GLAPI void GLAPIENTRY glPolygonStipple( const GLubyte *mask ); GLAPI void GLAPIENTRY glGetPolygonStipple( GLubyte *mask ); GLAPI void GLAPIENTRY glEdgeFlag( GLboolean flag ); GLAPI void GLAPIENTRY glEdgeFlagv( const GLboolean *flag ); GLAPI void GLAPIENTRY glScissor( GLint x, GLint y, GLsizei width, GLsizei height ); GLAPI void GLAPIENTRY glClipPlane( GLenum plane, const GLdouble *equation ); GLAPI void GLAPIENTRY glGetClipPlane( GLenum plane, GLdouble *equation ); GLAPI void GLAPIENTRY glDrawBuffer( GLenum mode ); GLAPI void GLAPIENTRY glReadBuffer( GLenum mode ); GLAPI void GLAPIENTRY glEnable( GLenum cap ); GLAPI void GLAPIENTRY glDisable( GLenum cap ); GLAPI GLboolean GLAPIENTRY glIsEnabled( GLenum cap ); GLAPI void GLAPIENTRY glEnableClientState( GLenum cap ); /* 1.1 */ GLAPI void GLAPIENTRY glDisableClientState( GLenum cap ); /* 1.1 */ GLAPI void GLAPIENTRY glGetBooleanv( GLenum pname, GLboolean *params ); GLAPI void GLAPIENTRY glGetDoublev( GLenum pname, GLdouble *params ); GLAPI void GLAPIENTRY glGetFloatv( GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetIntegerv( GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glPushAttrib( GLbitfield mask ); GLAPI void GLAPIENTRY glPopAttrib( void ); GLAPI void GLAPIENTRY glPushClientAttrib( GLbitfield mask ); /* 1.1 */ GLAPI void GLAPIENTRY glPopClientAttrib( void ); /* 1.1 */ GLAPI GLint GLAPIENTRY glRenderMode( GLenum mode ); GLAPI GLenum GLAPIENTRY glGetError( void ); GLAPI const GLubyte* GLAPIENTRY glGetString( GLenum name ); GLAPI void GLAPIENTRY glFinish( void ); GLAPI void GLAPIENTRY glFlush( void ); GLAPI void GLAPIENTRY glHint( GLenum target, GLenum mode ); /* * Depth Buffer */ GLAPI void GLAPIENTRY glClearDepth( GLclampd depth ); GLAPI void GLAPIENTRY glDepthFunc( GLenum func ); GLAPI void GLAPIENTRY glDepthMask( GLboolean flag ); GLAPI void GLAPIENTRY glDepthRange( GLclampd near_val, GLclampd far_val ); /* * Accumulation Buffer */ GLAPI void GLAPIENTRY glClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); GLAPI void GLAPIENTRY glAccum( GLenum op, GLfloat value ); /* * Transformation */ GLAPI void GLAPIENTRY glMatrixMode( GLenum mode ); GLAPI void GLAPIENTRY glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val ); GLAPI void GLAPIENTRY glFrustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val ); GLAPI void GLAPIENTRY glViewport( GLint x, GLint y, GLsizei width, GLsizei height ); GLAPI void GLAPIENTRY glPushMatrix( void ); GLAPI void GLAPIENTRY glPopMatrix( void ); GLAPI void GLAPIENTRY glLoadIdentity( void ); GLAPI void GLAPIENTRY glLoadMatrixd( const GLdouble *m ); GLAPI void GLAPIENTRY glLoadMatrixf( const GLfloat *m ); GLAPI void GLAPIENTRY glMultMatrixd( const GLdouble *m ); GLAPI void GLAPIENTRY glMultMatrixf( const GLfloat *m ); GLAPI void GLAPIENTRY glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ); GLAPI void GLAPIENTRY glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ); GLAPI void GLAPIENTRY glScaled( GLdouble x, GLdouble y, GLdouble z ); GLAPI void GLAPIENTRY glScalef( GLfloat x, GLfloat y, GLfloat z ); GLAPI void GLAPIENTRY glTranslated( GLdouble x, GLdouble y, GLdouble z ); GLAPI void GLAPIENTRY glTranslatef( GLfloat x, GLfloat y, GLfloat z ); /* * Display Lists */ GLAPI GLboolean GLAPIENTRY glIsList( GLuint list ); GLAPI void GLAPIENTRY glDeleteLists( GLuint list, GLsizei range ); GLAPI GLuint GLAPIENTRY glGenLists( GLsizei range ); GLAPI void GLAPIENTRY glNewList( GLuint list, GLenum mode ); GLAPI void GLAPIENTRY glEndList( void ); GLAPI void GLAPIENTRY glCallList( GLuint list ); GLAPI void GLAPIENTRY glCallLists( GLsizei n, GLenum type, const GLvoid *lists ); GLAPI void GLAPIENTRY glListBase( GLuint base ); /* * Drawing Functions */ GLAPI void GLAPIENTRY glBegin( GLenum mode ); GLAPI void GLAPIENTRY glEnd( void ); GLAPI void GLAPIENTRY glVertex2d( GLdouble x, GLdouble y ); GLAPI void GLAPIENTRY glVertex2f( GLfloat x, GLfloat y ); GLAPI void GLAPIENTRY glVertex2i( GLint x, GLint y ); GLAPI void GLAPIENTRY glVertex2s( GLshort x, GLshort y ); GLAPI void GLAPIENTRY glVertex3d( GLdouble x, GLdouble y, GLdouble z ); GLAPI void GLAPIENTRY glVertex3f( GLfloat x, GLfloat y, GLfloat z ); GLAPI void GLAPIENTRY glVertex3i( GLint x, GLint y, GLint z ); GLAPI void GLAPIENTRY glVertex3s( GLshort x, GLshort y, GLshort z ); GLAPI void GLAPIENTRY glVertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); GLAPI void GLAPIENTRY glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); GLAPI void GLAPIENTRY glVertex4i( GLint x, GLint y, GLint z, GLint w ); GLAPI void GLAPIENTRY glVertex4s( GLshort x, GLshort y, GLshort z, GLshort w ); GLAPI void GLAPIENTRY glVertex2dv( const GLdouble *v ); GLAPI void GLAPIENTRY glVertex2fv( const GLfloat *v ); GLAPI void GLAPIENTRY glVertex2iv( const GLint *v ); GLAPI void GLAPIENTRY glVertex2sv( const GLshort *v ); GLAPI void GLAPIENTRY glVertex3dv( const GLdouble *v ); GLAPI void GLAPIENTRY glVertex3fv( const GLfloat *v ); GLAPI void GLAPIENTRY glVertex3iv( const GLint *v ); GLAPI void GLAPIENTRY glVertex3sv( const GLshort *v ); GLAPI void GLAPIENTRY glVertex4dv( const GLdouble *v ); GLAPI void GLAPIENTRY glVertex4fv( const GLfloat *v ); GLAPI void GLAPIENTRY glVertex4iv( const GLint *v ); GLAPI void GLAPIENTRY glVertex4sv( const GLshort *v ); GLAPI void GLAPIENTRY glNormal3b( GLbyte nx, GLbyte ny, GLbyte nz ); GLAPI void GLAPIENTRY glNormal3d( GLdouble nx, GLdouble ny, GLdouble nz ); GLAPI void GLAPIENTRY glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz ); GLAPI void GLAPIENTRY glNormal3i( GLint nx, GLint ny, GLint nz ); GLAPI void GLAPIENTRY glNormal3s( GLshort nx, GLshort ny, GLshort nz ); GLAPI void GLAPIENTRY glNormal3bv( const GLbyte *v ); GLAPI void GLAPIENTRY glNormal3dv( const GLdouble *v ); GLAPI void GLAPIENTRY glNormal3fv( const GLfloat *v ); GLAPI void GLAPIENTRY glNormal3iv( const GLint *v ); GLAPI void GLAPIENTRY glNormal3sv( const GLshort *v ); GLAPI void GLAPIENTRY glIndexd( GLdouble c ); GLAPI void GLAPIENTRY glIndexf( GLfloat c ); GLAPI void GLAPIENTRY glIndexi( GLint c ); GLAPI void GLAPIENTRY glIndexs( GLshort c ); GLAPI void GLAPIENTRY glIndexub( GLubyte c ); /* 1.1 */ GLAPI void GLAPIENTRY glIndexdv( const GLdouble *c ); GLAPI void GLAPIENTRY glIndexfv( const GLfloat *c ); GLAPI void GLAPIENTRY glIndexiv( const GLint *c ); GLAPI void GLAPIENTRY glIndexsv( const GLshort *c ); GLAPI void GLAPIENTRY glIndexubv( const GLubyte *c ); /* 1.1 */ GLAPI void GLAPIENTRY glColor3b( GLbyte red, GLbyte green, GLbyte blue ); GLAPI void GLAPIENTRY glColor3d( GLdouble red, GLdouble green, GLdouble blue ); GLAPI void GLAPIENTRY glColor3f( GLfloat red, GLfloat green, GLfloat blue ); GLAPI void GLAPIENTRY glColor3i( GLint red, GLint green, GLint blue ); GLAPI void GLAPIENTRY glColor3s( GLshort red, GLshort green, GLshort blue ); GLAPI void GLAPIENTRY glColor3ub( GLubyte red, GLubyte green, GLubyte blue ); GLAPI void GLAPIENTRY glColor3ui( GLuint red, GLuint green, GLuint blue ); GLAPI void GLAPIENTRY glColor3us( GLushort red, GLushort green, GLushort blue ); GLAPI void GLAPIENTRY glColor4b( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha ); GLAPI void GLAPIENTRY glColor4d( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha ); GLAPI void GLAPIENTRY glColor4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); GLAPI void GLAPIENTRY glColor4i( GLint red, GLint green, GLint blue, GLint alpha ); GLAPI void GLAPIENTRY glColor4s( GLshort red, GLshort green, GLshort blue, GLshort alpha ); GLAPI void GLAPIENTRY glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha ); GLAPI void GLAPIENTRY glColor4ui( GLuint red, GLuint green, GLuint blue, GLuint alpha ); GLAPI void GLAPIENTRY glColor4us( GLushort red, GLushort green, GLushort blue, GLushort alpha ); GLAPI void GLAPIENTRY glColor3bv( const GLbyte *v ); GLAPI void GLAPIENTRY glColor3dv( const GLdouble *v ); GLAPI void GLAPIENTRY glColor3fv( const GLfloat *v ); GLAPI void GLAPIENTRY glColor3iv( const GLint *v ); GLAPI void GLAPIENTRY glColor3sv( const GLshort *v ); GLAPI void GLAPIENTRY glColor3ubv( const GLubyte *v ); GLAPI void GLAPIENTRY glColor3uiv( const GLuint *v ); GLAPI void GLAPIENTRY glColor3usv( const GLushort *v ); GLAPI void GLAPIENTRY glColor4bv( const GLbyte *v ); GLAPI void GLAPIENTRY glColor4dv( const GLdouble *v ); GLAPI void GLAPIENTRY glColor4fv( const GLfloat *v ); GLAPI void GLAPIENTRY glColor4iv( const GLint *v ); GLAPI void GLAPIENTRY glColor4sv( const GLshort *v ); GLAPI void GLAPIENTRY glColor4ubv( const GLubyte *v ); GLAPI void GLAPIENTRY glColor4uiv( const GLuint *v ); GLAPI void GLAPIENTRY glColor4usv( const GLushort *v ); GLAPI void GLAPIENTRY glTexCoord1d( GLdouble s ); GLAPI void GLAPIENTRY glTexCoord1f( GLfloat s ); GLAPI void GLAPIENTRY glTexCoord1i( GLint s ); GLAPI void GLAPIENTRY glTexCoord1s( GLshort s ); GLAPI void GLAPIENTRY glTexCoord2d( GLdouble s, GLdouble t ); GLAPI void GLAPIENTRY glTexCoord2f( GLfloat s, GLfloat t ); GLAPI void GLAPIENTRY glTexCoord2i( GLint s, GLint t ); GLAPI void GLAPIENTRY glTexCoord2s( GLshort s, GLshort t ); GLAPI void GLAPIENTRY glTexCoord3d( GLdouble s, GLdouble t, GLdouble r ); GLAPI void GLAPIENTRY glTexCoord3f( GLfloat s, GLfloat t, GLfloat r ); GLAPI void GLAPIENTRY glTexCoord3i( GLint s, GLint t, GLint r ); GLAPI void GLAPIENTRY glTexCoord3s( GLshort s, GLshort t, GLshort r ); GLAPI void GLAPIENTRY glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q ); GLAPI void GLAPIENTRY glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q ); GLAPI void GLAPIENTRY glTexCoord4i( GLint s, GLint t, GLint r, GLint q ); GLAPI void GLAPIENTRY glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q ); GLAPI void GLAPIENTRY glTexCoord1dv( const GLdouble *v ); GLAPI void GLAPIENTRY glTexCoord1fv( const GLfloat *v ); GLAPI void GLAPIENTRY glTexCoord1iv( const GLint *v ); GLAPI void GLAPIENTRY glTexCoord1sv( const GLshort *v ); GLAPI void GLAPIENTRY glTexCoord2dv( const GLdouble *v ); GLAPI void GLAPIENTRY glTexCoord2fv( const GLfloat *v ); GLAPI void GLAPIENTRY glTexCoord2iv( const GLint *v ); GLAPI void GLAPIENTRY glTexCoord2sv( const GLshort *v ); GLAPI void GLAPIENTRY glTexCoord3dv( const GLdouble *v ); GLAPI void GLAPIENTRY glTexCoord3fv( const GLfloat *v ); GLAPI void GLAPIENTRY glTexCoord3iv( const GLint *v ); GLAPI void GLAPIENTRY glTexCoord3sv( const GLshort *v ); GLAPI void GLAPIENTRY glTexCoord4dv( const GLdouble *v ); GLAPI void GLAPIENTRY glTexCoord4fv( const GLfloat *v ); GLAPI void GLAPIENTRY glTexCoord4iv( const GLint *v ); GLAPI void GLAPIENTRY glTexCoord4sv( const GLshort *v ); GLAPI void GLAPIENTRY glRasterPos2d( GLdouble x, GLdouble y ); GLAPI void GLAPIENTRY glRasterPos2f( GLfloat x, GLfloat y ); GLAPI void GLAPIENTRY glRasterPos2i( GLint x, GLint y ); GLAPI void GLAPIENTRY glRasterPos2s( GLshort x, GLshort y ); GLAPI void GLAPIENTRY glRasterPos3d( GLdouble x, GLdouble y, GLdouble z ); GLAPI void GLAPIENTRY glRasterPos3f( GLfloat x, GLfloat y, GLfloat z ); GLAPI void GLAPIENTRY glRasterPos3i( GLint x, GLint y, GLint z ); GLAPI void GLAPIENTRY glRasterPos3s( GLshort x, GLshort y, GLshort z ); GLAPI void GLAPIENTRY glRasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); GLAPI void GLAPIENTRY glRasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); GLAPI void GLAPIENTRY glRasterPos4i( GLint x, GLint y, GLint z, GLint w ); GLAPI void GLAPIENTRY glRasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w ); GLAPI void GLAPIENTRY glRasterPos2dv( const GLdouble *v ); GLAPI void GLAPIENTRY glRasterPos2fv( const GLfloat *v ); GLAPI void GLAPIENTRY glRasterPos2iv( const GLint *v ); GLAPI void GLAPIENTRY glRasterPos2sv( const GLshort *v ); GLAPI void GLAPIENTRY glRasterPos3dv( const GLdouble *v ); GLAPI void GLAPIENTRY glRasterPos3fv( const GLfloat *v ); GLAPI void GLAPIENTRY glRasterPos3iv( const GLint *v ); GLAPI void GLAPIENTRY glRasterPos3sv( const GLshort *v ); GLAPI void GLAPIENTRY glRasterPos4dv( const GLdouble *v ); GLAPI void GLAPIENTRY glRasterPos4fv( const GLfloat *v ); GLAPI void GLAPIENTRY glRasterPos4iv( const GLint *v ); GLAPI void GLAPIENTRY glRasterPos4sv( const GLshort *v ); GLAPI void GLAPIENTRY glRectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ); GLAPI void GLAPIENTRY glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ); GLAPI void GLAPIENTRY glRecti( GLint x1, GLint y1, GLint x2, GLint y2 ); GLAPI void GLAPIENTRY glRects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ); GLAPI void GLAPIENTRY glRectdv( const GLdouble *v1, const GLdouble *v2 ); GLAPI void GLAPIENTRY glRectfv( const GLfloat *v1, const GLfloat *v2 ); GLAPI void GLAPIENTRY glRectiv( const GLint *v1, const GLint *v2 ); GLAPI void GLAPIENTRY glRectsv( const GLshort *v1, const GLshort *v2 ); /* * Vertex Arrays (1.1) */ GLAPI void GLAPIENTRY glVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *ptr ); GLAPI void GLAPIENTRY glNormalPointer( GLenum type, GLsizei stride, const GLvoid *ptr ); GLAPI void GLAPIENTRY glColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *ptr ); GLAPI void GLAPIENTRY glIndexPointer( GLenum type, GLsizei stride, const GLvoid *ptr ); GLAPI void GLAPIENTRY glTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *ptr ); GLAPI void GLAPIENTRY glEdgeFlagPointer( GLsizei stride, const GLvoid *ptr ); GLAPI void GLAPIENTRY glGetPointerv( GLenum pname, void **params ); GLAPI void GLAPIENTRY glArrayElement( GLint i ); GLAPI void GLAPIENTRY glDrawArrays( GLenum mode, GLint first, GLsizei count ); GLAPI void GLAPIENTRY glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices ); GLAPI void GLAPIENTRY glInterleavedArrays( GLenum format, GLsizei stride, const GLvoid *pointer ); /* * Lighting */ GLAPI void GLAPIENTRY glShadeModel( GLenum mode ); GLAPI void GLAPIENTRY glLightf( GLenum light, GLenum pname, GLfloat param ); GLAPI void GLAPIENTRY glLighti( GLenum light, GLenum pname, GLint param ); GLAPI void GLAPIENTRY glLightfv( GLenum light, GLenum pname, const GLfloat *params ); GLAPI void GLAPIENTRY glLightiv( GLenum light, GLenum pname, const GLint *params ); GLAPI void GLAPIENTRY glGetLightfv( GLenum light, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetLightiv( GLenum light, GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glLightModelf( GLenum pname, GLfloat param ); GLAPI void GLAPIENTRY glLightModeli( GLenum pname, GLint param ); GLAPI void GLAPIENTRY glLightModelfv( GLenum pname, const GLfloat *params ); GLAPI void GLAPIENTRY glLightModeliv( GLenum pname, const GLint *params ); GLAPI void GLAPIENTRY glMaterialf( GLenum face, GLenum pname, GLfloat param ); GLAPI void GLAPIENTRY glMateriali( GLenum face, GLenum pname, GLint param ); GLAPI void GLAPIENTRY glMaterialfv( GLenum face, GLenum pname, const GLfloat *params ); GLAPI void GLAPIENTRY glMaterialiv( GLenum face, GLenum pname, const GLint *params ); GLAPI void GLAPIENTRY glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetMaterialiv( GLenum face, GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glColorMaterial( GLenum face, GLenum mode ); /* * Raster functions */ GLAPI void GLAPIENTRY glPixelZoom( GLfloat xfactor, GLfloat yfactor ); GLAPI void GLAPIENTRY glPixelStoref( GLenum pname, GLfloat param ); GLAPI void GLAPIENTRY glPixelStorei( GLenum pname, GLint param ); GLAPI void GLAPIENTRY glPixelTransferf( GLenum pname, GLfloat param ); GLAPI void GLAPIENTRY glPixelTransferi( GLenum pname, GLint param ); GLAPI void GLAPIENTRY glPixelMapfv( GLenum map, GLint mapsize, const GLfloat *values ); GLAPI void GLAPIENTRY glPixelMapuiv( GLenum map, GLint mapsize, const GLuint *values ); GLAPI void GLAPIENTRY glPixelMapusv( GLenum map, GLint mapsize, const GLushort *values ); GLAPI void GLAPIENTRY glGetPixelMapfv( GLenum map, GLfloat *values ); GLAPI void GLAPIENTRY glGetPixelMapuiv( GLenum map, GLuint *values ); GLAPI void GLAPIENTRY glGetPixelMapusv( GLenum map, GLushort *values ); GLAPI void GLAPIENTRY glBitmap( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap ); GLAPI void GLAPIENTRY glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ); GLAPI void GLAPIENTRY glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ); GLAPI void GLAPIENTRY glCopyPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type ); /* * Stenciling */ GLAPI void GLAPIENTRY glStencilFunc( GLenum func, GLint ref, GLuint mask ); GLAPI void GLAPIENTRY glStencilMask( GLuint mask ); GLAPI void GLAPIENTRY glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ); GLAPI void GLAPIENTRY glClearStencil( GLint s ); /* * Texture mapping */ GLAPI void GLAPIENTRY glTexGend( GLenum coord, GLenum pname, GLdouble param ); GLAPI void GLAPIENTRY glTexGenf( GLenum coord, GLenum pname, GLfloat param ); GLAPI void GLAPIENTRY glTexGeni( GLenum coord, GLenum pname, GLint param ); GLAPI void GLAPIENTRY glTexGendv( GLenum coord, GLenum pname, const GLdouble *params ); GLAPI void GLAPIENTRY glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params ); GLAPI void GLAPIENTRY glTexGeniv( GLenum coord, GLenum pname, const GLint *params ); GLAPI void GLAPIENTRY glGetTexGendv( GLenum coord, GLenum pname, GLdouble *params ); GLAPI void GLAPIENTRY glGetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetTexGeniv( GLenum coord, GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glTexEnvf( GLenum target, GLenum pname, GLfloat param ); GLAPI void GLAPIENTRY glTexEnvi( GLenum target, GLenum pname, GLint param ); GLAPI void GLAPIENTRY glTexEnvfv( GLenum target, GLenum pname, const GLfloat *params ); GLAPI void GLAPIENTRY glTexEnviv( GLenum target, GLenum pname, const GLint *params ); GLAPI void GLAPIENTRY glGetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetTexEnviv( GLenum target, GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glTexParameterf( GLenum target, GLenum pname, GLfloat param ); GLAPI void GLAPIENTRY glTexParameteri( GLenum target, GLenum pname, GLint param ); GLAPI void GLAPIENTRY glTexParameterfv( GLenum target, GLenum pname, const GLfloat *params ); GLAPI void GLAPIENTRY glTexParameteriv( GLenum target, GLenum pname, const GLint *params ); GLAPI void GLAPIENTRY glGetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetTexParameteriv( GLenum target, GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glGetTexLevelParameterfv( GLenum target, GLint level, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetTexLevelParameteriv( GLenum target, GLint level, GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glTexImage1D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); GLAPI void GLAPIENTRY glTexImage2D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); GLAPI void GLAPIENTRY glGetTexImage( GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels ); /* 1.1 functions */ GLAPI void GLAPIENTRY glGenTextures( GLsizei n, GLuint *textures ); GLAPI void GLAPIENTRY glDeleteTextures( GLsizei n, const GLuint *textures ); GLAPI void GLAPIENTRY glBindTexture( GLenum target, GLuint texture ); GLAPI void GLAPIENTRY glPrioritizeTextures( GLsizei n, const GLuint *textures, const GLclampf *priorities ); GLAPI GLboolean GLAPIENTRY glAreTexturesResident( GLsizei n, const GLuint *textures, GLboolean *residences ); GLAPI GLboolean GLAPIENTRY glIsTexture( GLuint texture ); GLAPI void GLAPIENTRY glTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels ); GLAPI void GLAPIENTRY glTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ); GLAPI void GLAPIENTRY glCopyTexImage1D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border ); GLAPI void GLAPIENTRY glCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border ); GLAPI void GLAPIENTRY glCopyTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width ); GLAPI void GLAPIENTRY glCopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height ); /* * Evaluators */ GLAPI void GLAPIENTRY glMap1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points ); GLAPI void GLAPIENTRY glMap1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points ); GLAPI void GLAPIENTRY glMap2d( GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points ); GLAPI void GLAPIENTRY glMap2f( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points ); GLAPI void GLAPIENTRY glGetMapdv( GLenum target, GLenum query, GLdouble *v ); GLAPI void GLAPIENTRY glGetMapfv( GLenum target, GLenum query, GLfloat *v ); GLAPI void GLAPIENTRY glGetMapiv( GLenum target, GLenum query, GLint *v ); GLAPI void GLAPIENTRY glEvalCoord1d( GLdouble u ); GLAPI void GLAPIENTRY glEvalCoord1f( GLfloat u ); GLAPI void GLAPIENTRY glEvalCoord1dv( const GLdouble *u ); GLAPI void GLAPIENTRY glEvalCoord1fv( const GLfloat *u ); GLAPI void GLAPIENTRY glEvalCoord2d( GLdouble u, GLdouble v ); GLAPI void GLAPIENTRY glEvalCoord2f( GLfloat u, GLfloat v ); GLAPI void GLAPIENTRY glEvalCoord2dv( const GLdouble *u ); GLAPI void GLAPIENTRY glEvalCoord2fv( const GLfloat *u ); GLAPI void GLAPIENTRY glMapGrid1d( GLint un, GLdouble u1, GLdouble u2 ); GLAPI void GLAPIENTRY glMapGrid1f( GLint un, GLfloat u1, GLfloat u2 ); GLAPI void GLAPIENTRY glMapGrid2d( GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2 ); GLAPI void GLAPIENTRY glMapGrid2f( GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2 ); GLAPI void GLAPIENTRY glEvalPoint1( GLint i ); GLAPI void GLAPIENTRY glEvalPoint2( GLint i, GLint j ); GLAPI void GLAPIENTRY glEvalMesh1( GLenum mode, GLint i1, GLint i2 ); GLAPI void GLAPIENTRY glEvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); /* * Fog */ GLAPI void GLAPIENTRY glFogf( GLenum pname, GLfloat param ); GLAPI void GLAPIENTRY glFogi( GLenum pname, GLint param ); GLAPI void GLAPIENTRY glFogfv( GLenum pname, const GLfloat *params ); GLAPI void GLAPIENTRY glFogiv( GLenum pname, const GLint *params ); /* * Selection and Feedback */ GLAPI void GLAPIENTRY glFeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ); GLAPI void GLAPIENTRY glPassThrough( GLfloat token ); GLAPI void GLAPIENTRY glSelectBuffer( GLsizei size, GLuint *buffer ); GLAPI void GLAPIENTRY glInitNames( void ); GLAPI void GLAPIENTRY glLoadName( GLuint name ); GLAPI void GLAPIENTRY glPushName( GLuint name ); GLAPI void GLAPIENTRY glPopName( void ); /* * Extensions */ /* GL_EXT_blend_minmax */ GLAPI void GLAPIENTRY glBlendEquationEXT( GLenum mode ); /* GL_EXT_blend_color */ GLAPI void GLAPIENTRY glBlendColorEXT( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); /* GL_EXT_polygon_offset */ GLAPI void GLAPIENTRY glPolygonOffsetEXT( GLfloat factor, GLfloat bias ); /* GL_EXT_vertex_array */ GLAPI void GLAPIENTRY glVertexPointerEXT( GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr ); GLAPI void GLAPIENTRY glNormalPointerEXT( GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr ); GLAPI void GLAPIENTRY glColorPointerEXT( GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr ); GLAPI void GLAPIENTRY glIndexPointerEXT( GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr ); GLAPI void GLAPIENTRY glTexCoordPointerEXT( GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr ); GLAPI void GLAPIENTRY glEdgeFlagPointerEXT( GLsizei stride, GLsizei count, const GLboolean *ptr ); GLAPI void GLAPIENTRY glGetPointervEXT( GLenum pname, void **params ); GLAPI void GLAPIENTRY glArrayElementEXT( GLint i ); GLAPI void GLAPIENTRY glDrawArraysEXT( GLenum mode, GLint first, GLsizei count ); /* GL_EXT_texture_object */ GLAPI void GLAPIENTRY glGenTexturesEXT( GLsizei n, GLuint *textures ); GLAPI void GLAPIENTRY glDeleteTexturesEXT( GLsizei n, const GLuint *textures ); GLAPI void GLAPIENTRY glBindTextureEXT( GLenum target, GLuint texture ); GLAPI void GLAPIENTRY glPrioritizeTexturesEXT( GLsizei n, const GLuint *textures, const GLclampf *priorities ); GLAPI GLboolean GLAPIENTRY glAreTexturesResidentEXT( GLsizei n, const GLuint *textures, GLboolean *residences ); GLAPI GLboolean GLAPIENTRY glIsTextureEXT( GLuint texture ); /* GL_EXT_texture3D */ GLAPI void GLAPIENTRY glTexImage3DEXT( GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); GLAPI void GLAPIENTRY glTexSubImage3DEXT( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels ); GLAPI void GLAPIENTRY glCopyTexSubImage3DEXT( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ); /* GL_EXT_color_table */ GLAPI void GLAPIENTRY glColorTableEXT( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table ); GLAPI void GLAPIENTRY glColorSubTableEXT( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data ); GLAPI void GLAPIENTRY glGetColorTableEXT( GLenum target, GLenum format, GLenum type, GLvoid *table ); GLAPI void GLAPIENTRY glGetColorTableParameterfvEXT( GLenum target, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetColorTableParameterivEXT( GLenum target, GLenum pname, GLint *params ); /* GL_ARB_multitexture */ GLAPI void GLAPIENTRY glActiveTextureARB( GLenum texture ); GLAPI void GLAPIENTRY glClientActiveTextureARB( GLenum texture ); GLAPI void GLAPIENTRY glMultiTexCoord1dARB( GLenum target, GLdouble s ); GLAPI void GLAPIENTRY glMultiTexCoord1dvARB( GLenum target, const GLdouble *v ); GLAPI void GLAPIENTRY glMultiTexCoord1fARB( GLenum target, GLfloat s ); GLAPI void GLAPIENTRY glMultiTexCoord1fvARB( GLenum target, const GLfloat *v ); GLAPI void GLAPIENTRY glMultiTexCoord1iARB( GLenum target, GLint s ); GLAPI void GLAPIENTRY glMultiTexCoord1ivARB( GLenum target, const GLint *v ); GLAPI void GLAPIENTRY glMultiTexCoord1sARB( GLenum target, GLshort s ); GLAPI void GLAPIENTRY glMultiTexCoord1svARB( GLenum target, const GLshort *v ); GLAPI void GLAPIENTRY glMultiTexCoord2dARB( GLenum target, GLdouble s, GLdouble t ); GLAPI void GLAPIENTRY glMultiTexCoord2dvARB( GLenum target, const GLdouble *v ); GLAPI void GLAPIENTRY glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t ); GLAPI void GLAPIENTRY glMultiTexCoord2fvARB( GLenum target, const GLfloat *v ); GLAPI void GLAPIENTRY glMultiTexCoord2iARB( GLenum target, GLint s, GLint t ); GLAPI void GLAPIENTRY glMultiTexCoord2ivARB( GLenum target, const GLint *v ); GLAPI void GLAPIENTRY glMultiTexCoord2sARB( GLenum target, GLshort s, GLshort t ); GLAPI void GLAPIENTRY glMultiTexCoord2svARB( GLenum target, const GLshort *v ); GLAPI void GLAPIENTRY glMultiTexCoord3dARB( GLenum target, GLdouble s, GLdouble t, GLdouble r ); GLAPI void GLAPIENTRY glMultiTexCoord3dvARB( GLenum target, const GLdouble *v ); GLAPI void GLAPIENTRY glMultiTexCoord3fARB( GLenum target, GLfloat s, GLfloat t, GLfloat r ); GLAPI void GLAPIENTRY glMultiTexCoord3fvARB( GLenum target, const GLfloat *v ); GLAPI void GLAPIENTRY glMultiTexCoord3iARB( GLenum target, GLint s, GLint t, GLint r ); GLAPI void GLAPIENTRY glMultiTexCoord3ivARB( GLenum target, const GLint *v ); GLAPI void GLAPIENTRY glMultiTexCoord3sARB( GLenum target, GLshort s, GLshort t, GLshort r ); GLAPI void GLAPIENTRY glMultiTexCoord3svARB( GLenum target, const GLshort *v ); GLAPI void GLAPIENTRY glMultiTexCoord4dARB( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ); GLAPI void GLAPIENTRY glMultiTexCoord4dvARB( GLenum target, const GLdouble *v ); GLAPI void GLAPIENTRY glMultiTexCoord4fARB( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ); GLAPI void GLAPIENTRY glMultiTexCoord4fvARB( GLenum target, const GLfloat *v ); GLAPI void GLAPIENTRY glMultiTexCoord4iARB( GLenum target, GLint s, GLint t, GLint r, GLint q ); GLAPI void GLAPIENTRY glMultiTexCoord4ivARB( GLenum target, const GLint *v ); GLAPI void GLAPIENTRY glMultiTexCoord4sARB( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ); GLAPI void GLAPIENTRY glMultiTexCoord4svARB( GLenum target, const GLshort *v ); /* GL_EXT_point_parameters */ GLAPI void GLAPIENTRY glPointParameterfEXT( GLenum pname, GLfloat param ); GLAPI void GLAPIENTRY glPointParameterfvEXT( GLenum pname, const GLfloat *params ); /* GL_INGR_blend_func_separate */ GLAPI void GLAPIENTRY glBlendFuncSeparateINGR( GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha ); /* 1.2 functions */ GLAPI void GLAPIENTRY glDrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); GLAPI void GLAPIENTRY glTexImage3D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); GLAPI void GLAPIENTRY glTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels ); GLAPI void GLAPIENTRY glCopyTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ); /* 1.2 imaging extension functions */ GLAPI void GLAPIENTRY glColorTable( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table ); GLAPI void GLAPIENTRY glColorSubTable( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data ); GLAPI void GLAPIENTRY glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params ); GLAPI void GLAPIENTRY glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params ); GLAPI void GLAPIENTRY glCopyColorSubTable( GLenum target, GLsizei start, GLint x, GLint y, GLsizei width ); GLAPI void GLAPIENTRY glCopyColorTable( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ); GLAPI void GLAPIENTRY glGetColorTable( GLenum target, GLenum format, GLenum type, GLvoid *table ); GLAPI void GLAPIENTRY glGetColorTableParameterfv( GLenum target, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetColorTableParameteriv( GLenum target, GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glBlendEquation( GLenum mode ); GLAPI void GLAPIENTRY glBlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); GLAPI void GLAPIENTRY glHistogram( GLenum target, GLsizei width, GLenum internalformat, GLboolean sink ); GLAPI void GLAPIENTRY glResetHistogram( GLenum target ); GLAPI void GLAPIENTRY glGetHistogram( GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values ); GLAPI void GLAPIENTRY glGetHistogramParameterfv( GLenum target, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetHistogramParameteriv( GLenum target, GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glMinmax( GLenum target, GLenum internalformat, GLboolean sink ); GLAPI void GLAPIENTRY glResetMinmax( GLenum target ); GLAPI void GLAPIENTRY glGetMinmax( GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values ); GLAPI void GLAPIENTRY glGetMinmaxParameterfv( GLenum target, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetMinmaxParameteriv( GLenum target, GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glConvolutionFilter1D( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image ); GLAPI void GLAPIENTRY glConvolutionFilter2D( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image ); GLAPI void GLAPIENTRY glConvolutionParameterf( GLenum target, GLenum pname, GLfloat params ); GLAPI void GLAPIENTRY glConvolutionParameterfv( GLenum target, GLenum pname, const GLfloat *params ); GLAPI void GLAPIENTRY glConvolutionParameteri( GLenum target, GLenum pname, GLint params ); GLAPI void GLAPIENTRY glConvolutionParameteriv( GLenum target, GLenum pname, const GLint *params ); GLAPI void GLAPIENTRY glCopyConvolutionFilter1D( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ); GLAPI void GLAPIENTRY glCopyConvolutionFilter2D( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height ); GLAPI void GLAPIENTRY glGetConvolutionFilter( GLenum target, GLenum format, GLenum type, GLvoid *image ); GLAPI void GLAPIENTRY glGetConvolutionParameterfv( GLenum target, GLenum pname, GLfloat *params ); GLAPI void GLAPIENTRY glGetConvolutionParameteriv( GLenum target, GLenum pname, GLint *params ); GLAPI void GLAPIENTRY glSeparableFilter2D( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column ); GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); /* GL_EXT_compiled_vertex_array */ GLAPI void GLAPIENTRY glLockArraysEXT( GLint first, GLsizei count ); GLAPI void GLAPIENTRY glUnlockArraysEXT( void ); /* GL_PGI_misc_hints */ GLAPI void GLAPIENTRY glHintPGI( GLenum target, GLint mode ); esdl-1.3.1/api_gen/glufuncs0000775000070100000120000001726212200143736014273 0ustar dguduucp /* * * Miscellaneous functions * */ GLUAPI void GLAPIENTRY gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz ); GLUAPI void GLAPIENTRY gluOrtho2D( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top ); GLUAPI void GLAPIENTRY gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ); GLUAPI void GLAPIENTRY gluPickMatrix( GLdouble x, GLdouble y, GLdouble width, GLdouble height, const GLint viewport[4] ); GLUAPI GLint GLAPIENTRY gluProject( GLdouble objx, GLdouble objy, GLdouble objz, const GLdouble modelMatrix[16], const GLdouble projMatrix[16], const GLint viewport[4], GLdouble *winx, GLdouble *winy, GLdouble *winz ); GLUAPI GLint GLAPIENTRY gluUnProject( GLdouble winx, GLdouble winy, GLdouble winz, const GLdouble modelMatrix[16], const GLdouble projMatrix[16], const GLint viewport[4], GLdouble *objx, GLdouble *objy, GLdouble *objz ); GLUAPI const GLubyte* GLAPIENTRY gluErrorString( GLenum errorCode ); /* * *Mipmapping and image scaling * */ GLUAPI GLint GLAPIENTRY gluScaleImage( GLenum format, GLsizei widthin, GLsizei heightin, GLenum typein, const void *datain, GLsizei widthout, GLsizei heightout, GLenum typeout, void *dataout ); GLUAPI GLint GLAPIENTRY gluBuild1DMipmaps( GLenum target, GLint components, GLsizei width, GLenum format, GLenum type, const void *data ); GLUAPI GLint GLAPIENTRY gluBuild2DMipmaps( GLenum target, GLint components, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data ); /* * *Quadrics * */ GLUAPI GLUquadricObj* GLAPIENTRY gluNewQuadric( void ); GLUAPI void GLAPIENTRY gluDeleteQuadric( GLUquadricObj *state ); GLUAPI void GLAPIENTRY gluQuadricDrawStyle( GLUquadricObj *quadObject, GLenum drawStyle ); GLUAPI void GLAPIENTRY gluQuadricOrientation( GLUquadricObj *quadObject, GLenum orientation ); GLUAPI void GLAPIENTRY gluQuadricNormals( GLUquadricObj *quadObject, GLenum normals ); GLUAPI void GLAPIENTRY gluQuadricTexture( GLUquadricObj *quadObject, GLboolean textureCoords ); GLUAPI void GLAPIENTRY gluQuadricCallback( GLUquadricObj *qobj, GLenum which, void (GLCALLBACK *fn)() ); GLUAPI void GLAPIENTRY gluCylinder( GLUquadricObj *qobj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks ); GLUAPI void GLAPIENTRY gluSphere( GLUquadricObj *qobj, GLdouble radius, GLint slices, GLint stacks ); GLUAPI void GLAPIENTRY gluDisk( GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops ); GLUAPI void GLAPIENTRY gluPartialDisk( GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops, GLdouble startAngle, GLdouble sweepAngle ); /* * *Nurbs * */ GLUAPI GLUnurbsObj* GLAPIENTRY gluNewNurbsRenderer( void ); GLUAPI void GLAPIENTRY gluDeleteNurbsRenderer( GLUnurbsObj *nobj ); GLUAPI void GLAPIENTRY gluLoadSamplingMatrices( GLUnurbsObj *nobj, const GLfloat modelMatrix[16], const GLfloat projMatrix[16], const GLint viewport[4] ); GLUAPI void GLAPIENTRY gluNurbsProperty( GLUnurbsObj *nobj, GLenum property, GLfloat value ); GLUAPI void GLAPIENTRY gluGetNurbsProperty( GLUnurbsObj *nobj, GLenum property, GLfloat *value ); GLUAPI void GLAPIENTRY gluBeginCurve( GLUnurbsObj *nobj ); GLUAPI void GLAPIENTRY gluEndCurve( GLUnurbsObj *nobj ); GLUAPI void GLAPIENTRY gluNurbsCurve( GLUnurbsObj *nobj, GLint nknots, GLfloat *knot, GLint stride, GLfloat *ctlarray, GLint order, GLenum type ); GLUAPI void GLAPIENTRY gluBeginSurface( GLUnurbsObj *nobj ); GLUAPI void GLAPIENTRY gluEndSurface( GLUnurbsObj *nobj ); GLUAPI void GLAPIENTRY gluNurbsSurface( GLUnurbsObj *nobj, GLint sknot_count, GLfloat *sknot, GLint tknot_count, GLfloat *tknot, GLint s_stride, GLint t_stride, GLfloat *ctlarray, GLint sorder, GLint torder, GLenum type ); GLUAPI void GLAPIENTRY gluBeginTrim( GLUnurbsObj *nobj ); GLUAPI void GLAPIENTRY gluEndTrim( GLUnurbsObj *nobj ); GLUAPI void GLAPIENTRY gluPwlCurve( GLUnurbsObj *nobj, GLint count, GLfloat *array, GLint stride, GLenum type ); GLUAPI void GLAPIENTRY gluNurbsCallback( GLUnurbsObj *nobj, GLenum which, void (GLCALLBACK *fn)() ); /* * *Polygon tessellation * */ GLUAPI GLUtesselator* GLAPIENTRY gluNewTess( void ); GLUAPI void GLAPIENTRY gluDeleteTess( GLUtesselator *tobj ); GLUAPI void GLAPIENTRY gluTessBeginPolygon( GLUtesselator *tobj, void *polygon_data ); GLUAPI void GLAPIENTRY gluTessBeginContour( GLUtesselator *tobj ); GLUAPI void GLAPIENTRY gluTessVertex( GLUtesselator *tobj, GLdouble coords[3], void *vertex_data ); GLUAPI void GLAPIENTRY gluTessEndContour( GLUtesselator *tobj ); GLUAPI void GLAPIENTRY gluTessEndPolygon( GLUtesselator *tobj ); GLUAPI void GLAPIENTRY gluTessProperty( GLUtesselator *tobj, GLenum which, GLdouble value ); GLUAPI void GLAPIENTRY gluTessNormal( GLUtesselator *tobj, GLdouble x, GLdouble y, GLdouble z ); GLUAPI void GLAPIENTRY gluTessCallback( GLUtesselator *tobj, GLenum which, void (GLCALLBACK *fn)() ); GLUAPI void GLAPIENTRY gluGetTessProperty( GLUtesselator *tobj, GLenum which, GLdouble *value ); /* * *Obsolete 1.0 tessellation functions * */ GLUAPI void GLAPIENTRY gluBeginPolygon( GLUtesselator *tobj ); GLUAPI void GLAPIENTRY gluNextContour( GLUtesselator *tobj, GLenum type ); GLUAPI void GLAPIENTRY gluEndPolygon( GLUtesselator *tobj ); /* * *New functions in GLU 1.1 * */ GLUAPI const GLubyte* GLAPIENTRY gluGetString( GLenum name ); /* * *GLU 1.3 functions * */ GLUAPI GLboolean GLAPIENTRY gluCheckExtension( const char *extName, const GLubyte *extString ); esdl-1.3.1/api_gen/gldefs0000775000070100000120000006403612200143736013712 0ustar dguduucptypedef enum { /* Boolean values */ GL_FALSE = 0, GL_TRUE = 1, /* Data types */ GL_BYTE = 0x1400, GL_UNSIGNED_BYTE = 0x1401, GL_SHORT = 0x1402, GL_UNSIGNED_SHORT = 0x1403, GL_INT = 0x1404, GL_UNSIGNED_INT = 0x1405, GL_FLOAT = 0x1406, GL_DOUBLE = 0x140A, GL_2_BYTES = 0x1407, GL_3_BYTES = 0x1408, GL_4_BYTES = 0x1409, /* Primitives */ GL_POINTS = 0x0000, GL_LINES = 0x0001, GL_LINE_LOOP = 0x0002, GL_LINE_STRIP = 0x0003, GL_TRIANGLES = 0x0004, GL_TRIANGLE_STRIP = 0x0005, GL_TRIANGLE_FAN = 0x0006, GL_QUADS = 0x0007, GL_QUAD_STRIP = 0x0008, GL_POLYGON = 0x0009, /* Vertex Arrays */ GL_VERTEX_ARRAY = 0x8074, GL_NORMAL_ARRAY = 0x8075, GL_COLOR_ARRAY = 0x8076, GL_INDEX_ARRAY = 0x8077, GL_TEXTURE_COORD_ARRAY = 0x8078, GL_EDGE_FLAG_ARRAY = 0x8079, GL_VERTEX_ARRAY_SIZE = 0x807A, GL_VERTEX_ARRAY_TYPE = 0x807B, GL_VERTEX_ARRAY_STRIDE = 0x807C, GL_NORMAL_ARRAY_TYPE = 0x807E, GL_NORMAL_ARRAY_STRIDE = 0x807F, GL_COLOR_ARRAY_SIZE = 0x8081, GL_COLOR_ARRAY_TYPE = 0x8082, GL_COLOR_ARRAY_STRIDE = 0x8083, GL_INDEX_ARRAY_TYPE = 0x8085, GL_INDEX_ARRAY_STRIDE = 0x8086, GL_TEXTURE_COORD_ARRAY_SIZE = 0x8088, GL_TEXTURE_COORD_ARRAY_TYPE = 0x8089, GL_TEXTURE_COORD_ARRAY_STRIDE = 0x808A, GL_EDGE_FLAG_ARRAY_STRIDE = 0x808C, GL_VERTEX_ARRAY_POINTER = 0x808E, GL_NORMAL_ARRAY_POINTER = 0x808F, GL_COLOR_ARRAY_POINTER = 0x8090, GL_INDEX_ARRAY_POINTER = 0x8091, GL_TEXTURE_COORD_ARRAY_POINTER = 0x8092, GL_EDGE_FLAG_ARRAY_POINTER = 0x8093, GL_V2F = 0x2A20, GL_V3F = 0x2A21, GL_C4UB_V2F = 0x2A22, GL_C4UB_V3F = 0x2A23, GL_C3F_V3F = 0x2A24, GL_N3F_V3F = 0x2A25, GL_C4F_N3F_V3F = 0x2A26, GL_T2F_V3F = 0x2A27, GL_T4F_V4F = 0x2A28, GL_T2F_C4UB_V3F = 0x2A29, GL_T2F_C3F_V3F = 0x2A2A, GL_T2F_N3F_V3F = 0x2A2B, GL_T2F_C4F_N3F_V3F = 0x2A2C, GL_T4F_C4F_N3F_V4F = 0x2A2D, /* Matrix Mode */ GL_MATRIX_MODE = 0x0BA0, GL_MODELVIEW = 0x1700, GL_PROJECTION = 0x1701, GL_TEXTURE = 0x1702, /* Points */ GL_POINT_SMOOTH = 0x0B10, GL_POINT_SIZE = 0x0B11, GL_POINT_SIZE_GRANULARITY = 0x0B13, GL_POINT_SIZE_RANGE = 0x0B12, /* Lines */ GL_LINE_SMOOTH = 0x0B20, GL_LINE_STIPPLE = 0x0B24, GL_LINE_STIPPLE_PATTERN = 0x0B25, GL_LINE_STIPPLE_REPEAT = 0x0B26, GL_LINE_WIDTH = 0x0B21, GL_LINE_WIDTH_GRANULARITY = 0x0B23, GL_LINE_WIDTH_RANGE = 0x0B22, /* Polygons */ GL_POINT = 0x1B00, GL_LINE = 0x1B01, GL_FILL = 0x1B02, GL_CW = 0x0900, GL_CCW = 0x0901, GL_FRONT = 0x0404, GL_BACK = 0x0405, GL_POLYGON_MODE = 0x0B40, GL_POLYGON_SMOOTH = 0x0B41, GL_POLYGON_STIPPLE = 0x0B42, GL_EDGE_FLAG = 0x0B43, GL_CULL_FACE = 0x0B44, GL_CULL_FACE_MODE = 0x0B45, GL_FRONT_FACE = 0x0B46, GL_POLYGON_OFFSET_FACTOR = 0x8038, GL_POLYGON_OFFSET_UNITS = 0x2A00, GL_POLYGON_OFFSET_POINT = 0x2A01, GL_POLYGON_OFFSET_LINE = 0x2A02, GL_POLYGON_OFFSET_FILL = 0x8037, /* Display Lists */ GL_COMPILE = 0x1300, GL_COMPILE_AND_EXECUTE = 0x1301, GL_LIST_BASE = 0x0B32, GL_LIST_INDEX = 0x0B33, GL_LIST_MODE = 0x0B30, /* Depth buffer */ GL_NEVER = 0x0200, GL_LESS = 0x0201, GL_GEQUAL = 0x0206, GL_LEQUAL = 0x0203, GL_GREATER = 0x0204, GL_NOTEQUAL = 0x0205, GL_EQUAL = 0x0202, GL_ALWAYS = 0x0207, GL_DEPTH_TEST = 0x0B71, GL_DEPTH_BITS = 0x0D56, GL_DEPTH_CLEAR_VALUE = 0x0B73, GL_DEPTH_FUNC = 0x0B74, GL_DEPTH_RANGE = 0x0B70, GL_DEPTH_WRITEMASK = 0x0B72, GL_DEPTH_COMPONENT = 0x1902, /* Lighting */ GL_LIGHTING = 0x0B50, GL_LIGHT0 = 0x4000, GL_LIGHT1 = 0x4001, GL_LIGHT2 = 0x4002, GL_LIGHT3 = 0x4003, GL_LIGHT4 = 0x4004, GL_LIGHT5 = 0x4005, GL_LIGHT6 = 0x4006, GL_LIGHT7 = 0x4007, GL_SPOT_EXPONENT = 0x1205, GL_SPOT_CUTOFF = 0x1206, GL_CONSTANT_ATTENUATION = 0x1207, GL_LINEAR_ATTENUATION = 0x1208, GL_QUADRATIC_ATTENUATION = 0x1209, GL_AMBIENT = 0x1200, GL_DIFFUSE = 0x1201, GL_SPECULAR = 0x1202, GL_SHININESS = 0x1601, GL_EMISSION = 0x1600, GL_POSITION = 0x1203, GL_SPOT_DIRECTION = 0x1204, GL_AMBIENT_AND_DIFFUSE = 0x1602, GL_COLOR_INDEXES = 0x1603, GL_LIGHT_MODEL_TWO_SIDE = 0x0B52, GL_LIGHT_MODEL_LOCAL_VIEWER = 0x0B51, GL_LIGHT_MODEL_AMBIENT = 0x0B53, GL_FRONT_AND_BACK = 0x0408, GL_SHADE_MODEL = 0x0B54, GL_FLAT = 0x1D00, GL_SMOOTH = 0x1D01, GL_COLOR_MATERIAL = 0x0B57, GL_COLOR_MATERIAL_FACE = 0x0B55, GL_COLOR_MATERIAL_PARAMETER = 0x0B56, GL_NORMALIZE = 0x0BA1, /* User clipping planes */ GL_CLIP_PLANE0 = 0x3000, GL_CLIP_PLANE1 = 0x3001, GL_CLIP_PLANE2 = 0x3002, GL_CLIP_PLANE3 = 0x3003, GL_CLIP_PLANE4 = 0x3004, GL_CLIP_PLANE5 = 0x3005, /* Accumulation buffer */ GL_ACCUM_RED_BITS = 0x0D58, GL_ACCUM_GREEN_BITS = 0x0D59, GL_ACCUM_BLUE_BITS = 0x0D5A, GL_ACCUM_ALPHA_BITS = 0x0D5B, GL_ACCUM_CLEAR_VALUE = 0x0B80, GL_ACCUM = 0x0100, GL_ADD = 0x0104, GL_LOAD = 0x0101, GL_MULT = 0x0103, GL_RETURN = 0x0102, /* Alpha testing */ GL_ALPHA_TEST = 0x0BC0, GL_ALPHA_TEST_REF = 0x0BC2, GL_ALPHA_TEST_FUNC = 0x0BC1, /* Blending */ GL_BLEND = 0x0BE2, GL_BLEND_SRC = 0x0BE1, GL_BLEND_DST = 0x0BE0, GL_ZERO = 0, GL_ONE = 1, GL_SRC_COLOR = 0x0300, GL_ONE_MINUS_SRC_COLOR = 0x0301, GL_DST_COLOR = 0x0306, GL_ONE_MINUS_DST_COLOR = 0x0307, GL_SRC_ALPHA = 0x0302, GL_ONE_MINUS_SRC_ALPHA = 0x0303, GL_DST_ALPHA = 0x0304, GL_ONE_MINUS_DST_ALPHA = 0x0305, GL_SRC_ALPHA_SATURATE = 0x0308, GL_CONSTANT_COLOR = 0x8001, GL_ONE_MINUS_CONSTANT_COLOR = 0x8002, GL_CONSTANT_ALPHA = 0x8003, GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004, /* Render Mode */ GL_FEEDBACK = 0x1C01, GL_RENDER = 0x1C00, GL_SELECT = 0x1C02, /* Feedback */ GL_2D = 0x0600, GL_3D = 0x0601, GL_3D_COLOR = 0x0602, GL_3D_COLOR_TEXTURE = 0x0603, GL_4D_COLOR_TEXTURE = 0x0604, GL_POINT_TOKEN = 0x0701, GL_LINE_TOKEN = 0x0702, GL_LINE_RESET_TOKEN = 0x0707, GL_POLYGON_TOKEN = 0x0703, GL_BITMAP_TOKEN = 0x0704, GL_DRAW_PIXEL_TOKEN = 0x0705, GL_COPY_PIXEL_TOKEN = 0x0706, GL_PASS_THROUGH_TOKEN = 0x0700, GL_FEEDBACK_BUFFER_POINTER = 0x0DF0, GL_FEEDBACK_BUFFER_SIZE = 0x0DF1, GL_FEEDBACK_BUFFER_TYPE = 0x0DF2, /* Selection */ GL_SELECTION_BUFFER_POINTER = 0x0DF3, GL_SELECTION_BUFFER_SIZE = 0x0DF4, /* Fog */ GL_FOG = 0x0B60, GL_FOG_MODE = 0x0B65, GL_FOG_DENSITY = 0x0B62, GL_FOG_COLOR = 0x0B66, GL_FOG_INDEX = 0x0B61, GL_FOG_START = 0x0B63, GL_FOG_END = 0x0B64, GL_LINEAR = 0x2601, GL_EXP = 0x0800, GL_EXP2 = 0x0801, /* Logic Ops */ GL_LOGIC_OP = 0x0BF1, GL_INDEX_LOGIC_OP = 0x0BF1, GL_COLOR_LOGIC_OP = 0x0BF2, GL_LOGIC_OP_MODE = 0x0BF0, GL_CLEAR = 0x1500, GL_SET = 0x150F, GL_COPY = 0x1503, GL_COPY_INVERTED = 0x150C, GL_NOOP = 0x1505, GL_INVERT = 0x150A, GL_AND = 0x1501, GL_NAND = 0x150E, GL_OR = 0x1507, GL_NOR = 0x1508, GL_XOR = 0x1506, GL_EQUIV = 0x1509, GL_AND_REVERSE = 0x1502, GL_AND_INVERTED = 0x1504, GL_OR_REVERSE = 0x150B, GL_OR_INVERTED = 0x150D, /* Stencil */ GL_STENCIL_TEST = 0x0B90, GL_STENCIL_WRITEMASK = 0x0B98, GL_STENCIL_BITS = 0x0D57, GL_STENCIL_FUNC = 0x0B92, GL_STENCIL_VALUE_MASK = 0x0B93, GL_STENCIL_REF = 0x0B97, GL_STENCIL_FAIL = 0x0B94, GL_STENCIL_PASS_DEPTH_PASS = 0x0B96, GL_STENCIL_PASS_DEPTH_FAIL = 0x0B95, GL_STENCIL_CLEAR_VALUE = 0x0B91, GL_STENCIL_INDEX = 0x1901, GL_KEEP = 0x1E00, GL_REPLACE = 0x1E01, GL_INCR = 0x1E02, GL_DECR = 0x1E03, /* Buffers, Pixel Drawing/Reading */ GL_NONE = 0, GL_LEFT = 0x0406, GL_RIGHT = 0x0407, /* GL_FRONT = 0x0404, */ /* GL_BACK = 0x0405, */ /* GL_FRONT_AND_BACK = 0x0408, */ GL_FRONT_LEFT = 0x0400, GL_FRONT_RIGHT = 0x0401, GL_BACK_LEFT = 0x0402, GL_BACK_RIGHT = 0x0403, GL_AUX0 = 0x0409, GL_AUX1 = 0x040A, GL_AUX2 = 0x040B, GL_AUX3 = 0x040C, GL_COLOR_INDEX = 0x1900, GL_RED = 0x1903, GL_GREEN = 0x1904, GL_BLUE = 0x1905, GL_ALPHA = 0x1906, GL_LUMINANCE = 0x1909, GL_LUMINANCE_ALPHA = 0x190A, GL_ALPHA_BITS = 0x0D55, GL_RED_BITS = 0x0D52, GL_GREEN_BITS = 0x0D53, GL_BLUE_BITS = 0x0D54, GL_INDEX_BITS = 0x0D51, GL_SUBPIXEL_BITS = 0x0D50, GL_AUX_BUFFERS = 0x0C00, GL_READ_BUFFER = 0x0C02, GL_DRAW_BUFFER = 0x0C01, GL_DOUBLEBUFFER = 0x0C32, GL_STEREO = 0x0C33, GL_BITMAP = 0x1A00, GL_COLOR = 0x1800, GL_DEPTH = 0x1801, GL_STENCIL = 0x1802, GL_DITHER = 0x0BD0, GL_RGB = 0x1907, GL_RGBA = 0x1908, /* Implementation limits */ GL_MAX_LIST_NESTING = 0x0B31, GL_MAX_ATTRIB_STACK_DEPTH = 0x0D35, GL_MAX_MODELVIEW_STACK_DEPTH = 0x0D36, GL_MAX_NAME_STACK_DEPTH = 0x0D37, GL_MAX_PROJECTION_STACK_DEPTH = 0x0D38, GL_MAX_TEXTURE_STACK_DEPTH = 0x0D39, GL_MAX_EVAL_ORDER = 0x0D30, GL_MAX_LIGHTS = 0x0D31, GL_MAX_CLIP_PLANES = 0x0D32, GL_MAX_TEXTURE_SIZE = 0x0D33, GL_MAX_PIXEL_MAP_TABLE = 0x0D34, GL_MAX_VIEWPORT_DIMS = 0x0D3A, GL_MAX_CLIENT_ATTRIB_STACK_DEPTH = 0x0D3B, /* Gets */ GL_ATTRIB_STACK_DEPTH = 0x0BB0, GL_CLIENT_ATTRIB_STACK_DEPTH = 0x0BB1, GL_COLOR_CLEAR_VALUE = 0x0C22, GL_COLOR_WRITEMASK = 0x0C23, GL_CURRENT_INDEX = 0x0B01, GL_CURRENT_COLOR = 0x0B00, GL_CURRENT_NORMAL = 0x0B02, GL_CURRENT_RASTER_COLOR = 0x0B04, GL_CURRENT_RASTER_DISTANCE = 0x0B09, GL_CURRENT_RASTER_INDEX = 0x0B05, GL_CURRENT_RASTER_POSITION = 0x0B07, GL_CURRENT_RASTER_TEXTURE_COORDS = 0x0B06, GL_CURRENT_RASTER_POSITION_VALID = 0x0B08, GL_CURRENT_TEXTURE_COORDS = 0x0B03, GL_INDEX_CLEAR_VALUE = 0x0C20, GL_INDEX_MODE = 0x0C30, GL_INDEX_WRITEMASK = 0x0C21, GL_MODELVIEW_MATRIX = 0x0BA6, GL_MODELVIEW_STACK_DEPTH = 0x0BA3, GL_NAME_STACK_DEPTH = 0x0D70, GL_PROJECTION_MATRIX = 0x0BA7, GL_PROJECTION_STACK_DEPTH = 0x0BA4, GL_RENDER_MODE = 0x0C40, GL_RGBA_MODE = 0x0C31, GL_TEXTURE_MATRIX = 0x0BA8, GL_TEXTURE_STACK_DEPTH = 0x0BA5, GL_VIEWPORT = 0x0BA2, /* Evaluators */ GL_AUTO_NORMAL = 0x0D80, GL_MAP1_COLOR_4 = 0x0D90, GL_MAP1_GRID_DOMAIN = 0x0DD0, GL_MAP1_GRID_SEGMENTS = 0x0DD1, GL_MAP1_INDEX = 0x0D91, GL_MAP1_NORMAL = 0x0D92, GL_MAP1_TEXTURE_COORD_1 = 0x0D93, GL_MAP1_TEXTURE_COORD_2 = 0x0D94, GL_MAP1_TEXTURE_COORD_3 = 0x0D95, GL_MAP1_TEXTURE_COORD_4 = 0x0D96, GL_MAP1_VERTEX_3 = 0x0D97, GL_MAP1_VERTEX_4 = 0x0D98, GL_MAP2_COLOR_4 = 0x0DB0, GL_MAP2_GRID_DOMAIN = 0x0DD2, GL_MAP2_GRID_SEGMENTS = 0x0DD3, GL_MAP2_INDEX = 0x0DB1, GL_MAP2_NORMAL = 0x0DB2, GL_MAP2_TEXTURE_COORD_1 = 0x0DB3, GL_MAP2_TEXTURE_COORD_2 = 0x0DB4, GL_MAP2_TEXTURE_COORD_3 = 0x0DB5, GL_MAP2_TEXTURE_COORD_4 = 0x0DB6, GL_MAP2_VERTEX_3 = 0x0DB7, GL_MAP2_VERTEX_4 = 0x0DB8, GL_COEFF = 0x0A00, GL_DOMAIN = 0x0A02, GL_ORDER = 0x0A01, /* Hints */ GL_FOG_HINT = 0x0C54, GL_LINE_SMOOTH_HINT = 0x0C52, GL_PERSPECTIVE_CORRECTION_HINT = 0x0C50, GL_POINT_SMOOTH_HINT = 0x0C51, GL_POLYGON_SMOOTH_HINT = 0x0C53, GL_DONT_CARE = 0x1100, GL_FASTEST = 0x1101, GL_NICEST = 0x1102, /* Scissor box */ GL_SCISSOR_TEST = 0x0C11, GL_SCISSOR_BOX = 0x0C10, /* Pixel Mode / Transfer */ GL_MAP_COLOR = 0x0D10, GL_MAP_STENCIL = 0x0D11, GL_INDEX_SHIFT = 0x0D12, GL_INDEX_OFFSET = 0x0D13, GL_RED_SCALE = 0x0D14, GL_RED_BIAS = 0x0D15, GL_GREEN_SCALE = 0x0D18, GL_GREEN_BIAS = 0x0D19, GL_BLUE_SCALE = 0x0D1A, GL_BLUE_BIAS = 0x0D1B, GL_ALPHA_SCALE = 0x0D1C, GL_ALPHA_BIAS = 0x0D1D, GL_DEPTH_SCALE = 0x0D1E, GL_DEPTH_BIAS = 0x0D1F, GL_PIXEL_MAP_S_TO_S_SIZE = 0x0CB1, GL_PIXEL_MAP_I_TO_I_SIZE = 0x0CB0, GL_PIXEL_MAP_I_TO_R_SIZE = 0x0CB2, GL_PIXEL_MAP_I_TO_G_SIZE = 0x0CB3, GL_PIXEL_MAP_I_TO_B_SIZE = 0x0CB4, GL_PIXEL_MAP_I_TO_A_SIZE = 0x0CB5, GL_PIXEL_MAP_R_TO_R_SIZE = 0x0CB6, GL_PIXEL_MAP_G_TO_G_SIZE = 0x0CB7, GL_PIXEL_MAP_B_TO_B_SIZE = 0x0CB8, GL_PIXEL_MAP_A_TO_A_SIZE = 0x0CB9, GL_PIXEL_MAP_S_TO_S = 0x0C71, GL_PIXEL_MAP_I_TO_I = 0x0C70, GL_PIXEL_MAP_I_TO_R = 0x0C72, GL_PIXEL_MAP_I_TO_G = 0x0C73, GL_PIXEL_MAP_I_TO_B = 0x0C74, GL_PIXEL_MAP_I_TO_A = 0x0C75, GL_PIXEL_MAP_R_TO_R = 0x0C76, GL_PIXEL_MAP_G_TO_G = 0x0C77, GL_PIXEL_MAP_B_TO_B = 0x0C78, GL_PIXEL_MAP_A_TO_A = 0x0C79, GL_PACK_ALIGNMENT = 0x0D05, GL_PACK_LSB_FIRST = 0x0D01, GL_PACK_ROW_LENGTH = 0x0D02, GL_PACK_SKIP_PIXELS = 0x0D04, GL_PACK_SKIP_ROWS = 0x0D03, GL_PACK_SWAP_BYTES = 0x0D00, GL_UNPACK_ALIGNMENT = 0x0CF5, GL_UNPACK_LSB_FIRST = 0x0CF1, GL_UNPACK_ROW_LENGTH = 0x0CF2, GL_UNPACK_SKIP_PIXELS = 0x0CF4, GL_UNPACK_SKIP_ROWS = 0x0CF3, GL_UNPACK_SWAP_BYTES = 0x0CF0, GL_ZOOM_X = 0x0D16, GL_ZOOM_Y = 0x0D17, /* Texture mapping */ GL_TEXTURE_ENV = 0x2300, GL_TEXTURE_ENV_MODE = 0x2200, GL_TEXTURE_1D = 0x0DE0, GL_TEXTURE_2D = 0x0DE1, GL_TEXTURE_WRAP_S = 0x2802, GL_TEXTURE_WRAP_T = 0x2803, GL_TEXTURE_MAG_FILTER = 0x2800, GL_TEXTURE_MIN_FILTER = 0x2801, GL_TEXTURE_ENV_COLOR = 0x2201, GL_TEXTURE_GEN_S = 0x0C60, GL_TEXTURE_GEN_T = 0x0C61, GL_TEXTURE_GEN_MODE = 0x2500, GL_TEXTURE_BORDER_COLOR = 0x1004, GL_TEXTURE_WIDTH = 0x1000, GL_TEXTURE_HEIGHT = 0x1001, GL_TEXTURE_BORDER = 0x1005, GL_TEXTURE_COMPONENTS = 0x1003, GL_TEXTURE_RED_SIZE = 0x805C, GL_TEXTURE_GREEN_SIZE = 0x805D, GL_TEXTURE_BLUE_SIZE = 0x805E, GL_TEXTURE_ALPHA_SIZE = 0x805F, GL_TEXTURE_LUMINANCE_SIZE = 0x8060, GL_TEXTURE_INTENSITY_SIZE = 0x8061, GL_NEAREST_MIPMAP_NEAREST = 0x2700, GL_NEAREST_MIPMAP_LINEAR = 0x2702, GL_LINEAR_MIPMAP_NEAREST = 0x2701, GL_LINEAR_MIPMAP_LINEAR = 0x2703, GL_OBJECT_LINEAR = 0x2401, GL_OBJECT_PLANE = 0x2501, GL_EYE_LINEAR = 0x2400, GL_EYE_PLANE = 0x2502, GL_SPHERE_MAP = 0x2402, GL_DECAL = 0x2101, GL_MODULATE = 0x2100, GL_NEAREST = 0x2600, GL_REPEAT = 0x2901, GL_CLAMP = 0x2900, GL_S = 0x2000, GL_T = 0x2001, GL_R = 0x2002, GL_Q = 0x2003, GL_TEXTURE_GEN_R = 0x0C62, GL_TEXTURE_GEN_Q = 0x0C63, /* GL 1.1 texturing */ GL_PROXY_TEXTURE_1D = 0x8063, GL_PROXY_TEXTURE_2D = 0x8064, GL_TEXTURE_PRIORITY = 0x8066, GL_TEXTURE_RESIDENT = 0x8067, GL_TEXTURE_BINDING_1D = 0x8068, GL_TEXTURE_BINDING_2D = 0x8069, GL_TEXTURE_INTERNAL_FORMAT = 0x1003, /* GL 1.2 texturing */ GL_PACK_SKIP_IMAGES = 0x806B, GL_PACK_IMAGE_HEIGHT = 0x806C, GL_UNPACK_SKIP_IMAGES = 0x806D, GL_UNPACK_IMAGE_HEIGHT = 0x806E, GL_TEXTURE_3D = 0x806F, GL_PROXY_TEXTURE_3D = 0x8070, GL_TEXTURE_DEPTH = 0x8071, GL_TEXTURE_WRAP_R = 0x8072, GL_MAX_3D_TEXTURE_SIZE = 0x8073, GL_TEXTURE_BINDING_3D = 0x806A, /* Internal texture formats (GL 1.1) */ GL_ALPHA4 = 0x803B, GL_ALPHA8 = 0x803C, GL_ALPHA12 = 0x803D, GL_ALPHA16 = 0x803E, GL_LUMINANCE4 = 0x803F, GL_LUMINANCE8 = 0x8040, GL_LUMINANCE12 = 0x8041, GL_LUMINANCE16 = 0x8042, GL_LUMINANCE4_ALPHA4 = 0x8043, GL_LUMINANCE6_ALPHA2 = 0x8044, GL_LUMINANCE8_ALPHA8 = 0x8045, GL_LUMINANCE12_ALPHA4 = 0x8046, GL_LUMINANCE12_ALPHA12 = 0x8047, GL_LUMINANCE16_ALPHA16 = 0x8048, GL_INTENSITY = 0x8049, GL_INTENSITY4 = 0x804A, GL_INTENSITY8 = 0x804B, GL_INTENSITY12 = 0x804C, GL_INTENSITY16 = 0x804D, GL_R3_G3_B2 = 0x2A10, GL_RGB4 = 0x804F, GL_RGB5 = 0x8050, GL_RGB8 = 0x8051, GL_RGB10 = 0x8052, GL_RGB12 = 0x8053, GL_RGB16 = 0x8054, GL_RGBA2 = 0x8055, GL_RGBA4 = 0x8056, GL_RGB5_A1 = 0x8057, GL_RGBA8 = 0x8058, GL_RGB10_A2 = 0x8059, GL_RGBA12 = 0x805A, GL_RGBA16 = 0x805B, /* Utility */ GL_VENDOR = 0x1F00, GL_RENDERER = 0x1F01, GL_VERSION = 0x1F02, GL_EXTENSIONS = 0x1F03, /* Errors */ GL_INVALID_VALUE = 0x0501, GL_INVALID_ENUM = 0x0500, GL_INVALID_OPERATION = 0x0502, GL_STACK_OVERFLOW = 0x0503, GL_STACK_UNDERFLOW = 0x0504, GL_OUT_OF_MEMORY = 0x0505, /* * Extensions */ /* GL_EXT_blend_minmax and GL_EXT_blend_color */ GL_CONSTANT_COLOR_EXT = 0x8001, GL_ONE_MINUS_CONSTANT_COLOR_EXT = 0x8002, GL_CONSTANT_ALPHA_EXT = 0x8003, GL_ONE_MINUS_CONSTANT_ALPHA_EXT = 0x8004, GL_BLEND_EQUATION_EXT = 0x8009, GL_MIN_EXT = 0x8007, GL_MAX_EXT = 0x8008, GL_FUNC_ADD_EXT = 0x8006, GL_FUNC_SUBTRACT_EXT = 0x800A, GL_FUNC_REVERSE_SUBTRACT_EXT = 0x800B, GL_BLEND_COLOR_EXT = 0x8005, /* GL_EXT_polygon_offset */ GL_POLYGON_OFFSET_EXT = 0x8037, GL_POLYGON_OFFSET_FACTOR_EXT = 0x8038, GL_POLYGON_OFFSET_BIAS_EXT = 0x8039, /* GL_EXT_vertex_array */ GL_VERTEX_ARRAY_EXT = 0x8074, GL_NORMAL_ARRAY_EXT = 0x8075, GL_COLOR_ARRAY_EXT = 0x8076, GL_INDEX_ARRAY_EXT = 0x8077, GL_TEXTURE_COORD_ARRAY_EXT = 0x8078, GL_EDGE_FLAG_ARRAY_EXT = 0x8079, GL_VERTEX_ARRAY_SIZE_EXT = 0x807A, GL_VERTEX_ARRAY_TYPE_EXT = 0x807B, GL_VERTEX_ARRAY_STRIDE_EXT = 0x807C, GL_VERTEX_ARRAY_COUNT_EXT = 0x807D, GL_NORMAL_ARRAY_TYPE_EXT = 0x807E, GL_NORMAL_ARRAY_STRIDE_EXT = 0x807F, GL_NORMAL_ARRAY_COUNT_EXT = 0x8080, GL_COLOR_ARRAY_SIZE_EXT = 0x8081, GL_COLOR_ARRAY_TYPE_EXT = 0x8082, GL_COLOR_ARRAY_STRIDE_EXT = 0x8083, GL_COLOR_ARRAY_COUNT_EXT = 0x8084, GL_INDEX_ARRAY_TYPE_EXT = 0x8085, GL_INDEX_ARRAY_STRIDE_EXT = 0x8086, GL_INDEX_ARRAY_COUNT_EXT = 0x8087, GL_TEXTURE_COORD_ARRAY_SIZE_EXT = 0x8088, GL_TEXTURE_COORD_ARRAY_TYPE_EXT = 0x8089, GL_TEXTURE_COORD_ARRAY_STRIDE_EXT = 0x808A, GL_TEXTURE_COORD_ARRAY_COUNT_EXT = 0x808B, GL_EDGE_FLAG_ARRAY_STRIDE_EXT = 0x808C, GL_EDGE_FLAG_ARRAY_COUNT_EXT = 0x808D, GL_VERTEX_ARRAY_POINTER_EXT = 0x808E, GL_NORMAL_ARRAY_POINTER_EXT = 0x808F, GL_COLOR_ARRAY_POINTER_EXT = 0x8090, GL_INDEX_ARRAY_POINTER_EXT = 0x8091, GL_TEXTURE_COORD_ARRAY_POINTER_EXT = 0x8092, GL_EDGE_FLAG_ARRAY_POINTER_EXT = 0x8093, /* GL_EXT_texture_object */ GL_TEXTURE_PRIORITY_EXT = 0x8066, GL_TEXTURE_RESIDENT_EXT = 0x8067, GL_TEXTURE_1D_BINDING_EXT = 0x8068, GL_TEXTURE_2D_BINDING_EXT = 0x8069, /* GL_EXT_texture3D */ GL_PACK_SKIP_IMAGES_EXT = 0x806B, GL_PACK_IMAGE_HEIGHT_EXT = 0x806C, GL_UNPACK_SKIP_IMAGES_EXT = 0x806D, GL_UNPACK_IMAGE_HEIGHT_EXT = 0x806E, GL_TEXTURE_3D_EXT = 0x806F, GL_PROXY_TEXTURE_3D_EXT = 0x8070, GL_TEXTURE_DEPTH_EXT = 0x8071, GL_TEXTURE_WRAP_R_EXT = 0x8072, GL_MAX_3D_TEXTURE_SIZE_EXT = 0x8073, GL_TEXTURE_3D_BINDING_EXT = 0x806A, /* GL_EXT_paletted_texture */ GL_TABLE_TOO_LARGE_EXT = 0x8031, GL_COLOR_TABLE_FORMAT_EXT = 0x80D8, GL_COLOR_TABLE_WIDTH_EXT = 0x80D9, GL_COLOR_TABLE_RED_SIZE_EXT = 0x80DA, GL_COLOR_TABLE_GREEN_SIZE_EXT = 0x80DB, GL_COLOR_TABLE_BLUE_SIZE_EXT = 0x80DC, GL_COLOR_TABLE_ALPHA_SIZE_EXT = 0x80DD, GL_COLOR_TABLE_LUMINANCE_SIZE_EXT = 0x80DE, GL_COLOR_TABLE_INTENSITY_SIZE_EXT = 0x80DF, GL_TEXTURE_INDEX_SIZE_EXT = 0x80ED, GL_COLOR_INDEX1_EXT = 0x80E2, GL_COLOR_INDEX2_EXT = 0x80E3, GL_COLOR_INDEX4_EXT = 0x80E4, GL_COLOR_INDEX8_EXT = 0x80E5, GL_COLOR_INDEX12_EXT = 0x80E6, GL_COLOR_INDEX16_EXT = 0x80E7, /* GL_EXT_shared_texture_palette */ GL_SHARED_TEXTURE_PALETTE_EXT = 0x81FB, /* GL_EXT_point_parameters */ GL_POINT_SIZE_MIN_EXT = 0x8126, GL_POINT_SIZE_MAX_EXT = 0x8127, GL_POINT_FADE_THRESHOLD_SIZE_EXT = 0x8128, GL_DISTANCE_ATTENUATION_EXT = 0x8129, /* GL_EXT_rescale_normal */ GL_RESCALE_NORMAL_EXT = 0x803A, /* GL_EXT_abgr */ GL_ABGR_EXT = 0x8000, /* GL_EXT_stencil_wrap */ GL_INCR_WRAP_EXT = 0x8507, GL_DECR_WRAP_EXT = 0x8508, /* GL_SGIS_texture_edge_clamp */ GL_CLAMP_TO_EDGE_SGIS = 0x812F, /* GL_INGR_blend_func_separate */ GL_BLEND_DST_RGB_INGR = 0x80C8, GL_BLEND_SRC_RGB_INGR = 0x80C9, GL_BLEND_DST_ALPHA_INGR = 0x80CA, GL_BLEND_SRC_ALPHA_INGR = 0x80CB, /* OpenGL 1.2 */ GL_RESCALE_NORMAL = 0x803A, GL_CLAMP_TO_EDGE = 0x812F, GL_MAX_ELEMENTS_VERTICES = 0x80E8, GL_MAX_ELEMENTS_INDICES = 0x80E9, GL_BGR = 0x80E0, GL_BGRA = 0x80E1, GL_UNSIGNED_BYTE_3_3_2 = 0x8032, GL_UNSIGNED_BYTE_2_3_3_REV = 0x8362, GL_UNSIGNED_SHORT_5_6_5 = 0x8363, GL_UNSIGNED_SHORT_5_6_5_REV = 0x8364, GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033, GL_UNSIGNED_SHORT_4_4_4_4_REV = 0x8365, GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034, GL_UNSIGNED_SHORT_1_5_5_5_REV = 0x8366, GL_UNSIGNED_INT_8_8_8_8 = 0x8035, GL_UNSIGNED_INT_8_8_8_8_REV = 0x8367, GL_UNSIGNED_INT_10_10_10_2 = 0x8036, GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368, GL_LIGHT_MODEL_COLOR_CONTROL = 0x81F8, GL_SINGLE_COLOR = 0x81F9, GL_SEPARATE_SPECULAR_COLOR = 0x81FA, GL_TEXTURE_MIN_LOD = 0x813A, GL_TEXTURE_MAX_LOD = 0x813B, GL_TEXTURE_BASE_LEVEL = 0x813C, GL_TEXTURE_MAX_LEVEL = 0x813D, GL_SMOOTH_POINT_SIZE_RANGE = 0x0B12, GL_SMOOTH_POINT_SIZE_GRANULARITY = 0x0B13, GL_SMOOTH_LINE_WIDTH_RANGE = 0x0B22, GL_SMOOTH_LINE_WIDTH_GRANULARITY = 0x0B23, GL_ALIASED_POINT_SIZE_RANGE = 0x846D, GL_ALIASED_LINE_WIDTH_RANGE = 0x846E, /* GL_ARB_multitexture */ GL_TEXTURE0_ARB = 0x84C0, GL_TEXTURE1_ARB = 0x84C1, GL_TEXTURE2_ARB = 0x84C2, GL_TEXTURE3_ARB = 0x84C3, GL_TEXTURE4_ARB = 0x84C4, GL_TEXTURE5_ARB = 0x84C5, GL_TEXTURE6_ARB = 0x84C6, GL_TEXTURE7_ARB = 0x84C7, GL_TEXTURE8_ARB = 0x84C8, GL_TEXTURE9_ARB = 0x84C9, GL_TEXTURE10_ARB = 0x84CA, GL_TEXTURE11_ARB = 0x84CB, GL_TEXTURE12_ARB = 0x84CC, GL_TEXTURE13_ARB = 0x84CD, GL_TEXTURE14_ARB = 0x84CE, GL_TEXTURE15_ARB = 0x84CF, GL_TEXTURE16_ARB = 0x84D0, GL_TEXTURE17_ARB = 0x84D1, GL_TEXTURE18_ARB = 0x84D2, GL_TEXTURE19_ARB = 0x84D3, GL_TEXTURE20_ARB = 0x84D4, GL_TEXTURE21_ARB = 0x84D5, GL_TEXTURE22_ARB = 0x84D6, GL_TEXTURE23_ARB = 0x84D7, GL_TEXTURE24_ARB = 0x84D8, GL_TEXTURE25_ARB = 0x84D9, GL_TEXTURE26_ARB = 0x84DA, GL_TEXTURE27_ARB = 0x84DB, GL_TEXTURE28_ARB = 0x84DC, GL_TEXTURE29_ARB = 0x84DD, GL_TEXTURE30_ARB = 0x84DE, GL_TEXTURE31_ARB = 0x84DF, GL_ACTIVE_TEXTURE_ARB = 0x84E0, GL_CLIENT_ACTIVE_TEXTURE_ARB = 0x84E1, GL_MAX_TEXTURE_UNITS_ARB = 0x84E2, /* * OpenGL 1.2 imaging subset (NOT IMPLEMENTED BY MESA) */ /* GL_EXT_color_table */ GL_COLOR_TABLE = 0x80D0, GL_POST_CONVOLUTION_COLOR_TABLE = 0x80D1, GL_POST_COLOR_MATRIX_COLOR_TABLE = 0x80D2, GL_PROXY_COLOR_TABLE = 0x80D3, GL_PROXY_POST_CONVOLUTION_COLOR_TABLE = 0x80D4, GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE = 0x80D5, GL_COLOR_TABLE_SCALE = 0x80D6, GL_COLOR_TABLE_BIAS = 0x80D7, GL_COLOR_TABLE_FORMAT = 0x80D8, GL_COLOR_TABLE_WIDTH = 0x80D9, GL_COLOR_TABLE_RED_SIZE = 0x80DA, GL_COLOR_TABLE_GREEN_SIZE = 0x80DB, GL_COLOR_TABLE_BLUE_SIZE = 0x80DC, GL_COLOR_TABLE_ALPHA_SIZE = 0x80DD, GL_COLOR_TABLE_LUMINANCE_SIZE = 0x80DE, GL_COLOR_TABLE_INTENSITY_SIZE = 0x80DF, /* GL_EXT_convolution and GL_HP_convolution_border_modes */ GL_CONVOLUTION_1D = 0x8010, GL_CONVOLUTION_2D = 0x8011, GL_SEPARABLE_2D = 0x8012, GL_CONVOLUTION_BORDER_MODE = 0x8013, GL_CONVOLUTION_FILTER_SCALE = 0x8014, GL_CONVOLUTION_FILTER_BIAS = 0x8015, GL_REDUCE = 0x8016, GL_CONVOLUTION_FORMAT = 0x8017, GL_CONVOLUTION_WIDTH = 0x8018, GL_CONVOLUTION_HEIGHT = 0x8019, GL_MAX_CONVOLUTION_WIDTH = 0x801A, GL_MAX_CONVOLUTION_HEIGHT = 0x801B, GL_POST_CONVOLUTION_RED_SCALE = 0x801C, GL_POST_CONVOLUTION_GREEN_SCALE = 0x801D, GL_POST_CONVOLUTION_BLUE_SCALE = 0x801E, GL_POST_CONVOLUTION_ALPHA_SCALE = 0x801F, GL_POST_CONVOLUTION_RED_BIAS = 0x8020, GL_POST_CONVOLUTION_GREEN_BIAS = 0x8021, GL_POST_CONVOLUTION_BLUE_BIAS = 0x8022, GL_POST_CONVOLUTION_ALPHA_BIAS = 0x8023, GL_CONSTANT_BORDER = 0x8151, GL_REPLICATE_BORDER = 0x8153, GL_CONVOLUTION_BORDER_COLOR = 0x8154, /* GL_SGI_color_matrix */ GL_COLOR_MATRIX = 0x80B1, GL_COLOR_MATRIX_STACK_DEPTH = 0x80B2, GL_MAX_COLOR_MATRIX_STACK_DEPTH = 0x80B3, GL_POST_COLOR_MATRIX_RED_SCALE = 0x80B4, GL_POST_COLOR_MATRIX_GREEN_SCALE = 0x80B5, GL_POST_COLOR_MATRIX_BLUE_SCALE = 0x80B6, GL_POST_COLOR_MATRIX_ALPHA_SCALE = 0x80B7, GL_POST_COLOR_MATRIX_RED_BIAS = 0x80B8, GL_POST_COLOR_MATRIX_GREEN_BIAS = 0x80B9, GL_POST_COLOR_MATRIX_BLUE_BIAS = 0x80BA, GL_POST_COLOR_MATRIX_ALPHA_BIAS = 0x80BB, /* GL_EXT_histogram */ GL_HISTOGRAM = 0x8024, GL_PROXY_HISTOGRAM = 0x8025, GL_HISTOGRAM_WIDTH = 0x8026, GL_HISTOGRAM_FORMAT = 0x8027, GL_HISTOGRAM_RED_SIZE = 0x8028, GL_HISTOGRAM_GREEN_SIZE = 0x8029, GL_HISTOGRAM_BLUE_SIZE = 0x802A, GL_HISTOGRAM_ALPHA_SIZE = 0x802B, GL_HISTOGRAM_LUMINANCE_SIZE = 0x802C, GL_HISTOGRAM_SINK = 0x802D, GL_MINMAX = 0x802E, GL_MINMAX_FORMAT = 0x802F, GL_MINMAX_SINK = 0x8030, GL_TABLE_TOO_LARGE = 0x8031, /* GL_EXT_blend_color, GL_EXT_blend_minmax */ GL_BLEND_EQUATION = 0x8009, GL_MIN = 0x8007, GL_MAX = 0x8008, GL_FUNC_ADD = 0x8006, GL_FUNC_SUBTRACT = 0x800A, GL_FUNC_REVERSE_SUBTRACT = 0x800B, GL_BLEND_COLOR = 0x8005, /* GL_NV_texgen_reflection (nVidia) */ GL_NORMAL_MAP_NV = 0x8511, GL_REFLECTION_MAP_NV = 0x8512, /* GL_PGI_misc_hints */ GL_PREFER_DOUBLEBUFFER_HINT_PGI = 107000, GL_STRICT_DEPTHFUNC_HINT_PGI = 107030, GL_STRICT_LIGHTING_HINT_PGI = 107031, GL_STRICT_SCISSOR_HINT_PGI = 107032, GL_FULL_STIPPLE_HINT_PGI = 107033, GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI = 107011, GL_NATIVE_GRAPHICS_END_HINT_PGI = 107012, GL_CONSERVE_MEMORY_HINT_PGI = 107005, GL_RECLAIM_MEMORY_HINT_PGI = 107006, GL_ALWAYS_FAST_HINT_PGI = 107020, GL_ALWAYS_SOFT_HINT_PGI = 107021, GL_ALLOW_DRAW_OBJ_HINT_PGI = 107022, GL_ALLOW_DRAW_WIN_HINT_PGI = 107023, GL_ALLOW_DRAW_FRG_HINT_PGI = 107024, GL_ALLOW_DRAW_SPN_HINT_PGI = 107024, GL_ALLOW_DRAW_MEM_HINT_PGI = 107025, GL_CLIP_NEAR_HINT_PGI = 107040, GL_CLIP_FAR_HINT_PGI = 107041, GL_WIDE_LINE_HINT_PGI = 107042, GL_BACK_NORMALS_HINT_PGI = 107043, GL_NATIVE_GRAPHICS_HANDLE_PGI = 107010, /* GL_EXT_compiled_vertex_array */ GL_ARRAY_ELEMENT_LOCK_FIRST_EXT = 0x81A8, GL_ARRAY_ELEMENT_LOCK_COUNT_EXT = 0x81A9, /* GL_EXT_clip_volume_hint */ GL_CLIP_VOLUME_CLIPPING_HINT_EXT = 0x80F0 } enum { GL_CURRENT_BIT = 0x00000001, GL_POINT_BIT = 0x00000002, GL_LINE_BIT = 0x00000004, GL_POLYGON_BIT = 0x00000008, GL_POLYGON_STIPPLE_BIT = 0x00000010, GL_PIXEL_MODE_BIT = 0x00000020, GL_LIGHTING_BIT = 0x00000040, GL_FOG_BIT = 0x00000080, GL_DEPTH_BUFFER_BIT = 0x00000100, GL_ACCUM_BUFFER_BIT = 0x00000200, GL_STENCIL_BUFFER_BIT = 0x00000400, GL_VIEWPORT_BIT = 0x00000800, GL_TRANSFORM_BIT = 0x00001000, GL_ENABLE_BIT = 0x00002000, GL_COLOR_BUFFER_BIT = 0x00004000, GL_HINT_BIT = 0x00008000, GL_EVAL_BIT = 0x00010000, GL_LIST_BIT = 0x00020000, GL_TEXTURE_BIT = 0x00040000, GL_SCISSOR_BIT = 0x00080000, GL_ALL_ATTRIB_BITS = 0x000FFFFF }; enum { GL_CLIENT_PIXEL_STORE_BIT = 0x00000001, GL_CLIENT_VERTEX_ARRAY_BIT = 0x00000002 }; #define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF esdl-1.3.1/api_gen/conv_gl.erl0000664000070100000120000004260512200143736014651 0ustar dguduucp%%%---------------------------------------------------------------------- %%% File : conv.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 11 Oct 2001 by Dan Gudmundsson %%%---------------------------------------------------------------------- %% Some knowledge about lengths of arrays and similar stuff. -module(conv_gl). -export([add/0]). -compile(export_all). add() -> [ {"glAreTexturesResident",{[{"residences","n"},{"textures","n"}],[]}}, {"glBitmap", {[{"bitmap", pointer}], []}}, {"glCallLists", {[{"lists", "n", "type"}], []}}, {"glClipPlane", {[{"equation", 4}], []}}, {"glDeleteTextures", {[{"textures", "n"}], []}}, {"glDrawElements", {[{"indices", {index_or_list,"count"}, "type"}], []}}, {"glDrawPixels", {[{"pixels", pointer, "type"}], []}}, {"glEdgeFlagv", {[{"flag", 1}], []}}, {"glFogfv", {[{"params", {undefined, 4,x}}], []}}, {"glFogiv", {[{"params", {undefined, 4,x}}], []}}, {"glGenTextures", {[{"textures", "n"}], []}}, {"glGetBooleanv", {[{"params", {undefined,16,"pname"}}], []}},%% Variable {"glGetDoublev", {[{"params", {undefined,16,"pname"}}], []}},%% Variable {"glGetFloatv", {[{"params", {undefined,16,"pname"}}], []}},%% Variable {"glGetIntegerv", {[{"params", {undefined,16,"pname"}}], []}},%% Variable {"glGetClipPlane", {[{"equation", 4}], []}}, {"glGetLightfv", {[{"params", {undefined, 4,"pname"}}], []}}, %% Variable {"glGetLightiv", {[{"params", {undefined, 4,"pname"}}], []}}, %% Variable {"glGetMapdv", {[{"v", sdlmem}], []}},%% undefined Variable ? {"glGetMapfv", {[{"v", sdlmem}], []}},%% undefined Variable ? {"glGetMapiv", {[{"v", sdlmem}], []}},%% undefined Variable ? {"glGetPointerv", {[{"params", sdlmem}], []}},%% undefined Variable ? {"glGetMaterialfv", {[{"params", {undefined, 4, "pname"}}], []}},%% Variable {"glGetMaterialiv", {[{"params", {undefined, 4, "pname"}}], []}},%% Variable {"glGetPixelMapfv", {[{"values", sdlmem}], []}}, {"glGetPixelMapuiv", {[{"values", sdlmem}], []}}, {"glGetPixelMapusv", {[{"values", sdlmem}], []}}, {"glGetPolygonStipple", {[{"mask", 128}], []}}, {"glGetTexGendv", {[{"params", {undefined, 4, "pname"}}], []}},%% Variable {"glGetTexGenfv", {[{"params", {undefined, 4, "pname"}}], []}},%% Variable {"glGetTexGeniv", {[{"params", {undefined, 4, "pname"}}], []}},%% Variable {"glGetTexEnvfv", {[{"params", {undefined, 4, "pname"}}], []}},%% Variable Max 4 {"glGetTexEnviv", {[{"params", {undefined, 4, "pname"}}], []}}, %% Variable Max 4 {"glGetTexParameterfv", {[{"params", {undefined, 4, "pname"}}], []}},%% Variable Max 4 {"glGetTexParameteriv", {[{"params", {undefined, 4, "pname"}}], []}},%% Variable Max 4 {"glGetTexLevelParameterfv", {[{"params", 1}], []}}, {"glGetTexLevelParameteriv", {[{"params", 1}], []}}, {"glIndexdv", {[{"c", 1}], []}}, {"glIndexfv", {[{"c", 1}], []}}, {"glIndexiv", {[{"c", 1}], []}}, {"glIndexsv", {[{"c", 1}], []}}, {"glIndexubv", {[{"c", 1}], []}}, {"glPixelMapfv", {[{"values", "mapsize"}], []}}, {"glPixelMapuiv", {[{"values", "mapsize"}], []}}, {"glPixelMapusv", {[{"values", "mapsize"}], []}}, {"glLightModelfv", {[{"params", {undefined, 4,x}}], []}}, {"glLightModeliv", {[{"params", {undefined, 4,x}}], []}}, {"glLightfv", {[{"params", {undefined, 4,x}}], []}}, {"glLightiv", {[{"params", {undefined, 4,x}}], []}}, {"glLoadMatrixd", {[{"m", 16}], []}}, {"glLoadMatrixf", {[{"m", 16}], []}}, {"glMaterialfv", {[{"params", {undefined, 4,x}}], []}}, {"glMaterialiv", {[{"params", {undefined, 4,x}}], []}}, {"glMultMatrixd", {[{"m", 16}], []}}, {"glMultMatrixf", {[{"m", 16}], []}}, {"glPolygonStipple", {[{"mask", 128}], []}}, {"glPrioritizeTextures", {[{"priorities", "n"}, {"textures", "n"}], []}}, {"glRectdv", {[{"v1", 2},{"v2", 2}], []}}, {"glRectfv", {[{"v1", 2},{"v2", 2}], []}}, {"glRectiv", {[{"v1", 2},{"v2", 2}], []}}, {"glRectsv", {[{"v1", 2},{"v2", 2}], []}}, {"glTexEnvfv", {[{"params", {undefined, 4,x}}], []}}, {"glTexEnviv", {[{"params", {undefined, 4,x}}], []}}, {"glTexGendv", {[{"params", 4}], []}}, {"glTexGenfv", {[{"params", 4}], []}}, {"glTexGeniv", {[{"params", 4}], []}}, {"glTexImage1D", {[{"pixels", pointer, "type"}], []}}, {"glTexImage2D", {[{"pixels", pointer, "type"}], []}}, {"glTexParameterfv", {[{"params", {undefined, 4,x}}], []}}, {"glTexParameteriv", {[{"params", {undefined, 4,x}}], []}}, {"glTexSubImage1D", {[{"pixels", pointer, "type"}], []}}, {"glTexSubImage2D", {[{"pixels", pointer, "type"}], []}}, {"glFeedbackBuffer", {[{"buffer", sdlmem}], []}}, {"glSelectBuffer", {[{"buffer", sdlmem}], []}}, {"glReadPixels", {[{"pixels", sdlmem}], []}}, {"glGetTexImage", {[{"pixels", sdlmem}], []}}, %% sdlmem actually possible to count the size of the correct buffer using the args see man page. {"glColorPointer", {[{"pointer", pointer, "type"}], []}}, {"glEdgeFlagPointer", {[{"pointer", pointer, "?GLboolean"}], []}}, {"glIndexPointer", {[{"pointer", pointer, "type"}], []}}, {"glInterleavedArrays", {[{"pointer", pointer, "format"}], []}}, {"glNormalPointer", {[{"pointer", pointer, "type"}], []}}, {"glTexCoordPointer", {[{"pointer", pointer, "type"}], []}}, {"glVertexPointer", {[{"pointer", pointer, "type"}, {"ptr", pointer, "type"}], []}}, {"glMap1d", {[{"points", {undefined, "order * 4",x}}], []}}, {"glMap1f", {[{"points", {undefined, "order * 4",x}}], []}}, {"glMap2d", {[{"points", {undefined, "uorder * vorder * 4",x}}], []}}, {"glMap2f", {[{"points", {undefined, "uorder * vorder * 4",x}}], []}} ]. init_erl(Fd) -> io:format(Fd, " -module(gl). -include(\"esdl.hrl\"). -include(\"gl.hrl\"). -include(\"gl_funcs.hrl\"). -include(\"sdl_util.hrl\"). ~n -compile(export_all). -import(sdl, [call/2,cast/2]). -import(sdl_util, [bin2list/2,bin2list/3, term2bin/2, term2bin/3, matrix2bin/2]). %% Some binary type shortcuts -define(UN, unsigned-native). -define(SN, signed-native). -define(FN, float-native). glGetIntegervLen(Type) -> glGetBooleanvLen(Type). glGetDoublevLen(Type) -> glGetBooleanvLen(Type). glGetFloatvLen(Type) -> glGetBooleanvLen(Type). glGetBooleanvLen(Type) -> case Type of ?GL_ACCUM_ALPHA_BITS -> 1; ?GL_ACCUM_BLUE_BITS -> 1; ?GL_ACCUM_CLEAR_VALUE -> 4; ?GL_ACCUM_GREEN_BITS -> 1; ?GL_ACCUM_RED_BITS -> 1; ?GL_ALPHA_BIAS -> 1; ?GL_ALPHA_BITS -> 1; ?GL_ALPHA_SCALE -> 1; ?GL_ALPHA_TEST -> 1; ?GL_ALPHA_TEST_FUNC -> 1; ?GL_ALPHA_TEST_REF -> 1; ?GL_ATTRIB_STACK_DEPTH -> 1; ?GL_AUTO_NORMAL -> 1; ?GL_AUX_BUFFERS -> 1; ?GL_BLEND -> 1; ?GL_BLEND_DST -> 1; ?GL_BLEND_SRC -> 1; ?GL_BLUE_BIAS -> 1; ?GL_BLUE_BITS -> 1; ?GL_BLUE_SCALE -> 1; ?GL_CLIENT_ATTRIB_STACK_DEPTH -> 1; ?GL_CLIP_PLANE0 -> 1; ?GL_CLIP_PLANE1 -> 1; ?GL_CLIP_PLANE2 -> 1; ?GL_CLIP_PLANE3 -> 1; ?GL_CLIP_PLANE4 -> 1; ?GL_CLIP_PLANE5 -> 1; ?GL_COLOR_ARRAY -> 1; ?GL_COLOR_ARRAY_SIZE -> 1; ?GL_COLOR_ARRAY_STRIDE -> 1; ?GL_COLOR_ARRAY_TYPE -> 1; ?GL_COLOR_CLEAR_VALUE -> 4; ?GL_COLOR_LOGIC_OP -> 1; ?GL_COLOR_MATERIAL -> 1; ?GL_COLOR_MATERIAL_FACE -> 1; ?GL_COLOR_MATERIAL_PARAMETER -> 1; ?GL_COLOR_WRITEMASK -> 4; % -ifdef(GL_CONVOLUTION_1D_EXT). % ?GL_CONVOLUTION_1D_EXT -> 1; % ?GL_CONVOLUTION_2D_EXT -> 1; % -endif(). ?GL_CULL_FACE -> 1; ?GL_CULL_FACE_MODE -> 1; ?GL_CURRENT_COLOR -> 4; ?GL_CURRENT_INDEX -> 1; ?GL_CURRENT_NORMAL -> 3; ?GL_CURRENT_RASTER_COLOR -> 4; ?GL_CURRENT_RASTER_DISTANCE -> 1; ?GL_CURRENT_RASTER_INDEX -> 1; ?GL_CURRENT_RASTER_POSITION -> 4; ?GL_CURRENT_RASTER_POSITION_VALID -> 1; ?GL_CURRENT_RASTER_TEXTURE_COORDS -> 4; ?GL_CURRENT_TEXTURE_COORDS -> 4; ?GL_DEPTH_BIAS -> 1; ?GL_DEPTH_BITS -> 1; ?GL_DEPTH_CLEAR_VALUE -> 1; ?GL_DEPTH_FUNC -> 1; ?GL_DEPTH_RANGE -> 2; ?GL_DEPTH_SCALE -> 1; ?GL_DEPTH_TEST -> 1; ?GL_DEPTH_WRITEMASK -> 1; ?GL_DITHER -> 1; ?GL_DOUBLEBUFFER -> 1; ?GL_DRAW_BUFFER -> 1; ?GL_EDGE_FLAG -> 1; ?GL_EDGE_FLAG_ARRAY -> 1; ?GL_EDGE_FLAG_ARRAY_STRIDE -> 1; ?GL_FOG -> 1; ?GL_FOG_COLOR -> 4; ?GL_FOG_DENSITY -> 1; ?GL_FOG_END -> 1; ?GL_FOG_HINT -> 1; ?GL_FOG_INDEX -> 1; ?GL_FOG_MODE -> 1; ?GL_FOG_START -> 1; ?GL_FRONT_FACE -> 1; % ?GL_GLOBAL_ALPHA_FACTOR_SUN -> 1; ?GL_GREEN_BIAS -> 1; ?GL_GREEN_BITS -> 1; ?GL_GREEN_SCALE -> 1; % -ifdef(GL_HISTOGRAM_EXT). % ?GL_HISTOGRAM_EXT -> 1; % -endif(). ?GL_INDEX_ARRAY -> 1; ?GL_INDEX_ARRAY_STRIDE -> 1; ?GL_INDEX_ARRAY_TYPE -> 1; ?GL_INDEX_BITS -> 1; ?GL_INDEX_CLEAR_VALUE -> 1; ?GL_INDEX_LOGIC_OP -> 1; ?GL_INDEX_MODE -> 1; ?GL_INDEX_OFFSET -> 1; ?GL_INDEX_SHIFT -> 1; ?GL_INDEX_WRITEMASK -> 1; ?GL_LIGHT0 -> 1; ?GL_LIGHT1 -> 1; ?GL_LIGHT2 -> 1; ?GL_LIGHT3 -> 1; ?GL_LIGHT4 -> 1; ?GL_LIGHT5 -> 1; ?GL_LIGHT6 -> 1; ?GL_LIGHT7 -> 1; % ?GL_LIGHT8 -> 1; % ?GL_LIGHT9 -> 1; ?GL_LIGHTING -> 1; ?GL_LIGHT_MODEL_AMBIENT -> 4; ?GL_LIGHT_MODEL_LOCAL_VIEWER -> 1; ?GL_LIGHT_MODEL_TWO_SIDE -> 1; ?GL_LINE_SMOOTH -> 1; ?GL_LINE_SMOOTH_HINT -> 1; ?GL_LINE_STIPPLE -> 1; ?GL_LINE_STIPPLE_PATTERN -> 1; ?GL_LINE_STIPPLE_REPEAT -> 1; ?GL_LINE_WIDTH -> 1; ?GL_LINE_WIDTH_GRANULARITY -> 1; ?GL_LINE_WIDTH_RANGE -> 2; ?GL_LIST_BASE -> 1; ?GL_LIST_INDEX -> 1; ?GL_LIST_MODE -> 1; ?GL_LOGIC_OP_MODE -> 1; ?GL_MAP1_COLOR_4 -> 1; ?GL_MAP1_GRID_DOMAIN -> 2; ?GL_MAP1_GRID_SEGMENTS -> 1; ?GL_MAP1_INDEX -> 1; ?GL_MAP1_NORMAL -> 1; ?GL_MAP1_TEXTURE_COORD_1 -> 1; ?GL_MAP1_TEXTURE_COORD_2 -> 1; ?GL_MAP1_TEXTURE_COORD_3 -> 1; ?GL_MAP1_TEXTURE_COORD_4 -> 1; ?GL_MAP1_VERTEX_3 -> 1; ?GL_MAP1_VERTEX_4 -> 1; ?GL_MAP2_COLOR_4 -> 1; ?GL_MAP2_GRID_DOMAIN -> 4; ?GL_MAP2_GRID_SEGMENTS -> 2; ?GL_MAP2_INDEX -> 1; ?GL_MAP2_NORMAL -> 1; ?GL_MAP2_TEXTURE_COORD_1 -> 1; ?GL_MAP2_TEXTURE_COORD_2 -> 1; ?GL_MAP2_TEXTURE_COORD_3 -> 1; ?GL_MAP2_TEXTURE_COORD_4 -> 1; ?GL_MAP2_VERTEX_3 -> 1; ?GL_MAP2_VERTEX_4 -> 1; ?GL_MAP_COLOR -> 1; ?GL_MAP_STENCIL -> 1; ?GL_MATRIX_MODE -> 1; ?GL_MAX_3D_TEXTURE_SIZE -> 1; ?GL_MAX_CLIENT_ATTRIB_STACK_DEPTH -> 1; ?GL_MAX_ATTRIB_STACK_DEPTH -> 1; ?GL_MAX_CLIP_PLANES -> 1; ?GL_MAX_ELEMENTS_INDICES -> 1; ?GL_MAX_ELEMENTS_VERTICES -> 1; ?GL_MAX_EVAL_ORDER -> 1; ?GL_MAX_LIGHTS -> 1; ?GL_MAX_LIST_NESTING -> 1; ?GL_MAX_MODELVIEW_STACK_DEPTH -> 1; ?GL_MAX_NAME_STACK_DEPTH -> 1; ?GL_MAX_PIXEL_MAP_TABLE -> 1; ?GL_MAX_PROJECTION_STACK_DEPTH -> 1; ?GL_MAX_TEXTURE_SIZE -> 1; ?GL_MAX_TEXTURE_STACK_DEPTH -> 1; ?GL_MAX_VERTEX_UNITS_ARB -> 1; ?GL_MAX_VIEWPORT_DIMS -> 2; ?GL_MODELVIEW_MATRIX -> 16; %% ?GL_MINMAX_EXT -> 1; ?GL_MODELVIEW_STACK_DEPTH -> 1; ?GL_NAME_STACK_DEPTH -> 1; ?GL_NORMAL_ARRAY -> 1; ?GL_NORMAL_ARRAY_STRIDE -> 1; ?GL_NORMAL_ARRAY_TYPE -> 1; ?GL_NORMALIZE -> 1; ?GL_NUM_COMPRESSED_TEXTURE_FORMATS -> 1; ?GL_PACK_ALIGNMENT -> 1; ?GL_PACK_LSB_FIRST -> 1; ?GL_PACK_ROW_LENGTH -> 1; ?GL_PACK_SKIP_PIXELS -> 1; ?GL_PACK_SKIP_ROWS -> 1; ?GL_PACK_SWAP_BYTES -> 1; ?GL_PERSPECTIVE_CORRECTION_HINT -> 1; ?GL_PIXEL_MAP_A_TO_A_SIZE -> 1; ?GL_PIXEL_MAP_B_TO_B_SIZE -> 1; ?GL_PIXEL_MAP_G_TO_G_SIZE -> 1; ?GL_PIXEL_MAP_I_TO_A_SIZE -> 1; ?GL_PIXEL_MAP_I_TO_B_SIZE -> 1; ?GL_PIXEL_MAP_I_TO_G_SIZE -> 1; ?GL_PIXEL_MAP_I_TO_I_SIZE -> 1; ?GL_PIXEL_MAP_I_TO_R_SIZE -> 1; ?GL_PIXEL_MAP_R_TO_R_SIZE -> 1; ?GL_PIXEL_MAP_S_TO_S_SIZE -> 1; ?GL_POINT_SIZE -> 1; ?GL_POINT_SIZE_GRANULARITY -> 1; ?GL_POINT_SIZE_RANGE -> 2; ?GL_POINT_SMOOTH -> 1; ?GL_POINT_SMOOTH_HINT -> 1; ?GL_POLYGON_MODE -> 2; ?GL_POLYGON_OFFSET_FACTOR -> 1; ?GL_POLYGON_OFFSET_UNITS -> 1; ?GL_POLYGON_OFFSET_FILL -> 1; ?GL_POLYGON_OFFSET_LINE -> 1; ?GL_POLYGON_OFFSET_POINT -> 1; % ?GL_POLYGON_OFFSET_BIAS_EXT -> 1; % ?GL_POLYGON_OFFSET_FACTOR_EXT -> 1; % ?GL_POLYGON_OFFSET_EXT -> 1; ?GL_POLYGON_SMOOTH -> 1; ?GL_POLYGON_SMOOTH_HINT -> 1; ?GL_POLYGON_STIPPLE -> 1; % ?GL_POST_CONVOLUTION_ALPHA_BIAS_EXT -> 1; % ?GL_POST_CONVOLUTION_BLUE_BIAS_EXT -> 1; % ?GL_POST_CONVOLUTION_GREEN_BIAS_EXT -> 1; % ?GL_POST_CONVOLUTION_RED_BIAS_EXT -> 1; % ?GL_POST_CONVOLUTION_ALPHA_SCALE_EXT -> 1; % ?GL_POST_CONVOLUTION_BLUE_SCALE_EXT -> 1; % ?GL_POST_CONVOLUTION_GREEN_SCALE_EXT -> 1; % ?GL_POST_CONVOLUTION_RED_SCALE_EXT -> 1; ?GL_PROJECTION_MATRIX -> 16; ?GL_PROJECTION_STACK_DEPTH -> 1; ?GL_READ_BUFFER -> 1; ?GL_RED_BIAS -> 1; ?GL_RED_BITS -> 1; ?GL_RED_SCALE -> 1; ?GL_RENDER_MODE -> 1; ?GL_RGBA_MODE -> 1; ?GL_SCISSOR_BOX -> 4; ?GL_SCISSOR_TEST -> 1; % ?GL_SEPARABLE_2D_EXT -> 1; ?GL_SHADE_MODEL -> 1; ?GL_STENCIL_BITS -> 1; ?GL_STENCIL_CLEAR_VALUE -> 1; ?GL_STENCIL_FAIL -> 1; ?GL_STENCIL_FUNC -> 1; ?GL_STENCIL_PASS_DEPTH_FAIL -> 1; ?GL_STENCIL_PASS_DEPTH_PASS -> 1; ?GL_STENCIL_REF -> 1; ?GL_STENCIL_TEST -> 1; ?GL_STENCIL_VALUE_MASK -> 1; ?GL_STENCIL_WRITEMASK -> 1; ?GL_STEREO -> 1; ?GL_SUBPIXEL_BITS -> 1; ?GL_TEXTURE_1D -> 1; % ?GL_TEXTURE_1D_BINDING -> 1; ?GL_TEXTURE_2D -> 1; % ?GL_TEXTURE_2D_BINDING -> 1; ?GL_TEXTURE_COORD_ARRAY -> 1; ?GL_TEXTURE_COORD_ARRAY_SIZE -> 1; ?GL_TEXTURE_COORD_ARRAY_STRIDE -> 1; ?GL_TEXTURE_COORD_ARRAY_TYPE -> 1; ?GL_TEXTURE_GEN_Q -> 1; ?GL_TEXTURE_GEN_R -> 1; ?GL_TEXTURE_GEN_S -> 1; ?GL_TEXTURE_GEN_T -> 1; ?GL_TEXTURE_MATRIX -> 16; ?GL_TEXTURE_STACK_DEPTH -> 1; ?GL_UNPACK_ALIGNMENT -> 1; ?GL_UNPACK_LSB_FIRST -> 1; ?GL_UNPACK_ROW_LENGTH -> 1; ?GL_UNPACK_SKIP_PIXELS -> 1; ?GL_UNPACK_SKIP_ROWS -> 1; % ?GL_UNPACK_CONSTANT_DATA_SUNX -> 1; ?GL_UNPACK_SWAP_BYTES -> 1; ?GL_VERTEX_ARRAY -> 1; ?GL_VERTEX_ARRAY_SIZE -> 1; ?GL_VERTEX_ARRAY_STRIDE -> 1; ?GL_VERTEX_ARRAY_TYPE -> 1; ?GL_VIEWPORT -> 4; ?GL_ZOOM_X -> 1; ?GL_ZOOM_Y -> 1; ?GL_MAX_TEXTURE_UNITS -> 1; %% Unknown length use 16 so far %% the greatest known return value _Else -> 16 end. glGetLightivLen(Type) -> glGetLightfvLen(Type). glGetLightfvLen(Type) -> case Type of ?GL_AMBIENT -> 4; ?GL_DIFFUSE -> 4; ?GL_SPECULAR -> 4; ?GL_POSITION -> 4; ?GL_SPOT_DIRECTION -> 3; ?GL_SPOT_EXPONENT -> 1; ?GL_SPOT_CUTOFF -> 1; ?GL_CONSTANT_ATTENUATION -> 1; ?GL_LINEAR_ATTENUATION -> 1; ?GL_QUADRATIC_ATTENUATION -> 1 end. glGetMaterialivLen(Type) -> glGetMaterialfvLen(Type). glGetMaterialfvLen(Type) -> case Type of ?GL_AMBIENT -> 4; ?GL_DIFFUSE -> 4; ?GL_SPECULAR -> 4; ?GL_EMISSION -> 4; ?GL_SHININESS -> 1; ?GL_COLOR_INDEXES -> 3; _ -> 4 end. glGetTexGendvLen(Type) -> glGetTexGenivLen(Type). glGetTexGenfvLen(Type) -> glGetTexGenivLen(Type). glGetTexGenivLen(Type) -> case Type of ?GL_TEXTURE_GEN_MODE -> 1; ?GL_OBJECT_PLANE -> 4; ?GL_EYE_PLANE -> 4; _ -> 4 end. glGetTexEnvfvLen(Type) -> glGetTexEnvivLen(Type). glGetTexEnvivLen(Type) -> case Type of ?GL_TEXTURE_ENV_MODE -> 1; ?GL_TEXTURE_ENV_COLOR -> 4; _ -> 4 end. glGetTexParameterivLen(Type) -> glGetTexParameterfvLen(Type). glGetTexParameterfvLen(Type) -> case Type of ?GL_TEXTURE_MAG_FILTER -> 1; ?GL_TEXTURE_MIN_FILTER -> 1; ?GL_TEXTURE_WRAP_S -> 1; ?GL_TEXTURE_WRAP_T -> 1; ?GL_TEXTURE_BORDER_COLOR -> 4; ?GL_TEXTURE_PRIORITY -> 1; ?GL_TEXTURE_RESIDENT -> 1; _ -> 4 end. %% Backward compability glBegin(Arg) -> 'begin'(Arg). glEnd() -> 'end'(). swapBuffers() -> sdl_video:gl_swapBuffers(). ", []). init_hrl(Fd) -> io:format(Fd, " -define(GL_BYTE_SIZE, 8). -define(GL_UNSIGNED_BYTE_SIZE, 8). -define(GL_SHORT_SIZE, 16). -define(GL_UNSIGNED_SHORT_SIZE, 16). -define(GL_INT_SIZE, 32). -define(GL_UNSIGNED_INT_SIZE, 32). -define(GL_FLOAT_SIZE, 32). -define(GL_DOUBLE_SIZE, 64). -define(gl_type_size(TYPE), case (TYPE) of ?GL_BYTE -> ?GL_BYTE_SIZE; ?GL_UNSIGNED_BYTE-> ?GL_UNSIGNED_BYTE_SIZE; ?GL_SHORT -> ?GL_SHORT_SIZE; ?GL_UNSIGNED_SHORT -> ?GL_UNSIGNED_SHORT_SIZE; ?GL_INT -> ?GL_INT_SIZE; ?GL_UNSIGNED_INT -> ?GL_UNSIGNED_INT_SIZE; ?GL_FLOAT -> ?GL_FLOAT_SIZE; ?GL_DOUBLE -> ?GL_DOUBLE_SIZE end). ",[]). init_c(Fd) -> io:format(Fd, " #include #include #include \"esdl.h\" ", []). % post_erl(Fd) -> % io:format(Fd, " % -include(\"glext.erl\"). % ", []). % post_hrl(Fd) -> % io:format(Fd, " % -include(\"glext.hrl\"). % ", []). esdl-1.3.1/api_gen/conv.hrl0000664000070100000120000000062212200143736014163 0ustar dguduucp%%%---------------------------------------------------------------------- %%% File : conv.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 11 Oct 2001 by Dan Gudmundsson %%%---------------------------------------------------------------------- %% Some knowledge about lengths of arrays and similar stuff. -define(array_lengths, []). esdl-1.3.1/api_gen/conv.erl0000775000070100000120000017324012200143736014172 0ustar dguduucp%% ``The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in %% compliance with the License. You should have received a copy of the %% Erlang Public License along with this software. If not, it can be %% retrieved via the world wide web at http://www.erlang.org/. %% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and limitations %% under the License. %% %% The Initial Developer of the Original Code is Dan Gudmundsson. %% Portions created by me are Copyright 2000 All Rights Reserved.'' %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : conv.erl %%% Author : Dan Gudmundsson %%% Purpose : conv between C header files to generate C and Erl stub files %%% Created : 29 Aug 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(conv). -author('dgud@erix.ericsson.se'). -include("conv.hrl"). %%-compile(export_all). -export([go/1]). -export([is_matrixOp/1]). -record(fs, {hrl, erl, c, h, sw, fhrl, last = 0, file}). -define(W(Str,Args), io:format(Fd, Str, Args)). -define(erl_comments, [Fd#fs.hrl]). -define(c_comments, []). -define(GLUTYPE(T), T=="GLUtesselator";T=="GLUnurbs";T=="GLUquadric"). -define(GL_BYTE_SIZE, 8). -define(GL_UNSIGNED_BYTE_SIZE, 8). -define(GL_SHORT_SIZE, 16). -define(GL_UNSIGNED_SHORT_SIZE, 16). -define(GL_INT_SIZE, 32). -define(GL_UNSIGNED_INT_SIZE, 32). -define(GL_FLOAT_SIZE, 32). -define(GL_DOUBLE_SIZE, 64). -define(SEARCH, "http://www.google.com/search?btnI=I%27m+Feeling+Lucky&q=manual+pages+"). gl_type_size(TYPE) -> case (TYPE) of "boolean" -> hd(io_lib:format("~p", [?GL_BYTE_SIZE div 8])); "?GL_BYTE" -> hd(io_lib:format("~p", [?GL_BYTE_SIZE div 8])); "?GL_UNSIGNED_BYTE" -> hd(io_lib:format("~p", [?GL_UNSIGNED_BYTE_SIZE div 8])); "?GL_SHORT" -> hd(io_lib:format("~p", [?GL_SHORT_SIZE div 8])); "?GL_UNSIGNED_SHORT" -> hd(io_lib:format("~p", [?GL_UNSIGNED_SHORT_SIZE div 8])); "?GL_INT" -> hd(io_lib:format("~p", [?GL_INT_SIZE div 8])); "?GL_UNSIGNED_INT" -> hd(io_lib:format("~p", [?GL_UNSIGNED_INT_SIZE div 8])); "?GL_FLOAT" -> hd(io_lib:format("~p", [?GL_FLOAT_SIZE div 8])); "?GL_DOUBLE" -> hd(io_lib:format("~p", [?GL_DOUBLE_SIZE div 8])); ELsE -> ELsE end. go(File) -> {ok, Bin} = file:read_file(File), Prog_list = binary_to_list(Bin), Prog = tokens(Prog_list, " \t\n\r,();*"), FName = if atom(File) -> atom_to_list(File) -- ".h"; list(File) -> File -- ".h" end, Dir = "generated/", {ok, Erl} = file:open(Dir ++ FName ++ ".erl", [write]), {ok, Hrl} = file:open(Dir ++ FName ++ ".hrl", [write]), {ok, FHrl} = file:open(Dir ++ FName ++ "_funcs.hrl", [write]), {ok, C} = file:open(Dir ++ "esdl_" ++ FName ++ ".c", [write]), {ok, H} = file:open(Dir ++ "esdl_" ++ FName ++ ".h", [write]), {ok, Sw} = file:open(Dir ++ "esdl_" ++ FName ++ "_fp.h", [write]), State0 = case FName of "gl" -> #fs{file = "OPENGL"}; "glu" -> #fs{file = "OPENGLU"}; "glext" -> #fs{file = "OPENGL_EXTS"} end, [write_cpyr_c(F) || F <- [C,H,Sw]], [write_cpyr_erl(F) || F <- [Erl, Hrl, FHrl]], State = State0#fs{hrl = Hrl, erl = Erl, c = C, h = H, sw = Sw, fhrl = FHrl}, init_files(FName, State), Res = generate(Prog, State), post_files(FName, State), Files = [Erl, FHrl, Hrl, C, H, Sw], [file:close(F) || F <- Files], Res. write_cpyr_c(Fd) -> ?W("/* * Copyright (c) 2003 Dan Gudmundsson * See the file \"license.terms\" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * */ ", []). write_cpyr_erl(Fd) -> ?W("%% %% Copyright (c) 2001 Dan Gudmundsson %% %% See the file \"license.terms\" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% ", []). init_files("gl", State) -> erase(), GL = conv_gl:add(), lists:foreach(fun({F, D}) -> put(F,D) end, GL), conv_gl:init_hrl(State#fs.hrl), conv_gl:init_erl(State#fs.erl), catch conv_gl:init_c(State#fs.c); init_files("glu", State) -> erase(), GLU = conv_glu:add(), lists:foreach(fun({F, D}) -> put(F,D) end, GLU), conv_glu:init_hrl(State#fs.hrl), conv_glu:init_erl(State#fs.erl), catch conv_glu:init_c(State#fs.c); init_files("glext", State) -> erase(), GLU = conv_glext:add(), lists:foreach(fun({F, D}) -> put(F,D) end, GLU), catch conv_glext:init_hrl(State#fs.hrl), catch conv_glext:init_erl(State#fs.erl), catch conv_glext:init_c(State#fs.c), catch conv_glext:init_h(State#fs.h); init_files(Which, _State) -> io:format("Don't no how to initialize ~s~n", [Which]). post_files("gl", State) -> catch conv_gl:post_erl(State#fs.erl), catch conv_gl:post_hrl(State#fs.hrl); post_files("glu", State) -> catch conv_glu:post_erl(State#fs.erl), catch conv_glu:post_hrl(State#fs.hrl); post_files("glext", State) -> catch conv_glext:post_erl(State#fs.erl), catch conv_glext:post_hrl(State#fs.hrl); post_files(_, _) -> ok. generate(["/", pointer |R], Fd) -> [io:format(F, "%%%% ", []) || F <- ?erl_comments], [io:format(F, "/* ", []) || F <- ?c_comments ], Rest = generate_comments(R, Fd), generate(Rest, Fd); generate([[$/, pointer |R1]|R], Fd) -> [io:format(F, "%%%% ", []) || F <- ?erl_comments], [io:format(F, "/* ", []) || F <- ?c_comments ], Rest = generate_comments([R1|R], Fd), generate(Rest, Fd); generate([What, "=", Value, eol | R], Fd) -> V = generate_value(Value), io:format(Fd#fs.hrl, "-define(~s, ~s).~n", [What, V]), generate(R, Fd); generate(["#define", What, eol | R], Fd) -> io:format(Fd#fs.hrl, "-define(~s, 1).~n", [What]), generate(R, Fd); generate(["#define", What, Value, eol | R], Fd) -> V = generate_value(Value), io:format(Fd#fs.hrl, "-define(~s, ~s).~n", [What, V]), {Arb,String} = arb(What), case Arb of false -> ignore; _ -> io:format(Fd#fs.hrl, "-define(~s, ~s).~n", [String, V]) end, generate(R, Fd); generate(["#ifndef", What, eol | R], Fd) -> case skip_extensions(What, R) of false -> io:format(Fd#fs.hrl, "-ifndef(~s).~n", [What]), generate(R, Fd); NewR -> generate(NewR, Fd) end; generate(["#ifdef", "GL_GLEXT_PROTOTYPES", eol | R0], Fd) -> R=store_prototypes(R0), generate(R, Fd); generate(["#ifdef", What, eol | R], Fd) -> io:format(Fd#fs.hrl, "-ifdef(~s).~n", [What]), generate(R, Fd); generate(["#else", eol | R], Fd) -> io:format(Fd#fs.hrl, "-elseif.~n", []), generate(R, Fd); generate(["#endif" | R], Fd) -> io:format(Fd#fs.hrl, "-endif.~n", []), generate(R, Fd); generate(["enum"|R], Fd) -> generate(R, Fd); generate(["extern", _, "{" |R], Fd) -> generate(R, Fd); generate(["#pragma"|R0], Fd) -> [eol|R] = lists:dropwhile(fun(eol) -> false; (_) ->true end, R0), generate(R, Fd); generate(["#include"|R0], Fd) -> [eol|R] = lists:dropwhile(fun(eol) -> false; (_) ->true end, R0), generate(R, Fd); generate(["class"|R0], Fd) -> [eol|R] = lists:dropwhile(fun(eol) -> false; (_) ->true end, R0), generate(R, Fd); generate(["{"|R], Fd) -> generate(R, Fd); generate(["}"|R], Fd) -> generate(R, Fd); generate(["};"|R], Fd) -> generate(R, Fd); generate([eol|R], Fd) -> generate(R, Fd); generate([], _Fd) -> ok; generate([[]|R], Fd) -> generate(R, Fd); generate([Func|R], Fd) when Func == "WINGDIAPI"; Func == "GLAPI"; Func == "extern" -> case catch generate_funcs(R, Fd) of {'EXIT', What} -> display_error(What, R, Fd); {R2, Fd2} -> generate(R2, Fd2) end; generate(["typedef", Type, lpar, "APIENTRYP", Func, rpar|R], Fd) -> NewF = gb_trees:get(Func, get(glext_proto)), generate(["GLAPI",Type, "APIENTRY",NewF|R], Fd); generate(["typedef"|R], Fd) -> io:format("skipped typedef ~p ~n", [string:substr(R, 1, 5)]), C = lists:dropwhile(fun(eol) -> false; (_A) -> true end, R), generate(C, Fd); generate(R, Fd) -> io:format("%% ERROR: Generate couldn't handle '", []), C = lists:dropwhile(fun(eol) -> false; (A) -> io:format("~s ", [A]), true end, R), io:format("'~n"), generate(C, Fd). display_error(What, R, Fd) -> case What of {Reason, [{M,F,[A1|AR]}| ER]} when list(A1) -> io:format(" ERROR: Generate funcs couldn't handle ", []), C = lists:dropwhile(fun(eol) -> false; (A) -> io:format("~s ", [A]), true end, R), io:format("~n EXIT ~p ~n", [{Reason, [{M,F,[lists:sublist(A1, 10)|AR]}|ER]}]), generate(C, Fd); _ -> io:format("%% ERROR: Generate funcs couldn't handle ~p ~n", [What]) end. generate_funcs(["const", Type, pointer | Rest], Files) -> generate_funcs([{Type, pointer}| Rest], Files); generate_funcs([Type, pointer | Rest], Files) -> generate_funcs([{Type, pointer}| Rest], Files); generate_funcs([Type, AE, Func, lpar | Rest], Files) when AE == "APIENTRY"; AE == "GLAPIENTRY" -> generate_funcs([Type, Func, lpar | Rest], Files); generate_funcs([Type, Func, lpar | Rest], Files) -> {Args, R2} = getArgs(Rest, []), Next = case catch genfuncs(Type, Func, Args, Files) of {'EXIT', Reason} -> io:format("genfuncs crashed in ~p ~s(~p)~n ~p", [Type,Func, Args,Reason]), exit(Reason); Res -> Res end, {R2, Files#fs{last = Next}}. generate_comments([pointer, "/"|R], Fd) -> [io:format(F, "~n", []) || F <- ?erl_comments], [io:format(F, "*/~n ", []) || F <- ?c_comments ], R; generate_comments([eol|R], Fd) -> [io:format(F, "~n%%%", []) || F <- ?erl_comments], [io:format(F, "~n * ", []) || F <- ?c_comments ], generate_comments(R, Fd); generate_comments([W|R], Fd) -> [io:format(F, "~s ", [W]) || F <- ?erl_comments], [io:format(F, "~s ", [W]) || F <- ?c_comments], generate_comments(R, Fd). generate_value([$0, $x | Rest]) -> "16#" ++ Rest; generate_value("GL_" ++ _ = Val) -> "?" ++ Val; generate_value(Val) -> Val. getArgs([rpar, eol | Rest], Acc) -> {lists:reverse(Acc), Rest}; getArgs(["void", rpar, eol | Rest], Acc) -> {lists:reverse(Acc), Rest}; %getArgs(["const" | Rest], Acc) -> % getArgs(Rest, Acc); %getArgs(["void", "(GLCALLBACK", "*fn)()"| Rest], Acc) -> % getArgs(Rest, [{"void", "(GLCALLBACK *fn)()"} | Acc]); getArgs([Type, lpar, pointer, GLCALLBACK, rpar, lpar,rpar| Rest], Acc) -> getArgs(Rest, [{Type, callback, GLCALLBACK} | Acc]); getArgs([Type, Var, rpar, eol | Rest], Acc) -> {lists:reverse([{Type, Var}|Acc]), Rest}; getArgs([Type, Var, separtor | Rest], Acc) -> getArgs(Rest, [{Type, Var} | Acc]); getArgs(["const", Type, pointer, Var, separtor | Rest], Acc) -> getArgs(Rest, [{Type, const, pointer, Var} | Acc]); getArgs(["const", Type, pointer, Var, rpar, eol | Rest], Acc) -> {lists:reverse([{Type, const, pointer, Var}|Acc]), Rest}; getArgs([Type, pointer, Var, separtor | Rest], Acc) -> getArgs(Rest, [{Type, pointer, Var} | Acc]); getArgs([Type, pointer, Var, rpar, eol | Rest], Acc) -> {lists:reverse([{Type, pointer, Var}|Acc]), Rest}; getArgs([Type, pointer, pointer, Var, separtor | Rest], Acc) -> getArgs(Rest, [{Type, pointer, pointer, Var} | Acc]); getArgs([Type, pointer, pointer, Var, rpar, eol | Rest], Acc) -> {lists:reverse([{Type, pointer, pointer, Var}|Acc]), Rest}; getArgs(["const", Type, pointer, pointer, Var, separtor | Rest], Acc) -> getArgs(Rest, [{Type, const, pointer, pointer, Var} | Acc]); getArgs(["const", Type, const,pointer, pointer, Var, rpar, eol | Rest], Acc) -> {lists:reverse([{Type, const, pointer, pointer, Var}|Acc]), Rest}; getArgs([eol | Rest], Acc) -> getArgs(Rest, Acc). genfuncs(Type, FuncName, Args, F) -> case skip(FuncName) of true -> io:format("Skipped ~s ~n", [FuncName]), F#fs.last; call_vector -> Last = F#fs.last, genf_erl(Type, FuncName, Args, Last, F#fs.erl), Last; false -> io:format("Generating: {~p,{skip,[]}},~n", [FuncName]), Last = F#fs.last, genf_h(Type, FuncName, Args, Last, F#fs.file, F#fs.h), genf_sw(Type, FuncName, Args, Last, F#fs.sw), genf_hrl(Type, FuncName, Args, Last, F#fs.file, F#fs.fhrl), genf_erl(Type, FuncName, Args, Last, F#fs.erl), genf_c(Type, FuncName, Args, Last, F#fs.c), Last+1 end. genf_hrl(_Type, FuncName0, _Args, Last, File, Fd) -> case skip(FuncName0) of true -> ignore; _ -> {_, FuncName} = arb(FuncName0), ?W("-define(~s, ?SDL_~s_HRL + ~p).~n", [FuncName, File, Last]) end. genf_h(Type, FuncName, Args, Last, File, Fd) -> case skip(FuncName) of true -> ignore; _ -> F = FuncName ++ "Func", ?W("enum { ~s = ~s_H + ~p };~n", [F, File, Last]), case is_extension(FuncName) of true -> gen_extension(Type, FuncName, Args, Fd); false -> ignore end, ?W("void ~s (sdl_data *, int, char *); ~n", [format_func2c(FuncName)]) end. genf_sw(_Type, FN, _Args, _Last, Fd) -> case skip(FN) of true -> ignore; _ -> case is_extension(FN) of true -> ?W("{ ~sFunc, \"~s\", ~s, &esdl_~s},~n", [FN,FN,format_func2c(FN),FN]); false -> ?W("{ ~sFunc, \"~s\", ~s },~n",[FN,FN,format_func2c(FN)]) end end. genf_erl(Type, FuncName, Args0, _Last, Fd) -> EFN = format_func2erl(FuncName), {Rets,Args1} = find_returns(Args0, FuncName), Args = fixArgsOrder(FuncName, Args1), ?W("%% @spec ~s(", [EFN]), write_args(FuncName, erlcom, Args1, Fd), ?W(") -> ",[]), write_returns(FuncName, erlcom, Type, Rets, Fd), % ?W("%% Func: ~s ~n", [EFN]), % ?W("%% Args: ",[]), write_args(FuncName, erlcom, Args1, Fd), % ?W("~n%% Returns: ",[]), write_returns(FuncName, erlcom, Type, Rets, Fd), ?W("~n%% @doc External manpage: ~s", [?SEARCH,strip_types(FuncName),EFN]), ?W("~n%% C-API func: ~s ~s(", if element(2,Type) == pointer -> [element(1,Type)++"*", FuncName]; true -> [Type, FuncName] end), write_args(FuncName, c, Args0, Fd), Cfunc = case skip(FuncName) of call_vector -> call_vector(FuncName); _ -> FuncName end, ?W(")~n~s(", [EFN]), write_args(FuncName, erl, Args1, Fd), ?W(") -> ~n", []), case arb(FuncName) of {false,_} -> ignore; {{test,ReNamed},_} -> ?W(" try ~s(", [ReNamed]), write_args(FuncName, erl, Args1, Fd), ?W(")~n catch error:_ -> ~s_fallback(", [FuncName]), write_args(FuncName, erl, Args1, Fd), ?W(") end.~n",[]), ?W("%% @hidden~n",[]), ?W("~s_fallback(", [FuncName]), write_args(FuncName, erl, Args1, Fd), ?W(") -> ~n", []); {true,NoArb0} -> NoArb = format_func2erl(NoArb0), ?W(" ~s(", [NoArb]), write_args(FuncName, erl, Args1, Fd), ?W(").~n~s(", [NoArb]), write_args(FuncName, erl, Args1, Fd), ?W(") -> ~n", []) end, %% io:format(Fd, "exit(nyi),~n", []), NewArgs = maybe_build_erlbinaries(FuncName, Args, Fd), case {Type, Rets} of {"void", []} -> ?W(" cast(?~s, ", [element(2,arb(Cfunc))]), write_args(FuncName, binerl, NewArgs, Fd), ?W(").~n~n", []); _ -> ?W(" Bin = call(?~s, ", [element(2,arb(Cfunc))]), write_args(FuncName, binerl, NewArgs, Fd), ?W("), ~n",[]), write_undef_rets(FuncName, Rets, Fd), ?W(" case Bin of ~n", []), write_returns(FuncName, erl, Type, Rets, Fd), ?W("\tElse -> erlang:error({?MODULE, " "?LINE, badtype, Else})~n" " end.~n~n", []) end. gen_extension(Type, Func, Args, Fd) -> %% typedef void (APIENTRY * PFNGLPOINTPARAMETERFEXTPROC)(GLenum pname, GLfloat param); %% PFNGLPOINTPARAMETERFEXTPROC glPointParameterfEXT; case is_extension(Func) of true -> Proto = "ESDL" ++ uppercase_all(Func) ++ "PROC", ?W("typedef ~s (APIENTRY * ~s)(", [Type, Proto]), write_args(Func, c, Args, Fd), ?W(");~n", []), ?W("ESDL_EXTERN ~s esdl_~s;~n", [Proto, Func]), % ?W("void ~s(sdl_data *, int, char *);~n",[format_func2c(Func)]), %%% ?W("sdl_fun esdl_load_~s()~n{~n esdl_~s = (~s) SDL_GL_GetProcAddress(\"~s\");~n", %%% [Func, Func, Proto, Func]), %%% ?W(" if(NULL != esdl_~s )~n return (sdl_fun) ~s; ~n", [Func,format_func2c(Func)]), %%% ?W(" else return NULL; ~n}~n~n", []); ok; false -> ignore end. genf_c(Type, FuncName, Args0, _Last, Fd) -> CallFunc = case is_extension(FuncName) of true -> "esdl_" ++ FuncName; false -> FuncName end, ?W("void ~s(sdl_data *egl_sd, int egl_len, char *egl_buff) ~n", [format_func2c(FuncName)]), ?W("{~n char * bp; ~n", []), {Rets,Args} = find_returns(Args0, FuncName), case {Type, Rets} of {"void", []} -> ok; {{RT,pointer},[]} -> ?W(" char * egl_start; ~n", []), ?W(" int egl_sendlen; ~n", []), ?W(" const ~s *egl_res; ~n", [RT]); {Type,[]} -> ?W(" char * egl_start; ~n", []), ?W(" int egl_sendlen; ~n", []), ?W(" ~s egl_res; ~n", [Type]); {"void", _} -> ?W(" char * egl_start; ~n", []), ?W(" int egl_sendlen; ~n", []); % ?W(" int i; ~n", []); _ -> ?W(" char * egl_start; ~n", []), ?W(" int egl_sendlen; ~n", []), %% ?W(" int i; ~n", []), ?W(" ~s egl_res; ~n", [Type]) end, write_args(FuncName, cdef, Args0, Fd), ?W(" bp = egl_buff;~n", []), OrderedArgs = fixArgsOrder(FuncName, Args0), write_args(FuncName, binc, OrderedArgs, Fd), case {Type, Rets} of {"void", []} -> ?W(" ~s(", [CallFunc]), write_args(FuncName, ccalls, Args0, Fd), ?W(");~n", []), free_mem(Args, FuncName, Fd), ok; _ -> case Type of "void" -> ignore ; _ -> ?W(" egl_res = ", []) end, ?W(" ~s(", [CallFunc]), write_args(FuncName, ccalls, Args0, Fd), ?W(");~n", []), AllocSize = get_size(FuncName, Type, Rets, ""), ?W(" bp = egl_start = sdl_get_temp_buff(egl_sd, ~s);~n",[AllocSize]), case Type of "void" -> ignore; {"GLubyte", pointer} -> ?W(" strcpy((GLubyte *)bp, egl_res);~n", []), ?W(" bp += strlen(egl_res);~n", []); {RType, pointer} when ?GLUTYPE(RType) -> ?W(" * (~s **) bp = egl_res;~n" " bp += sizeof(~s *);~n", [RType, RType]); _ -> ?W(" * (~s *) bp = egl_res;~n" " bp += sizeof(~s);~n", [Type, Type]) end, Forloop = fun({V1,T1}) -> case getdef(FuncName, V1) of 1 -> ?W(" * (~s *)bp = ~s[0]; bp += sizeof(~s);~n", [T1,V1,T1]); N when integer(N) -> ?W(" memcpy(bp, ~s, sizeof(~s)*~w);~n" " bp += sizeof(~s)*~w;~n", [V1,T1,N,T1,N]); {undefined, N, _} when integer(N) -> ?W(" memcpy(bp, ~s, sizeof(~s)*~w);~n" " bp += sizeof(~s)*~w;~n", [V1,T1,N,T1,N]); {Val,_} when is_list(Val) -> ?W(" memcpy(bp, ~s, sizeof(~s)*(*~s));~n" " bp += sizeof(~s)*(*~s);~n", [V1,T1,Val,T1,Val]); Val when is_list(Val) -> ?W(" memcpy(bp, ~s, sizeof(~s)*(*~s));~n" " bp += sizeof(~s)*(*~s);~n", [V1,T1,Val,T1,Val]) end; ({V1,pointer,_T1}) -> ?W(" PUSHGLPTR(~s,bp);~n", [V1]) end, lists:foreach(Forloop, Rets), free_mem(Args0, FuncName, Fd), ?W(" egl_sendlen = bp - egl_start;~n" " sdl_send(egl_sd, egl_sendlen);~n", []) end, ?W("}~n~n~n", []). free_mem([{_T, const, pointer, pointer, V1}|Args], FuncName, Fd) when FuncName == "glShaderSourceARB" -> ?W(" free(~s);~n", [V1]), free_mem(Args, FuncName, Fd); free_mem([{T, const, pointer, V1}|Args], FuncName, Fd) -> case getdef(FuncName, V1) of Str when list(Str), ((T == "GLdouble") or (T=="GLclampd")) -> ?W(" free(~s);~n", [V1]); {undefined, Val,_} when ((T == "GLdouble") or (T == "GLclampd")), is_list(Val) -> ?W(" free(~s);~n", [V1]); _ -> ignore end, free_mem(Args, FuncName, Fd); free_mem([{T, pointer, V1}|Args], FuncName, Fd) -> case getdef(FuncName, V1) of _ when ?GLUTYPE(T) -> ignore; Str when list(Str) -> ?W(" free(~s);~n", [V1]); {Str,_} when list(Str) -> ?W(" free(~s);~n", [V1]); _ -> ignore end, free_mem(Args, FuncName, Fd); free_mem([_|Args], FuncName, Fd) -> free_mem(Args, FuncName, Fd); free_mem([], _,Fd) -> case get(free_args) of undefined -> ok; true -> erase(free_args), ?W(" sdl_free_binaries(egl_sd);~n", []) end. maybe_build_erlbinaries(Func,[Arg={_,const,pointer,_}|R],Fd) -> case is_vector(Func) of N when is_number(N) -> [Arg | maybe_build_erlbinaries(Func, R, Fd)]; Vec -> case build_erlbinaries(Func, Arg, Vec, R == [], Fd) of already_sent -> maybe_build_erlbinaries(Func, R, Fd); New -> put({binary_arg, Func}, Arg), [New | maybe_build_erlbinaries(Func, R, Fd)] end end; maybe_build_erlbinaries(Func,[Arg={_,const,pointer,pointer,_}|R],Fd) -> case is_vector(Func) of N when is_integer(N) -> [Arg | maybe_build_erlbinaries(Func, R, Fd)]; Vector -> case build_erlbinaries(Func, Arg, Vector, R == [], Fd) of already_sent -> maybe_build_erlbinaries(Func, R, Fd); New -> put({binary_arg, Func}, Arg), [New | maybe_build_erlbinaries(Func, R, Fd)] end end; maybe_build_erlbinaries(Func, [V={_T,pointer,Var}|R], Fd) -> case getdef(Func, Var) of pointer -> ?W(" sdl:send_bin(~s, ?MODULE, ?LINE),~n", [uppercase(Var)]), maybe_build_erlbinaries(Func, R, Fd); sdlmem -> ?W(" sdl:send_bin(~s, ?MODULE, ?LINE),~n", [uppercase(Var)]), maybe_build_erlbinaries(Func, R, Fd); _ -> [V|maybe_build_erlbinaries(Func, R,Fd)] end; maybe_build_erlbinaries(Func, [V|R], Fd) -> [V|maybe_build_erlbinaries(Func, R,Fd)]; maybe_build_erlbinaries(_F, [], _Fd) -> []. build_erlbinaries(_Func, {_T, const, pointer, pointer,V}, _IsTuple, _IsLast, Fd) -> ?W(" lists:foreach(fun(Values) -> sdl:send_bin(list_to_binary([Values,0]), ?MODULE, ?LINE) end, ~s),~n", [uppercase(V)]), already_sent; build_erlbinaries(Func,{T,const,pointer,V},{tuplelist,1}, _IsLast, Fd) -> N = case getdef(Func, V) of What when is_list(What) -> uppercase(What); What when is_integer(What) -> integer_to_list(What) end, ?W(" sdl:send_bin(list_to_binary(term2bin(~s,~s,~s)), ?MODULE, ?LINE),~n", [uppercase(V),N,type_to_enum(T)]), already_sent; build_erlbinaries(_Func,{T,const,pointer,V},{tuplelist,N}, _IsLast, Fd) -> ?W(" sdl:send_bin(sdl_util:tuplelist2bin(~p,~s,~s), ?MODULE, ?LINE),~n", [N,type_to_enum(T),uppercase(V)]), already_sent; build_erlbinaries(Func, {T, const, pointer,V}, _IsTuple, IsLast, Fd) -> Var = uppercase(V), Type = case type_to_enum(T) of Unknown = "GeneraterUnknownType:" ++ _ -> case catch uppercase(gettype(Func, V)) of {'EXIT', _} -> Unknown; UppType -> UppType end; EnumType -> EnumType end, case getdef(Func, V) of pointer when T == "GLcharARB";T == "GLchar" -> ?W(" sdl:send_bin(list_to_binary([~s,0]), ?MODULE, ?LINE),~n", [Var]), already_sent; pointer -> %% ?W(" sdl:send_bin(~s, ?MODULE, ?LINE),", [Var]), ?W("%% Maybe NULL or offset sometimes~n",[]), ?W(" New~s =~n if is_integer(~s) -> ~s;~n" " true ->~n",[Var,Var,Var]), ?W(" sdl:send_bin(~s, ?MODULE, ?LINE),~n",[Var]), ?W(" 0~n end,~n", []), {"GLint", "new" ++ Var}; sdlmem -> ?W(" sdl:send_bin(~s, ?MODULE, ?LINE),~n", [Var]), already_sent; {index_or_list, Val} -> ?W("%% Maybe NULL or offset sometimes2~n",[]), ?W(" New~s = if is_integer(~s) -> ~s; ~n", [Var,Var,Var]), ?W("\tis_list(~s) ; is_tuple(~s) -> ", [Var, Var]), ?W("sdl:send_bin(list_to_binary(term2bin(~s, ~s, ~s)),?MODULE,?LINE),0;~n", [Var, uppercase(Val), Type]), ?W("\tis_binary(~s) -> sdl:send_bin(~s, ?MODULE, ?LINE),0;~n",[Var,Var]), ?W("\ttrue -> erlang:error({?MODULE, ?LINE, unsupported_type, ~s})~n", [Var]), ?W(" end, ~n", []), {"GLint", "new" ++ Var}; Val when integer(Val) -> case Val == 16 andalso is_matrixOp(Func) of true -> ?W(" New~s = if~n", [Var]), ?W("\tis_list(~s) ; is_tuple(~s) -> ", [Var, Var]), ?W("matrix2bin(~s, ~s);~n", [Var, Type]), ?W("\tbinary(~s) -> ~s;~n",[Var, Var]), ?W("\ttrue -> erlang:error({?MODULE, ?LINE, unsupported_type, ~s})~n", [Var]), ?W(" end, ~n", []), {binary, "new" ++ Var}; false -> ?W(" New~s = if~n", [Var]), ?W("\tis_list(~s) ; is_tuple(~s) -> ", [Var, Var]), ?W("term2bin(~s, ~p, ~s);~n", [Var, Val, Type]), %% ?W("\tbinary(~s), size(~s) >= ~p * ~s -> ~s;~n", %% [Var, Var, Val, gl_type_size(Type), Var]); ?W("\tbinary(~s) -> ~s;~n",[Var, Var]), ?W("\ttrue -> erlang:error({?MODULE, ?LINE, unsupported_type, ~s})~n", [Var]), ?W(" end, ~n", []), {binary, "new" ++ Var} end; {undefined, _,_} when IsLast -> %% Assert that XXXLen is only generated last ?W(" New~s = if~n", [Var]), %% the code for handling XXXLen has been removed ?W("\tis_list(~s) -> ", [Var]), %% in the c-code (except for type GLdouble) ?W(" ~sLen = length(~s), ~n" "\t [<<~sLen:32/native>>, term2bin(~s, ~sLen, ~s)];~n", [Var, Var, Var, Var, Var, Type]), ?W("\tis_tuple(~s) -> ", [Var]), ?W(" ~sLen = size(~s), ~n" "\t [<<~sLen:32/native>>, term2bin(~s, ~sLen, ~s)];~n", [Var, Var, Var, Var, Var, Type]), ?W("\tis_binary(~s) -> " "[<<(size(~s) div ~s):32/native>>,~s];~n", [Var, Var, gl_type_size(Type), Var]), ?W("\ttrue -> erlang:error({?MODULE, ?LINE, unsupported_type, ~s})~n", [Var]), ?W(" end, ~n", []), {binary, "new" ++ Var}; Val when list(Val) -> ?W(" New~s = if~n", [Var]), ?W("\tis_list(~s) ; is_tuple(~s) -> ", [Var, Var]), ?W("term2bin(~s, ~s, ~s);~n", [Var, uppercase(Val), Type]), %% ?W("\tis_binary(~s), size(~s) >= ~s * ?gl_type_size(~s) -> ~s;~n", %% [Var, Var, uppercase(Val), gl_type_size(Type), Var]) ?W("\tis_binary(~s) -> ~s;~n", [Var, Var]), ?W("\ttrue -> erlang:error({?MODULE, ?LINE, unsupported_type, ~s})~n", [Var]), ?W(" end, ~n", []), {binary, "new" ++ Var} end. get_size(Func, {"GLubyte",pointer}, R, _First) -> "strlen(egl_res) " ++ get_size(Func, "void", R, "+ "); get_size(Func, {Type,pointer}, R, "") when ?GLUTYPE(Type) -> "sizeof(" ++ Type ++ "*) " ++ get_size(Func, "void", R, "+ "); get_size(Func,"void", [{_V,pointer,T}|R], First) -> First ++ "sizeof(" ++ T ++ "*)" ++ get_size(Func,"void", R, "+ "); get_size(Func,"void", [{V,T}|R], First) -> case getdef(Func, V) of N when integer(N) -> First ++ "sizeof(" ++ T ++ ") *" ++ integer_to_list(N) ++ get_size(Func,"void", R, "+ "); {undefined, Val, _} when integer(Val) -> First ++ "sizeof(" ++ T ++ ") *" ++ integer_to_list(Val) ++ get_size(Func,"void", R, "+ "); Val when is_list(Val) -> First ++ "sizeof(" ++ T ++ ") * (*" ++ Val ++ ")" ++ get_size(Func,"void", R, "+ "); {Val,_} when is_list(Val) -> First ++ "sizeof(" ++ T ++ ") * (*" ++ Val ++ ")" ++ get_size(Func,"void", R, "+ ") % {undefined, Val, _} when is_list(Val)-> % First ++ "sizeof(" ++ T ++ ") * (*" ++ Val ++ ")" ++ % get_size(Func,"void", R, "+ ") end; get_size(Func,Type, R, "") -> "sizeof(" ++ Type ++ ") " ++ get_size(Func,"void", R, "+ "); get_size(_Func,"void", [], "+ ") -> []. bump_buff(false, Type, Len, Fd) when number(Len) -> ?W(" bp += sizeof(~s)*(~w); ~n", [Type, Len]); bump_buff(false, Type, Len, Fd) when is_list(Len) -> ?W(" bp += sizeof(~s)*(*~s); ~n", [Type, Len]); bump_buff(true, _,_,_) -> ok. write_args(FuncName, T, L, Fd) -> put(arg_cnt, 0), case has_binary(FuncName) of false -> skip; _ when T == binerl -> ?W("[", []); _ -> skip end, write_args(FuncName, T, L, Fd, first, 0). write_args(FuncName, T, [H], Fd, Prev, Align0) -> Args = remap_const(FuncName, H), {Prev1,Align} = write_arg(FuncName, T, Args, Fd, Prev, true, Align0), case Prev1 of buildbin when T == binerl -> ?W(">>", []); _ -> skip end, case has_binary(FuncName) of false -> skip; _ when T == binerl -> ?W("]", []); _ -> skip end, Align; write_args(_FuncName, Type, [], Fd, _First0, _Align0) -> if Type == binerl -> ?W("[]", []); true -> skip end; write_args(FuncName, Type, [H|R], Fd, Prev0, Align0) -> Args = remap_const(FuncName, H), {Prev,Align} = write_arg(FuncName, Type, Args, Fd, Prev0, false, Align0), write_args(FuncName, Type, R, Fd, Prev, Align). write_arg(_FuncName, Type, {T,V}, Fd, Prev0, IsLast, Align0) -> Cont = case Prev0 of first -> ""; _Else -> ", " end, Align = write_align(Type, Align0, T, Fd), Prev = case Type of c -> ?W("~s~s ~s", [Cont, T, V]), no; cdef when ((T == "GLdouble") or (T == "GLclampd")) -> ?W(" ~s ~s;~n", [T, V]), no; cdef -> ?W(" ~s * ~s;~n", [T, V]), no; binc when ((T=="GLdouble") or (T=="GLclampd")), IsLast -> ?W(" memcpy(&~s, bp, sizeof(~s)); ~n", [V, T]), no; binc when ((T=="GLdouble") or (T=="GLclampd")) -> ?W(" memcpy(&~s, bp, sizeof(~s)); bp += sizeof(~s); ~n", [V, T, T]), no; binc when IsLast -> ?W(" ~s = (~s *) bp; ~n", [V, T]), no; binc -> ?W(" ~s = (~s *) bp; bp += sizeof(~s); ~n", [V, T, T]), no; ccalls when ((T=="GLdouble") or (T=="GLclampd")) -> ?W("~s~s", [Cont, remCarray(V)]), no; ccalls -> ?W("~s*~s", [Cont, remCarray(V)]), no; erl -> ?W("~s~s", [Cont, element(1, erlVar(V))]), no; erlcom -> ?W("~s~s::~s", [Cont, element(1, erlVar(V)),erltype(T)]), no; binerl -> Next = write_binarg(Prev0, T, Fd), binary_arg(erlVar(V), T, Fd), Next end, {Prev, Align+typeSz(T)}; write_arg(FuncName, Type, {T,pointer, V}, Fd, Prev0, _IsLast, Align0) -> Cont = case Prev0 of first -> ""; _Else -> ", " end, Align = write_align(Type, Align0, T, Fd), Prev = case Type of c -> ?W("~s~s * ~s", [Cont, T, V]); cdef -> case getdef(FuncName, V) of Val when integer(Val) -> ?W(" ~s ~s[~p]; ~n", [T, V, Val]); _ when ?GLUTYPE(T) -> case T of "GLUtesselator" -> ?W(" eglu_tessobj * ~s;~n", [V]); _ -> ?W(" ~s * ~s;~n", [T,V]) end; {undefined, Val,_} -> ?W(" ~s ~s[~p];~n", [T,V,Val]); % pointer -> % ?W(" char ~sMemT = 0;~n", [T,V]); % ?W(" ~s * ~s = NULL;~n", [T,V]); sdlmem -> ?W(" GLvoid * ~s = NULL;~n", [V]); Variable when list(Variable) -> ?W(" ~s * ~s = NULL;~n", [T,V]); {Variable,_Max} when list(Variable) -> ?W(" ~s * ~s = NULL;~n", [T,V]); Error -> erlang:error({?MODULE, ?LINE, Error}) end; binc -> case getdef(FuncName, V) of sdlmem -> Cnt = get(arg_cnt), ?W(" ~s = (~s *) egl_sd->bin[~w].base; ~n", [V,T,Cnt]), put(free_args, true), put(arg_cnt, Cnt+1); _ when ?GLUTYPE(T) -> case T of "GLUtesselator" -> ?W(" GetNativePtr(~s, (eglu_tessobj *),bp);~n", [V]); _ -> ?W(" GetNativePtr(~s, (~s *),bp);~n", [V,T]) end; Variable when list(Variable) -> ?W(" ~s = (~s*) malloc(sizeof(~s)*(*~s));~n", [V,T,T,Variable]); {Variable,Max} when list(Variable) -> ?W(" ~s = (~s*) malloc(sizeof(~s)*(*~s));~n", [V,T,T,Max]); Var when integer(Var) -> skip; {undefined, _Var, _} -> skip; Error -> erlang:error({?MODULE, ?LINE, Error}) end; ccalls -> case getdef(FuncName, V) of sdlmem -> ?W("~s~s", [Cont, V]); _ when T == "GLUtesselator" -> ?W("~s~s->tess", [Cont,V]); _ -> ?W("~s~s", [Cont,remCarray(V)]) end; erlcom -> case getdef(FuncName, V) of sdlmem -> ?W("~s~s::~s", [Cont, element(1, erlVar(V)), erltype(sdlmem)]); _ when ?GLUTYPE(T) -> ?W("~s~s::~s", [Cont,element(1, erlVar(V)), erltype(T)]); _ -> ignore end; erl -> case getdef(FuncName, V) of sdlmem -> ?W("~s#sdlmem{bin=~s}", [Cont, element(1, erlVar(V))]); _ when ?GLUTYPE(T) -> ?W("~s~s=#~s{}", [Cont,element(1, erlVar(V)),eglutype(T)]); _ -> ignore end; binerl -> case getdef(FuncName, V) of sdlmem -> % write_binarg(Prev0, T, Fd), % ?W("(~s#sdlmem.ptr):32/big-unsigned", % [element(1, erlVar(V))]), % buildbin; Prev0; _ when ?GLUTYPE(T) -> write_binarg(Prev0, T, Fd), ?W("(~s#~s.ptr)~s", [element(1, erlVar(V)),eglutype(T), bintype(T)]), buildbin; _ -> Prev0 end end, {Prev, Align}; write_arg(FuncName, Type, {T, const, pointer, V}, Fd, Prev0, IsLast, Align0) -> Cont = case Prev0 of first -> ""; _Else -> ", " end, Align1 = write_align(Type, Align0, T, Fd), Prev = case Type of c -> ?W("~s const ~s * ~s", [Cont, T, V]); cdef -> case getdef(FuncName, V) of Val when integer(Val), ((T=="GLdouble") or (T=="GLclampd")) -> ?W(" ~s ~s[~w];~n", [T, V, Val]); Val when integer(Val) -> ?W(" ~s * ~s;~n", [T, V]); {undefined, Val,_} when ((T=="GLdouble") or (T=="GLclampd")) -> if is_list(Val) -> ?W(" ~s *~s;int * ~sLen;~n", [T,V,V]); true -> ?W(" ~s ~s[~w];int * ~sLen;~n", [T,V,Val,V]) end; {undefined, _Val,_} -> ?W(" ~s * ~s;~n", [T,V]); pointer when ((T=="GLdouble") or (T=="GLclampd")) -> ?W("{not_implemented, ~p}", [?LINE]), ?W(" int * ~sMemT = 0;~n", [V]), ?W(" int * ~sLen = 0;~n", [V]), ?W(" ~s * ~s = NULL;~n", [T,V]); pointer -> ?W(" ~s * ~s = NULL;~n", [T,V]); sdlmem -> ?W(" GLvoid * ~s = NULL;~n", [V]); %% ?W(" oglmem * ~s = NULL;~n", [V]); Variable when list(Variable) -> ?W(" ~s * ~s = NULL; ~n", [T,V]); {tuplelist,_N} -> ?W(" ~s * ~s = NULL;~n", [T,V]); {index_or_list,_} -> ?W(" ~s * ~s = NULL;~n", [T,V]); Error -> erlang:error({?MODULE, ?LINE, Error}) end; binc -> case getdef(FuncName, V) of Val when integer(Val),((T=="GLdouble") or (T=="GLclampd")) -> ?W(" memcpy(~s,bp,sizeof(~s)*~w); ~n", [V,T,Val]), bump_buff(IsLast, T, Val, Fd); Val when integer(Val) -> ?W(" ~s = (~s *) bp;~n",[V,T]), bump_buff(IsLast, T, Val, Fd); {undefined, Val,_} when ((T=="GLdouble") or (T=="GLclampd")) -> ?W(" ~sLen = (int *) bp; bp += sizeof(int); ~n", [V]), if is_list(Val) -> ?W(" ~s = (~s*) malloc(sizeof(~s)*(*~sLen));~n", [V,T,T,V]); true -> ignore end, ?W(" memcpy(~s,bp,sizeof(~s)*(*~sLen));~n" " bp += sizeof(~s)*(*~sLen); ~n", [V,T,V,T,V]); {undefined, _Val,_} when IsLast -> ?W(" bp += sizeof(int); ~n",[]), ?W(" ~s = (~s *) bp; ~n", [V,T]); {undefined, Val,_} when is_list(Val) -> ?W(" bp += sizeof(int); ~n", []), ?W(" ~s = (~s *) bp; bp += sizeof(~s)*(*~s); ~n", [V,T,T,Val]); pointer when ((T=="GLdouble") or (T=="GLclampd")) -> ?W("{not_implemented, ~p}", [?LINE]); pointer -> Cnt = get(arg_cnt), ?W(" if(egl_sd->next_bin == ~p) {~n ~s = (~s *) *(GLint *)bp;~n", [Cnt,V,T]), ?W(" } else {~n ~s = (~s *) egl_sd->bin[~w].base;~n };~n", [V,T,Cnt]), ?W(" bp += sizeof(GLint);~n", []), put(free_args, true), put(arg_cnt, Cnt+1); {index_or_list,_} -> Cnt = get(arg_cnt), ?W(" if(egl_sd->next_bin == ~p) {~n ~s = (~s *) *(GLint *)bp;~n", [Cnt,V,T]), ?W(" } else {~n ~s = (~s *) egl_sd->bin[~w].base;~n };~n", [V,T,Cnt]), ?W(" bp += sizeof(GLint);~n", []), put(free_args, true), put(arg_cnt, Cnt+1); sdlmem -> Cnt = get(arg_cnt), ?W(" ~s = (~s *) egl_sd->bin[~w].base; ~n", [V,T,Cnt]), put(free_args, true), put(arg_cnt, Cnt+1); {tuplelist,_N} -> Cnt = get(arg_cnt), ?W(" ~s = (~s *) egl_sd->bin[~w].base; ~n", [V,T,Cnt]), put(free_args, true), put(arg_cnt, Cnt+1); Str when list(Str), ((T=="GLdouble") or (T=="GLclampd")) -> ?W(" ~s = (~s*) malloc(sizeof(~s)*(*~s));~n", [V,T,T,Str]), ?W(" memcpy(~s,bp,sizeof(~s)*(*~s));~n", [V,T,Str]), bump_buff(IsLast, T,Str,Fd); Str when list(Str) -> TT = if T == "GLvoid" -> gettype(FuncName, V); true -> T end, ?W(" ~s = (~s *) bp;~n", [V,T]), bump_buff(IsLast, TT,Str,Fd); Error -> erlang:error({?MODULE,?LINE, Error}) end; ccalls -> ?W("~s~s", [Cont, remCarray(V)]); erlcom -> case is_vector(FuncName) of false -> ?W("~s~s::binary() | [~s]", [Cont, element(1, erlVar(V)),erltype(T)]); {tuplelist, 1} -> write_tuple(erlVar(V), 1, Cont++"[","::"++erltype(T),"]",Fd); {tuplelist, Int} -> write_tuple(erlVar(V), Int, Cont++"[{","::"++erltype(T),"}]",Fd); Int -> write_tuple(erlVar(V), Int, Cont++"{","::"++erltype(T),"}",Fd) end; erl -> case is_vector(FuncName) of Int when is_integer(Int) -> write_tuple(erlVar(V), Int, Cont++"{", "", "}",Fd); _ -> ?W("~s~s", [Cont, element(1, erlVar(V))]) end; binerl -> case is_vector(FuncName) of Int when integer(Int) -> write_binarg(Prev0, T, Fd), write_tuple(erlVar(V), Int, "", bintype(T), "", Fd), buildbin; {tuplelist, _Int} -> exit({?MODULE,?LINE}); _ -> Prev0 end end, Align = case erlVar(V) of {_, 0} -> Align1 + typeSz(T); {_, N} when T /= binary -> Align1 + typeSz(T)*N end, {Prev, Align}; write_arg(_FuncName, _Type, {T,pointer,pointer,_V}, _Fd, _First, _IsLast, _Align) when T == ((T=="GLdouble") or (T=="GLclampd")) -> erlang:error({not_implemented, ?LINE}); write_arg(_FuncName, Type, {T, pointer, pointer, V}, Fd, First, _IsLast, Align) -> Cont = case First of first -> ""; {first,_} -> ""; _Else -> ", " end, case Type of c -> ?W("~s ~s* *~s", [Cont, T, V]); cdef -> ?W(" ~s *~s = NULL;~n", [T,V]); binc -> ignore; ccalls -> ?W("~s&~s", [Cont, remCarray(V)]); erlcom -> io:format("~p~p error", [?MODULE,?LINE]), exit(error) end, {no, Align}; write_arg(FuncName,Type,{T,const,pointer,pointer,V},Fd,First, _IsLast,Align) when FuncName == "glShaderSource" -> Cont = case First of first -> ""; {first,_} -> ""; _Else -> ", " end, case Type of c -> ?W("~s const ~s* *~s", [Cont, T, V]); cdef -> ?W(" const ~s* *~s;~n", [T,V]), ?W(" int index;~n", []); binc -> case getdef(FuncName, V) of Variable when list(Variable) -> ?W(" ~s = (const ~s* *) malloc(sizeof(~s*)*(*~s));~n", [V,T,T,Variable]), Cnt = get(arg_cnt), ?W(" for(index=0; index < *~s; index++) ~n" " ~s[index] = (~s *) egl_sd->bin[index+~w].base;~n", [Variable, V, T, Cnt]), put(free_args, true), put(arg_cnt, unusable) end; ccalls -> ?W("~s~s", [Cont, remCarray(V)]); erl -> ?W("~s~s", [Cont, element(1, erlVar(V))]); erlcom -> ?W("~s~s::[binary()]", [Cont, element(1, erlVar(V))]); _ -> ignore end, {no, Align}; write_arg(_FuncName, _Type, {_T, callback, _V}, Fd, _First, _, Align) -> io:format("Error Dont know how to generate callbacks~n", []), io:format(Fd,"Error Dont know how to generate callbacks~n", []), {no, Align}. write_tuple({V,0}, N, Start, Type, End, Fd) -> ?W("~s", [Start]), write_tuple2(V, 1, N, Type, End, Fd). write_tuple2(V,N,N, Type, End,Fd) -> ?W("~s~w~s~s", [V, N, Type,End]); write_tuple2(V,N,Max, Type, End,Fd) -> ?W("~s~w~s,", [V, N, Type]), write_tuple2(V,N+1,Max, Type, End,Fd). write_binarg(Prev0, binary, Fd) -> if Prev0 == first -> ?W(" ",[]), binary; Prev0 == binary -> ?W(", ",[]), binary; true -> ?W(">>,",[]), binary end; write_binarg(Prev0, _, Fd) -> if Prev0 == first -> ?W("<<", []), buildbin; Prev0 == binary -> ?W(", <<", []), buildbin; true -> ?W(", ", []), buildbin end. write_undef_rets(_FuncName, [], _Fd) -> ok; write_undef_rets(FuncName, [{V,_T}|R], Fd) -> case getdef(FuncName,V) of {undefined, Max, Enum} -> ?W( " ~sLen = ~sLen(~s),~n", [uppercase(V),FuncName,uppercase(Enum)]), ?W( " ~sBump = ~w - ~sLen,~n", [uppercase(V),Max,uppercase(V)]); _ -> skip end, write_undef_rets(FuncName,R,Fd); write_undef_rets(FuncName, [_|R],Fd) -> write_undef_rets(FuncName,R,Fd). write_returns(_FuncName, erlcom, Type, Rets, Fd) -> case {Type, Rets} of {"void", []} -> ?W("ok", []); {"void", [{D,_}]} -> ?W("~s::[~s]", [uppercase(D),erltype(Type)]); {"void", [{D,pointer,_}]} -> ?W("~s::sdlmem()", [uppercase(D)]); {"void", [{V1, T1}|R]} -> ?W("{[~s::~s]", [uppercase(V1),erltype(T1)]), [?W(", [~s::~s]", [uppercase(V),erltype(T2)]) || {V, T2} <- R], ?W("}", []); {{RType, pointer}, []} when ?GLUTYPE(RType) -> ?W("[~s]", [uppercase(eglutype(RType))]); {{RT,pointer}, []} -> ?W("[~s]", [erltype(RT)]); {Type, []} -> ?W("~s", [erltype(Type)]); {Type, _} -> ?W("{~s", [erltype(Type)]), [?W(", [~s::~s]", [uppercase(V),erltype(T)]) || {V,T} <- Rets], ?W("}", []) end; write_returns(FuncName, erl, Type, Rets, Fd) -> case {Type, Rets} of {"void", []} -> erlang:error({?MODULE, ?LINE, {erl, Type, Rets}}); {{RType, pointer}, []} when ?GLUTYPE(RType) -> ?W("\t<<", []), binary_arg({"Ret", 0}, RType, Fd), ?W(">> -> ~n #~s{ptr=Ret};~n", [eglutype(RType)]); {{RType,pointer}, []} -> ?W("\tRet -> bin2list(undefined,~s,Ret);~n", [type_to_enum(RType)]); {Type, []} -> ?W("\t<<", []), binary_arg({"Ret", 0}, Type, Fd), ?W(">> -> ~n ~s;~n",[boolret("Ret", Type)]); {"void", _} -> write_rets(FuncName, Rets, Rets,Fd, 0, "void"); {Type, _} -> ?W("\t<<", []), binary_arg({"Ret", 0}, Type, Fd), write_rets(FuncName,Rets,Rets,Fd, 1, Type) end. write_rets(Func, [Ret], _, Fd, 0,_T) -> ?W("\t<<",[]), write_ret(Func, Ret, Fd), ?W(">> -> ~n\t ",[]), write_ret2(Func, Ret, "", Fd), ?W(";~n",[]); write_rets(Func, [Ret|R], Rets, Fd, N,T) -> if N == 0 -> ?W("\t<<",[]); true -> ?W(", ",[]) end, write_ret(Func, Ret, Fd), write_rets(Func, R, Rets, Fd, N+1,T); write_rets(Func, [], Rets, Fd, N,Type) -> if N == 1 -> ?W(">> -> ~n\t ",[]); Type == "void" -> ?W(">> -> ~n\t {",[]); true -> ?W(">> -> ~n\t {~s, ",[boolret("Ret", Type)]) end, write_ret2(Func, hd(Rets), "", Fd), [write_ret2(Func, Ret, ", ", Fd) || Ret <- tl(Rets)], if N == 1 -> ?W(";~n ",[]); true -> ?W("};~n",[]) end. write_ret(FuncName, {D,T}, Fd) -> UD = uppercase(D), case getdef(FuncName, D) of 1 -> ?W("~s~s", [UD, bintype(T)]); {undefined, _Max, _} -> ?W("~s:~sLen/binary-unit:~s_SIZE,_:~sBump/binary-unit:~s_SIZE", [UD, UD, type_to_enum(T), UD, type_to_enum(T)]); {Length,_Max} when list(Length) -> ?W("~s:~s/binary-unit:~s_SIZE", [UD, uppercase(Length), type_to_enum(T)]); Length when list(Length) -> ?W("~s:~s/binary-unit:~s_SIZE", [UD, uppercase(Length), type_to_enum(T)]); Length when integer(Length) -> ?W("~s:~w/binary-unit:~s_SIZE", [UD, Length, type_to_enum(T)]) end; write_ret(_FuncName, {D,pointer,_T}, Fd) -> UD = uppercase(D), ?W("~s:32/big-unsigned", [UD]). write_ret2(FuncName, {D,T}, Cont, Fd) -> UD = uppercase(D), case getdef(FuncName, D) of 1 -> ?W("~s~s", [Cont,UD]); {undefined, _Max, _} -> ?W("~sbin2list(~sLen, ~s, ~s)", [Cont,UD,type_to_enum(T),UD]); Length when list(Length) -> ?W("~sbin2list(~s, ~s, ~s)", [Cont,uppercase(Length),type_to_enum(T),UD]); {Length,_Max} when list(Length) -> ?W("~sbin2list(~s, ~s, ~s)", [Cont,uppercase(Length),type_to_enum(T),UD]); Length when integer(Length) -> ?W("~sbin2list(~w, ~s, ~s)", [Cont,Length,type_to_enum(T),UD]) end; write_ret2(_FuncName, {_D,pointer,_T}, Cont, Fd) -> %% ?W("~s#sdlmem{ptr=~s}", [Cont,UD]). ?W("~serlang:error({nyi, ?MODULE,?LINE})", [Cont]). find_returns(Args,Funcs) -> find_returns(Args,Funcs,[],[]). find_returns([{T, pointer, pointer, V}|R], Func, Rets, Args) -> find_returns(R, Func, [{V,pointer,T}|Rets],Args); find_returns([W={T, pointer, V}|R], Func, Rets, Args) -> case getdef(Func, V) of sdlmem -> find_returns(R, Func, Rets, [W|Args]); _ when ?GLUTYPE(T) -> find_returns(R, Func, Rets, [W|Args]); _ -> case remap_const(Func, W) of W -> find_returns(R, Func, [{V,T}|Rets],Args); New -> find_returns(R, Func, Rets,[New|Args]) end end; find_returns([H|R], Func,Rets,Args) -> find_returns(R, Func, Rets, [H|Args]); find_returns([], _Func,Rets,Args) -> {lists:reverse(Rets),lists:reverse(Args)}. boolret(Var, "GLboolean") -> Var ++ " /= ?GL_FALSE"; boolret(Var, _) -> Var. write_align(binerl, A, T, Fd) when (A rem 4) /= 0 -> case typeSz(T) of _ when T == binary -> PadBytes = 4-(A rem 4), ?W(", 0:~p", [PadBytes*8]), 0; 1 -> A; 2 when (A rem 2) == 0 -> A; 2 -> %% Pad one byte ?W(", 0:8", []), A + 1; _ -> PadBytes = 4 - (A rem 4), ?W(", 0:~p", [PadBytes*8]), 0 end; write_align(binc, A, T, Fd) when (A rem 4) /=0 -> case typeSz(T) of _ when T == binary -> PadBytes = 4 - (A rem 4), ?W(" bp += ~p;~n", [PadBytes]), 0; 1 -> A; 2 when (A rem 2) == 0 -> A; 2 -> %% Pad one byte ?W(" bp += 1;~n", []), A + 1; _ -> %% Expecting that 64 bits can be word aligned PadBytes = 4 - (A rem 4), ?W(" bp += ~p;~n", [PadBytes]), 0 end; write_align(_,A,_,_) -> A. binary_arg({Var, 0}, binary, Fd) -> ?W("~s", [Var]); binary_arg({Var, 0}, Type, Fd) -> ?W("~s~s", [Var, bintype(Type)]); binary_arg({Var, N}, Type, Fd) -> io:format("**Shouldn't be here in binary_arg ~p~n", [{{Var, N}, Type}]), ?W(">>,term2bin(~s, ~s, ?~s)),<<", [Var, N, Type]). % bintype(binary) -> %% Probably a pointer % "/binary"; bintype("GLvoid") -> %% Probably a pointer ":32/?UN"; bintype("GLenum") -> ":32/?UN"; bintype("GLboolean") -> ":8/unsigned"; bintype("GLbyte") -> ":8/signed"; bintype("GLshort") -> ":16/?SN"; bintype("GLint") -> ":32/?SN"; bintype("GLubyte") -> ":8/unsigned"; bintype("GLushort") -> ":16/?UN"; bintype("GLuint") -> ":32/?UN"; bintype("GLsizei") -> ":32/?SN"; bintype("GLfloat") -> ":32/?FN"; bintype("GLclampf") -> ":32/?FN"; bintype("GLdouble") -> ":64/?FN"; bintype("GLclampd") -> ":64/?FN"; bintype("GLbitfield") -> ":32/?UN"; bintype("GLchar" ++ _) -> ":8/?UN"; bintype("GLhandle" ++ _) -> ":32/?UN"; bintype("GLsizeiptr") -> ":32/?UN"; bintype("GLintptr") -> ":32/?UN"; %% bintype("?_PTR") -> %% ":?_PTR"; %% GLU types bintype("GLUnurbs") -> %% a pointer ":32/?UN"; bintype("GLUquadric") -> %% a pointer ":32/?UN"; bintype("GLUtesselator") -> %% a pointer ":32/?UN"; bintype(What) -> "GeneraterUnknownType:" ++ What. eglutype("GLUtesselator") -> "tessPtr"; eglutype("GLUquadric") -> "quadricPtr"; eglutype("GLUnurbs") -> "nurbsPtr". type_to_enum("GLboolean") -> "?GL_BYTE"; type_to_enum("GLbyte") -> "?GL_BYTE"; type_to_enum("GLshort") -> "?GL_SHORT"; type_to_enum("GLint") -> "?GL_INT"; type_to_enum("GLubyte") -> "?GL_UNSIGNED_BYTE"; type_to_enum("GLcharARB") -> "?GL_UNSIGNED_BYTE"; type_to_enum("GLchar") -> "?GL_UNSIGNED_BYTE"; type_to_enum("GLushort") -> "?GL_UNSIGNED_SHORT"; type_to_enum("GLuint") -> "?GL_UNSIGNED_INT"; type_to_enum("GLsizei") -> "?GL_UNSIGNED_INT"; type_to_enum("GLfloat") -> "?GL_FLOAT"; type_to_enum("GLclampf") -> "?GL_FLOAT"; type_to_enum("GLdouble") -> "?GL_DOUBLE"; type_to_enum("GLclampd") -> "?GL_DOUBLE"; type_to_enum("GLbitfield") -> "?GL_INT"; type_to_enum("GLenum") -> "?GL_INT"; %% hmm type_to_enum("GLhandleARB") -> "?GL_UNSIGNED_INT"; type_to_enum("GLsizeiptr") -> "?GL_UNSIGNED_INT"; %% hmm type_to_enum("GLintptr") -> "?GL_UNSIGNED_INT"; %% hmm type_to_enum(What) -> "GeneraterUnknownType: " ++ What. erltype("GLboolean") -> "bool()"; erltype("GLbyte") -> "integer()"; erltype("GLshort") -> "integer()"; erltype("GLint") -> "integer()"; erltype("GLubyte") -> "integer()"; erltype("GLcharARB") -> "integer()"; erltype("GLchar") -> "integer()"; erltype("GLushort") -> "integer()"; erltype("GLuint") -> "integer()"; erltype("GLsizei") -> "integer()"; erltype("GLfloat") -> "float()"; erltype("GLclampf") -> "float()"; erltype("GLdouble") -> "float()"; erltype("GLclampd") -> "float()"; erltype("GLbitfield") -> "integer()"; erltype("GLenum") -> "integer()"; %% hmm erltype("GLhandleARB") -> "integer()"; erltype("GLsizeiptr") -> "integer()"; %% hmm erltype("GLintptr") -> "integer()"; %% hmm erltype("GLvoid") -> "number()"; %% hmm erltype(sdlmem) -> "sdlmem()"; %% hmm %%erltype({binORlist,T}) -> "::binary()"; %% hmm erltype(T) when ?GLUTYPE(T) -> "::"++ eglutype(T) ++"()"; %% hmm erltype(_T) -> "term()". typeSz(T) -> case type_to_enum(T) of "GeneraterUnknownType" ++ _ -> byteSz(T); Else -> byteSz(Else) end. byteSz(TYPE) -> case TYPE of "boolean" -> ?GL_BYTE_SIZE div 8; "GLboolean" -> ?GL_BYTE_SIZE div 8; "GLenum" -> ?GL_INT_SIZE div 8; "?GL_BYTE" -> ?GL_BYTE_SIZE div 8; "?GL_UNSIGNED_BYTE" -> ?GL_UNSIGNED_BYTE_SIZE div 8; "?GL_SHORT" -> ?GL_SHORT_SIZE div 8; "?GL_UNSIGNED_SHORT" -> ?GL_UNSIGNED_SHORT_SIZE div 8; "?GL_INT" -> ?GL_INT_SIZE div 8; "?GL_UNSIGNED_INT" -> ?GL_UNSIGNED_INT_SIZE div 8; "?GL_FLOAT" -> ?GL_FLOAT_SIZE div 8; "?GL_DOUBLE" -> ?GL_DOUBLE_SIZE div 8; "GLvoid" -> ?GL_INT_SIZE div 8; % Pointer "void" -> ?GL_INT_SIZE div 8; % Pointer "GLintptr" ++ _ -> ?GL_UNSIGNED_INT_SIZE div 8; % long ? "GLsizeiptr" ++ _ -> ?GL_UNSIGNED_INT_SIZE div 8; % long ? "GLchar" ++ _ -> ?GL_BYTE_SIZE div 8; "GLhandle" ++ _ -> ?GL_UNSIGNED_INT_SIZE div 8; "?_PTR" ++ _ -> 8; %% Always 8 binary -> 4 %% Ignore binariers are always 32 aligned. end. remCarray(Arg) -> case string:tokens(Arg, "[]") of [Arg] -> [Arg]; [Arg1, _ArraySize] -> [Arg1] end. erlVar(Arg) -> case string:tokens(Arg, "[]") of [Arg] -> {uppercase(Arg), 0}; [Arg1, ArraySize] -> {uppercase(Arg1), ArraySize} end. lowercase([F|R]) -> [F+($a-$A)|R]. uppercase([F|R]) when F >= $a-> [F+($A-$a)|R]; uppercase(Str) when list(Str) -> Str. uppercase_all([F|R]) when F >= $a-> [F+($A-$a)|uppercase_all(R)]; uppercase_all([A|R]) -> [A|uppercase_all(R)]; uppercase_all([]) -> []. format_func2erl([$g,$l, $x, U|Rest]) -> lowercase([U|Rest]); format_func2erl([$g,$l, $u, U|Rest]) -> lowercase([U|Rest]); format_func2erl("glBegin") -> "\'begin\'"; format_func2erl("glEnd") -> "\'end\'"; format_func2erl([$g,$l, U|Rest]) -> lowercase([U|Rest]). format_func2c([$g,$l, $x, U|Rest]) -> lowercase([U|Rest]); format_func2c([$g,$l, $u, U|Rest]) -> "eglu_" ++ lowercase([U|Rest]); format_func2c([$g,$l, U|Rest]) -> "egl_" ++ lowercase([U|Rest]). % tokens(S) -> % tokens1(S, " \r\n", []). tokens(S, Toks) -> tokens1(S, Toks, []). tokens1([C|S], Seps, Toks) -> case lists:member(C, Seps) of true -> tokens1(S, Seps, [C|Toks]); false -> tokens2(S, Seps, Toks, [C]) end; tokens1([], _Seps, Toks) -> replace_and_remove(Toks, []). tokens2([C|S], Seps, Toks, Cs) -> case lists:member(C, Seps) of true -> tokens1(S, Seps, [C, lists:reverse(Cs) |Toks]); false -> tokens2(S, Seps, Toks, [C|Cs]) end; tokens2([], _Seps, Toks, Cs) -> replace_and_remove([lists:reverse(Cs)|Toks], []). replace_and_remove([E|R], Acc) when list(E) -> %% Keep everything that is a word replace_and_remove(R, [E|Acc]); replace_and_remove([$\n | R], Acc) -> %% It is line oriented so keep eol replace_and_remove(R, [eol|Acc]); replace_and_remove([$( | R], Acc) -> replace_and_remove(R, [lpar|Acc]); replace_and_remove([$) | R], Acc) -> replace_and_remove(R, [rpar|Acc]); replace_and_remove([$* | R], Acc) -> replace_and_remove(R, [pointer|Acc]); replace_and_remove([$, | R], Acc) -> replace_and_remove(R, [separtor|Acc]); replace_and_remove([_E|R], Acc) -> %% Ignore everthing else replace_and_remove(R, Acc); replace_and_remove([], Acc) -> Acc. %% The extensions we want to have.. skip_extensions("GL_ARB_vertex_blend",_R) -> false; skip_extensions("GL_ARB_imaging",_R) -> false; skip_extensions("GL_ARB_matrix_palette",_R) -> false; skip_extensions("GL_ARB_shadow_ambient",_R) -> false; skip_extensions("GL_ARB_vertex_program",_R) -> false; skip_extensions("GL_ARB_fragment_program",_R) -> false; skip_extensions("GL_NV_depth_clamp",_R) -> false; %% skip_extensions("GL_ARB_vertex_shader",_R) -> false; %% skip_extensions("GL_ARB_fragment_shader", _R) -> false; %% skip_extensions("GL_ARB_shading_language_100",_R) -> false; %% skip_extensions("GL_ARB_texture_non_power_of_two",_R) -> false; %% skip_extensions("GL_ARB_point_sprite",_R) -> false; skip_extensions("GL_ARB_shader_objects",_R) -> false; %% skip_extensions("GL_ARB_draw_buffers",_R) -> false; skip_extensions("GL_ABGR_EXT", _R) -> false; skip_extensions("GL_ATI_separate_stencil",_R) -> false; %% skip_extensions("",_R) -> false; skip_extensions("GL_NV_float_buffer",_R) -> false; skip_extensions("GL_ATI_texture_float",_R) -> false; skip_extensions("GL_EXT_texture_mirror_clamp",_R) -> false; skip_extensions("GL_EXT_framebuffer_object",_) -> false; %% skip the rest. skip_extensions("GL_ARB_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_EXT_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_SGI" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_FfdMaskSGIX" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_NV_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_HP_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_IBM_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_WIN_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_PGI_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_INTEL_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_REND_screen_coordinates" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_APPLE_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_SUN_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_GREMEDY_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_SUNX_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_INGR_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_MESA_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_3DFX_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_ATI_" ++ _, R) -> skip_to_endif(R,0); skip_extensions("GL_OML_" ++ _, R) -> skip_to_endif(R,0); skip_extensions(_What, _R) -> false. skip_to_endif(["#ifdef", _What, eol | R],N) -> skip_to_endif(R,N+1); skip_to_endif(["#endif", eol |R], N) -> if N == 0 -> R; true -> skip_to_endif(R, N-1) end; skip_to_endif(["#endif", "/", pointer, _, pointer, "/", eol |R], N) -> if N == 0 -> R; true -> skip_to_endif(R, N-1) end; skip_to_endif(R0, N) -> [eol|R] = lists:dropwhile(fun(eol) -> false; (_) ->true end, R0), skip_to_endif(R, N). prototypes(Func) -> "PFN" ++ uppercase_all(Func) ++ "PROC". store_prototypes([Pre, _Type|R0]) when Pre == "WINGDIAPI"; Pre == "GLAPI"; Pre == "extern" -> {Func,R1} = case R0 of ["APIENTRY", F|Rest] -> {F,Rest}; [pointer, "APIENTRY", F|Rest] -> {F,Rest} end, Tree = case get(glext_proto) of undefined -> gb_trees:empty(); Tx -> Tx end, NT = gb_trees:insert(prototypes(Func), Func, Tree), put(glext_proto, NT), [eol|R] = lists:dropwhile(fun(eol) -> false; (_) ->true end, R1), store_prototypes(R); store_prototypes(["#endif"| R0]) -> [eol|R] = lists:dropwhile(fun(eol) -> false; (_) ->true end, R0), R. is_extension(Func) -> case get(glext_proto) of undefined -> false; T -> gb_trees:is_defined(prototypes(Func), T) end. skip(Func) -> case get(Func) of {skip, _Else} -> true; _Else -> has_vector(lists:reverse(Func)) end. arb(Func) -> case get(Func) of {{use,Other}, _} -> {{test,format_func2erl(Other)}, Func}; _What -> case lists:reverse(Func) of "BRA_" ++ Define -> {true,lists:reverse(Define)}; "BRA" ++ Rfunc -> {true,lists:reverse(Rfunc)}; _ -> {false,Func} end end. call_vector(FuncName) -> call_vector(lists:reverse(FuncName), FuncName). call_vector("BRA" ++ List, _Func) -> lists:reverse(List) ++ "vARB"; call_vector(_, Func) -> Func ++ "v". has_vector("v" ++ _) -> false; has_vector([_,_|"paMlg"]) -> %% glMap1d false; has_vector([_,_|"dirGpaMlg"]) -> %% glMapGrid1d false; has_vector([_,_|"mrofinUlg"]) -> %% glUniform false; has_vector([$b, N|_]) when N > 47, N < 58 -> call_vector; has_vector([$i, N|_]) when N > 47, N < 58 -> call_vector; has_vector([$s, N|_]) when N > 47, N < 58 -> call_vector; has_vector([$b,$u,N|_]) when N > 47, N < 58 -> call_vector; has_vector([$i,$u,N|_]) when N > 47, N < 58 -> call_vector; has_vector([$s,$u,N|_]) when N > 47, N < 58 -> call_vector; has_vector([$d, N|_]) when N > 47, N < 58 -> call_vector; has_vector([$f, N|_]) when N > 47, N < 58 -> call_vector; has_vector("BRA" ++ Rest) -> %% ARB has_vector(Rest); has_vector(_) -> false. strip_types(Func) -> RFunc = lists:reverse(Func), case (has_vector(RFunc) /= false) orelse is_vector(Func) /= false of false -> Func; true -> strip_func(RFunc) end. strip_func("BRA" ++ Name) -> strip_func(Name) ++ "ARB"; strip_func("TXE" ++ Name) -> strip_func(Name) ++ "EXT"; strip_func("v" ++ Name) -> strip_func(Name); strip_func("f" ++ Name) -> strip_func(Name); strip_func("d" ++ Name) -> strip_func(Name); strip_func("s" ++ Name) -> strip_func(Name); strip_func("i" ++ Name) -> strip_func(Name); strip_func("u" ++ Name) -> strip_func(Name); strip_func("b" ++ Name) -> strip_func(Name); strip_func([N|Name]) when N > 47, N < 58 -> lists:reverse(Name); strip_func(Name) -> lists:reverse(Name). is_vector(Func) -> case get({is_vector, Func}) of undefined -> Res0 = is_vector2(lists:reverse(Func)), Res = case Func of "glUniform" ++ _ when Res0 /= false -> {tuplelist, Res0}; _ -> Res0 end, put({is_vector, Func}, Res), Res; Else -> Else end. is_vector2([$v,$f,N,$x,$i,$r,$t,$a|_]) when N > 47, N < 58 -> I=N-$0, I*I; is_vector2([$v,$b, N|_]) when N > 47, N < 58 -> N-$0; is_vector2([$v,$i, N|_]) when N > 47, N < 58 -> N-$0; is_vector2([$v,$s, N|_]) when N > 47, N < 58 -> N-$0; is_vector2([$v,$b,$u,N|_]) when N > 47, N < 58 -> N-$0; is_vector2([$v,$i,$u,N|_]) when N > 47, N < 58 -> N-$0; is_vector2([$v,$s,$u,N|_]) when N > 47, N < 58 -> N-$0; is_vector2([$v,$d, N|_]) when N > 47, N < 58 -> N-$0; is_vector2([$v,$f, N|_]) when N > 47, N < 58 -> N-$0; is_vector2(_) -> false. has_binary(Func) -> case get({binary_arg, Func}) of undefined -> false; E -> E end. remap_const(FuncName, Arg = {T, pointer, V}) -> case get(FuncName) of undefined -> Arg; {{use, TestFunc},_} -> remap_const(TestFunc,Arg); {List, _Spec} -> case lists:keysearch(V, 1, List) of {value, {V, {const,_Value}}} -> {T, const, pointer, V}; {value, {V, {const,_Value}, _Type}} -> {T, const, pointer, V}; _ -> Arg end end; remap_const(_FuncName, What) -> What. fixArgsOrder(Func, Args) -> case get(Func) of undefined -> Args; {{use, TestFunc},_} -> fixArgsOrder(TestFunc,Args); {_, []} -> Args; {_, Order} -> fixArgsOrder(Order, Args, []) end. fixArgsOrder([F|R], [A={_,F}|As], Ordered) -> fixArgsOrder(R,As,[A|Ordered]); fixArgsOrder([F|R], [A={_,_,F}|As], Ordered) -> fixArgsOrder(R,As,[A|Ordered]); fixArgsOrder([F|R], [A={_,_,_,F}|As], Ordered) -> fixArgsOrder(R,As,[A|Ordered]); fixArgsOrder([F|R], [A={_,_,_,_,F}|As], Ordered) -> fixArgsOrder(R,As,[A|Ordered]); fixArgsOrder(Next, [A|As], Ordered) -> fixArgsOrder(Next,As++[A],Ordered); fixArgsOrder([], [], Ordered) -> lists:reverse(Ordered). getdef(_Func, Var) when Var == "tess"; Var == "nurb"; Var == "quad" -> Var; getdef(Func, Var) -> case get(Func) of undefined -> case is_vector(Func) of false -> io:format("Undefined length {\"~s\", {[{\"~s\", XX}], []}},~n", [Func, Var]), Var; Num -> Num end; {{use, TestFunc},_} -> getdef(TestFunc,Var); {List, Spec} -> case lists:keysearch(Var, 1, List) of {value, {Var, {const,Value}}} -> Value; {value, {Var, {const,Value}, _Type}} -> Value; {value, {Var, Value}} -> Value; {value, {Var, Value, _Type}} -> Value; _Else -> NewList = List ++ [{Var, "XXX"}], io:format("Undefined length ~p ~n", [{Func, Var, {NewList, Spec}}]), Var end end. gettype(_Func, Var) when Var == "tess"; Var == "nurb"; Var == "quad" -> Var; gettype(Func, Var) -> case get(Func) of undefined -> io:format("Undefined type {\"~s\", {[{\"~s\", XX}], []}},~n", [Func, Var]), Var; {{use, TestFunc},_} -> gettype(TestFunc,Var); {List, Spec} -> case lists:keysearch(Var, 1, List) of {value, {Var, _Value}} -> io:format("Undefined type ~p ~n", [{Func, Var, {List, Spec}}]), undefined; {value, {Var, _Value, Type}} -> Type; _Else -> io:format("Undefined type ~p ~n", [{Func, Var, {List, Spec}}]), undefined end end. is_matrixOp([]) -> false; is_matrixOp("Matrix" ++ _) -> true; is_matrixOp([_A|R]) -> is_matrixOp(R). esdl-1.3.1/rebar.config0000664000070100000120000000170712200143736013374 0ustar dguduucp%% -*- erlang -*- %% Config file for cl-application {erl_opts, [debug_info, fail_on_warning]}. %% Also see rebar.config.script {port_env, [ {"linux", "CFLAGS", "$CFLAGS $SDL_CFLAGS"}, {"linux", "LDFLAGS", "$LDFLAGS $SDL_LIBDIR"}, {"darwin", "CFLAGS", "$CFLAGS -ObjC -D_OSX_COCOA -I/opt/X11/include"}, {"darwin", "LDFLAGS", "$LDFLAGS -framework SDL -rpath @executable_path/../Frameworks"}, {"win32", "CFLAGS", "$CFLAGS -DWIN32 -D_WIN32 -D__WIN32__ $SDL_INCDIR"}, {"win32", "DRV_CFLAGS", "/Zi /W3 $ERL_CFLAGS"}, {"win32", "ERL_LDFLAGS", " /debug /LIBPATH:$SDL_LIBDIR SDL.lib user32.lib"} ]}. {port_specs, [ {"priv/sdl_driver.so", ["c_src/esdl_audio.c", "c_src/esdl_driver.c", "c_src/esdl_events.c", "c_src/esdl_gen.c", "c_src/esdl_gl.c", "c_src/esdl_spec.c", "c_src/esdl_util.c", "c_src/esdl_video.c", "c_src/esdl_wrapper.c" ]} ]}. %% {edoc_opts, [{doclet, edown_doclet}]}. esdl-1.3.1/esdl.pub0000775000070100000120000000066512200143736012556 0ustar dguduucp{name, "esdl"}. {vsn, {0,9}}. {summary, "A 2D & 3D (Opengl) graphics package"}. {author, "Dan Gudmundsson", "dgud@erix.ericsson.se", "001201"}. {keywords, ["sdl", "opengl", "graphic"]}. {needs, [{"sdl (C-lib)",{1,5}}, {"Opengl (c-lib)",{1,1}}]}. {abstract, "Provides access to 2d and 3d graphics through Opengl and SDL." "More information and a prebuilt Windows release" "can be found on http://www.ericsson.se/cslab/~dgud/esdl/"}.