1 module bindbc.sdlgfx.dynload;
2 
3 import bindbc.sdlgfx.defs;
4 
5 version(BindSDLgfx_Static) {}
6 else version = BindSDLgfx_Dynamic;
7 
8 version(BindSDLgfx_Dynamic):
9 
10 import bindbc.loader;
11 
12 private {
13     SharedLib lib;
14     SDLgfxSupport loadedVersion;
15 }
16 
17 enum SDLgfxSupport {
18     noLibrary,
19     badLibrary,
20     SDLgfx
21 }
22 
23 void unloadSDLgfx()
24 {
25     if(lib != invalidHandle) {
26         lib.unload();
27     }
28 }
29 
30 SDLgfxSupport loadedSDLgfxVersion() { return loadedVersion; }
31 
32 bool isSDLgfxLoaded() { return lib != invalidHandle; }
33 
34 SDLgfxSupport loadSDLgfx()
35 {
36     version(Windows) {
37         const(char)[][1] libNames = ["SDL2_gfx.dll"];
38     }
39     else version(OSX) {
40         const(char)[][3] libNames = [
41             "../Frameworks/SDL2_gfx.framework/SDL2_gfx",
42             "/Library/Frameworks/SDL2_gfx.framework/SDL2_gfx",
43             "/System/Library/Frameworks/SDL2_gfx.framework/SDL2_gfx"
44         ];
45     }
46     else version(Posix) {
47         const(char)[][1] libNames = [
48             "libSDL2_gfx.so"
49         ];
50     }
51     else static assert(0, "bindbc-SDLgfx is not yet supported on this platform");
52     
53     SDLgfxSupport ret;
54     foreach(name; libNames) {
55         ret = loadSDLgfx(name.ptr);
56         if(ret != SDLgfxSupport.noLibrary) break;
57     }
58     return ret;
59 }
60 
61 SDLgfxSupport loadSDLgfx(const(char)* libName)
62 {
63     // If the library isn't yet loaded, load it now.
64     if(lib == invalidHandle) {
65         lib = load(libName);
66         if(lib == invalidHandle) {
67             return SDLgfxSupport.noLibrary;
68         }
69     }
70 
71     auto errCount = errorCount();
72 
73     lib.bindSymbol(cast(void**)&pixelColor, "pixelColor");
74     lib.bindSymbol(cast(void**)&pixelRGBA, "pixelRGBA");
75     lib.bindSymbol(cast(void**)&hlineColor, "hlineColor");
76     lib.bindSymbol(cast(void**)&hlineRGBA, "hlineRGBA");
77     lib.bindSymbol(cast(void**)&vlineColor, "vlineColor");
78     lib.bindSymbol(cast(void**)&vlineRGBA, "vlineRGBA");
79     lib.bindSymbol(cast(void**)&rectangleColor, "rectangleColor");
80     lib.bindSymbol(cast(void**)&rectangleRGBA, "rectangleRGBA");
81     lib.bindSymbol(cast(void**)&roundedRectangleColor, "roundedRectangleColor");
82     lib.bindSymbol(cast(void**)&roundedRectangleRGBA, "roundedRectangleRGBA");
83     lib.bindSymbol(cast(void**)&boxColor, "boxColor");
84     lib.bindSymbol(cast(void**)&boxRGBA, "boxRGBA");
85     lib.bindSymbol(cast(void**)&roundedBoxColor, "roundedBoxColor");
86     lib.bindSymbol(cast(void**)&roundedBoxRGBA, "roundedBoxRGBA");
87     lib.bindSymbol(cast(void**)&lineColor, "lineColor");
88     lib.bindSymbol(cast(void**)&lineRGBA, "lineRGBA");
89     lib.bindSymbol(cast(void**)&aalineColor, "aalineColor");
90     lib.bindSymbol(cast(void**)&aalineRGBA, "aalineRGBA");
91     lib.bindSymbol(cast(void**)&thickLineColor, "thickLineColor");
92     lib.bindSymbol(cast(void**)&thickLineRGBA, "thickLineRGBA");
93     lib.bindSymbol(cast(void**)&circleColor, "circleColor");
94     lib.bindSymbol(cast(void**)&circleRGBA, "circleRGBA");
95     lib.bindSymbol(cast(void**)&arcColor, "arcColor");
96     lib.bindSymbol(cast(void**)&arcRGBA, "arcRGBA");
97     lib.bindSymbol(cast(void**)&aacircleColor, "aacircleColor");
98     lib.bindSymbol(cast(void**)&aacircleRGBA, "aacircleRGBA");
99     lib.bindSymbol(cast(void**)&filledCircleColor, "filledCircleColor");
100     lib.bindSymbol(cast(void**)&filledCircleRGBA, "filledCircleRGBA");
101     lib.bindSymbol(cast(void**)&ellipseColor, "ellipseColor");
102     lib.bindSymbol(cast(void**)&ellipseRGBA, "ellipseRGBA");
103     lib.bindSymbol(cast(void**)&aaellipseColor, "aaellipseColor");
104     lib.bindSymbol(cast(void**)&aaellipseRGBA, "aaellipseRGBA");
105     lib.bindSymbol(cast(void**)&filledEllipseColor, "filledEllipseColor");
106     lib.bindSymbol(cast(void**)&filledEllipseRGBA, "filledEllipseRGBA");
107     lib.bindSymbol(cast(void**)&pieColor, "pieColor");
108     lib.bindSymbol(cast(void**)&pieRGBA, "pieRGBA");
109     lib.bindSymbol(cast(void**)&filledPieColor, "filledPieColor");
110     lib.bindSymbol(cast(void**)&filledPieRGBA, "filledPieRGBA");
111     lib.bindSymbol(cast(void**)&trigonColor, "trigonColor");
112     lib.bindSymbol(cast(void**)&trigonRGBA, "trigonRGBA");
113     lib.bindSymbol(cast(void**)&aatrigonColor, "aatrigonColor");
114     lib.bindSymbol(cast(void**)&aatrigonRGBA, "aatrigonRGBA");
115     lib.bindSymbol(cast(void**)&filledTrigonColor, "filledTrigonColor");
116     lib.bindSymbol(cast(void**)&filledTrigonRGBA, "filledTrigonRGBA");
117     lib.bindSymbol(cast(void**)&polygonColor, "polygonColor");
118     lib.bindSymbol(cast(void**)&polygonRGBA, "polygonRGBA");
119     lib.bindSymbol(cast(void**)&aapolygonColor, "aapolygonColor");
120     lib.bindSymbol(cast(void**)&aapolygonRGBA, "aapolygonRGBA");
121     lib.bindSymbol(cast(void**)&filledPolygonColor, "filledPolygonColor");
122     lib.bindSymbol(cast(void**)&filledPolygonRGBA, "filledPolygonRGBA");
123     lib.bindSymbol(cast(void**)&texturedPolygon, "texturedPolygon");
124     //lib.bindSymbol(cast(void**)&filledPolygonColorMT, "filledPolygonColorMT");
125     lib.bindSymbol(cast(void**)&filledPolygonRGBAMT, "filledPolygonRGBAMT");
126     lib.bindSymbol(cast(void**)&texturedPolygonMT, "texturedPolygonMT");
127     lib.bindSymbol(cast(void**)&bezierColor, "bezierColor");
128     lib.bindSymbol(cast(void**)&bezierRGBA, "bezierRGBA");
129     lib.bindSymbol(cast(void**)&gfxPrimitivesSetFont, "gfxPrimitivesSetFont");
130     lib.bindSymbol(cast(void**)&gfxPrimitivesSetFontRotation, "gfxPrimitivesSetFontRotation");
131     lib.bindSymbol(cast(void**)&characterColor, "characterColor");
132     lib.bindSymbol(cast(void**)&characterRGBA, "characterRGBA");
133     lib.bindSymbol(cast(void**)&stringColor, "stringColor");
134     lib.bindSymbol(cast(void**)&stringRGBA, "stringRGBA");
135     //lib.bindSymbol(cast(void**)&SDL_gfxBlitRGBA, "SDL_gfxBlitRGBA");
136     //lib.bindSymbol(cast(void**)&SDL_gfxSetAlpha, "SDL_gfxSetAlpha");
137     //lib.bindSymbol(cast(void**)&SDL_gfxMultiplyAlpha, "SDL_gfxMultiplyAlpha");
138     lib.bindSymbol(cast(void**)&SDL_imageFilterMMXdetect, "SDL_imageFilterMMXdetect");
139     lib.bindSymbol(cast(void**)&SDL_imageFilterMMXoff, "SDL_imageFilterMMXoff");
140     lib.bindSymbol(cast(void**)&SDL_imageFilterMMXon, "SDL_imageFilterMMXon");
141     lib.bindSymbol(cast(void**)&SDL_imageFilterAdd, "SDL_imageFilterAdd");
142     lib.bindSymbol(cast(void**)&SDL_imageFilterMean, "SDL_imageFilterMean");
143     lib.bindSymbol(cast(void**)&SDL_imageFilterSub, "SDL_imageFilterSub");
144     lib.bindSymbol(cast(void**)&SDL_imageFilterAbsDiff, "SDL_imageFilterAbsDiff");
145     lib.bindSymbol(cast(void**)&SDL_imageFilterMult, "SDL_imageFilterMult");
146     lib.bindSymbol(cast(void**)&SDL_imageFilterMultNor, "SDL_imageFilterMultNor");
147     lib.bindSymbol(cast(void**)&SDL_imageFilterMultDivby2, "SDL_imageFilterMultDivby2");
148     lib.bindSymbol(cast(void**)&SDL_imageFilterMultDivby4, "SDL_imageFilterMultDivby4");
149     lib.bindSymbol(cast(void**)&SDL_imageFilterBitAnd, "SDL_imageFilterBitAnd");
150     lib.bindSymbol(cast(void**)&SDL_imageFilterBitOr, "SDL_imageFilterBitOr");
151     lib.bindSymbol(cast(void**)&SDL_imageFilterDiv, "SDL_imageFilterDiv");
152     lib.bindSymbol(cast(void**)&SDL_imageFilterBitNegation, "SDL_imageFilterBitNegation");
153     lib.bindSymbol(cast(void**)&SDL_imageFilterAddByte, "SDL_imageFilterAddByte");
154     lib.bindSymbol(cast(void**)&SDL_imageFilterAddUint, "SDL_imageFilterAddUint");
155     lib.bindSymbol(cast(void**)&SDL_imageFilterAddByteToHalf, "SDL_imageFilterAddByteToHalf");
156     lib.bindSymbol(cast(void**)&SDL_imageFilterSubByte, "SDL_imageFilterSubByte");
157     lib.bindSymbol(cast(void**)&SDL_imageFilterSubUint, "SDL_imageFilterSubUint");
158     lib.bindSymbol(cast(void**)&SDL_imageFilterShiftRight, "SDL_imageFilterShiftRight");
159     lib.bindSymbol(cast(void**)&SDL_imageFilterShiftRightUint, "SDL_imageFilterShiftRightUint");
160     lib.bindSymbol(cast(void**)&SDL_imageFilterMultByByte, "SDL_imageFilterMultByByte");
161     lib.bindSymbol(cast(void**)&SDL_imageFilterShiftRightAndMultByByte, "SDL_imageFilterShiftRightAndMultByByte");
162     lib.bindSymbol(cast(void**)&SDL_imageFilterShiftLeftByte, "SDL_imageFilterShiftLeftByte");
163     lib.bindSymbol(cast(void**)&SDL_imageFilterShiftLeftUint, "SDL_imageFilterShiftLeftUint");
164     lib.bindSymbol(cast(void**)&SDL_imageFilterShiftLeft, "SDL_imageFilterShiftLeft");
165     lib.bindSymbol(cast(void**)&SDL_imageFilterBinarizeUsingThreshold, "SDL_imageFilterBinarizeUsingThreshold");
166     lib.bindSymbol(cast(void**)&SDL_imageFilterClipToRange, "SDL_imageFilterClipToRange");
167     lib.bindSymbol(cast(void**)&SDL_imageFilterNormalizeLinear, "SDL_imageFilterNormalizeLinear");
168     lib.bindSymbol(cast(void**)&SDL_imageFilterConvolveKernel3x3Divide, "SDL_imageFilterConvolveKernel3x3Divide");
169     lib.bindSymbol(cast(void**)&SDL_imageFilterConvolveKernel5x5Divide, "SDL_imageFilterConvolveKernel5x5Divide");
170     lib.bindSymbol(cast(void**)&SDL_imageFilterConvolveKernel7x7Divide, "SDL_imageFilterConvolveKernel7x7Divide");
171     lib.bindSymbol(cast(void**)&SDL_imageFilterConvolveKernel9x9Divide, "SDL_imageFilterConvolveKernel9x9Divide");
172     lib.bindSymbol(cast(void**)&SDL_imageFilterConvolveKernel3x3ShiftRight, "SDL_imageFilterConvolveKernel3x3ShiftRight");
173     lib.bindSymbol(cast(void**)&SDL_imageFilterConvolveKernel5x5ShiftRight, "SDL_imageFilterConvolveKernel5x5ShiftRight");
174     lib.bindSymbol(cast(void**)&SDL_imageFilterConvolveKernel7x7ShiftRight, "SDL_imageFilterConvolveKernel7x7ShiftRight");
175     lib.bindSymbol(cast(void**)&SDL_imageFilterConvolveKernel9x9ShiftRight, "SDL_imageFilterConvolveKernel9x9ShiftRight");
176     lib.bindSymbol(cast(void**)&SDL_imageFilterSobelX, "SDL_imageFilterSobelX");
177     lib.bindSymbol(cast(void**)&SDL_imageFilterSobelXShiftRight, "SDL_imageFilterSobelXShiftRight");
178     lib.bindSymbol(cast(void**)&SDL_imageFilterAlignStack, "SDL_imageFilterAlignStack");
179     lib.bindSymbol(cast(void**)&SDL_imageFilterRestoreStack, "SDL_imageFilterRestoreStack");
180     lib.bindSymbol(cast(void**)&rotozoomSurface, "rotozoomSurface");
181     lib.bindSymbol(cast(void**)&rotozoomSurfaceXY, "rotozoomSurfaceXY");
182     lib.bindSymbol(cast(void**)&rotozoomSurfaceSize, "rotozoomSurfaceSize");
183     lib.bindSymbol(cast(void**)&rotozoomSurfaceSizeXY, "rotozoomSurfaceSizeXY");
184     lib.bindSymbol(cast(void**)&zoomSurface, "zoomSurface");
185     lib.bindSymbol(cast(void**)&zoomSurfaceSize, "zoomSurfaceSize");
186     lib.bindSymbol(cast(void**)&shrinkSurface, "shrinkSurface");
187     //lib.bindSymbol(cast(void**)&rotateSurface90Degree, "rotateSurface90Degree");
188     
189     if(errorCount() != errCount) loadedVersion = SDLgfxSupport.badLibrary;
190     else loadedVersion = SDLgfxSupport.SDLgfx;
191 
192     return loadedVersion;
193 }