From 533139fec82821f848a6beb3f2a20fc2cf367001 Mon Sep 17 00:00:00 2001 From: bsupnik Date: Sun, 17 Nov 2013 21:46:28 -0500 Subject: [PATCH 01/29] bug fix from keith: fixed return types to XPMPGetPlaneData --- include/XPMPMultiplayer.h | 6 +++--- src/XPMPMultiplayer.cpp | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/include/XPMPMultiplayer.h b/include/XPMPMultiplayer.h index 71f9ec514..c1bd2b707 100644 --- a/include/XPMPMultiplayer.h +++ b/include/XPMPMultiplayer.h @@ -410,11 +410,11 @@ typedef void (* XPMPPlaneNotifier_f)( * * This function fetches specific data about a plane in the sim. Pass in a plane ID, a data type * and a pointer to a struct for the data. The struct's size field must be filled in! The data - * will be returned if possible, as well as the sim cycle the data is from, or 0 if the data could not - * be fetched. + * will be returned if possible, as well as an enum code indicating whether we are returning new + * data, old data, or we have no data at all. * */ - int XPMPGetPlaneData( + XPMPPlaneCallbackResult XPMPGetPlaneData( XPMPPlaneID inPlane, XPMPPlaneDataType inDataType, void * outData); diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index e2185ff10..f2976441a 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -371,14 +371,17 @@ void XPMPUnregisterPlaneNotifierFunc( gObservers.erase(iter); } -int XPMPGetPlaneData( +XPMPPlaneCallbackResult XPMPGetPlaneData( XPMPPlaneID inPlane, XPMPPlaneDataType inDataType, void * outData) { XPMPPlanePtr plane = XPMPPlaneIsValid(inPlane, NULL); + + XPMPPlaneCallbackResult result = xpmpData_Unavailable; + if (plane == NULL) - return -1; + return result; int now = XPLMGetCycleNumber(); @@ -387,8 +390,7 @@ int XPMPGetPlaneData( { if (plane->posAge != now) { - XPMPPlaneCallbackResult result = - plane->dataFunc(plane, inDataType, &plane->pos, plane->ref); + result = plane->dataFunc(plane, inDataType, &plane->pos, plane->ref); if (result == xpmpData_NewData) plane->posAge = now; } @@ -396,38 +398,36 @@ int XPMPGetPlaneData( XPMPPlanePosition_t * posD = (XPMPPlanePosition_t *) outData; memcpy(posD, &plane->pos, XPMP_TMIN(posD->size, plane->pos.size)); - return plane->posAge; + break; } case xpmpDataType_Surfaces: { if (plane->surfaceAge != now) { - XPMPPlaneCallbackResult result = - plane->dataFunc(plane, inDataType, &plane->surface, plane->ref); + result = plane->dataFunc(plane, inDataType, &plane->surface, plane->ref); if (result == xpmpData_NewData) plane->surfaceAge = now; } XPMPPlaneSurfaces_t * surfD = (XPMPPlaneSurfaces_t *) outData; memcpy(surfD, &plane->surface, XPMP_TMIN(surfD->size, plane->surface.size)); - return plane->surfaceAge; + break; } case xpmpDataType_Radar: { if (plane->radarAge != now) { - XPMPPlaneCallbackResult result = - plane->dataFunc(plane, inDataType, &plane->radar, plane->ref); + result = plane->dataFunc(plane, inDataType, &plane->radar, plane->ref); if (result == xpmpData_NewData) plane->radarAge = now; } XPMPPlaneRadar_t * radD = (XPMPPlaneRadar_t *) outData; memcpy(radD, &plane->radar, XPMP_TMIN(radD->size, plane->radar.size)); - return plane->radarAge; + break; } } - return -1; + return result; } XPMPPlanePtr XPMPPlaneIsValid(XPMPPlaneID inID, XPMPPlaneVector::iterator * outIter) From 32a0bcd508d52a6e135ebb5d87ac42add61da897 Mon Sep 17 00:00:00 2001 From: Wade Williams Date: Wed, 20 Nov 2013 11:10:36 -0600 Subject: [PATCH 02/29] Fixed typo in markdown --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 5b6b6d195..361194924 100644 --- a/README.markdown +++ b/README.markdown @@ -42,7 +42,7 @@ Multiplayer as it existed on X-IvAp SourceForge: git checkout -b <new branch name> last_xivap_subversion Multiplayer as it existed on XSB/VATSIM git repository: -git checkout -b < Date: Wed, 20 Nov 2013 11:10:59 -0600 Subject: [PATCH 03/29] Disabled CSL debugging --- src/BitmapUtils.h | 2 +- src/XPMPMultiplayerCSL.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BitmapUtils.h b/src/BitmapUtils.h index dece79c2b..a8173c8a6 100644 --- a/src/BitmapUtils.h +++ b/src/BitmapUtils.h @@ -34,7 +34,7 @@ */ #if APL -#pragma options align=mac68k +//#pragma options align=mac68k #endif #if IBM #pragma pack(push, 2) diff --git a/src/XPMPMultiplayerCSL.cpp b/src/XPMPMultiplayerCSL.cpp index 11a6775eb..776081c0f 100644 --- a/src/XPMPMultiplayerCSL.cpp +++ b/src/XPMPMultiplayerCSL.cpp @@ -38,7 +38,7 @@ using std::max; #endif // Set this to 1 to get TONS of diagnostics on what the lib is doing. -#define DEBUG_CSL_LOADING 1 +#define DEBUG_CSL_LOADING 0 // Set this to 1 to cause AIRLINE and LIVERY to create ICAO codes automatically #define USE_DEFAULTING 0 From 072f095fadfc8c52bca9f58a1ca124c6b79e3140 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sat, 21 Jun 2014 22:52:24 +0100 Subject: [PATCH 04/29] [swift] killed approximately 150 compiler warnings --- png.h | 6 +- src/BitmapUtils.cpp | 18 ++--- src/XObjReadWrite.cpp | 82 ++++++++++----------- src/XPCAircraft.cpp | 2 +- src/XPMPMultiplayer.cpp | 38 +++++----- src/XPMPMultiplayerCSL.cpp | 51 +++++++------ src/XPMPMultiplayerObj.cpp | 141 ++++++++++++++++++------------------ src/XPMPMultiplayerObj8.cpp | 26 +++---- src/XPMPPlaneRenderer.cpp | 43 ++++++----- src/XUtils.cpp | 34 +++++---- 10 files changed, 230 insertions(+), 211 deletions(-) diff --git a/png.h b/png.h index f059910e6..1778c3d3c 100644 --- a/png.h +++ b/png.h @@ -2308,19 +2308,19 @@ extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, #define png_debug(l,m) \ { \ int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ + fprintf(PNG_DEBUG_FILE,"%s" m,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ } #define png_debug1(l,m,p1) \ { \ int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ + fprintf(PNG_DEBUG_FILE,"%s" m,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ } #define png_debug2(l,m,p1,p2) \ { \ int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ + fprintf(PNG_DEBUG_FILE,"%s" m,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ } #endif /* (PNG_DEBUG > 1) */ diff --git a/src/BitmapUtils.cpp b/src/BitmapUtils.cpp index 68cf2a0fb..b5a9080e2 100644 --- a/src/BitmapUtils.cpp +++ b/src/BitmapUtils.cpp @@ -510,7 +510,7 @@ int ConvertBitmapToAlpha( struct ImageInfo * ioImage) { unsigned char * oldData, * newData, * srcPixel, * dstPixel; - int count; + //int count; int x,y; if (ioImage->channels == 4) @@ -525,7 +525,7 @@ int ConvertBitmapToAlpha( srcPixel = oldData; dstPixel = newData; - count = ioImage->width * ioImage->height; + //count = ioImage->width * ioImage->height; for (y = 0; y < ioImage->height; ++y) for (x = 0; x < ioImage->width; ++x) { @@ -567,7 +567,7 @@ int ConvertAlphaToBitmap( struct ImageInfo * ioImage) { unsigned char * oldData, * newData, * srcPixel, * dstPixel; - int count; + //int count; int x,y; if (ioImage->channels == 3) @@ -590,7 +590,7 @@ int ConvertAlphaToBitmap( srcPixel = oldData; dstPixel = newData; - count = ioImage->width * ioImage->height; + //count = ioImage->width * ioImage->height; for (y = 0; y < ioImage->height; ++y) for (x = 0; x < ioImage->width; ++x) @@ -633,7 +633,7 @@ int ConvertAlphaToBitmap( return 0; } -#pragma mark - +//#pragma mark - #if BITMAP_USE_JPEG @@ -842,8 +842,8 @@ int CreateBitmapFromJPEGData(void * inBytes, int inLength, struct ImageInfo * o #endif /* BITMAP_USE_JPEG */ -void my_error (png_structp,png_const_charp err){} -void my_warning(png_structp,png_const_charp err){} +void my_error (png_structp,png_const_charp /*err*/){} +void my_warning(png_structp,png_const_charp /*err*/){} unsigned char * png_start_pos = NULL; unsigned char * png_end_pos = NULL; @@ -867,7 +867,7 @@ int CreateBitmapFromPNG(const char * inFilePath, struct ImageInfo * outImageInf png_infop infoPtr = NULL; unsigned char * buffer = NULL; FILE * file = NULL; - int fileLength = 0; + size_t fileLength = 0; outImageInfo->data = NULL; char** rows = NULL; double lcl_gamma; // This will be the gamma of the file if it has one. @@ -947,7 +947,7 @@ int CreateBitmapFromPNG(const char * inFilePath, struct ImageInfo * outImageInf rows=(char**)malloc(height*sizeof(char*)); if (!rows) goto bail; - for(int i=0;idata +((outImageInfo->height-1-i)*(outImageInfo->width)*(outImageInfo->channels)); } diff --git a/src/XObjReadWrite.cpp b/src/XObjReadWrite.cpp index 41f78868d..b35ef6ddb 100644 --- a/src/XObjReadWrite.cpp +++ b/src/XObjReadWrite.cpp @@ -140,9 +140,9 @@ bool XObjRead(const char * inFile, XObj& outObj) cmd.cmdType = type_PtLine; count = obj2_op; if (tokens.size() < 4) return false; - scanned_st_rgb[0][0]=scanned_st_rgb[1][0]=atof(tokens[1].c_str())*0.1; // r - scanned_st_rgb[0][1]=scanned_st_rgb[1][1]=atof(tokens[2].c_str())*0.1; // g - scanned_st_rgb[0][2]=scanned_st_rgb[1][2]=atof(tokens[3].c_str())*0.1; // b + scanned_st_rgb[0][0]=scanned_st_rgb[1][0]=static_cast(atof(tokens[1].c_str()))*0.1f; // r + scanned_st_rgb[0][1]=scanned_st_rgb[1][1]=static_cast(atof(tokens[2].c_str()))*0.1f; // g + scanned_st_rgb[0][2]=scanned_st_rgb[1][2]=static_cast(atof(tokens[3].c_str()))*0.1f; // b // Sets of x,y,z follows. for (int t = 0; t < count; ++t) @@ -151,9 +151,9 @@ bool XObjRead(const char * inFile, XObj& outObj) f.next(); BreakString(line, tokens); if (tokens.size() < 3) return false; - vrgb.v[0] = atof(tokens[0].c_str()); - vrgb.v[1] = atof(tokens[1].c_str()); - vrgb.v[2] = atof(tokens[2].c_str()); + vrgb.v[0] = static_cast(atof(tokens[0].c_str())); + vrgb.v[1] = static_cast(atof(tokens[1].c_str())); + vrgb.v[2] = static_cast(atof(tokens[2].c_str())); vrgb.rgb[0] = scanned_st_rgb[t][0]; vrgb.rgb[1] = scanned_st_rgb[t][1]; vrgb.rgb[2] = scanned_st_rgb[t][2]; @@ -176,10 +176,10 @@ bool XObjRead(const char * inFile, XObj& outObj) // because if (version == 2) { - scanned_st_rgb[2][0]=scanned_st_rgb[3][0]=atof(tokens[1].c_str()); // s1 - scanned_st_rgb[0][0]=scanned_st_rgb[1][0]=atof(tokens[2].c_str()); // s2 - scanned_st_rgb[1][1]=scanned_st_rgb[2][1]=atof(tokens[3].c_str()); // t1 - scanned_st_rgb[0][1]=scanned_st_rgb[3][1]=atof(tokens[4].c_str()); // t2 + scanned_st_rgb[2][0]=scanned_st_rgb[3][0]=static_cast(atof(tokens[1].c_str())); // s1 + scanned_st_rgb[0][0]=scanned_st_rgb[1][0]=static_cast(atof(tokens[2].c_str())); // s2 + scanned_st_rgb[1][1]=scanned_st_rgb[2][1]=static_cast(atof(tokens[3].c_str())); // t1 + scanned_st_rgb[0][1]=scanned_st_rgb[3][1]=static_cast(atof(tokens[4].c_str())); // t2 } else { scanned_st_rgb[2][0]=scanned_st_rgb[3][0]=0.0; scanned_st_rgb[0][0]=scanned_st_rgb[1][0]=0.0; @@ -194,9 +194,9 @@ bool XObjRead(const char * inFile, XObj& outObj) BreakString(line, tokens); if (tokens.size() < 3) return false; - vst.v[0] = atof(tokens[0].c_str()); - vst.v[1] = atof(tokens[1].c_str()); - vst.v[2] = atof(tokens[2].c_str()); + vst.v[0] = static_cast(atof(tokens[0].c_str())); + vst.v[1] = static_cast(atof(tokens[1].c_str())); + vst.v[2] = static_cast(atof(tokens[2].c_str())); vst.st[0] = scanned_st_rgb[t][0]; vst.st[1] = scanned_st_rgb[t][1]; cmd.st.push_back(vst); @@ -224,17 +224,17 @@ bool XObjRead(const char * inFile, XObj& outObj) f.next(); BreakString(line, tokens); if (tokens.size() < 10) return false; - vst.v[0] = atof(tokens[0].c_str()); - vst.v[1] = atof(tokens[1].c_str()); - vst.v[2] = atof(tokens[2].c_str()); - vst.st[0] = atof(tokens[6].c_str()); - vst.st[1] = atof(tokens[8].c_str()); + vst.v[0] = static_cast(atof(tokens[0].c_str())); + vst.v[1] = static_cast(atof(tokens[1].c_str())); + vst.v[2] = static_cast(atof(tokens[2].c_str())); + vst.st[0] = static_cast(atof(tokens[6].c_str())); + vst.st[1] = static_cast(atof(tokens[8].c_str())); cmd.st.push_back(vst); - vst.v[0] = atof(tokens[3].c_str()); - vst.v[1] = atof(tokens[4].c_str()); - vst.v[2] = atof(tokens[5].c_str()); - vst.st[0] = atof(tokens[7].c_str()); - vst.st[1] = atof(tokens[9].c_str()); + vst.v[0] = static_cast(atof(tokens[3].c_str())); + vst.v[1] = static_cast(atof(tokens[4].c_str())); + vst.v[2] = static_cast(atof(tokens[5].c_str())); + vst.st[0] = static_cast(atof(tokens[7].c_str())); + vst.st[1] = static_cast(atof(tokens[9].c_str())); cmd.st.push_back(vst); } outObj.cmds.push_back(cmd); @@ -270,12 +270,12 @@ bool XObjRead(const char * inFile, XObj& outObj) BreakString(line, tokens); if (tokens.size() > 5) { - vrgb.v[0] = atof(tokens[0].c_str()); - vrgb.v[1] = atof(tokens[1].c_str()); - vrgb.v[2] = atof(tokens[2].c_str()); - vrgb.rgb[0] = atof(tokens[3].c_str()); - vrgb.rgb[1] = atof(tokens[4].c_str()); - vrgb.rgb[2] = atof(tokens[5].c_str()); + vrgb.v[0] = static_cast(atof(tokens[0].c_str())); + vrgb.v[1] = static_cast(atof(tokens[1].c_str())); + vrgb.v[2] = static_cast(atof(tokens[2].c_str())); + vrgb.rgb[0] = static_cast(atof(tokens[3].c_str())); + vrgb.rgb[1] = static_cast(atof(tokens[4].c_str())); + vrgb.rgb[2] = static_cast(atof(tokens[5].c_str())); cmd.rgb.push_back(vrgb); } else @@ -295,22 +295,22 @@ bool XObjRead(const char * inFile, XObj& outObj) BreakString(line, tokens); if (tokens.size() > 4) { - vst.v[0] = atof(tokens[0].c_str()); - vst.v[1] = atof(tokens[1].c_str()); - vst.v[2] = atof(tokens[2].c_str()); - vst.st[0] = atof(tokens[3].c_str()); - vst.st[1] = atof(tokens[4].c_str()); + vst.v[0] = static_cast(atof(tokens[0].c_str())); + vst.v[1] = static_cast(atof(tokens[1].c_str())); + vst.v[2] = static_cast(atof(tokens[2].c_str())); + vst.st[0] = static_cast(atof(tokens[3].c_str())); + vst.st[1] = static_cast(atof(tokens[4].c_str())); cmd.st.push_back(vst); if (tokens.size() > 9) { --count; - vst.v[0] = atof(tokens[5].c_str()); - vst.v[1] = atof(tokens[6].c_str()); - vst.v[2] = atof(tokens[7].c_str()); - vst.st[0] = atof(tokens[8].c_str()); - vst.st[1] = atof(tokens[9].c_str()); + vst.v[0] = static_cast(atof(tokens[5].c_str())); + vst.v[1] = static_cast(atof(tokens[6].c_str())); + vst.v[2] = static_cast(atof(tokens[7].c_str())); + vst.st[0] = static_cast(atof(tokens[8].c_str())); + vst.st[1] = static_cast(atof(tokens[9].c_str())); cmd.st.push_back(vst); } @@ -322,10 +322,10 @@ bool XObjRead(const char * inFile, XObj& outObj) break; case type_Attr: - if (tokens.size() > count) + if (tokens.size() > static_cast(count)) { for (int n = 0; n < count; ++n) - cmd.attributes.push_back(atof(tokens[n+1].c_str())); + cmd.attributes.push_back(static_cast(atof(tokens[n+1].c_str()))); } else return false; diff --git a/src/XPCAircraft.cpp b/src/XPCAircraft.cpp index ab8d97103..104a56664 100644 --- a/src/XPCAircraft.cpp +++ b/src/XPCAircraft.cpp @@ -15,7 +15,7 @@ XPCAircraft::~XPCAircraft() } XPMPPlaneCallbackResult XPCAircraft::AircraftCB( - XPMPPlaneID inPlane, + XPMPPlaneID /*inPlane*/, XPMPPlaneDataType inDataType, void * ioData, void * inRefcon) diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index 67df3b4f6..52cbfa623 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -114,11 +114,11 @@ const char * XPMPMultiplayerInit( gDefaultPlane = inDefaultPlane; gIntPrefsFunc = inIntPrefsFunc; gFloatPrefsFunc = inFloatPrefsFunc; - char myPath[1024]; - char airPath[1024]; - char line[256]; - char sysPath[1024]; - FILE * fi; + //char myPath[1024]; + //char airPath[1024]; + //char line[256]; + //char sysPath[1024]; + //FILE * fi; bool problem = false; @@ -162,13 +162,13 @@ const char * XPMPMultiplayerEnable(void) std::vector ptrs; gPlanePaths.push_back(""); - for (int p = 0; p < gPackages.size(); ++p) + for (size_t p = 0; p < gPackages.size(); ++p) { - for (int pp = 0; pp < gPackages[p].planes.size(); ++pp) + for (size_t pp = 0; pp < gPackages[p].planes.size(); ++pp) { if (gPackages[p].planes[pp].plane_type == plane_Austin) { - gPackages[p].planes[pp].austin_idx = gPlanePaths.size(); + gPackages[p].planes[pp].austin_idx = static_cast(gPlanePaths.size()); char buf[1024]; strcpy(buf,gPackages[p].planes[pp].file_path.c_str()); #if APL @@ -180,11 +180,11 @@ const char * XPMPMultiplayerEnable(void) } // Copy the list into something that's not permanent, but is needed by the XPLM. - for (int n = 0; n < gPlanePaths.size(); ++n) + for (size_t n = 0; n < gPlanePaths.size(); ++n) { #if DEBUG_MANUAL_LOADING char strbuf[1024]; - sprintf(strbuf, "Plane %d = '%s'\n", n, gPlanePaths[n].c_str()); + sprintf(strbuf, "Plane %d = '%s'\n", static_cast(n), gPlanePaths[n].c_str()); XPLMDebugString(strbuf); #endif ptrs.push_back((char *) gPlanePaths[n].c_str()); @@ -220,8 +220,8 @@ void XPMPLoadPlanesIfNecessary(void) if (owner != XPLMGetMyID()) return; - if (models > gPlanePaths.size()) - models = gPlanePaths.size(); + if (models > static_cast(gPlanePaths.size())) + models = static_cast(gPlanePaths.size()); for (int n = 1; n < models; ++n) { if (!gPlanePaths[n].empty()) @@ -327,13 +327,13 @@ void XPMPSetDefaultPlaneICAO( long XPMPCountPlanes(void) { - return gPlanes.size(); + return static_cast(gPlanes.size()); } XPMPPlaneID XPMPGetNthPlane( long index) { - if ((index < 0) || (index >= gPlanes.size())) + if ((index < 0) || (index >= static_cast(gPlanes.size()))) return NULL; return gPlanes[index]; @@ -457,8 +457,8 @@ void XPMPSetPlaneRenderer( // This callback ping-pongs the multiplayer count up and back depending // on whether we're drawing the TCAS gauges or not. int XPMPControlPlaneCount( - XPLMDrawingPhase inPhase, - int inIsBefore, + XPLMDrawingPhase /*inPhase*/, + int /*inIsBefore*/, void * inRefcon) { if (inRefcon == NULL) @@ -473,9 +473,9 @@ int XPMPControlPlaneCount( // This routine draws the actual planes. int XPMPRenderMultiplayerPlanes( - XPLMDrawingPhase inPhase, - int inIsBefore, - void * inRefcon) + XPLMDrawingPhase /*inPhase*/, + int /*inIsBefore*/, + void * /*inRefcon*/) { static int is_blend = 0; diff --git a/src/XPMPMultiplayerCSL.cpp b/src/XPMPMultiplayerCSL.cpp index ca6266fd2..598545a4e 100644 --- a/src/XPMPMultiplayerCSL.cpp +++ b/src/XPMPMultiplayerCSL.cpp @@ -106,7 +106,7 @@ int HFS2PosixPath(const char *path, char *result, int resultLen) static void MakePartialPathNativeObj(string& io_str) { // char sep = *XPLMGetDirectorySeparator(); - for(int i = 0; i < io_str.size(); ++i) + for(size_t i = 0; i < io_str.size(); ++i) if(io_str[i] == '/' || io_str[i] == ':' || io_str[i] == '\\') io_str[i] = '/'; } @@ -140,6 +140,12 @@ struct XPLMDump { XPLMDebugString(buf); return *this; } + XPLMDump& operator<<(size_t n) { + char buf[255]; + sprintf(buf, "%u", static_cast(n)); + XPLMDebugString(buf); + return *this; + } }; @@ -182,6 +188,7 @@ char * fgets_multiplatform(char * s, int n, FILE * file) // EOF: this could mean I/O error or end of file. if (c == EOF) + { if (feof(file) && p != s) // We read something and now the file's done, ok. break; else @@ -189,6 +196,7 @@ char * fgets_multiplatform(char * s, int n, FILE * file) // Haven't read yet? I/O error? Return NULL! return(NULL); } + } *p++ = c; } @@ -230,7 +238,7 @@ void BreakStringPvt(const char * inString, std::vector& outStrings, ++iter; if (iter < endPos) { - if (maxBreak && (maxBreak == (outStrings.size()+1))) + if (maxBreak && (maxBreak == static_cast(outStrings.size()+1))) { outStrings.push_back(std::string(iter, endPos)); return; @@ -556,7 +564,7 @@ bool LoadOnePackage(const string& inPath, int pass) HFS2PosixPath(xsystem, xsystem, 1024); #endif - int sys_len = strlen(xsystem); + size_t sys_len = strlen(xsystem); if(fullPath.size() > sys_len) fullPath.erase(fullPath.begin(),fullPath.begin() + sys_len); else @@ -613,10 +621,10 @@ bool LoadOnePackage(const string& inPath, int pass) icao = tokens[1]; group = gGroupings[icao]; if (pckg->matches[match_icao].count(icao) == 0) - pckg->matches[match_icao] [icao] = pckg->planes.size() - 1; + pckg->matches[match_icao] [icao] = static_cast(pckg->planes.size()) - 1; if (!group.empty()) if (pckg->matches[match_group].count(group) == 0) - pckg->matches[match_group] [group] = pckg->planes.size() - 1; + pckg->matches[match_group] [group] = static_cast(pckg->planes.size()) - 1; } else { parse_err = true; XPLMDump(path, lineNum, line) << "XSB WARNING: ICAO command takes 1 argument.\n"; @@ -636,7 +644,7 @@ bool LoadOnePackage(const string& inPath, int pass) airline = tokens[2]; group = gGroupings[icao]; if (pckg->matches[match_icao_airline].count(icao + " " + airline) == 0) - pckg->matches[match_icao_airline] [icao + " " + airline] = pckg->planes.size() - 1; + pckg->matches[match_icao_airline] [icao + " " + airline] = static_cast(pckg->planes.size()) - 1; #if USE_DEFAULTING if (pckg->matches[match_icao ].count(icao ) == 0) pckg->matches[match_icao ] [icao ] = pckg->planes.size() - 1; @@ -648,7 +656,7 @@ bool LoadOnePackage(const string& inPath, int pass) pckg->matches[match_group ] [group ] = pckg->planes.size() - 1; #endif if (pckg->matches[match_group_airline].count(group + " " + airline) == 0) - pckg->matches[match_group_airline] [group + " " + airline] = pckg->planes.size() - 1; + pckg->matches[match_group_airline] [group + " " + airline] = static_cast(pckg->planes.size()) - 1; } } else { parse_err = true; @@ -677,7 +685,7 @@ bool LoadOnePackage(const string& inPath, int pass) pckg->matches[match_icao_airline ] [icao + " " + airline ] = pckg->planes.size() - 1; #endif if (pckg->matches[match_icao_airline_livery ].count(icao + " " + airline + " " + livery) == 0) - pckg->matches[match_icao_airline_livery ] [icao + " " + airline + " " + livery] = pckg->planes.size() - 1; + pckg->matches[match_icao_airline_livery ] [icao + " " + airline + " " + livery] = static_cast(pckg->planes.size()) - 1; if (!group.empty()) { #if USE_DEFAULTING @@ -687,7 +695,7 @@ bool LoadOnePackage(const string& inPath, int pass) pckg->matches[match_group_airline ] [group + " " + airline ] = pckg->planes.size() - 1; #endif if (pckg->matches[match_group_airline_livery ].count(group + " " + airline + " " + livery) == 0) - pckg->matches[match_group_airline_livery ] [group + " " + airline + " " + livery] = pckg->planes.size() - 1; + pckg->matches[match_group_airline_livery ] [group + " " + airline + " " + livery] = static_cast(pckg->planes.size()) - 1; } } else { parse_err = true; @@ -777,12 +785,12 @@ bool CSL_LoadCSL(const char * inFolderPath, const char * inRelatedFile, const ch vector tokens; BreakStringPvt(buf, tokens, 0, " \t\r\n"); string group; - for (int n = 0; n < tokens.size(); ++n) + for (size_t n = 0; n < tokens.size(); ++n) { if (n != 0) group += " "; group += tokens[n]; } - for (int n = 0; n < tokens.size(); ++n) + for (size_t n = 0; n < tokens.size(); ++n) { gGroupings[tokens[n]] = group; } @@ -827,7 +835,7 @@ bool CSL_LoadCSL(const char * inFolderPath, const char * inRelatedFile, const ch free(index_buf); for (int pass = 0; pass < pass_Count; ++pass) - for (int n = 0; n < pckgs.size(); ++n) + for (size_t n = 0; n < pckgs.size(); ++n) { if (LoadOnePackage(pckgs[n], pass)) ok = false; @@ -909,7 +917,7 @@ CSLPlane_t * CSL_MatchPlane(const char * inICAO, const char * inAirline, const c } // Now go through each group and see if we match. - for (int p = 0; p < gPackages.size(); ++p) + for (size_t p = 0; p < gPackages.size(); ++p) { map::iterator iter = gPackages[p].matches[n].find(key); if (iter != gPackages[p].matches[n].end()) @@ -976,7 +984,7 @@ CSLPlane_t * CSL_MatchPlane(const char * inICAO, const char * inAirline, const c } } - for (int p = 0; p < gPackages.size(); ++p) + for (size_t p = 0; p < gPackages.size(); ++p) { std::map::const_iterator it = gPackages[p].matches[4].begin(); while(it != gPackages[p].matches[4].end()) { @@ -1039,10 +1047,10 @@ CSLPlane_t * CSL_MatchPlane(const char * inICAO, const char * inAirline, const c void CSL_Dump(void) { // DIAGNOSTICS - print out everything we know. - for (int n = 0; n < gPackages.size(); ++n) + for (size_t n = 0; n < gPackages.size(); ++n) { XPLMDump() << "XSB CSL: Package " << n << " path = " << gPackages[n].name << "\n"; - for (int p = 0; p < gPackages[n].planes.size(); ++p) + for (size_t p = 0; p < gPackages[n].planes.size(); ++p) { XPLMDump() << "XSB CSL: Plane " << p << " = " << gPackages[n].planes[p].file_path << "\n"; } @@ -1096,10 +1104,10 @@ void CSL_DrawObject( { glMatrixMode(GL_MODELVIEW); glPushMatrix(); - glTranslatef(x, y, z); - glRotatef(heading, 0.0, -1.0, 0.0); - glRotatef(pitch, 01.0, 0.0, 0.0); - glRotatef(roll, 0.0, 0.0, -1.0); + glTranslatef(static_cast(x), static_cast(y), static_cast(z)); + glRotatef(static_cast(heading), 0.0, -1.0, 0.0); + glRotatef(static_cast(pitch), 01.0, 0.0, 0.0); + glRotatef(static_cast(roll), 0.0, 0.0, -1.0); } switch (type) @@ -1111,7 +1119,8 @@ void CSL_DrawObject( XPLMCountAircraft(&total, &active, &who); if (model->austin_idx > 0 && model->austin_idx < active) XPLMDrawAircraft(model->austin_idx, - x, y ,z, pitch, roll, heading, + static_cast(x), static_cast(y), static_cast(z), + static_cast(pitch), static_cast(roll), static_cast(heading), full, state); } break; diff --git a/src/XPMPMultiplayerObj.cpp b/src/XPMPMultiplayerObj.cpp index 397169686..3238ab5f7 100644 --- a/src/XPMPMultiplayerObj.cpp +++ b/src/XPMPMultiplayerObj.cpp @@ -50,17 +50,17 @@ const double kMetersToNM = 0.000539956803; //const float kNavLightGreen[] = {0.0, 1.0, 0.3, 0.6}; //const float kLandingLight[] = {1.0, 1.0, 0.7, 0.6}; //const float kStrobeLight[] = {1.0, 1.0, 1.0, 0.4}; -const float kNavLightRed[] = {1.0, 0.0, 0.2, 0.5}; -const float kNavLightGreen[] = {0.0, 1.0, 0.3, 0.5}; -const float kLandingLight[] = {1.0, 1.0, 0.7, 0.6}; -const float kStrobeLight[] = {1.0, 1.0, 1.0, 0.7}; +const float kNavLightRed[] = {1.0f, 0.0f, 0.2f, 0.5f}; +const float kNavLightGreen[] = {0.0f, 1.0f, 0.3f, 0.5f}; +const float kLandingLight[] = {1.0f, 1.0f, 0.7f, 0.6f}; +const float kStrobeLight[] = {1.0f, 1.0f, 1.0f, 0.7f}; static int sLightTexture = -1; static void MakePartialPathNativeObj(string& io_str) { // char sep = *XPLMGetDirectorySeparator(); - for(int i = 0; i < io_str.size(); ++i) + for(size_t i = 0; i < io_str.size(); ++i) if(io_str[i] == '/' || io_str[i] == ':' || io_str[i] == '\\') io_str[i] = '/'; } @@ -73,7 +73,7 @@ bool NormalizeVec(float vec[3]) float len=sqrt(vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2]); if (len>0.0) { - len = 1.0 / len; + len = 1.0f / len; vec[0] *= len; vec[1] *= len; vec[2] *= len; @@ -105,7 +105,7 @@ public: void NormalizeNormals(void); void DebugDrawNormals(); void Purge() { mPointPool.clear(); } - int Size() { return mPointPool.size(); } + int Size() { return static_cast(mPointPool.size()); } private: vector mPointPool; }; @@ -119,14 +119,14 @@ int OBJ_PointPool::AddPoint(float xyz[3], float st[2]) { #if !DISABLE_SHARING // Use x as the key...see if we can find it - for(int n = 0; n < mPointPool.size(); n += 8) + for(size_t n = 0; n < mPointPool.size(); n += 8) { if((xyz[0] == mPointPool[n]) && (xyz[1] == mPointPool[n+1]) && (xyz[2] == mPointPool[n+2]) && (st[0] == mPointPool[n+3]) && (st[1] == mPointPool[n+4])) - return n/8; // Clients care about point # not array index + return static_cast(n/8); // Clients care about point # not array index } #endif @@ -137,7 +137,7 @@ int OBJ_PointPool::AddPoint(float xyz[3], float st[2]) mPointPool.push_back(st[0]); mPointPool.push_back(st[1]); // Allocate some space for the normal later mPointPool.push_back(0.0); mPointPool.push_back(0.0); mPointPool.push_back(0.0); - return (mPointPool.size()/8)-1; + return (static_cast(mPointPool.size())/8)-1; } // This function sets up OpenGL for our point pool @@ -213,9 +213,9 @@ void OBJ_PointPool::NormalizeNormals(void) // be the same but the S&T coords won't. If we have slightly different normals and the sun is making // shiney specular hilites, the discontinuity is real noticiable. #if BLEND_NORMALS - for (int n = 0; n < mPointPool.size(); n += 8) + for (size_t n = 0; n < mPointPool.size(); n += 8) { - for (int m = 0; m < mPointPool.size(); m += 8) + for (size_t m = 0; m < mPointPool.size(); m += 8) if (mPointPool[n ]==mPointPool[m ] && mPointPool[n+1]==mPointPool[m+1] && mPointPool[n+2]==mPointPool[m+2] && @@ -227,7 +227,7 @@ void OBJ_PointPool::NormalizeNormals(void) } } #endif - for (int n = 5; n < mPointPool.size(); n += 8) + for (size_t n = 5; n < mPointPool.size(); n += 8) { NormalizeVec(&mPointPool[n]); } @@ -239,7 +239,7 @@ void OBJ_PointPool::DebugDrawNormals() XPLMSetGraphicsState(0, 0, 0, 0, 0, 1, 0); glColor3f(1.0, 0.0, 1.0); glBegin(GL_LINES); - for(int n = 0; n < mPointPool.size(); n+=8) + for(size_t n = 0; n < mPointPool.size(); n+=8) { glVertex3f(mPointPool[n], mPointPool[n+1], mPointPool[n+2]); glVertex3f(mPointPool[n] + mPointPool[n+5], mPointPool[n+1] + mPointPool[n+1+5], @@ -322,10 +322,10 @@ int OBJ_LoadModel(const char * inFilePath) { string path(inFilePath); - for (int n = 0; n < sObjects.size(); ++n) + for (size_t n = 0; n < sObjects.size(); ++n) { if (path == sObjects[n].path) - return n; + return static_cast(n); } sObjects.push_back(ObjInfo_t()); @@ -394,15 +394,15 @@ int OBJ_LoadModel(const char * inFilePath) { // For each light we've found, copy the data into our // own light vector - for(int n = 0; n < cmd->rgb.size(); n++) + for(size_t n = 0; n < cmd->rgb.size(); n++) { sObjects.back().lods.back().lights.push_back(LightInfo_t()); sObjects.back().lods.back().lights.back().xyz[0] = cmd->rgb[n].v[0]; sObjects.back().lods.back().lights.back().xyz[1] = cmd->rgb[n].v[1]; sObjects.back().lods.back().lights.back().xyz[2] = cmd->rgb[n].v[2]; - sObjects.back().lods.back().lights.back().rgb[0] = cmd->rgb[n].rgb[0]; - sObjects.back().lods.back().lights.back().rgb[1] = cmd->rgb[n].rgb[1]; - sObjects.back().lods.back().lights.back().rgb[2] = cmd->rgb[n].rgb[2]; + sObjects.back().lods.back().lights.back().rgb[0] = static_cast(cmd->rgb[n].rgb[0]); + sObjects.back().lods.back().lights.back().rgb[1] = static_cast(cmd->rgb[n].rgb[1]); + sObjects.back().lods.back().lights.back().rgb[2] = static_cast(cmd->rgb[n].rgb[2]); } } break; @@ -410,7 +410,7 @@ int OBJ_LoadModel(const char * inFilePath) { vector indexes; // First get our point pool setup with all verticies - for(int n = 0; n < cmd->st.size(); n++) + for(size_t n = 0; n < cmd->st.size(); n++) { float xyz[3], st[2]; int index; @@ -426,13 +426,13 @@ int OBJ_LoadModel(const char * inFilePath) switch(cmd->cmdID) { case obj_Tri: - for(int n = 0; n < indexes.size(); ++n) + for(size_t n = 0; n < indexes.size(); ++n) { sObjects.back().lods.back().triangleList.push_back(indexes[n]); } break; case obj_Tri_Fan: - for(int n = 2; n < indexes.size(); n++) + for(size_t n = 2; n < indexes.size(); n++) { sObjects.back().lods.back().triangleList.push_back(indexes[0 ]); sObjects.back().lods.back().triangleList.push_back(indexes[n-1]); @@ -441,7 +441,7 @@ int OBJ_LoadModel(const char * inFilePath) break; case obj_Tri_Strip: case obj_Quad_Strip: - for(int n = 2; n < indexes.size(); n++) + for(size_t n = 2; n < indexes.size(); n++) { if((n % 2) == 1) { @@ -458,7 +458,7 @@ int OBJ_LoadModel(const char * inFilePath) } break; case obj_Quad: - for(int n = 3; n < indexes.size(); n += 4) + for(size_t n = 3; n < indexes.size(); n += 4) { sObjects.back().lods.back().triangleList.push_back(indexes[n-3]); sObjects.back().lods.back().triangleList.push_back(indexes[n-2]); @@ -475,9 +475,9 @@ int OBJ_LoadModel(const char * inFilePath) } // Calculate our normals for all LOD's - for (int i = 0; i < sObjects.back().lods.size(); i++) + for (size_t i = 0; i < sObjects.back().lods.size(); i++) { - for (int n = 0; n < sObjects.back().lods[i].triangleList.size(); n += 3) + for (size_t n = 0; n < sObjects.back().lods[i].triangleList.size(); n += 3) { sObjects.back().lods[i].pointPool.CalcTriNormal( sObjects.back().lods[i].triangleList[n], @@ -488,7 +488,7 @@ int OBJ_LoadModel(const char * inFilePath) sObjects.back().lods[i].dl = 0; } sObjects.back().obj.cmds.clear(); - return sObjects.size()-1; + return static_cast(sObjects.size())-1; } /***************************************************** @@ -497,18 +497,18 @@ int OBJ_LoadModel(const char * inFilePath) // Note that texID and litTexID are OPTIONAL! They will only be filled // in if the user wants to override the default texture specified by the // obj file -void OBJ_PlotModel(int model, int texID, int litTexID, float inDistance, double inX, - double inY, double inZ, double inPitch, double inRoll, double inHeading) +void OBJ_PlotModel(int model, int texID, int litTexID, float inDistance, double /*inX*/, + double /*inY*/, double /*inZ*/, double /*inPitch*/, double /*inRoll*/, double /*inHeading*/) { int tex, lit; // Find out what LOD we need to draw int lodIdx = -1; - for(int n = 0; n < sObjects[model].lods.size(); n++) + for(size_t n = 0; n < sObjects[model].lods.size(); n++) { if((inDistance >= sObjects[model].lods[n].nearDist) && (inDistance <= sObjects[model].lods[n].farDist)) { - lodIdx = n; + lodIdx = static_cast(n); break; } } @@ -574,7 +574,7 @@ void OBJ_PlotModel(int model, int texID, int litTexID, float inDistance, double glNewList(sObjects[model].lods[lodIdx].dl, GL_COMPILE); // Kick OpenGL and draw baby! - glDrawElements(GL_TRIANGLES, sObjects[model].lods[lodIdx].triangleList.size(), + glDrawElements(GL_TRIANGLES, static_cast(sObjects[model].lods[lodIdx].triangleList.size()), GL_UNSIGNED_INT, &(*sObjects[model].lods[lodIdx].triangleList.begin())); #if DEBUG_NORMALS @@ -682,12 +682,12 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, // Find out what LOD we need to draw int lodIdx = -1; - for(int n = 0; n < sObjects[model].lods.size(); n++) + for(size_t n = 0; n < sObjects[model].lods.size(); n++) { if((inDistance >= sObjects[model].lods[n].nearDist) && (inDistance <= sObjects[model].lods[n].farDist)) { - lodIdx = n; + lodIdx = static_cast(n); break; } } @@ -695,13 +695,14 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, if(lodIdx == -1) return; - double size, distance; + GLfloat size; + double distance; // Where are we looking? XPLMCameraPosition_t cameraPos; XPLMReadCameraPosition(&cameraPos); // We can have 1 or more lights on each aircraft - for(int n = 0; n < sObjects[model].lods[lodIdx].lights.size(); n++) + for(size_t n = 0; n < sObjects[model].lods[lodIdx].lights.size(); n++) { glMatrixMode(GL_MODELVIEW); glPushMatrix(); @@ -726,9 +727,9 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, glRotated(cameraPos.roll, 0.0, 0.0, -1.0); // Find our distance from the camera - float dx = cameraPos.x - inX; - float dy = cameraPos.y - inY; - float dz = cameraPos.z - inZ; + float dx = cameraPos.x - static_cast(inX); + float dy = cameraPos.y - static_cast(inY); + float dz = cameraPos.z - static_cast(inZ); distance = sqrt((dx * dx) + (dy * dy) + (dz * dz)); // Convert to NM @@ -744,9 +745,9 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, // that light size changed more rapidly when closer than 3nm so // I have a separate equation for that. if(distance <= 3.6) - size = (10 * distance) + 1; + size = (10.0f * static_cast(distance)) + 1.0f; else - size = (6.7 * distance) + 12; + size = (6.7f * static_cast(distance)) + 12.0f; // Finally we can draw our lights // Red Nav @@ -757,10 +758,10 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, { if(navLights) { glColor4fv(kNavLightRed); - glTexCoord2f(0, 0.5); glVertex2f(-(size/2.0), -(size/2.0)); - glTexCoord2f(0, 1.0); glVertex2f(-(size/2.0), (size/2.0)); - glTexCoord2f(0.25, 1.0); glVertex2f((size/2.0), (size/2.0)); - glTexCoord2f(0.25, 0.5); glVertex2f((size/2.0), -(size/2.0)); + glTexCoord2f(0.0f, 0.5f); glVertex2f(-(size/2.0f), -(size/2.0f)); + glTexCoord2f(0.0f, 1.0f); glVertex2f(-(size/2.0f), (size/2.0f)); + glTexCoord2f(0.25f, 1.0f); glVertex2f((size/2.0f), (size/2.0f)); + glTexCoord2f(0.25f, 0.5f); glVertex2f((size/2.0f), -(size/2.0f)); } } // Green Nav @@ -770,10 +771,10 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, { if(navLights) { glColor4fv(kNavLightGreen); - glTexCoord2f(0, 0.5); glVertex2f(-(size/2.0), -(size/2.0)); - glTexCoord2f(0, 1.0); glVertex2f(-(size/2.0), (size/2.0)); - glTexCoord2f(0.25, 1.0); glVertex2f((size/2.0), (size/2.0)); - glTexCoord2f(0.25, 0.5); glVertex2f((size/2.0), -(size/2.0)); + glTexCoord2f(0.0f, 0.5f); glVertex2f(-(size/2.0f), -(size/2.0f)); + glTexCoord2f(0.0f, 1.0f); glVertex2f(-(size/2.0f), (size/2.0f)); + glTexCoord2f(0.25f, 1.0f); glVertex2f((size/2.0f), (size/2.0f)); + glTexCoord2f(0.25f, 0.5f); glVertex2f((size/2.0f), -(size/2.0f)); } } // Beacon @@ -784,10 +785,10 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, if(bcnLights) { glColor4fv(kNavLightRed); - glTexCoord2f(0, 0.5); glVertex2f(-(size/2.0), -(size/2.0)); - glTexCoord2f(0, 1.0); glVertex2f(-(size/2.0), (size/2.0)); - glTexCoord2f(0.25, 1.0); glVertex2f((size/2.0), (size/2.0)); - glTexCoord2f(0.25, 0.5); glVertex2f((size/2.0), -(size/2.0)); + glTexCoord2f(0.0f, 0.5f); glVertex2f(-(size/2.0f), -(size/2.0f)); + glTexCoord2f(0.0f, 1.0f); glVertex2f(-(size/2.0f), (size/2.0f)); + glTexCoord2f(0.25f, 1.0f); glVertex2f((size/2.0f), (size/2.0f)); + glTexCoord2f(0.25f, 0.5f); glVertex2f((size/2.0f), -(size/2.0f)); } } // Strobes @@ -798,10 +799,10 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, if(strbLights) { glColor4fv(kStrobeLight); - glTexCoord2f(0.25, 0.0); glVertex2f(-(size/1.5), -(size/1.5)); - glTexCoord2f(0.25, 0.5); glVertex2f(-(size/1.5), (size/1.5)); - glTexCoord2f(0.50, 0.5); glVertex2f((size/1.5), (size/1.5)); - glTexCoord2f(0.50, 0.0); glVertex2f((size/1.5), -(size/1.5)); + glTexCoord2f(0.25f, 0.0f); glVertex2f(-(size/1.5f), -(size/1.5f)); + glTexCoord2f(0.25f, 0.5f); glVertex2f(-(size/1.5f), (size/1.5f)); + glTexCoord2f(0.50f, 0.5f); glVertex2f((size/1.5f), (size/1.5f)); + glTexCoord2f(0.50f, 0.0f); glVertex2f((size/1.5f), -(size/1.5f)); } } // Landing Lights @@ -820,24 +821,24 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, if(color[0] < 0.0) color[0] = 0.0; color[2] = kLandingLight[2]; if(color[0] < 0.0) color[0] = 0.0; - color[3] = kLandingLight[3] * ((distance * -0.05882) + 1.1764); + color[3] = kLandingLight[3] * ((static_cast(distance) * -0.05882f) + 1.1764f); glColor4fv(color); - glTexCoord2f(0.25, 0.0); glVertex2f(-(size/2.0), -(size/2.0)); - glTexCoord2f(0.25, 0.5); glVertex2f(-(size/2.0), (size/2.0)); - glTexCoord2f(0.50, 0.5); glVertex2f((size/2.0), (size/2.0)); - glTexCoord2f(0.50, 0.0); glVertex2f((size/2.0), -(size/2.0)); + glTexCoord2f(0.25f, 0.0f); glVertex2f(-(size/2.0f), -(size/2.0f)); + glTexCoord2f(0.25f, 0.5f); glVertex2f(-(size/2.0f), (size/2.0f)); + glTexCoord2f(0.50f, 0.5f); glVertex2f((size/2.0f), (size/2.0f)); + glTexCoord2f(0.50f, 0.0f); glVertex2f((size/2.0f), -(size/2.0f)); } } else { // rear nav light and others? I guess... if(navLights) { glColor3f( - sObjects[model].lods[lodIdx].lights[n].rgb[0] * 0.1, - sObjects[model].lods[lodIdx].lights[n].rgb[1] * 0.1, - sObjects[model].lods[lodIdx].lights[n].rgb[2] * 0.1); - glTexCoord2f(0, 0.5); glVertex2f(-(size/2.0), -(size/2.0)); - glTexCoord2f(0, 1.0); glVertex2f(-(size/2.0), (size/2.0)); - glTexCoord2f(0.25, 1.0); glVertex2f((size/2.0), (size/2.0)); - glTexCoord2f(0.25, 0.5); glVertex2f((size/2.0), -(size/2.0)); + sObjects[model].lods[lodIdx].lights[n].rgb[0] * 0.1f, + sObjects[model].lods[lodIdx].lights[n].rgb[1] * 0.1f, + sObjects[model].lods[lodIdx].lights[n].rgb[2] * 0.1f); + glTexCoord2f(0.0f, 0.5f); glVertex2f(-(size/2.0f), -(size/2.0f)); + glTexCoord2f(0.0f, 1.0f); glVertex2f(-(size/2.0f), (size/2.0f)); + glTexCoord2f(0.25f, 1.0f); glVertex2f((size/2.0f), (size/2.0f)); + glTexCoord2f(0.25f, 0.5f); glVertex2f((size/2.0f), -(size/2.0f)); } } glEnd(); diff --git a/src/XPMPMultiplayerObj8.cpp b/src/XPMPMultiplayerObj8.cpp index 48551b1d1..2a77ecbd2 100644 --- a/src/XPMPMultiplayerObj8.cpp +++ b/src/XPMPMultiplayerObj8.cpp @@ -97,7 +97,7 @@ static float obj_get_float(void * inRefcon) { if(s_cur_plane == NULL) return 0.0f; - int v = reinterpret_cast(inRefcon); + intptr_t v = reinterpret_cast(inRefcon); switch(v) { case gear_rat: return s_cur_plane->state->gearPosition; break; @@ -111,10 +111,10 @@ static float obj_get_float(void * inRefcon) case head_rat: return s_cur_plane->state->yokeHeading; break; case roll_rat: return s_cur_plane->state->yokeRoll; break; - case lan_lite_on: return s_cur_plane->lights.landLights; break; - case bcn_lite_on: return s_cur_plane->lights.bcnLights; break; - case str_lite_on: return s_cur_plane->lights.strbLights; break; - case nav_lite_on: return s_cur_plane->lights.navLights; break; + case lan_lite_on: return static_cast(s_cur_plane->lights.landLights); break; + case bcn_lite_on: return static_cast(s_cur_plane->lights.bcnLights); break; + case str_lite_on: return static_cast(s_cur_plane->lights.strbLights); break; + case nav_lite_on: return static_cast(s_cur_plane->lights.navLights); break; default: return 0.0f; @@ -124,7 +124,7 @@ static float obj_get_float(void * inRefcon) int obj_get_float_array( void * inRefcon, float * inValues, - int inOffset, + int /*inOffset*/, int inCount) { if(inValues == NULL) @@ -212,7 +212,7 @@ void obj_schedule_one_aircraft( double pitch, double roll, double heading, - int full, // + int /*full*/, // xpmp_LightStatus lights, XPLMPlaneDrawState_t * state) { @@ -255,12 +255,12 @@ void obj_schedule_one_aircraft( i->lights = lights; i->state = state; i->location.structSize = sizeof(i->location); - i->location.x = x; - i->location.y = y; - i->location.z = z; - i->location.pitch = pitch; - i->location.roll = roll; - i->location.heading = heading; + i->location.x = static_cast(x); + i->location.y = static_cast(y); + i->location.z = static_cast(z); + i->location.pitch = static_cast(pitch); + i->location.roll = static_cast(roll); + i->location.heading = static_cast(heading); } } } diff --git a/src/XPMPPlaneRenderer.cpp b/src/XPMPPlaneRenderer.cpp index 1641de9af..6dc46c5e3 100644 --- a/src/XPMPPlaneRenderer.cpp +++ b/src/XPMPPlaneRenderer.cpp @@ -332,7 +332,10 @@ void XPMPDefaultPlaneRenderer(int is_blend) double x,y,z; XPLMWorldToLocal(pos.lat, pos.lon, pos.elevation * kFtToMeters, &x, &y, &z); - float distMeters = sqrt(sphere_distance_sqr(&gl_camera,x,y,z)); + float distMeters = sqrt(sphere_distance_sqr(&gl_camera, + static_cast(x), + static_cast(y), + static_cast(z))); // If the plane is farther than our TCAS range, it's just not visible. Drop it! if (distMeters > kMaxDistTCAS) @@ -358,8 +361,12 @@ void XPMPDefaultPlaneRenderer(int is_blend) // Calculate the angles between the camera angles and the real angles. // Cull if we exceed half the FOV. - if(!cull && !sphere_is_visible(&gl_camera, x, y, z, 50.0)) + if(!cull && !sphere_is_visible(&gl_camera, static_cast(x), + static_cast(y), + static_cast(z), 50.0)) + { cull = true; + } // Full plane or lites based on distance. bool drawFullPlane = (distMeters < fullPlaneDist); @@ -379,9 +386,9 @@ void XPMPDefaultPlaneRenderer(int is_blend) // Stash one render record with the plane's position, etc. { PlaneToRender_t renderRecord; - renderRecord.x = x; - renderRecord.y = y; - renderRecord.z = z; + renderRecord.x = static_cast(x); + renderRecord.y = static_cast(y); + renderRecord.z = static_cast(z); renderRecord.pitch = pos.pitch; renderRecord.heading = pos.heading; renderRecord.roll = pos.roll; @@ -409,13 +416,13 @@ void XPMPDefaultPlaneRenderer(int is_blend) } else { renderRecord.state.structSize = sizeof(renderRecord.state); - renderRecord.state.gearPosition = (pos.elevation < 70) ? 1.0 : 0.0; - renderRecord.state.flapRatio = (pos.elevation < 70) ? 1.0 : 0.0; + renderRecord.state.gearPosition = (pos.elevation < 70) ? 1.0f : 0.0f; + renderRecord.state.flapRatio = (pos.elevation < 70) ? 1.0f : 0.0f; renderRecord.state.spoilerRatio = renderRecord.state.speedBrakeRatio = renderRecord.state.slatRatio = renderRecord.state.wingSweep = 0.0; - renderRecord.state.thrust = (pos.pitch > 30) ? 1.0 : 0.6; - renderRecord.state.yokePitch = pos.pitch / 90.0; - renderRecord.state.yokeHeading = pos.heading / 180.0; - renderRecord.state.yokeRoll = pos.roll / 90.0; + renderRecord.state.thrust = (pos.pitch > 30) ? 1.0f : 0.6f; + renderRecord.state.yokePitch = pos.pitch / 90.0f; + renderRecord.state.yokeHeading = pos.heading / 180.0f; + renderRecord.state.yokeRoll = pos.roll / 90.0f; // use some smart defaults renderRecord.lights.bcnLights = 1; @@ -449,7 +456,7 @@ void XPMPDefaultPlaneRenderer(int is_blend) // We do this in two stages: building up what to do, then doing it in the optimal // OGL order. - int renderedCounter = 0; + size_t renderedCounter = 0; vector planes_obj_lites; multimap planes_austin; @@ -655,11 +662,11 @@ void XPMPDefaultPlaneRenderer(int is_blend) float x, y; convert_to_2d(&gl_camera, vp, iter->second.x, iter->second.y, iter->second.z, 1.0, &x, &y); - float rat = 1.0 - (iter->first / labelDist); - c[0] = c[1] = 0.5 + 0.5 * rat; - c[2] = 0.5 - 0.5 * rat; // gray -> yellow - no alpha in the SDK - foo! + float rat = 1.0f - (iter->first / static_cast(labelDist)); + c[0] = c[1] = 0.5f + 0.5f * rat; + c[2] = 0.5f - 0.5f * rat; // gray -> yellow - no alpha in the SDK - foo! - XPLMDrawString(c, x, y+10, (char *) iter->second.label.c_str(), NULL, xplmFont_Basic); + XPLMDrawString(c, static_cast(x), static_cast(y)+10, (char *) iter->second.label.c_str(), NULL, xplmFont_Basic); } glMatrixMode(GL_PROJECTION); @@ -671,8 +678,8 @@ void XPMPDefaultPlaneRenderer(int is_blend) // Final hack - leave a note to ourselves for how many of Austin's planes we relocated to do TCAS. - if (tcas > renderedCounter) - tcas = renderedCounter; + if (tcas > static_cast(renderedCounter)) + tcas = static_cast(renderedCounter); gEnableCount = (tcas+1); gDumpOneRenderCycle = 0; diff --git a/src/XUtils.cpp b/src/XUtils.cpp index 28ecfe393..e56f25dbb 100644 --- a/src/XUtils.cpp +++ b/src/XUtils.cpp @@ -53,12 +53,14 @@ static char * my_fgets(char * s, int n, FILE * file) c = fgetc(file); if (c == EOF) + { if (/*feof(file) &&*/ p != s) break; else { return(NULL); } + } *p++ = c; } @@ -109,7 +111,7 @@ void StTextFileScanner::read_next(void) while (mFile && /*!feof(mFile) &&*/ my_fgets(buf, sizeof(buf), mFile)) { - int len = strlen(buf); + int len = static_cast(strlen(buf)); while ((len > 0) && (buf[len-1] == '\r' || buf[len-1] == '\n')) { buf[len-1] = 0; @@ -223,13 +225,13 @@ int PickRandom(vector& chances) { double v = (double) (rand() % RAND_MAX) / (double) RAND_MAX; - for (int n = 0; n < chances.size(); ++n) + for (size_t n = 0; n < chances.size(); ++n) { if (v < chances[n]) - return n; + return static_cast(n); v -= chances[n]; } - return chances.size(); + return static_cast(chances.size()); } bool RollDice(double inProb) @@ -351,8 +353,8 @@ void ExtractFixedRecordString( { int sp = inBegin-1; int ep = inEnd; - if (ep > inLine.length()) ep = inLine.length(); - if (sp > inLine.length()) sp = inLine.length(); + if (ep > static_cast(inLine.length())) ep = static_cast(inLine.length()); + if (sp > static_cast(inLine.length())) sp = static_cast(inLine.length()); while ((sp < ep) && (inLine[sp] == ' ')) ++sp; @@ -389,7 +391,7 @@ bool ExtractFixedRecordUnsignedLong( return true; } -#pragma mark - +//#pragma mark - struct XPointPool::XPointPoolImp { @@ -408,7 +410,7 @@ struct XPointPool::XPointPoolImp { int count(void) { - return pts.size(); + return static_cast(pts.size()); } int accumulate(const float xyz[3], const float st[2]) @@ -427,9 +429,9 @@ struct XPointPool::XPointPoolImp { memcpy(p.xyz, xyz, sizeof(p.xyz)); memcpy(p.st, st, sizeof(p.st)); pts.push_back(p); - index.insert(map::value_type(key, pts.size())); + index.insert(map::value_type(key, static_cast(pts.size()))); pts.push_back(p); - return pts.size()-1; + return static_cast(pts.size())-1; } void get(int i, float xyz[3], float st[2]) @@ -501,12 +503,12 @@ void DecomposeObjCmd(const XObjCmd& inCmd, vector& outCmds, int maxVale case obj_Polygon: // Polygons might be ok. But if we have to break them down, // we generate N-2 triangles in a fan configuration. - if (maxValence < inCmd.st.size()) + if (maxValence < static_cast(inCmd.st.size())) { c.st.push_back(inCmd.st[0]); c.st.push_back(inCmd.st[1]); c.st.push_back(inCmd.st[2]); - for (int n = 2; n < inCmd.st.size(); ++n) + for (size_t n = 2; n < inCmd.st.size(); ++n) { c.st[1] = inCmd.st[n-1]; c.st[2] = inCmd.st[n ]; @@ -521,7 +523,7 @@ void DecomposeObjCmd(const XObjCmd& inCmd, vector& outCmds, int maxVale c.st.push_back(inCmd.st[0]); c.st.push_back(inCmd.st[1]); c.st.push_back(inCmd.st[2]); - for (int n = 2; n < inCmd.st.size(); ++n) + for (size_t n = 2; n < inCmd.st.size(); ++n) { if (n%2) { @@ -542,7 +544,7 @@ void DecomposeObjCmd(const XObjCmd& inCmd, vector& outCmds, int maxVale c.st.push_back(inCmd.st[0]); c.st.push_back(inCmd.st[1]); c.st.push_back(inCmd.st[2]); - for (int n = 2; n < inCmd.st.size(); ++n) + for (size_t n = 2; n < inCmd.st.size(); ++n) { c.st[1] = inCmd.st[n-1]; c.st[2] = inCmd.st[n ]; @@ -558,7 +560,7 @@ void DecomposeObjCmd(const XObjCmd& inCmd, vector& outCmds, int maxVale c.st.push_back(inCmd.st[1]); c.st.push_back(inCmd.st[2]); c.st.push_back(inCmd.st[3]); - for (int n = 2; n < inCmd.st.size(); n += 2) + for (size_t n = 2; n < inCmd.st.size(); n += 2) { c.st[0] = inCmd.st[n-2]; c.st[1] = inCmd.st[n-1]; @@ -570,7 +572,7 @@ void DecomposeObjCmd(const XObjCmd& inCmd, vector& outCmds, int maxVale c.st.push_back(inCmd.st[0]); c.st.push_back(inCmd.st[1]); c.st.push_back(inCmd.st[2]); - for (int n = 2; n < inCmd.st.size(); ++n) + for (size_t n = 2; n < inCmd.st.size(); ++n) { if (n%2) { From 457bae1a6db5fbce52ee22ef47a59d28ba5eb306 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sat, 21 Jun 2014 22:54:34 +0100 Subject: [PATCH 05/29] [swift] killing all those distracting warnings revealed one which identified an obvious mistake --- src/Interpolation.i | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Interpolation.i b/src/Interpolation.i index 1e24512ea..12c8e6577 100644 --- a/src/Interpolation.i +++ b/src/Interpolation.i @@ -108,6 +108,6 @@ double BicubicInterpolate2d( BicubicInterpolate1d(v0, v1, v2, v3, hPosition), BicubicInterpolate1d(v4, v5, v6, v7, hPosition), BicubicInterpolate1d(v8, v9, v10, v11, hPosition), - BicubicInterpolate1d(v12, v13, v14, 15, hPosition), + BicubicInterpolate1d(v12, v13, v14, v15, hPosition), vPosition); } From 81c83f2f782a71ee03527c0f4304c1328ef89ea9 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Mon, 23 Jun 2014 17:05:04 +0100 Subject: [PATCH 06/29] [swift] don't store libpng or zlib headers with the libxplanemp source code --- png.h | 3283 ------------------------------------------- pngconf.h | 1348 ------------------ src/BitmapUtils.cpp | 8 +- zconf.h | 279 ---- zlib.h | 893 ------------ 5 files changed, 7 insertions(+), 5804 deletions(-) delete mode 100644 png.h delete mode 100644 pngconf.h delete mode 100644 zconf.h delete mode 100644 zlib.h diff --git a/png.h b/png.h deleted file mode 100644 index 1778c3d3c..000000000 --- a/png.h +++ /dev/null @@ -1,3283 +0,0 @@ -/* png.h - header file for PNG reference library - * - * libpng version 1.2.5 - October 3, 2002 - * Copyright (c) 1998-2002 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * Authors and maintainers: - * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat - * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.2.5 - October 3, 2002: Glenn - * See also "Contributing Authors", below. - * - * Note about libpng version numbers: - * - * Due to various miscommunications, unforeseen code incompatibilities - * and occasional factors outside the authors' control, version numbering - * on the library has not always been consistent and straightforward. - * The following table summarizes matters since version 0.89c, which was - * the first widely used release: - * - * source png.h png.h shared-lib - * version string int version - * ------- ------ ----- ---------- - * 0.89c "1.0 beta 3" 0.89 89 1.0.89 - * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] - * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] - * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] - * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] - * 0.97c 0.97 97 2.0.97 - * 0.98 0.98 98 2.0.98 - * 0.99 0.99 98 2.0.99 - * 0.99a-m 0.99 99 2.0.99 - * 1.00 1.00 100 2.1.0 [100 should be 10000] - * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] - * 1.0.1 png.h string is 10001 2.1.0 - * 1.0.1a-e identical to the 10002 from here on, the shared library - * 1.0.2 source version) 10002 is 2.V where V is the source code - * 1.0.2a-b 10003 version, except as noted. - * 1.0.3 10003 - * 1.0.3a-d 10004 - * 1.0.4 10004 - * 1.0.4a-f 10005 - * 1.0.5 (+ 2 patches) 10005 - * 1.0.5a-d 10006 - * 1.0.5e-r 10100 (not source compatible) - * 1.0.5s-v 10006 (not binary compatible) - * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) - * 1.0.6d-f 10007 (still binary incompatible) - * 1.0.6g 10007 - * 1.0.6h 10007 10.6h (testing xy.z so-numbering) - * 1.0.6i 10007 10.6i - * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) - * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) - * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) - * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) - * 1.0.7 1 10007 (still compatible) - * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 - * 1.0.8rc1 1 10008 2.1.0.8rc1 - * 1.0.8 1 10008 2.1.0.8 - * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 - * 1.0.9rc1 1 10009 2.1.0.9rc1 - * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 - * 1.0.9rc2 1 10009 2.1.0.9rc2 - * 1.0.9 1 10009 2.1.0.9 - * 1.0.10beta1 1 10010 2.1.0.10beta1 - * 1.0.10rc1 1 10010 2.1.0.10rc1 - * 1.0.10 1 10010 2.1.0.10 - * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 - * 1.0.11rc1 1 10011 2.1.0.11rc1 - * 1.0.11 1 10011 2.1.0.11 - * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 - * 1.0.12rc1 2 10012 2.1.0.12rc1 - * 1.0.12 2 10012 2.1.0.12 - * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) - * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 - * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 - * 1.2.0rc1 3 10200 3.1.2.0rc1 - * 1.2.0 3 10200 3.1.2.0 - * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 - * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 - * 1.2.1 3 10201 3.1.2.1 - * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 - * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 - * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 - * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 - * 1.0.13 10 10013 10.so.0.1.0.13 - * 1.2.2 12 10202 12.so.0.1.2.2 - * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 - * 1.2.3 12 10203 12.so.0.1.2.3 - * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 - * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 - * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 - * 1.0.14 10 10014 10.so.0.1.0.14 - * 1.2.4 13 10204 12.so.0.1.2.4 - * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 - * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 - * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 - * 1.0.15 10 10015 10.so.0.1.0.15 - * 1.2.5 13 10205 12.so.0.1.2.5 - * - * Henceforth the source version will match the shared-library major - * and minor numbers; the shared-library major version number will be - * used for changes in backward compatibility, as it is intended. The - * PNG_LIBPNG_VER macro, which is not used within libpng but is available - * for applications, is an unsigned integer of the form xyyzz corresponding - * to the source version x.y.z (leading zeros in y and z). Beta versions - * were given the previous public release number plus a letter, until - * version 1.0.6j; from then on they were given the upcoming public - * release number plus "betaNN" or "rcN". - * - * Binary incompatibility exists only when applications make direct access - * to the info_ptr or png_ptr members through png.h, and the compiled - * application is loaded with a different version of the library. - * - * DLLNUM will change each time there are forward or backward changes - * in binary compatibility (e.g., when a new feature is added). - * - * See libpng.txt or libpng.3 for more information. The PNG specification - * is available as RFC 2083 - * and as a W3C Recommendation - */ - -/* - * COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: - * - * If you modify libpng you may insert additional notices immediately following - * this sentence. - * - * libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are - * Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are - * distributed according to the same disclaimer and license as libpng-1.0.6 - * with the following individuals added to the list of Contributing Authors - * - * Simon-Pierre Cadieux - * Eric S. Raymond - * Gilles Vollant - * - * and with the following additions to the disclaimer: - * - * There is no warranty against interference with your enjoyment of the - * library or against infringement. There is no warranty that our - * efforts or the library will fulfill any of your particular purposes - * or needs. This library is provided with all faults, and the entire - * risk of satisfactory quality, performance, accuracy, and effort is with - * the user. - * - * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are - * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson - * Distributed according to the same disclaimer and license as libpng-0.96, - * with the following individuals added to the list of Contributing Authors: - * - * Tom Lane - * Glenn Randers-Pehrson - * Willem van Schaik - * - * libpng versions 0.89, June 1996, through 0.96, May 1997, are - * Copyright (c) 1996, 1997 Andreas Dilger - * Distributed according to the same disclaimer and license as libpng-0.88, - * with the following individuals added to the list of Contributing Authors: - * - * John Bowler - * Kevin Bracey - * Sam Bushell - * Magnus Holmgren - * Greg Roelofs - * Tom Tanner - * - * libpng versions 0.5, May 1995, through 0.88, January 1996, are - * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. - * - * For the purposes of this copyright and license, "Contributing Authors" - * is defined as the following set of individuals: - * - * Andreas Dilger - * Dave Martindale - * Guy Eric Schalnat - * Paul Schmidt - * Tim Wegner - * - * The PNG Reference Library is supplied "AS IS". The Contributing Authors - * and Group 42, Inc. disclaim all warranties, expressed or implied, - * including, without limitation, the warranties of merchantability and of - * fitness for any purpose. The Contributing Authors and Group 42, Inc. - * assume no liability for direct, indirect, incidental, special, exemplary, - * or consequential damages, which may result from the use of the PNG - * Reference Library, even if advised of the possibility of such damage. - * - * Permission is hereby granted to use, copy, modify, and distribute this - * source code, or portions hereof, for any purpose, without fee, subject - * to the following restrictions: - * - * 1. The origin of this source code must not be misrepresented. - * - * 2. Altered versions must be plainly marked as such and - * must not be misrepresented as being the original source. - * - * 3. This Copyright notice may not be removed or altered from - * any source or altered source distribution. - * - * The Contributing Authors and Group 42, Inc. specifically permit, without - * fee, and encourage the use of this source code as a component to - * supporting the PNG file format in commercial products. If you use this - * source code in a product, acknowledgment is not required but would be - * appreciated. - */ - -/* - * A "png_get_copyright" function is available, for convenient use in "about" - * boxes and the like: - * - * printf("%s",png_get_copyright(NULL)); - * - * Also, the PNG logo (in PNG format, of course) is supplied in the - * files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). - */ - -/* - * Libpng is OSI Certified Open Source Software. OSI Certified is a - * certification mark of the Open Source Initiative. - */ - -/* - * The contributing authors would like to thank all those who helped - * with testing, bug fixes, and patience. This wouldn't have been - * possible without all of you. - * - * Thanks to Frank J. T. Wojcik for helping with the documentation. - */ - -/* - * Y2K compliance in libpng: - * ========================= - * - * October 3, 2002 - * - * Since the PNG Development group is an ad-hoc body, we can't make - * an official declaration. - * - * This is your unofficial assurance that libpng from version 0.71 and - * upward through 1.2.5 are Y2K compliant. It is my belief that earlier - * versions were also Y2K compliant. - * - * Libpng only has three year fields. One is a 2-byte unsigned integer - * that will hold years up to 65535. The other two hold the date in text - * format, and will hold years up to 9999. - * - * The integer is - * "png_uint_16 year" in png_time_struct. - * - * The strings are - * "png_charp time_buffer" in png_struct and - * "near_time_buffer", which is a local character string in png.c. - * - * There are seven time-related functions: - * png.c: png_convert_to_rfc_1123() in png.c - * (formerly png_convert_to_rfc_1152() in error) - * png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c - * png_convert_from_time_t() in pngwrite.c - * png_get_tIME() in pngget.c - * png_handle_tIME() in pngrutil.c, called in pngread.c - * png_set_tIME() in pngset.c - * png_write_tIME() in pngwutil.c, called in pngwrite.c - * - * All handle dates properly in a Y2K environment. The - * png_convert_from_time_t() function calls gmtime() to convert from system - * clock time, which returns (year - 1900), which we properly convert to - * the full 4-digit year. There is a possibility that applications using - * libpng are not passing 4-digit years into the png_convert_to_rfc_1123() - * function, or that they are incorrectly passing only a 2-digit year - * instead of "year - 1900" into the png_convert_from_struct_tm() function, - * but this is not under our control. The libpng documentation has always - * stated that it works with 4-digit years, and the APIs have been - * documented as such. - * - * The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned - * integer to hold the year, and can hold years as large as 65535. - * - * zlib, upon which libpng depends, is also Y2K compliant. It contains - * no date-related code. - * - * Glenn Randers-Pehrson - * libpng maintainer - * PNG Development Group - */ - -#ifndef PNG_H -#define PNG_H - -/* This is not the place to learn how to use libpng. The file libpng.txt - * describes how to use libpng, and the file example.c summarizes it - * with some code on which to build. This file is useful for looking - * at the actual function definitions and structure components. - */ - -/* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.2.5" - -#define PNG_LIBPNG_VER_SONUM 0 -#define PNG_LIBPNG_VER_DLLNUM %DLLNUM% - -/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ -#define PNG_LIBPNG_VER_MAJOR 1 -#define PNG_LIBPNG_VER_MINOR 2 -#define PNG_LIBPNG_VER_RELEASE 5 -/* This should match the numeric part of the final component of - * PNG_LIBPNG_VER_STRING, omitting any leading zero: */ - -#define PNG_LIBPNG_VER_BUILD 0 - -#define PNG_LIBPNG_BUILD_ALPHA 1 -#define PNG_LIBPNG_BUILD_BETA 2 -#define PNG_LIBPNG_BUILD_RC 3 -#define PNG_LIBPNG_BUILD_STABLE 4 -#define PNG_LIBPNG_BUILD_TYPEMASK 7 -#define PNG_LIBPNG_BUILD_PATCH 8 /* Can be OR'ed with STABLE only */ -#define PNG_LIBPNG_BUILD_TYPE 4 - -/* Careful here. At one time, Guy wanted to use 082, but that would be octal. - * We must not include leading zeros. - * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only - * version 1.0.0 was mis-numbered 100 instead of 10000). From - * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */ -#define PNG_LIBPNG_VER 10205 /* 1.2.5 */ - -#ifndef PNG_VERSION_INFO_ONLY - -/* include the compression library's header */ -#include "zlib.h" - -/* include all user configurable info, including optional assembler routines */ -#include "pngconf.h" - -/* Inhibit C++ name-mangling for libpng functions but not for system calls. */ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* This file is arranged in several sections. The first section contains - * structure and type definitions. The second section contains the external - * library functions, while the third has the internal library functions, - * which applications aren't expected to use directly. - */ - -#ifndef PNG_NO_TYPECAST_NULL -#define int_p_NULL (int *)NULL -#define png_bytep_NULL (png_bytep)NULL -#define png_bytepp_NULL (png_bytepp)NULL -#define png_doublep_NULL (png_doublep)NULL -#define png_error_ptr_NULL (png_error_ptr)NULL -#define png_flush_ptr_NULL (png_flush_ptr)NULL -#define png_free_ptr_NULL (png_free_ptr)NULL -#define png_infopp_NULL (png_infopp)NULL -#define png_malloc_ptr_NULL (png_malloc_ptr)NULL -#define png_read_status_ptr_NULL (png_read_status_ptr)NULL -#define png_rw_ptr_NULL (png_rw_ptr)NULL -#define png_structp_NULL (png_structp)NULL -#define png_uint_16p_NULL (png_uint_16p)NULL -#define png_voidp_NULL (png_voidp)NULL -#define png_write_status_ptr_NULL (png_write_status_ptr)NULL -#else -#define int_p_NULL NULL -#define png_bytep_NULL NULL -#define png_bytepp_NULL NULL -#define png_doublep_NULL NULL -#define png_error_ptr_NULL NULL -#define png_flush_ptr_NULL NULL -#define png_free_ptr_NULL NULL -#define png_infopp_NULL NULL -#define png_malloc_ptr_NULL NULL -#define png_read_status_ptr_NULL NULL -#define png_rw_ptr_NULL NULL -#define png_structp_NULL NULL -#define png_uint_16p_NULL NULL -#define png_voidp_NULL NULL -#define png_write_status_ptr_NULL NULL -#endif - -/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ -#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) -/* Version information for C files, stored in png.c. This had better match - * the version above. - */ -#ifdef PNG_USE_GLOBAL_ARRAYS -PNG_EXPORT_VAR (const char) png_libpng_ver[18]; - /* need room for 99.99.99beta99z */ -#else -#define png_libpng_ver png_get_header_ver(NULL) -#endif - -#ifdef PNG_USE_GLOBAL_ARRAYS -/* This was removed in version 1.0.5c */ -/* Structures to facilitate easy interlacing. See png.c for more details */ -PNG_EXPORT_VAR (const int FARDATA) png_pass_start[7]; -PNG_EXPORT_VAR (const int FARDATA) png_pass_inc[7]; -PNG_EXPORT_VAR (const int FARDATA) png_pass_ystart[7]; -PNG_EXPORT_VAR (const int FARDATA) png_pass_yinc[7]; -PNG_EXPORT_VAR (const int FARDATA) png_pass_mask[7]; -PNG_EXPORT_VAR (const int FARDATA) png_pass_dsp_mask[7]; -#ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW -PNG_EXPORT_VAR (const int FARDATA) png_pass_width[7]; -#endif -/* This isn't currently used. If you need it, see png.c for more details. -PNG_EXPORT_VAR (const int FARDATA) png_pass_height[7]; -*/ -#endif - -#endif /* PNG_NO_EXTERN */ - -/* Three color definitions. The order of the red, green, and blue, (and the - * exact size) is not important, although the size of the fields need to - * be png_byte or png_uint_16 (as defined below). - */ -typedef struct png_color_struct -{ - png_byte red; - png_byte green; - png_byte blue; -} png_color; -typedef png_color FAR * png_colorp; -typedef png_color FAR * FAR * png_colorpp; - -typedef struct png_color_16_struct -{ - png_byte index; /* used for palette files */ - png_uint_16 red; /* for use in red green blue files */ - png_uint_16 green; - png_uint_16 blue; - png_uint_16 gray; /* for use in grayscale files */ -} png_color_16; -typedef png_color_16 FAR * png_color_16p; -typedef png_color_16 FAR * FAR * png_color_16pp; - -typedef struct png_color_8_struct -{ - png_byte red; /* for use in red green blue files */ - png_byte green; - png_byte blue; - png_byte gray; /* for use in grayscale files */ - png_byte alpha; /* for alpha channel files */ -} png_color_8; -typedef png_color_8 FAR * png_color_8p; -typedef png_color_8 FAR * FAR * png_color_8pp; - -/* - * The following two structures are used for the in-core representation - * of sPLT chunks. - */ -typedef struct png_sPLT_entry_struct -{ - png_uint_16 red; - png_uint_16 green; - png_uint_16 blue; - png_uint_16 alpha; - png_uint_16 frequency; -} png_sPLT_entry; -typedef png_sPLT_entry FAR * png_sPLT_entryp; -typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp; - -/* When the depth of the sPLT palette is 8 bits, the color and alpha samples - * occupy the LSB of their respective members, and the MSB of each member - * is zero-filled. The frequency member always occupies the full 16 bits. - */ - -typedef struct png_sPLT_struct -{ - png_charp name; /* palette name */ - png_byte depth; /* depth of palette samples */ - png_sPLT_entryp entries; /* palette entries */ - png_int_32 nentries; /* number of palette entries */ -} png_sPLT_t; -typedef png_sPLT_t FAR * png_sPLT_tp; -typedef png_sPLT_t FAR * FAR * png_sPLT_tpp; - -#ifdef PNG_TEXT_SUPPORTED -/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file, - * and whether that contents is compressed or not. The "key" field - * points to a regular zero-terminated C string. The "text", "lang", and - * "lang_key" fields can be regular C strings, empty strings, or NULL pointers. - * However, the * structure returned by png_get_text() will always contain - * regular zero-terminated C strings (possibly empty), never NULL pointers, - * so they can be safely used in printf() and other string-handling functions. - */ -typedef struct png_text_struct -{ - int compression; /* compression value: - -1: tEXt, none - 0: zTXt, deflate - 1: iTXt, none - 2: iTXt, deflate */ - png_charp key; /* keyword, 1-79 character description of "text" */ - png_charp text; /* comment, may be an empty string (ie "") - or a NULL pointer */ - png_size_t text_length; /* length of the text string */ -#ifdef PNG_iTXt_SUPPORTED - png_size_t itxt_length; /* length of the itxt string */ - png_charp lang; /* language code, 0-79 characters - or a NULL pointer */ - png_charp lang_key; /* keyword translated UTF-8 string, 0 or more - chars or a NULL pointer */ -#endif -} png_text; -typedef png_text FAR * png_textp; -typedef png_text FAR * FAR * png_textpp; -#endif - -/* Supported compression types for text in PNG files (tEXt, and zTXt). - * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */ -#define PNG_TEXT_COMPRESSION_NONE_WR -3 -#define PNG_TEXT_COMPRESSION_zTXt_WR -2 -#define PNG_TEXT_COMPRESSION_NONE -1 -#define PNG_TEXT_COMPRESSION_zTXt 0 -#define PNG_ITXT_COMPRESSION_NONE 1 -#define PNG_ITXT_COMPRESSION_zTXt 2 -#define PNG_TEXT_COMPRESSION_LAST 3 /* Not a valid value */ - -/* png_time is a way to hold the time in an machine independent way. - * Two conversions are provided, both from time_t and struct tm. There - * is no portable way to convert to either of these structures, as far - * as I know. If you know of a portable way, send it to me. As a side - * note - PNG has always been Year 2000 compliant! - */ -typedef struct png_time_struct -{ - png_uint_16 year; /* full year, as in, 1995 */ - png_byte month; /* month of year, 1 - 12 */ - png_byte day; /* day of month, 1 - 31 */ - png_byte hour; /* hour of day, 0 - 23 */ - png_byte minute; /* minute of hour, 0 - 59 */ - png_byte second; /* second of minute, 0 - 60 (for leap seconds) */ -} png_time; -typedef png_time FAR * png_timep; -typedef png_time FAR * FAR * png_timepp; - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -/* png_unknown_chunk is a structure to hold queued chunks for which there is - * no specific support. The idea is that we can use this to queue - * up private chunks for output even though the library doesn't actually - * know about their semantics. - */ -typedef struct png_unknown_chunk_t -{ - png_byte name[5]; - png_byte *data; - png_size_t size; - - /* libpng-using applications should NOT directly modify this byte. */ - png_byte location; /* mode of operation at read time */ -} -png_unknown_chunk; -typedef png_unknown_chunk FAR * png_unknown_chunkp; -typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp; -#endif - -/* png_info is a structure that holds the information in a PNG file so - * that the application can find out the characteristics of the image. - * If you are reading the file, this structure will tell you what is - * in the PNG file. If you are writing the file, fill in the information - * you want to put into the PNG file, then call png_write_info(). - * The names chosen should be very close to the PNG specification, so - * consult that document for information about the meaning of each field. - * - * With libpng < 0.95, it was only possible to directly set and read the - * the values in the png_info_struct, which meant that the contents and - * order of the values had to remain fixed. With libpng 0.95 and later, - * however, there are now functions that abstract the contents of - * png_info_struct from the application, so this makes it easier to use - * libpng with dynamic libraries, and even makes it possible to use - * libraries that don't have all of the libpng ancillary chunk-handing - * functionality. - * - * In any case, the order of the parameters in png_info_struct should NOT - * be changed for as long as possible to keep compatibility with applications - * that use the old direct-access method with png_info_struct. - * - * The following members may have allocated storage attached that should be - * cleaned up before the structure is discarded: palette, trans, text, - * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile, - * splt_palettes, scal_unit, row_pointers, and unknowns. By default, these - * are automatically freed when the info structure is deallocated, if they were - * allocated internally by libpng. This behavior can be changed by means - * of the png_data_freer() function. - * - * More allocation details: all the chunk-reading functions that - * change these members go through the corresponding png_set_* - * functions. A function to clear these members is available: see - * png_free_data(). The png_set_* functions do not depend on being - * able to point info structure members to any of the storage they are - * passed (they make their own copies), EXCEPT that the png_set_text - * functions use the same storage passed to them in the text_ptr or - * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns - * functions do not make their own copies. - */ -typedef struct png_info_struct -{ - /* the following are necessary for every PNG file */ - png_uint_32 width; /* width of image in pixels (from IHDR) */ - png_uint_32 height; /* height of image in pixels (from IHDR) */ - png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */ - png_uint_32 rowbytes; /* bytes needed to hold an untransformed row */ - png_colorp palette; /* array of color values (valid & PNG_INFO_PLTE) */ - png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */ - png_uint_16 num_trans; /* number of transparent palette color (tRNS) */ - png_byte bit_depth; /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */ - png_byte color_type; /* see PNG_COLOR_TYPE_ below (from IHDR) */ - /* The following three should have been named *_method not *_type */ - png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */ - png_byte filter_type; /* must be PNG_FILTER_TYPE_BASE (from IHDR) */ - png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ - - /* The following is informational only on read, and not used on writes. */ - png_byte channels; /* number of data channels per pixel (1, 2, 3, 4) */ - png_byte pixel_depth; /* number of bits per pixel */ - png_byte spare_byte; /* to align the data, and for future use */ - png_byte signature[8]; /* magic bytes read by libpng from start of file */ - - /* The rest of the data is optional. If you are reading, check the - * valid field to see if the information in these are valid. If you - * are writing, set the valid field to those chunks you want written, - * and initialize the appropriate fields below. - */ - -#if defined(PNG_gAMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) - /* The gAMA chunk describes the gamma characteristics of the system - * on which the image was created, normally in the range [1.0, 2.5]. - * Data is valid if (valid & PNG_INFO_gAMA) is non-zero. - */ - float gamma; /* gamma value of image, if (valid & PNG_INFO_gAMA) */ -#endif - -#if defined(PNG_sRGB_SUPPORTED) - /* GR-P, 0.96a */ - /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */ - png_byte srgb_intent; /* sRGB rendering intent [0, 1, 2, or 3] */ -#endif - -#if defined(PNG_TEXT_SUPPORTED) - /* The tEXt, and zTXt chunks contain human-readable textual data in - * uncompressed, compressed, and optionally compressed forms, respectively. - * The data in "text" is an array of pointers to uncompressed, - * null-terminated C strings. Each chunk has a keyword that describes the - * textual data contained in that chunk. Keywords are not required to be - * unique, and the text string may be empty. Any number of text chunks may - * be in an image. - */ - int num_text; /* number of comments read/to write */ - int max_text; /* current size of text array */ - png_textp text; /* array of comments read/to write */ -#endif /* PNG_TEXT_SUPPORTED */ - -#if defined(PNG_tIME_SUPPORTED) - /* The tIME chunk holds the last time the displayed image data was - * modified. See the png_time struct for the contents of this struct. - */ - png_time mod_time; -#endif - -#if defined(PNG_sBIT_SUPPORTED) - /* The sBIT chunk specifies the number of significant high-order bits - * in the pixel data. Values are in the range [1, bit_depth], and are - * only specified for the channels in the pixel data. The contents of - * the low-order bits is not specified. Data is valid if - * (valid & PNG_INFO_sBIT) is non-zero. - */ - png_color_8 sig_bit; /* significant bits in color channels */ -#endif - -#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \ -defined(PNG_READ_BACKGROUND_SUPPORTED) - /* The tRNS chunk supplies transparency data for paletted images and - * other image types that don't need a full alpha channel. There are - * "num_trans" transparency values for a paletted image, stored in the - * same order as the palette colors, starting from index 0. Values - * for the data are in the range [0, 255], ranging from fully transparent - * to fully opaque, respectively. For non-paletted images, there is a - * single color specified that should be treated as fully transparent. - * Data is valid if (valid & PNG_INFO_tRNS) is non-zero. - */ - png_bytep trans; /* transparent values for paletted image */ - png_color_16 trans_values; /* transparent color for non-palette image */ -#endif - -#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - /* The bKGD chunk gives the suggested image background color if the - * display program does not have its own background color and the image - * is needs to composited onto a background before display. The colors - * in "background" are normally in the same color space/depth as the - * pixel data. Data is valid if (valid & PNG_INFO_bKGD) is non-zero. - */ - png_color_16 background; -#endif - -#if defined(PNG_oFFs_SUPPORTED) - /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards - * and downwards from the top-left corner of the display, page, or other - * application-specific co-ordinate space. See the PNG_OFFSET_ defines - * below for the unit types. Valid if (valid & PNG_INFO_oFFs) non-zero. - */ - png_int_32 x_offset; /* x offset on page */ - png_int_32 y_offset; /* y offset on page */ - png_byte offset_unit_type; /* offset units type */ -#endif - -#if defined(PNG_pHYs_SUPPORTED) - /* The pHYs chunk gives the physical pixel density of the image for - * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_ - * defines below). Data is valid if (valid & PNG_INFO_pHYs) is non-zero. - */ - png_uint_32 x_pixels_per_unit; /* horizontal pixel density */ - png_uint_32 y_pixels_per_unit; /* vertical pixel density */ - png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */ -#endif - -#if defined(PNG_hIST_SUPPORTED) - /* The hIST chunk contains the relative frequency or importance of the - * various palette entries, so that a viewer can intelligently select a - * reduced-color palette, if required. Data is an array of "num_palette" - * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST) - * is non-zero. - */ - png_uint_16p hist; -#endif - -#ifdef PNG_cHRM_SUPPORTED - /* The cHRM chunk describes the CIE color characteristics of the monitor - * on which the PNG was created. This data allows the viewer to do gamut - * mapping of the input image to ensure that the viewer sees the same - * colors in the image as the creator. Values are in the range - * [0.0, 0.8]. Data valid if (valid & PNG_INFO_cHRM) non-zero. - */ -#ifdef PNG_FLOATING_POINT_SUPPORTED - float x_white; - float y_white; - float x_red; - float y_red; - float x_green; - float y_green; - float x_blue; - float y_blue; -#endif -#endif - -#if defined(PNG_pCAL_SUPPORTED) - /* The pCAL chunk describes a transformation between the stored pixel - * values and original physical data values used to create the image. - * The integer range [0, 2^bit_depth - 1] maps to the floating-point - * range given by [pcal_X0, pcal_X1], and are further transformed by a - * (possibly non-linear) transformation function given by "pcal_type" - * and "pcal_params" into "pcal_units". Please see the PNG_EQUATION_ - * defines below, and the PNG-Group's PNG extensions document for a - * complete description of the transformations and how they should be - * implemented, and for a description of the ASCII parameter strings. - * Data values are valid if (valid & PNG_INFO_pCAL) non-zero. - */ - png_charp pcal_purpose; /* pCAL chunk description string */ - png_int_32 pcal_X0; /* minimum value */ - png_int_32 pcal_X1; /* maximum value */ - png_charp pcal_units; /* Latin-1 string giving physical units */ - png_charpp pcal_params; /* ASCII strings containing parameter values */ - png_byte pcal_type; /* equation type (see PNG_EQUATION_ below) */ - png_byte pcal_nparams; /* number of parameters given in pcal_params */ -#endif - -/* New members added in libpng-1.0.6 */ -#ifdef PNG_FREE_ME_SUPPORTED - png_uint_32 free_me; /* flags items libpng is responsible for freeing */ -#endif - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) - /* storage for unknown chunks that the library doesn't recognize. */ - png_unknown_chunkp unknown_chunks; - png_size_t unknown_chunks_num; -#endif - -#if defined(PNG_iCCP_SUPPORTED) - /* iCCP chunk data. */ - png_charp iccp_name; /* profile name */ - png_charp iccp_profile; /* International Color Consortium profile data */ - /* Note to maintainer: should be png_bytep */ - png_uint_32 iccp_proflen; /* ICC profile data length */ - png_byte iccp_compression; /* Always zero */ -#endif - -#if defined(PNG_sPLT_SUPPORTED) - /* data on sPLT chunks (there may be more than one). */ - png_sPLT_tp splt_palettes; - png_uint_32 splt_palettes_num; -#endif - -#if defined(PNG_sCAL_SUPPORTED) - /* The sCAL chunk describes the actual physical dimensions of the - * subject matter of the graphic. The chunk contains a unit specification - * a byte value, and two ASCII strings representing floating-point - * values. The values are width and height corresponsing to one pixel - * in the image. This external representation is converted to double - * here. Data values are valid if (valid & PNG_INFO_sCAL) is non-zero. - */ - png_byte scal_unit; /* unit of physical scale */ -#ifdef PNG_FLOATING_POINT_SUPPORTED - double scal_pixel_width; /* width of one pixel */ - double scal_pixel_height; /* height of one pixel */ -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_charp scal_s_width; /* string containing height */ - png_charp scal_s_height; /* string containing width */ -#endif -#endif - -#if defined(PNG_INFO_IMAGE_SUPPORTED) - /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) non-zero */ - /* Data valid if (valid & PNG_INFO_IDAT) non-zero */ - png_bytepp row_pointers; /* the image bits */ -#endif - -#if defined(PNG_FIXED_POINT_SUPPORTED) && defined(PNG_gAMA_SUPPORTED) - png_fixed_point int_gamma; /* gamma of image, if (valid & PNG_INFO_gAMA) */ -#endif - -#if defined(PNG_cHRM_SUPPORTED) && defined(PNG_FIXED_POINT_SUPPORTED) - png_fixed_point int_x_white; - png_fixed_point int_y_white; - png_fixed_point int_x_red; - png_fixed_point int_y_red; - png_fixed_point int_x_green; - png_fixed_point int_y_green; - png_fixed_point int_x_blue; - png_fixed_point int_y_blue; -#endif - -} png_info; - -typedef png_info FAR * png_infop; -typedef png_info FAR * FAR * png_infopp; - -/* Maximum positive integer used in PNG is (2^31)-1 */ -#define PNG_MAX_UINT ((png_uint_32)0x7fffffffL) - -/* These describe the color_type field in png_info. */ -/* color type masks */ -#define PNG_COLOR_MASK_PALETTE 1 -#define PNG_COLOR_MASK_COLOR 2 -#define PNG_COLOR_MASK_ALPHA 4 - -/* color types. Note that not all combinations are legal */ -#define PNG_COLOR_TYPE_GRAY 0 -#define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE) -#define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR) -#define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA) -#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA) -/* aliases */ -#define PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGB_ALPHA -#define PNG_COLOR_TYPE_GA PNG_COLOR_TYPE_GRAY_ALPHA - -/* This is for compression type. PNG 1.0-1.2 only define the single type. */ -#define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */ -#define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE - -/* This is for filter type. PNG 1.0-1.2 only define the single type. */ -#define PNG_FILTER_TYPE_BASE 0 /* Single row per-byte filtering */ -#define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */ -#define PNG_FILTER_TYPE_DEFAULT PNG_FILTER_TYPE_BASE - -/* These are for the interlacing type. These values should NOT be changed. */ -#define PNG_INTERLACE_NONE 0 /* Non-interlaced image */ -#define PNG_INTERLACE_ADAM7 1 /* Adam7 interlacing */ -#define PNG_INTERLACE_LAST 2 /* Not a valid value */ - -/* These are for the oFFs chunk. These values should NOT be changed. */ -#define PNG_OFFSET_PIXEL 0 /* Offset in pixels */ -#define PNG_OFFSET_MICROMETER 1 /* Offset in micrometers (1/10^6 meter) */ -#define PNG_OFFSET_LAST 2 /* Not a valid value */ - -/* These are for the pCAL chunk. These values should NOT be changed. */ -#define PNG_EQUATION_LINEAR 0 /* Linear transformation */ -#define PNG_EQUATION_BASE_E 1 /* Exponential base e transform */ -#define PNG_EQUATION_ARBITRARY 2 /* Arbitrary base exponential transform */ -#define PNG_EQUATION_HYPERBOLIC 3 /* Hyperbolic sine transformation */ -#define PNG_EQUATION_LAST 4 /* Not a valid value */ - -/* These are for the sCAL chunk. These values should NOT be changed. */ -#define PNG_SCALE_UNKNOWN 0 /* unknown unit (image scale) */ -#define PNG_SCALE_METER 1 /* meters per pixel */ -#define PNG_SCALE_RADIAN 2 /* radians per pixel */ -#define PNG_SCALE_LAST 3 /* Not a valid value */ - -/* These are for the pHYs chunk. These values should NOT be changed. */ -#define PNG_RESOLUTION_UNKNOWN 0 /* pixels/unknown unit (aspect ratio) */ -#define PNG_RESOLUTION_METER 1 /* pixels/meter */ -#define PNG_RESOLUTION_LAST 2 /* Not a valid value */ - -/* These are for the sRGB chunk. These values should NOT be changed. */ -#define PNG_sRGB_INTENT_PERCEPTUAL 0 -#define PNG_sRGB_INTENT_RELATIVE 1 -#define PNG_sRGB_INTENT_SATURATION 2 -#define PNG_sRGB_INTENT_ABSOLUTE 3 -#define PNG_sRGB_INTENT_LAST 4 /* Not a valid value */ - -/* This is for text chunks */ -#define PNG_KEYWORD_MAX_LENGTH 79 - -/* Maximum number of entries in PLTE/sPLT/tRNS arrays */ -#define PNG_MAX_PALETTE_LENGTH 256 - -/* These determine if an ancillary chunk's data has been successfully read - * from the PNG header, or if the application has filled in the corresponding - * data in the info_struct to be written into the output file. The values - * of the PNG_INFO_ defines should NOT be changed. - */ -#define PNG_INFO_gAMA 0x0001 -#define PNG_INFO_sBIT 0x0002 -#define PNG_INFO_cHRM 0x0004 -#define PNG_INFO_PLTE 0x0008 -#define PNG_INFO_tRNS 0x0010 -#define PNG_INFO_bKGD 0x0020 -#define PNG_INFO_hIST 0x0040 -#define PNG_INFO_pHYs 0x0080 -#define PNG_INFO_oFFs 0x0100 -#define PNG_INFO_tIME 0x0200 -#define PNG_INFO_pCAL 0x0400 -#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ -#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ -#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ -#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ -#define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */ - -/* This is used for the transformation routines, as some of them - * change these values for the row. It also should enable using - * the routines for other purposes. - */ -typedef struct png_row_info_struct -{ - png_uint_32 width; /* width of row */ - png_uint_32 rowbytes; /* number of bytes in row */ - png_byte color_type; /* color type of row */ - png_byte bit_depth; /* bit depth of row */ - png_byte channels; /* number of channels (1, 2, 3, or 4) */ - png_byte pixel_depth; /* bits per pixel (depth * channels) */ -} png_row_info; - -typedef png_row_info FAR * png_row_infop; -typedef png_row_info FAR * FAR * png_row_infopp; - -/* These are the function types for the I/O functions and for the functions - * that allow the user to override the default I/O functions with his or her - * own. The png_error_ptr type should match that of user-supplied warning - * and error functions, while the png_rw_ptr type should match that of the - * user read/write data functions. - */ -typedef struct png_struct_def png_struct; -typedef png_struct FAR * png_structp; - -typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); -typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); -typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); -typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, - int)); -typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, - int)); - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop)); -typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); -typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, - png_uint_32, int)); -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, - png_row_infop, png_bytep)); -#endif - -#if defined(PNG_USER_CHUNKS_SUPPORTED) -typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp)); -#endif -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); -#endif - -/* Transform masks for the high-level interface */ -#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ -#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ -#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ -#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ -#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ -#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ -#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ -#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ -#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ -#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ -#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ -#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ -#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only */ - -/* Flags for MNG supported features */ -#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 -#define PNG_FLAG_MNG_FILTER_64 0x04 -#define PNG_ALL_MNG_FEATURES 0x05 - -typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); -typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); - -/* The structure that holds the information to read and write PNG files. - * The only people who need to care about what is inside of this are the - * people who will be modifying the library for their own special needs. - * It should NOT be accessed directly by an application, except to store - * the jmp_buf. - */ - -struct png_struct_def -{ -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf jmpbuf; /* used in png_error */ -#endif - png_error_ptr error_fn; /* function for printing errors and aborting */ - png_error_ptr warning_fn; /* function for printing warnings */ - png_voidp error_ptr; /* user supplied struct for error functions */ - png_rw_ptr write_data_fn; /* function for writing output data */ - png_rw_ptr read_data_fn; /* function for reading input data */ - png_voidp io_ptr; /* ptr to application struct for I/O functions */ - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) - png_user_transform_ptr read_user_transform_fn; /* user read transform */ -#endif - -#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) - png_user_transform_ptr write_user_transform_fn; /* user write transform */ -#endif - -/* These were added in libpng-1.0.2 */ -#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) - png_voidp user_transform_ptr; /* user supplied struct for user transform */ - png_byte user_transform_depth; /* bit depth of user transformed pixels */ - png_byte user_transform_channels; /* channels in user transformed pixels */ -#endif -#endif - - png_uint_32 mode; /* tells us where we are in the PNG file */ - png_uint_32 flags; /* flags indicating various things to libpng */ - png_uint_32 transformations; /* which transformations to perform */ - - z_stream zstream; /* pointer to decompression structure (below) */ - png_bytep zbuf; /* buffer for zlib */ - png_size_t zbuf_size; /* size of zbuf */ - int zlib_level; /* holds zlib compression level */ - int zlib_method; /* holds zlib compression method */ - int zlib_window_bits; /* holds zlib compression window bits */ - int zlib_mem_level; /* holds zlib compression memory level */ - int zlib_strategy; /* holds zlib compression strategy */ - - png_uint_32 width; /* width of image in pixels */ - png_uint_32 height; /* height of image in pixels */ - png_uint_32 num_rows; /* number of rows in current pass */ - png_uint_32 usr_width; /* width of row at start of write */ - png_uint_32 rowbytes; /* size of row in bytes */ - png_uint_32 irowbytes; /* size of current interlaced row in bytes */ - png_uint_32 iwidth; /* width of current interlaced row in pixels */ - png_uint_32 row_number; /* current row in interlace pass */ - png_bytep prev_row; /* buffer to save previous (unfiltered) row */ - png_bytep row_buf; /* buffer to save current (unfiltered) row */ - png_bytep sub_row; /* buffer to save "sub" row when filtering */ - png_bytep up_row; /* buffer to save "up" row when filtering */ - png_bytep avg_row; /* buffer to save "avg" row when filtering */ - png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ - png_row_info row_info; /* used for transformation routines */ - - png_uint_32 idat_size; /* current IDAT size for read */ - png_uint_32 crc; /* current chunk CRC value */ - png_colorp palette; /* palette from the input file */ - png_uint_16 num_palette; /* number of color entries in palette */ - png_uint_16 num_trans; /* number of transparency values */ - png_byte chunk_name[5]; /* null-terminated name of current chunk */ - png_byte compression; /* file compression type (always 0) */ - png_byte filter; /* file filter type (always 0) */ - png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ - png_byte pass; /* current interlace pass (0 - 6) */ - png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ - png_byte color_type; /* color type of file */ - png_byte bit_depth; /* bit depth of file */ - png_byte usr_bit_depth; /* bit depth of users row */ - png_byte pixel_depth; /* number of bits per pixel */ - png_byte channels; /* number of channels in file */ - png_byte usr_channels; /* channels at start of write */ - png_byte sig_bytes; /* magic bytes read/written from start of file */ - -#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) -#ifdef PNG_LEGACY_SUPPORTED - png_byte filler; /* filler byte for pixel expansion */ -#else - png_uint_16 filler; /* filler bytes for pixel expansion */ -#endif -#endif - -#if defined(PNG_bKGD_SUPPORTED) - png_byte background_gamma_type; -# ifdef PNG_FLOATING_POINT_SUPPORTED - float background_gamma; -# endif - png_color_16 background; /* background color in screen gamma space */ -#if defined(PNG_READ_GAMMA_SUPPORTED) - png_color_16 background_1; /* background normalized to gamma 1.0 */ -#endif -#endif /* PNG_bKGD_SUPPORTED */ - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) - png_flush_ptr output_flush_fn;/* Function for flushing output */ - png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ - png_uint_32 flush_rows; /* number of rows written since last flush */ -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - int gamma_shift; /* number of "insignificant" bits 16-bit gamma */ -#ifdef PNG_FLOATING_POINT_SUPPORTED - float gamma; /* file gamma value */ - float screen_gamma; /* screen gamma value (display_exponent) */ -#endif -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - png_bytep gamma_table; /* gamma table for 8-bit depth files */ - png_bytep gamma_from_1; /* converts from 1.0 to screen */ - png_bytep gamma_to_1; /* converts from file to 1.0 */ - png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ - png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ - png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) - png_color_8 sig_bit; /* significant bits in each available channel */ -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) - png_color_8 shift; /* shift for significant bit tranformation */ -#endif - -#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ - || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - png_bytep trans; /* transparency values for paletted files */ - png_color_16 trans_values; /* transparency values for non-paletted files */ -#endif - - png_read_status_ptr read_row_fn; /* called after each row is decoded */ - png_write_status_ptr write_row_fn; /* called after each row is encoded */ -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED - png_progressive_info_ptr info_fn; /* called after header data fully read */ - png_progressive_row_ptr row_fn; /* called after each prog. row is decoded */ - png_progressive_end_ptr end_fn; /* called after image is complete */ - png_bytep save_buffer_ptr; /* current location in save_buffer */ - png_bytep save_buffer; /* buffer for previously read data */ - png_bytep current_buffer_ptr; /* current location in current_buffer */ - png_bytep current_buffer; /* buffer for recently used data */ - png_uint_32 push_length; /* size of current input chunk */ - png_uint_32 skip_length; /* bytes to skip in input data */ - png_size_t save_buffer_size; /* amount of data now in save_buffer */ - png_size_t save_buffer_max; /* total size of save_buffer */ - png_size_t buffer_size; /* total amount of available input data */ - png_size_t current_buffer_size; /* amount of data now in current_buffer */ - int process_mode; /* what push library is currently doing */ - int cur_palette; /* current push library palette index */ - -# if defined(PNG_TEXT_SUPPORTED) - png_size_t current_text_size; /* current size of text input data */ - png_size_t current_text_left; /* how much text left to read in input */ - png_charp current_text; /* current text chunk buffer */ - png_charp current_text_ptr; /* current location in current_text */ -# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */ - -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - -#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) -/* for the Borland special 64K segment handler */ - png_bytepp offset_table_ptr; - png_bytep offset_table; - png_uint_16 offset_table_number; - png_uint_16 offset_table_count; - png_uint_16 offset_table_count_free; -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) - png_bytep palette_lookup; /* lookup table for dithering */ - png_bytep dither_index; /* index translation for palette files */ -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED) - png_uint_16p hist; /* histogram */ -#endif - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - png_byte heuristic_method; /* heuristic for row filter selection */ - png_byte num_prev_filters; /* number of weights for previous rows */ - png_bytep prev_filters; /* filter type(s) of previous row(s) */ - png_uint_16p filter_weights; /* weight(s) for previous line(s) */ - png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ - png_uint_16p filter_costs; /* relative filter calculation cost */ - png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ -#endif - -#if defined(PNG_TIME_RFC1123_SUPPORTED) - png_charp time_buffer; /* String to hold RFC 1123 time text */ -#endif - -/* New members added in libpng-1.0.6 */ - -#ifdef PNG_FREE_ME_SUPPORTED - png_uint_32 free_me; /* flags items libpng is responsible for freeing */ -#endif - -#if defined(PNG_USER_CHUNKS_SUPPORTED) - png_voidp user_chunk_ptr; - png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ -#endif - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) - int num_chunk_list; - png_bytep chunk_list; -#endif - -/* New members added in libpng-1.0.3 */ -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - png_byte rgb_to_gray_status; - /* These were changed from png_byte in libpng-1.0.6 */ - png_uint_16 rgb_to_gray_red_coeff; - png_uint_16 rgb_to_gray_green_coeff; - png_uint_16 rgb_to_gray_blue_coeff; -#endif - -/* New member added in libpng-1.0.4 (renamed in 1.0.9) */ -#if defined(PNG_MNG_FEATURES_SUPPORTED) || \ - defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ - defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) -/* changed from png_byte to png_uint_32 at version 1.2.0 */ -#ifdef PNG_1_0_X - png_byte mng_features_permitted; -#else - png_uint_32 mng_features_permitted; -#endif /* PNG_1_0_X */ -#endif - -/* New member added in libpng-1.0.7 */ -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - png_fixed_point int_gamma; -#endif - -/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ -#if defined(PNG_MNG_FEATURES_SUPPORTED) - png_byte filter_type; -#endif - -#if defined(PNG_1_0_X) || (defined(PNG_DEBUG) && defined(PNG_USE_PNGGCCRD)) -/* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */ - png_uint_32 row_buf_size; -#endif - -/* New members added in libpng-1.2.0 */ -#if !defined(PNG_1_0_X) && defined(PNG_ASSEMBLER_CODE_SUPPORTED) - png_byte mmx_bitdepth_threshold; - png_uint_32 mmx_rowbytes_threshold; - png_uint_32 asm_flags; -#endif - -/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ -#ifdef PNG_USER_MEM_SUPPORTED - png_voidp mem_ptr; /* user supplied struct for mem functions */ - png_malloc_ptr malloc_fn; /* function for allocating memory */ - png_free_ptr free_fn; /* function for freeing memory */ -#endif - -/* New member added in libpng-1.0.13 and 1.2.0 */ - png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ - -#if defined(PNG_READ_DITHER_SUPPORTED) -/* The following three members were added at version 1.0.14 and 1.2.4 */ - png_bytep dither_sort; /* working sort array */ - png_bytep index_to_palette; /* where the original index currently is */ - /* in the palette */ - png_bytep palette_to_index; /* which original index points to this */ - /* palette color */ -#endif - -}; - - -/* This prevents a compiler error in png.c if png.c and png.h are both at - version 1.2.5 - */ -typedef png_structp version_1_2_5; - -typedef png_struct FAR * FAR * png_structpp; - -/* Here are the function definitions most commonly used. This is not - * the place to find out how to use libpng. See libpng.txt for the - * full explanation, see example.c for the summary. This just provides - * a simple one line description of the use of each function. - */ - -/* Returns the version number of the library */ -extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void)); - -/* Tell lib we have already handled the first magic bytes. - * Handling more than 8 bytes from the beginning of the file is an error. - */ -extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr, - int num_bytes)); - -/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a - * PNG file. Returns zero if the supplied bytes match the 8-byte PNG - * signature, and non-zero otherwise. Having num_to_check == 0 or - * start > 7 will always fail (ie return non-zero). - */ -extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start, - png_size_t num_to_check)); - -/* Simple signature checking function. This is the same as calling - * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). - */ -extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num)); - -/* Allocate and initialize png_ptr struct for reading, and any other memory. */ -extern PNG_EXPORT(png_structp,png_create_read_struct) - PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn)); - -/* Allocate and initialize png_ptr struct for writing, and any other memory */ -extern PNG_EXPORT(png_structp,png_create_write_struct) - PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn)); - -extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) - PNGARG((png_structp png_ptr)); - -extern PNG_EXPORT(void,png_set_compression_buffer_size) - PNGARG((png_structp png_ptr, png_uint_32 size)); - -/* Reset the compression stream */ -extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); - -/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ -#ifdef PNG_USER_MEM_SUPPORTED -extern PNG_EXPORT(png_structp,png_create_read_struct_2) - PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn)); -extern PNG_EXPORT(png_structp,png_create_write_struct_2) - PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn)); -#endif - -/* Write a PNG chunk - size, type, (optional) data, CRC. */ -extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, - png_bytep chunk_name, png_bytep data, png_size_t length)); - -/* Write the start of a PNG chunk - length and chunk name. */ -extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, - png_bytep chunk_name, png_uint_32 length)); - -/* Write the data of a PNG chunk started with png_write_chunk_start(). */ -extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, - png_bytep data, png_size_t length)); - -/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ -extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); - -/* Allocate and initialize the info structure */ -extern PNG_EXPORT(png_infop,png_create_info_struct) - PNGARG((png_structp png_ptr)); - -/* Initialize the info structure (old interface - DEPRECATED) */ -extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr)); -#undef png_info_init -#define png_info_init(info_ptr) png_info_init_3(&info_ptr, sizeof(png_info)); -extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, - png_size_t png_info_struct_size)); - -/* Writes all the PNG information before the image. */ -extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, - png_infop info_ptr)); -extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -/* read the information before the actual image data. */ -extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -#if defined(PNG_TIME_RFC1123_SUPPORTED) -extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) - PNGARG((png_structp png_ptr, png_timep ptime)); -#endif - -#if !defined(_WIN32_WCE) -/* "time.h" functions are not supported on WindowsCE */ -#if defined(PNG_WRITE_tIME_SUPPORTED) -/* convert from a struct tm to png_time */ -extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, - struct tm FAR * ttime)); - -/* convert from time_t to png_time. Uses gmtime() */ -extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, - time_t ttime)); -#endif /* PNG_WRITE_tIME_SUPPORTED */ -#endif /* _WIN32_WCE */ - -#if defined(PNG_READ_EXPAND_SUPPORTED) -/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ -extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -/* Use blue, green, red order for pixels. */ -extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) -/* Expand the grayscale to 24-bit RGB if necessary. */ -extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -/* Reduce RGB to grayscale. */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, - int error_action, double red, double green )); -#endif -extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, - int error_action, png_fixed_point red, png_fixed_point green )); -extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp - png_ptr)); -#endif - -extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, - png_colorp palette)); - -#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) -/* Add a filler byte to 24-bit RGB images. */ -extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr, - png_uint_32 filler, int flags)); -/* The values of the PNG_FILLER_ defines should NOT be changed */ -#define PNG_FILLER_BEFORE 0 -#define PNG_FILLER_AFTER 1 -#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ - -#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -/* Swap bytes in 16-bit depth files. */ -extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) -/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ -extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) -/* Swap packing order of pixels in bytes. */ -extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) -/* Converts files to legal bit depths. */ -extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, - png_color_8p true_bits)); -#endif - -#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ - defined(PNG_WRITE_INTERLACING_SUPPORTED) -/* Have the code handle the interlacing. Returns the number of passes. */ -extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) -/* Invert monochrome files */ -extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) -/* Handle alpha and tRNS by replacing with a background color. */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, - png_color_16p background_color, int background_gamma_code, - int need_expand, double background_gamma)); -#endif -#define PNG_BACKGROUND_GAMMA_UNKNOWN 0 -#define PNG_BACKGROUND_GAMMA_SCREEN 1 -#define PNG_BACKGROUND_GAMMA_FILE 2 -#define PNG_BACKGROUND_GAMMA_UNIQUE 3 -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) -/* strip the second byte of information from a 16-bit depth file. */ -extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) -/* Turn on dithering, and reduce the palette to the number of colors available. */ -extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr, - png_colorp palette, int num_palette, int maximum_colors, - png_uint_16p histogram, int full_dither)); -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) -/* Handle gamma correction. Screen_gamma=(display_exponent) */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, - double screen_gamma, double default_file_gamma)); -#endif -#endif - -#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ - defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) -/* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */ -/* Deprecated and will be removed. Use png_permit_mng_features() instead. */ -extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr, - int empty_plte_permitted)); -#endif - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -/* Set how many lines between output flushes - 0 for no flushing */ -extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); -/* Flush the current PNG output buffer */ -extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); -#endif - -/* optional update palette with requested transformations */ -extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); - -/* optional call to update the users info structure */ -extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -/* read one or more rows of image data. */ -extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, - png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); - -/* read a row of data. */ -extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, - png_bytep row, - png_bytep display_row)); - -/* read the whole image into memory at once. */ -extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, - png_bytepp image)); - -/* write a row of image data */ -extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, - png_bytep row)); - -/* write a few rows of image data */ -extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, - png_bytepp row, png_uint_32 num_rows)); - -/* write the image data */ -extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, - png_bytepp image)); - -/* writes the end of the PNG file. */ -extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -/* read the end of the PNG file. */ -extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -/* free any memory associated with the png_info_struct */ -extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, - png_infopp info_ptr_ptr)); - -/* free any memory associated with the png_struct and the png_info_structs */ -extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp - png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); - -/* free all memory used by the read (old method - NOT DLL EXPORTED) */ -extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr, - png_infop end_info_ptr)); - -/* free any memory associated with the png_struct and the png_info_structs */ -extern PNG_EXPORT(void,png_destroy_write_struct) - PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); - -/* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ -extern void png_write_destroy PNGARG((png_structp png_ptr)); - -/* set the libpng method of handling chunk CRC errors */ -extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, - int crit_action, int ancil_action)); - -/* Values for png_set_crc_action() to say how to handle CRC errors in - * ancillary and critical chunks, and whether to use the data contained - * therein. Note that it is impossible to "discard" data in a critical - * chunk. For versions prior to 0.90, the action was always error/quit, - * whereas in version 0.90 and later, the action for CRC errors in ancillary - * chunks is warn/discard. These values should NOT be changed. - * - * value action:critical action:ancillary - */ -#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ -#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ -#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ -#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ -#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ -#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ - -/* These functions give the user control over the scan-line filtering in - * libpng and the compression methods used by zlib. These functions are - * mainly useful for testing, as the defaults should work with most users. - * Those users who are tight on memory or want faster performance at the - * expense of compression can modify them. See the compression library - * header file (zlib.h) for an explination of the compression functions. - */ - -/* set the filtering method(s) used by libpng. Currently, the only valid - * value for "method" is 0. - */ -extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, - int filters)); - -/* Flags for png_set_filter() to say which filters to use. The flags - * are chosen so that they don't conflict with real filter types - * below, in case they are supplied instead of the #defined constants. - * These values should NOT be changed. - */ -#define PNG_NO_FILTERS 0x00 -#define PNG_FILTER_NONE 0x08 -#define PNG_FILTER_SUB 0x10 -#define PNG_FILTER_UP 0x20 -#define PNG_FILTER_AVG 0x40 -#define PNG_FILTER_PAETH 0x80 -#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ - PNG_FILTER_AVG | PNG_FILTER_PAETH) - -/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. - * These defines should NOT be changed. - */ -#define PNG_FILTER_VALUE_NONE 0 -#define PNG_FILTER_VALUE_SUB 1 -#define PNG_FILTER_VALUE_UP 2 -#define PNG_FILTER_VALUE_AVG 3 -#define PNG_FILTER_VALUE_PAETH 4 -#define PNG_FILTER_VALUE_LAST 5 - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */ -/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ - * defines, either the default (minimum-sum-of-absolute-differences), or - * the experimental method (weighted-minimum-sum-of-absolute-differences). - * - * Weights are factors >= 1.0, indicating how important it is to keep the - * filter type consistent between rows. Larger numbers mean the current - * filter is that many times as likely to be the same as the "num_weights" - * previous filters. This is cumulative for each previous row with a weight. - * There needs to be "num_weights" values in "filter_weights", or it can be - * NULL if the weights aren't being specified. Weights have no influence on - * the selection of the first row filter. Well chosen weights can (in theory) - * improve the compression for a given image. - * - * Costs are factors >= 1.0 indicating the relative decoding costs of a - * filter type. Higher costs indicate more decoding expense, and are - * therefore less likely to be selected over a filter with lower computational - * costs. There needs to be a value in "filter_costs" for each valid filter - * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't - * setting the costs. Costs try to improve the speed of decompression without - * unduly increasing the compressed image size. - * - * A negative weight or cost indicates the default value is to be used, and - * values in the range [0.0, 1.0) indicate the value is to remain unchanged. - * The default values for both weights and costs are currently 1.0, but may - * change if good general weighting/cost heuristics can be found. If both - * the weights and costs are set to 1.0, this degenerates the WEIGHTED method - * to the UNWEIGHTED method, but with added encoding time/computation. - */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, - int heuristic_method, int num_weights, png_doublep filter_weights, - png_doublep filter_costs)); -#endif -#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ - -/* Heuristic used for row filter selection. These defines should NOT be - * changed. - */ -#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ -#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ -#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ -#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ - -/* Set the library compression level. Currently, valid values range from - * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 - * (0 - no compression, 9 - "maximal" compression). Note that tests have - * shown that zlib compression levels 3-6 usually perform as well as level 9 - * for PNG images, and do considerably fewer caclulations. In the future, - * these values may not correspond directly to the zlib compression levels. - */ -extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, - int level)); - -extern PNG_EXPORT(void,png_set_compression_mem_level) - PNGARG((png_structp png_ptr, int mem_level)); - -extern PNG_EXPORT(void,png_set_compression_strategy) - PNGARG((png_structp png_ptr, int strategy)); - -extern PNG_EXPORT(void,png_set_compression_window_bits) - PNGARG((png_structp png_ptr, int window_bits)); - -extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, - int method)); - -/* These next functions are called for input/output, memory, and error - * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, - * and call standard C I/O routines such as fread(), fwrite(), and - * fprintf(). These functions can be made to use other I/O routines - * at run time for those applications that need to handle I/O in a - * different manner by calling png_set_???_fn(). See libpng.txt for - * more information. - */ - -#if !defined(PNG_NO_STDIO) -/* Initialize the input/output for the PNG file to the default functions. */ -extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp)); -#endif - -/* Replace the (error and abort), and warning functions with user - * supplied functions. If no messages are to be printed you must still - * write and use replacement functions. The replacement error_fn should - * still do a longjmp to the last setjmp location if you are using this - * method of error handling. If error_fn or warning_fn is NULL, the - * default function will be used. - */ - -extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, - png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); - -/* Return the user pointer associated with the error functions */ -extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); - -/* Replace the default data output functions with a user supplied one(s). - * If buffered output is not used, then output_flush_fn can be set to NULL. - * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time - * output_flush_fn will be ignored (and thus can be NULL). - */ -extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, - png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); - -/* Replace the default data input function with a user supplied one. */ -extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, - png_voidp io_ptr, png_rw_ptr read_data_fn)); - -/* Return the user pointer associated with the I/O functions */ -extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); - -extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, - png_read_status_ptr read_row_fn)); - -extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr, - png_write_status_ptr write_row_fn)); - -#ifdef PNG_USER_MEM_SUPPORTED -/* Replace the default memory allocation functions with user supplied one(s). */ -extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr, - png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); -/* Return the user pointer associated with the memory functions */ -extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp - png_ptr, png_user_transform_ptr read_user_transform_fn)); -#endif - -#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp - png_ptr, png_user_transform_ptr write_user_transform_fn)); -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp - png_ptr, png_voidp user_transform_ptr, int user_transform_depth, - int user_transform_channels)); -/* Return the user pointer associated with the user transform functions */ -extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) - PNGARG((png_structp png_ptr)); -#endif - -#ifdef PNG_USER_CHUNKS_SUPPORTED -extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, - png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); -extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp - png_ptr)); -#endif - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -/* Sets the function callbacks for the push reader, and a pointer to a - * user-defined structure available to the callback functions. - */ -extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr, - png_voidp progressive_ptr, - png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, - png_progressive_end_ptr end_fn)); - -/* returns the user pointer associated with the push read functions */ -extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) - PNGARG((png_structp png_ptr)); - -/* function to be called when data becomes available */ -extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); - -/* function that combines rows. Not very much different than the - * png_combine_row() call. Is this even used????? - */ -extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, - png_bytep old_row, png_bytep new_row)); -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - -extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, - png_uint_32 size)); - -#if defined(PNG_1_0_X) -# define png_malloc_warn png_malloc -#else -/* Added at libpng version 1.2.4 */ -extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, - png_uint_32 size)); -#endif - -/* frees a pointer allocated by png_malloc() */ -extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); - -#if defined(PNG_1_0_X) -/* Function to allocate memory for zlib. */ -extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items, - uInt size)); - -/* Function to free memory for zlib */ -extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr)); -#endif - -/* Free data that was allocated internally */ -extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 free_me, int num)); -#ifdef PNG_FREE_ME_SUPPORTED -/* Reassign responsibility for freeing existing data, whether allocated - * by libpng or by the application */ -extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, - png_infop info_ptr, int freer, png_uint_32 mask)); -#endif -/* assignments for png_data_freer */ -#define PNG_DESTROY_WILL_FREE_DATA 1 -#define PNG_SET_WILL_FREE_DATA 1 -#define PNG_USER_WILL_FREE_DATA 2 -/* Flags for png_ptr->free_me and info_ptr->free_me */ -#define PNG_FREE_HIST 0x0008 -#define PNG_FREE_ICCP 0x0010 -#define PNG_FREE_SPLT 0x0020 -#define PNG_FREE_ROWS 0x0040 -#define PNG_FREE_PCAL 0x0080 -#define PNG_FREE_SCAL 0x0100 -#define PNG_FREE_UNKN 0x0200 -#define PNG_FREE_LIST 0x0400 -#define PNG_FREE_PLTE 0x1000 -#define PNG_FREE_TRNS 0x2000 -#define PNG_FREE_TEXT 0x4000 -#define PNG_FREE_ALL 0x7fff -#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ - -#ifdef PNG_USER_MEM_SUPPORTED -extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, - png_uint_32 size)); -extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, - png_voidp ptr)); -#endif - -extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, - png_voidp s1, png_voidp s2, png_uint_32 size)); - -extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr, - png_voidp s1, int value, png_uint_32 size)); - -#if defined(USE_FAR_KEYWORD) /* memory model conversion function */ -extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, - int check)); -#endif /* USE_FAR_KEYWORD */ - -/* Fatal error in PNG image of libpng - can't continue */ -extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, - png_const_charp error_message)); - -/* The same, but the chunk name is prepended to the error string. */ -extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, - png_const_charp error_message)); - -/* Non-fatal error in libpng. Can continue, but may have a problem. */ -extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, - png_const_charp warning_message)); - -/* Non-fatal error in libpng, chunk name is prepended to message. */ -extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, - png_const_charp warning_message)); - -/* The png_set_ functions are for storing values in the png_info_struct. - * Similarly, the png_get_ calls are used to read values from the - * png_info_struct, either storing the parameters in the passed variables, or - * setting pointers into the png_info_struct where the data is stored. The - * png_get_ functions return a non-zero value if the data was available - * in info_ptr, or return zero and do not change any of the parameters if the - * data was not available. - * - * These functions should be used instead of directly accessing png_info - * to avoid problems with future changes in the size and internal layout of - * png_info_struct. - */ -/* Returns "flag" if chunk data is valid in info_ptr. */ -extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, -png_infop info_ptr, png_uint_32 flag)); - -/* Returns number of bytes needed to hold a transformed row. */ -extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -/* Returns row_pointers, which is an array of pointers to scanlines that was -returned from png_read_png(). */ -extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, -png_infop info_ptr)); -/* Set row_pointers, which is an array of pointers to scanlines for use -by png_write_png(). */ -extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytepp row_pointers)); -#endif - -/* Returns number of color channels in image. */ -extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -#ifdef PNG_EASY_ACCESS_SUPPORTED -/* Returns image width in pixels. */ -extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image height in pixels. */ -extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image bit_depth. */ -extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image color_type. */ -extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image filter_type. */ -extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image interlace_type. */ -extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image compression_type. */ -extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image resolution in pixels per meter, from pHYs chunk data. */ -extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns pixel aspect ratio, computed from pHYs chunk data. */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -#endif - -/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ -extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -#endif /* PNG_EASY_ACCESS_SUPPORTED */ - -/* Returns pointer to signature string read from PNG header */ -extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -#if defined(PNG_bKGD_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_16p *background)); -#endif - -#if defined(PNG_bKGD_SUPPORTED) -extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_16p background)); -#endif - -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, - png_infop info_ptr, double *white_x, double *white_y, double *red_x, - double *red_y, double *green_x, double *green_y, double *blue_x, - double *blue_y)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point - *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, - png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point - *int_blue_x, png_fixed_point *int_blue_y)); -#endif -#endif - -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, - png_infop info_ptr, double white_x, double white_y, double red_x, - double red_y, double green_x, double green_y, double blue_x, double blue_y)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, - png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point - int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, - png_fixed_point int_blue_y)); -#endif -#endif - -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, - png_infop info_ptr, double *file_gamma)); -#endif -extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_fixed_point *int_file_gamma)); -#endif - -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, - png_infop info_ptr, double file_gamma)); -#endif -extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_fixed_point int_file_gamma)); -#endif - -#if defined(PNG_hIST_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_16p *hist)); -#endif - -#if defined(PNG_hIST_SUPPORTED) -extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_16p hist)); -#endif - -extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, - int *bit_depth, int *color_type, int *interlace_method, - int *compression_method, int *filter_method)); - -extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_method, int compression_method, - int filter_method)); - -#if defined(PNG_oFFs_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, - int *unit_type)); -#endif - -#if defined(PNG_oFFs_SUPPORTED) -extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, - int unit_type)); -#endif - -#if defined(PNG_pCAL_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, - int *type, int *nparams, png_charp *units, png_charpp *params)); -#endif - -#if defined(PNG_pCAL_SUPPORTED) -extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, - int type, int nparams, png_charp units, png_charpp params)); -#endif - -#if defined(PNG_pHYs_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); -#endif - -#if defined(PNG_pHYs_SUPPORTED) -extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); -#endif - -extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_colorp *palette, int *num_palette)); - -extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_colorp palette, int num_palette)); - -#if defined(PNG_sBIT_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_8p *sig_bit)); -#endif - -#if defined(PNG_sBIT_SUPPORTED) -extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_8p sig_bit)); -#endif - -#if defined(PNG_sRGB_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, - png_infop info_ptr, int *intent)); -#endif - -#if defined(PNG_sRGB_SUPPORTED) -extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, - png_infop info_ptr, int intent)); -extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, - png_infop info_ptr, int intent)); -#endif - -#if defined(PNG_iCCP_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charpp name, int *compression_type, - png_charpp profile, png_uint_32 *proflen)); - /* Note to maintainer: profile should be png_bytepp */ -#endif - -#if defined(PNG_iCCP_SUPPORTED) -extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charp name, int compression_type, - png_charp profile, png_uint_32 proflen)); - /* Note to maintainer: profile should be png_bytep */ -#endif - -#if defined(PNG_sPLT_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_sPLT_tpp entries)); -#endif - -#if defined(PNG_sPLT_SUPPORTED) -extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_sPLT_tp entries, int nentries)); -#endif - -#if defined(PNG_TEXT_SUPPORTED) -/* png_get_text also returns the number of text chunks in *num_text */ -extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_textp *text_ptr, int *num_text)); -#endif - -/* - * Note while png_set_text() will accept a structure whose text, - * language, and translated keywords are NULL pointers, the structure - * returned by png_get_text will always contain regular - * zero-terminated C strings. They might be empty strings but - * they will never be NULL pointers. - */ - -#if defined(PNG_TEXT_SUPPORTED) -extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_textp text_ptr, int num_text)); -#endif - -#if defined(PNG_tIME_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_timep *mod_time)); -#endif - -#if defined(PNG_tIME_SUPPORTED) -extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_timep mod_time)); -#endif - -#if defined(PNG_tRNS_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytep *trans, int *num_trans, - png_color_16p *trans_values)); -#endif - -#if defined(PNG_tRNS_SUPPORTED) -extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytep trans, int num_trans, - png_color_16p trans_values)); -#endif - -#if defined(PNG_tRNS_SUPPORTED) -#endif - -#if defined(PNG_sCAL_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, int *unit, double *width, double *height)); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, - png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); -#endif -#endif -#endif /* PNG_sCAL_SUPPORTED */ - -#if defined(PNG_sCAL_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, int unit, double width, double height)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, - png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); -#endif -#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -/* provide a list of chunks and how they are to be handled, if the built-in - handling or default unknown chunk handling is not desired. Any chunks not - listed will be handled in the default manner. The IHDR and IEND chunks - must not be listed. - keep = 0: follow default behavour - = 1: do not keep - = 2: keep only if safe-to-copy - = 3: keep even if unsafe-to-copy -*/ -extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp - png_ptr, int keep, png_bytep chunk_list, int num_chunks)); -extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); -extern PNG_EXPORT(void, png_set_unknown_chunk_location) - PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); -extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp - png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); -#endif -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep - chunk_name)); -#endif - -/* Png_free_data() will turn off the "valid" flag for anything it frees. - If you need to turn it off for a chunk that your application has freed, - you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */ -extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, - png_infop info_ptr, int mask)); - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -/* The "params" pointer is currently not used and is for future expansion. */ -extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, - png_infop info_ptr, - int transforms, - png_voidp params)); -extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, - png_infop info_ptr, - int transforms, - png_voidp params)); -#endif - -/* Define PNG_DEBUG at compile time for debugging information. Higher - * numbers for PNG_DEBUG mean more debugging information. This has - * only been added since version 0.95 so it is not implemented throughout - * libpng yet, but more support will be added as needed. - */ -#ifdef PNG_DEBUG -#if (PNG_DEBUG > 0) -#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) -#include -#if (PNG_DEBUG > 1) -#define png_debug(l,m) _RPT0(_CRT_WARN,m) -#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m,p1) -#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2) -#endif -#else /* PNG_DEBUG_FILE || !_MSC_VER */ -#ifndef PNG_DEBUG_FILE -#define PNG_DEBUG_FILE stderr -#endif /* PNG_DEBUG_FILE */ -#if (PNG_DEBUG > 1) -#define png_debug(l,m) \ -{ \ - int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s" m,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ -} -#define png_debug1(l,m,p1) \ -{ \ - int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s" m,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ -} -#define png_debug2(l,m,p1,p2) \ -{ \ - int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s" m,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ -} -#endif /* (PNG_DEBUG > 1) */ -#endif /* _MSC_VER */ -#endif /* (PNG_DEBUG > 0) */ -#endif /* PNG_DEBUG */ -#ifndef png_debug -#define png_debug(l, m) -#endif -#ifndef png_debug1 -#define png_debug1(l, m, p1) -#endif -#ifndef png_debug2 -#define png_debug2(l, m, p1, p2) -#endif - -extern PNG_EXPORT(png_bytep,png_sig_bytes) PNGARG((void)); - -extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); - -#ifdef PNG_MNG_FEATURES_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp - png_ptr, png_uint_32 mng_features_permitted)); -#endif - -/* Added to version 1.2.0 */ -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) -#define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */ -#define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */ -#define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04 -#define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08 -#define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10 -#define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20 -#define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40 -#define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80 -#define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */ - -#define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ - | PNG_ASM_FLAG_MMX_READ_INTERLACE \ - | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ - | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ - | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ - | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ) -#define PNG_MMX_WRITE_FLAGS ( 0 ) - -#define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \ - | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \ - | PNG_MMX_READ_FLAGS \ - | PNG_MMX_WRITE_FLAGS ) - -#define PNG_SELECT_READ 1 -#define PNG_SELECT_WRITE 2 - - -#if !defined(PNG_1_0_X) -/* pngget.c */ -extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask) - PNGARG((int flag_select, int *compilerID)); - -/* pngget.c */ -extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask) - PNGARG((int flag_select)); - -/* pngget.c */ -extern PNG_EXPORT(png_uint_32,png_get_asm_flags) - PNGARG((png_structp png_ptr)); - -/* pngget.c */ -extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold) - PNGARG((png_structp png_ptr)); - -/* pngget.c */ -extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold) - PNGARG((png_structp png_ptr)); - -/* pngset.c */ -extern PNG_EXPORT(void,png_set_asm_flags) - PNGARG((png_structp png_ptr, png_uint_32 asm_flags)); - -/* pngset.c */ -extern PNG_EXPORT(void,png_set_mmx_thresholds) - PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold, - png_uint_32 mmx_rowbytes_threshold)); - -#endif /* PNG_1_0_X */ -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - -#if !defined(PNG_1_0_X) -/* png.c, pnggccrd.c, or pngvcrd.c */ -extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); - -/* Strip the prepended error numbers ("#nnn ") from error and warning - * messages before passing them to the error or warning handler. */ -#ifdef PNG_ERROR_NUMBERS_SUPPORTED -extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp - png_ptr, png_uint_32 strip_mode)); -#endif -#endif /* PNG_1_0_X */ - -/* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */ - -#define PNG_HEADER_VERSION_STRING \ - " libpng version 1.2.5 - October 3, 2002 (header)\n" - -#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED -/* With these routines we avoid an integer divide, which will be slower on - * most machines. However, it does take more operations than the corresponding - * divide method, so it may be slower on a few RISC systems. There are two - * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. - * - * Note that the rounding factors are NOT supposed to be the same! 128 and - * 32768 are correct for the NODIV code; 127 and 32767 are correct for the - * standard method. - * - * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] - */ - - /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ - -# define png_composite(composite, fg, alpha, bg) \ - { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \ - + (png_uint_16)(bg)*(png_uint_16)(255 - \ - (png_uint_16)(alpha)) + (png_uint_16)128); \ - (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } - -# define png_composite_16(composite, fg, alpha, bg) \ - { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \ - + (png_uint_32)(bg)*(png_uint_32)(65535L - \ - (png_uint_32)(alpha)) + (png_uint_32)32768L); \ - (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } - -#else /* standard method using integer division */ - -# define png_composite(composite, fg, alpha, bg) \ - (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ - (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ - (png_uint_16)127) / 255) - -# define png_composite_16(composite, fg, alpha, bg) \ - (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ - (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ - (png_uint_32)32767) / (png_uint_32)65535L) - -#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ - -/* These next functions are used internally in the code. They generally - * shouldn't be used unless you are writing code to add or replace some - * functionality in libpng. More information about most functions can - * be found in the files where the functions are located. - */ - -#if defined(PNG_INTERNAL) - -/* Various modes of operation. Note that after an init, mode is set to - * zero automatically when the structure is created. - */ -#define PNG_HAVE_IHDR 0x01 -#define PNG_HAVE_PLTE 0x02 -#define PNG_HAVE_IDAT 0x04 -#define PNG_AFTER_IDAT 0x08 -#define PNG_HAVE_IEND 0x10 -#define PNG_HAVE_gAMA 0x20 -#define PNG_HAVE_cHRM 0x40 -#define PNG_HAVE_sRGB 0x80 -#define PNG_HAVE_CHUNK_HEADER 0x100 -#define PNG_WROTE_tIME 0x200 -#define PNG_WROTE_INFO_BEFORE_PLTE 0x400 -#define PNG_BACKGROUND_IS_GRAY 0x800 -#define PNG_HAVE_PNG_SIGNATURE 0x1000 - -/* flags for the transformations the PNG library does on the image data */ -#define PNG_BGR 0x0001 -#define PNG_INTERLACE 0x0002 -#define PNG_PACK 0x0004 -#define PNG_SHIFT 0x0008 -#define PNG_SWAP_BYTES 0x0010 -#define PNG_INVERT_MONO 0x0020 -#define PNG_DITHER 0x0040 -#define PNG_BACKGROUND 0x0080 -#define PNG_BACKGROUND_EXPAND 0x0100 - /* 0x0200 unused */ -#define PNG_16_TO_8 0x0400 -#define PNG_RGBA 0x0800 -#define PNG_EXPAND 0x1000 -#define PNG_GAMMA 0x2000 -#define PNG_GRAY_TO_RGB 0x4000 -#define PNG_FILLER 0x8000L -#define PNG_PACKSWAP 0x10000L -#define PNG_SWAP_ALPHA 0x20000L -#define PNG_STRIP_ALPHA 0x40000L -#define PNG_INVERT_ALPHA 0x80000L -#define PNG_USER_TRANSFORM 0x100000L -#define PNG_RGB_TO_GRAY_ERR 0x200000L -#define PNG_RGB_TO_GRAY_WARN 0x400000L -#define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ - -/* flags for png_create_struct */ -#define PNG_STRUCT_PNG 0x0001 -#define PNG_STRUCT_INFO 0x0002 - -/* Scaling factor for filter heuristic weighting calculations */ -#define PNG_WEIGHT_SHIFT 8 -#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) -#define PNG_COST_SHIFT 3 -#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) - -/* flags for the png_ptr->flags rather than declaring a byte for each one */ -#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 -#define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 -#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 -#define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 -#define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 -#define PNG_FLAG_ZLIB_FINISHED 0x0020 -#define PNG_FLAG_ROW_INIT 0x0040 -#define PNG_FLAG_FILLER_AFTER 0x0080 -#define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 -#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 -#define PNG_FLAG_CRC_CRITICAL_USE 0x0400 -#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 -#define PNG_FLAG_FREE_PLTE 0x1000 -#define PNG_FLAG_FREE_TRNS 0x2000 -#define PNG_FLAG_FREE_HIST 0x4000 -#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L -#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L -#define PNG_FLAG_LIBRARY_MISMATCH 0x20000L -#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L -#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L -#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L - -/* For use in png_set_keep_unknown, png_handle_as_unknown */ -#define HANDLE_CHUNK_AS_DEFAULT 0 -#define HANDLE_CHUNK_NEVER 1 -#define HANDLE_CHUNK_IF_SAFE 2 -#define HANDLE_CHUNK_ALWAYS 3 - -#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ - PNG_FLAG_CRC_ANCILLARY_NOWARN) - -#define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ - PNG_FLAG_CRC_CRITICAL_IGNORE) - -#define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ - PNG_FLAG_CRC_CRITICAL_MASK) - -/* save typing and make code easier to understand */ -#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ - abs((int)((c1).green) - (int)((c2).green)) + \ - abs((int)((c1).blue) - (int)((c2).blue))) - -/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ -#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) -/* place to hold the signature string for a PNG file. */ -#ifdef PNG_USE_GLOBAL_ARRAYS - PNG_EXPORT_VAR (const png_byte FARDATA) png_sig[8]; -#else -#define png_sig png_sig_bytes(NULL) -#endif -#endif /* PNG_NO_EXTERN */ - -/* Constant strings for known chunk types. If you need to add a chunk, - * define the name here, and add an invocation of the macro in png.c and - * wherever it's needed. - */ -#define PNG_IHDR const png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} -#define PNG_IDAT const png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} -#define PNG_IEND const png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} -#define PNG_PLTE const png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} -#define PNG_bKGD const png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} -#define PNG_cHRM const png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} -#define PNG_gAMA const png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} -#define PNG_hIST const png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} -#define PNG_iCCP const png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} -#define PNG_iTXt const png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} -#define PNG_oFFs const png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} -#define PNG_pCAL const png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} -#define PNG_sCAL const png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} -#define PNG_pHYs const png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} -#define PNG_sBIT const png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} -#define PNG_sPLT const png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} -#define PNG_sRGB const png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} -#define PNG_tEXt const png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} -#define PNG_tIME const png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} -#define PNG_tRNS const png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} -#define PNG_zTXt const png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} - -#ifdef PNG_USE_GLOBAL_ARRAYS -PNG_EXPORT_VAR (const png_byte FARDATA) png_IHDR[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_IDAT[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_IEND[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_PLTE[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_bKGD[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_cHRM[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_gAMA[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_hIST[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_iCCP[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_iTXt[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_oFFs[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_pCAL[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_sCAL[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_pHYs[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_sBIT[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_sPLT[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_sRGB[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_tEXt[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_tIME[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_tRNS[5]; -PNG_EXPORT_VAR (const png_byte FARDATA) png_zTXt[5]; -#endif /* PNG_USE_GLOBAL_ARRAYS */ - - -/* Inline macros to do direct reads of bytes from the input buffer. These - * require that you are using an architecture that uses PNG byte ordering - * (MSB first) and supports unaligned data storage. I think that PowerPC - * in big-endian mode and 680x0 are the only ones that will support this. - * The x86 line of processors definitely do not. The png_get_int_32() - * routine also assumes we are using two's complement format for negative - * values, which is almost certainly true. - */ -#if defined(PNG_READ_BIG_ENDIAN_SUPPORTED) -# if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED) -# define png_get_int_32(buf) ( *((png_int_32p) (buf))) -# endif -# define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) -# define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) -#else -# if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED) -PNG_EXTERN png_int_32 png_get_int_32 PNGARG((png_bytep buf)); -# endif -PNG_EXTERN png_uint_32 png_get_uint_32 PNGARG((png_bytep buf)); -PNG_EXTERN png_uint_16 png_get_uint_16 PNGARG((png_bytep buf)); -#endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ - -/* Initialize png_ptr struct for reading, and allocate any other memory. - * (old interface - DEPRECATED - use png_create_read_struct instead). - */ -extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr)); -#undef png_read_init -#define png_read_init(png_ptr) png_read_init_3(&png_ptr, \ - PNG_LIBPNG_VER_STRING, sizeof(png_struct)); -extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr, - png_const_charp user_png_ver, png_size_t png_struct_size)); -extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr, - png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t - png_info_size)); - -/* Initialize png_ptr struct for writing, and allocate any other memory. - * (old interface - DEPRECATED - use png_create_write_struct instead). - */ -extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr)); -#undef png_write_init -#define png_write_init(png_ptr) png_write_init_3(&png_ptr, \ - PNG_LIBPNG_VER_STRING, sizeof(png_struct)); -extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr, - png_const_charp user_png_ver, png_size_t png_struct_size)); -extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr, - png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t - png_info_size)); - -/* Allocate memory for an internal libpng struct */ -PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); - -/* Free memory from internal libpng struct */ -PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); - -PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr - malloc_fn, png_voidp mem_ptr)); -PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, - png_free_ptr free_fn, png_voidp mem_ptr)); - -/* Free any memory that info_ptr points to and reset struct. */ -PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -#ifndef PNG_1_0_X -/* Function to allocate memory for zlib. */ -PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); - -/* Function to free memory for zlib */ -PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); - -/* Next four functions are used internally as callbacks. PNGAPI is required - * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */ - -PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, - png_bytep data, png_size_t length)); - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t length)); -#endif - -PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, - png_bytep data, png_size_t length)); - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -#if !defined(PNG_NO_STDIO) -PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); -#endif -#endif -#else /* PNG_1_0_X */ -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t length)); -#endif -#endif /* PNG_1_0_X */ - -/* Reset the CRC variable */ -PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); - -/* Write the "data" buffer to whatever output you are using. */ -PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, - png_size_t length)); - -/* Read data from whatever input you are using into the "data" buffer */ -PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, - png_size_t length)); - -/* Read bytes into buf, and update png_ptr->crc */ -PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, - png_size_t length)); - -/* Decompress data in a chunk that uses compression */ -#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ - defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) -PNG_EXTERN png_charp png_decompress_chunk PNGARG((png_structp png_ptr, - int comp_type, png_charp chunkdata, png_size_t chunklength, - png_size_t prefix_length, png_size_t *data_length)); -#endif - -/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ -PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); - -/* Read the CRC from the file and compare it to the libpng calculated CRC */ -PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); - -/* Calculate the CRC over a section of data. Note that we are only - * passing a maximum of 64K on systems that have this as a memory limit, - * since this is the maximum buffer size we can specify. - */ -PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, - png_size_t length)); - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); -#endif - - -/* Place a 32-bit number into a buffer in PNG byte order (big-endian). - * The only currently known PNG chunks that use signed numbers are - * the ancillary extension chunks, oFFs and pCAL. - */ -PNG_EXTERN void png_save_uint_32 PNGARG((png_bytep buf, png_uint_32 i)); - -#if defined(PNG_WRITE_pCAL_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED) -PNG_EXTERN void png_save_int_32 PNGARG((png_bytep buf, png_int_32 i)); -#endif - -/* Place a 16-bit number into a buffer in PNG byte order. - * The parameter is declared unsigned int, not png_uint_16, - * just to avoid potential problems on pre-ANSI C compilers. - */ -PNG_EXTERN void png_save_uint_16 PNGARG((png_bytep buf, unsigned int i)); - -/* simple function to write the signature */ -PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); - -/* write various chunks */ - -/* Write the IHDR chunk, and update the png_struct with the necessary - * information. - */ -PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, - png_uint_32 height, - int bit_depth, int color_type, int compression_method, int filter_method, - int interlace_method)); - -PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, - png_uint_32 num_pal)); - -PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, - png_size_t length)); - -PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); - -#if defined(PNG_WRITE_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point - file_gamma)); -#endif -#endif - -#if defined(PNG_WRITE_sBIT_SUPPORTED) -PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, - int color_type)); -#endif - -#if defined(PNG_WRITE_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, - double white_x, double white_y, - double red_x, double red_y, double green_x, double green_y, - double blue_x, double blue_y)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, - png_fixed_point int_white_x, png_fixed_point int_white_y, - png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point - int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, - png_fixed_point int_blue_y)); -#endif -#endif - -#if defined(PNG_WRITE_sRGB_SUPPORTED) -PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, - int intent)); -#endif - -#if defined(PNG_WRITE_iCCP_SUPPORTED) -PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, - png_charp name, int compression_type, - png_charp profile, int proflen)); - /* Note to maintainer: profile should be png_bytep */ -#endif - -#if defined(PNG_WRITE_sPLT_SUPPORTED) -PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, - png_sPLT_tp palette)); -#endif - -#if defined(PNG_WRITE_tRNS_SUPPORTED) -PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, - png_color_16p values, int number, int color_type)); -#endif - -#if defined(PNG_WRITE_bKGD_SUPPORTED) -PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, - png_color_16p values, int color_type)); -#endif - -#if defined(PNG_WRITE_hIST_SUPPORTED) -PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, - int num_hist)); -#endif - -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ - defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) -PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, - png_charp key, png_charpp new_key)); -#endif - -#if defined(PNG_WRITE_tEXt_SUPPORTED) -PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, - png_charp text, png_size_t text_len)); -#endif - -#if defined(PNG_WRITE_zTXt_SUPPORTED) -PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, - png_charp text, png_size_t text_len, int compression)); -#endif - -#if defined(PNG_WRITE_iTXt_SUPPORTED) -PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, - int compression, png_charp key, png_charp lang, png_charp lang_key, - png_charp text)); -#endif - -#if defined(PNG_TEXT_SUPPORTED) /* Added at version 1.0.14 and 1.2.4 */ -PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, - png_infop info_ptr, png_textp text_ptr, int num_text)); -#endif - -#if defined(PNG_WRITE_oFFs_SUPPORTED) -PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, - png_int_32 x_offset, png_int_32 y_offset, int unit_type)); -#endif - -#if defined(PNG_WRITE_pCAL_SUPPORTED) -PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, - png_int_32 X0, png_int_32 X1, int type, int nparams, - png_charp units, png_charpp params)); -#endif - -#if defined(PNG_WRITE_pHYs_SUPPORTED) -PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, - png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, - int unit_type)); -#endif - -#if defined(PNG_WRITE_tIME_SUPPORTED) -PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, - png_timep mod_time)); -#endif - -#if defined(PNG_WRITE_sCAL_SUPPORTED) -#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) -PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, - int unit, double width, double height)); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, - int unit, png_charp width, png_charp height)); -#endif -#endif -#endif - -/* Called when finished processing a row of data */ -PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); - -/* Internal use only. Called before first row of data */ -PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); - -#if defined(PNG_READ_GAMMA_SUPPORTED) -PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr)); -#endif - -/* combine a row of data, dealing with alpha, etc. if requested */ -PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, - int mask)); - -#if defined(PNG_READ_INTERLACING_SUPPORTED) -/* expand an interlaced row */ -/* OLD pre-1.0.9 interface: -PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, - png_bytep row, int pass, png_uint_32 transformations)); - */ -PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); -#endif - -/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ - -#if defined(PNG_WRITE_INTERLACING_SUPPORTED) -/* grab pixels out of a row for an interlaced pass */ -PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, - png_bytep row, int pass)); -#endif - -/* unfilter a row */ -PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, - png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); - -/* Choose the best filter to use and filter the row data */ -PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, - png_row_infop row_info)); - -/* Write out the filtered row. */ -PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, - png_bytep filtered_row)); -/* finish a row while reading, dealing with interlacing passes, etc. */ -PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); - -/* initialize the row buffers, etc. */ -PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); -/* optional call to update the users info structure */ -PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -/* these are the functions that do the transformations */ -#if defined(PNG_READ_FILLER_SUPPORTED) -PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, - png_bytep row, png_uint_32 filler, png_uint_32 flags)); -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ - defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, - png_bytep row, png_uint_32 flags)); -#endif - -#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) -PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop - row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) -PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) -PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) -PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, - png_color_8p sig_bits)); -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) -PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) -PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) -PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info, - png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup)); - -# if defined(PNG_CORRECT_PALETTE_SUPPORTED) -PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, - png_colorp palette, int num_palette)); -# endif -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_WRITE_PACK_SUPPORTED) -PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, - png_bytep row, png_uint_32 bit_depth)); -#endif - -#if defined(PNG_WRITE_SHIFT_SUPPORTED) -PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, - png_color_8p bit_depth)); -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) -#if defined(PNG_READ_GAMMA_SUPPORTED) -PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, - png_color_16p trans_values, png_color_16p background, - png_color_16p background_1, - png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, - png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, - png_uint_16pp gamma_16_to_1, int gamma_shift)); -#else -PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, - png_color_16p trans_values, png_color_16p background)); -#endif -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) -PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, - png_bytep gamma_table, png_uint_16pp gamma_16_table, - int gamma_shift)); -#endif - -#if defined(PNG_READ_EXPAND_SUPPORTED) -PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, - png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); -PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, - png_bytep row, png_color_16p trans_value)); -#endif - -/* The following decodes the appropriate chunks, and does error correction, - * then calls the appropriate callback for the chunk if it is valid. - */ - -/* decode the IHDR chunk */ -PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); - -#if defined(PNG_READ_bKGD_SUPPORTED) -PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_cHRM_SUPPORTED) -PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_gAMA_SUPPORTED) -PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_hIST_SUPPORTED) -PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_iCCP_SUPPORTED) -extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif /* PNG_READ_iCCP_SUPPORTED */ - -#if defined(PNG_READ_iTXt_SUPPORTED) -PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_oFFs_SUPPORTED) -PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_pCAL_SUPPORTED) -PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_pHYs_SUPPORTED) -PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_sBIT_SUPPORTED) -PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_sCAL_SUPPORTED) -PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_sPLT_SUPPORTED) -extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif /* PNG_READ_sPLT_SUPPORTED */ - -#if defined(PNG_READ_sRGB_SUPPORTED) -PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_tEXt_SUPPORTED) -PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_tIME_SUPPORTED) -PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_tRNS_SUPPORTED) -PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_zTXt_SUPPORTED) -PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); - -PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, - png_bytep chunk_name)); - -/* handle the transformations for reading and writing */ -PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); - -PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, - png_uint_32 length)); -PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t buffer_length)); -PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t buffer_length)); -PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); -PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); -PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); -#if defined(PNG_READ_tEXt_SUPPORTED) -PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); -PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) -PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); -PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) -PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); -PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif - -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - -#ifdef PNG_MNG_FEATURES_SUPPORTED -PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, - png_bytep row)); -PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) -/* png.c */ /* PRIVATE */ -PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); -#endif -/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ - -#endif /* PNG_INTERNAL */ - -#ifdef __cplusplus -} -#endif - -#endif /* PNG_VERSION_INFO_ONLY */ -/* do not put anything past this line */ -#endif /* PNG_H */ diff --git a/pngconf.h b/pngconf.h deleted file mode 100644 index 4a425dd1a..000000000 --- a/pngconf.h +++ /dev/null @@ -1,1348 +0,0 @@ -/* pngconf.h - machine configurable file for libpng - * - * libpng 1.2.5 - October 3, 2002 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2002 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - */ - -/* Any machine specific code is near the front of this file, so if you - * are configuring libpng for a machine, you may want to read the section - * starting here down to where it starts to typedef png_color, png_text, - * and png_info. - */ - -#ifndef PNGCONF_H -#define PNGCONF_H - -/* This is the size of the compression buffer, and thus the size of - * an IDAT chunk. Make this whatever size you feel is best for your - * machine. One of these will be allocated per png_struct. When this - * is full, it writes the data to the disk, and does some other - * calculations. Making this an extremely small size will slow - * the library down, but you may want to experiment to determine - * where it becomes significant, if you are concerned with memory - * usage. Note that zlib allocates at least 32Kb also. For readers, - * this describes the size of the buffer available to read the data in. - * Unless this gets smaller than the size of a row (compressed), - * it should not make much difference how big this is. - */ - -#ifndef PNG_ZBUF_SIZE -# define PNG_ZBUF_SIZE 8192 -#endif - -/* Enable if you want a write-only libpng */ - -#ifndef PNG_NO_READ_SUPPORTED -# define PNG_READ_SUPPORTED -#endif - -/* Enable if you want a read-only libpng */ - -#ifndef PNG_NO_WRITE_SUPPORTED -# define PNG_WRITE_SUPPORTED -#endif - -/* Enabled by default in 1.2.0. You can disable this if you don't need to - support PNGs that are embedded in MNG datastreams */ -#if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES) -# ifndef PNG_MNG_FEATURES_SUPPORTED -# define PNG_MNG_FEATURES_SUPPORTED -# endif -#endif - -#ifndef PNG_NO_FLOATING_POINT_SUPPORTED -# ifndef PNG_FLOATING_POINT_SUPPORTED -# define PNG_FLOATING_POINT_SUPPORTED -# endif -#endif - -/* If you are running on a machine where you cannot allocate more - * than 64K of memory at once, uncomment this. While libpng will not - * normally need that much memory in a chunk (unless you load up a very - * large file), zlib needs to know how big of a chunk it can use, and - * libpng thus makes sure to check any memory allocation to verify it - * will fit into memory. -#define PNG_MAX_MALLOC_64K - */ -#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) -# define PNG_MAX_MALLOC_64K -#endif - -/* Special munging to support doing things the 'cygwin' way: - * 'Normal' png-on-win32 defines/defaults: - * PNG_BUILD_DLL -- building dll - * PNG_USE_DLL -- building an application, linking to dll - * (no define) -- building static library, or building an - * application and linking to the static lib - * 'Cygwin' defines/defaults: - * PNG_BUILD_DLL -- (ignored) building the dll - * (no define) -- (ignored) building an application, linking to the dll - * PNG_STATIC -- (ignored) building the static lib, or building an - * application that links to the static lib. - * ALL_STATIC -- (ignored) building various static libs, or building an - * application that links to the static libs. - * Thus, - * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and - * this bit of #ifdefs will define the 'correct' config variables based on - * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but - * unnecessary. - * - * Also, the precedence order is: - * ALL_STATIC (since we can't #undef something outside our namespace) - * PNG_BUILD_DLL - * PNG_STATIC - * (nothing) == PNG_USE_DLL - * - * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent - * of auto-import in binutils, we no longer need to worry about - * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, - * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes - * to __declspec() stuff. However, we DO need to worry about - * PNG_BUILD_DLL and PNG_STATIC because those change some defaults - * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. - */ -#if defined(__CYGWIN__) -# if defined(ALL_STATIC) -# if defined(PNG_BUILD_DLL) -# undef PNG_BUILD_DLL -# endif -# if defined(PNG_USE_DLL) -# undef PNG_USE_DLL -# endif -# if defined(PNG_DLL) -# undef PNG_DLL -# endif -# if !defined(PNG_STATIC) -# define PNG_STATIC -# endif -# else -# if defined (PNG_BUILD_DLL) -# if defined(PNG_STATIC) -# undef PNG_STATIC -# endif -# if defined(PNG_USE_DLL) -# undef PNG_USE_DLL -# endif -# if !defined(PNG_DLL) -# define PNG_DLL -# endif -# else -# if defined(PNG_STATIC) -# if defined(PNG_USE_DLL) -# undef PNG_USE_DLL -# endif -# if defined(PNG_DLL) -# undef PNG_DLL -# endif -# else -# if !defined(PNG_USE_DLL) -# define PNG_USE_DLL -# endif -# if !defined(PNG_DLL) -# define PNG_DLL -# endif -# endif -# endif -# endif -#endif - -/* This protects us against compilers that run on a windowing system - * and thus don't have or would rather us not use the stdio types: - * stdin, stdout, and stderr. The only one currently used is stderr - * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will - * prevent these from being compiled and used. #defining PNG_NO_STDIO - * will also prevent these, plus will prevent the entire set of stdio - * macros and functions (FILE *, printf, etc.) from being compiled and used, - * unless (PNG_DEBUG > 0) has been #defined. - * - * #define PNG_NO_CONSOLE_IO - * #define PNG_NO_STDIO - */ - -#if defined(_WIN32_WCE) -# include - /* Console I/O functions are not supported on WindowsCE */ -# define PNG_NO_CONSOLE_IO -# ifdef PNG_DEBUG -# undef PNG_DEBUG -# endif -#endif - -#ifdef PNG_BUILD_DLL -# ifndef PNG_CONSOLE_IO_SUPPORTED -# ifndef PNG_NO_CONSOLE_IO -# define PNG_NO_CONSOLE_IO -# endif -# endif -#endif - -# ifdef PNG_NO_STDIO -# ifndef PNG_NO_CONSOLE_IO -# define PNG_NO_CONSOLE_IO -# endif -# ifdef PNG_DEBUG -# if (PNG_DEBUG > 0) -# include -# endif -# endif -# else -# if !defined(_WIN32_WCE) -/* "stdio.h" functions are not supported on WindowsCE */ -# include -# endif -# endif - -/* This macro protects us against machines that don't have function - * prototypes (ie K&R style headers). If your compiler does not handle - * function prototypes, define this macro and use the included ansi2knr. - * I've always been able to use _NO_PROTO as the indicator, but you may - * need to drag the empty declaration out in front of here, or change the - * ifdef to suit your own needs. - */ -#ifndef PNGARG - -#ifdef OF /* zlib prototype munger */ -# define PNGARG(arglist) OF(arglist) -#else - -#ifdef _NO_PROTO -# define PNGARG(arglist) () -# ifndef PNG_TYPECAST_NULL -# define PNG_TYPECAST_NULL -# endif -#else -# define PNGARG(arglist) arglist -#endif /* _NO_PROTO */ - -#endif /* OF */ - -#endif /* PNGARG */ - -/* Try to determine if we are compiling on a Mac. Note that testing for - * just __MWERKS__ is not good enough, because the Codewarrior is now used - * on non-Mac platforms. - */ -#ifndef MACOS -# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ - defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) -# define MACOS -# endif -#endif - -/* enough people need this for various reasons to include it here */ -#if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE) -# include -#endif - -#if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) -# define PNG_SETJMP_SUPPORTED -#endif - -#ifdef PNG_SETJMP_SUPPORTED -/* This is an attempt to force a single setjmp behaviour on Linux. If - * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. - */ - -# ifdef __linux__ -# ifdef _BSD_SOURCE -# define PNG_SAVE_BSD_SOURCE -# undef _BSD_SOURCE -# endif -# ifdef _SETJMP_H - __png.h__ already includes setjmp.h; - __dont__ include it again.; -# endif -# endif /* __linux__ */ - - /* include setjmp.h for error handling */ -# include - -# ifdef __linux__ -# ifdef PNG_SAVE_BSD_SOURCE -# define _BSD_SOURCE -# undef PNG_SAVE_BSD_SOURCE -# endif -# endif /* __linux__ */ -#endif /* PNG_SETJMP_SUPPORTED */ - -#ifdef BSD -# include -#else -# include -#endif - -/* Other defines for things like memory and the like can go here. */ -#ifdef PNG_INTERNAL - -#include - -/* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which - * aren't usually used outside the library (as far as I know), so it is - * debatable if they should be exported at all. In the future, when it is - * possible to have run-time registry of chunk-handling functions, some of - * these will be made available again. -#define PNG_EXTERN extern - */ -#define PNG_EXTERN - -/* Other defines specific to compilers can go here. Try to keep - * them inside an appropriate ifdef/endif pair for portability. - */ - -#if defined(PNG_FLOATING_POINT_SUPPORTED) -# if defined(MACOS) - /* We need to check that hasn't already been included earlier - * as it seems it doesn't agree with , yet we should really use - * if possible. - */ -# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) -# include -# endif -# else -# include -# endif -# if defined(_AMIGA) && defined(__SASC) && defined(_M68881) - /* Amiga SAS/C: We must include builtin FPU functions when compiling using - * MATH=68881 - */ -# include -# endif -#endif - -/* Codewarrior on NT has linking problems without this. */ -#if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) -# define PNG_ALWAYS_EXTERN -#endif - -/* For some reason, Borland C++ defines memcmp, etc. in mem.h, not - * stdlib.h like it should (I think). Or perhaps this is a C++ - * "feature"? - */ -#ifdef __TURBOC__ -# include -# include "alloc.h" -#endif - -#if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \ - defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__)) -# include -#endif - -/* This controls how fine the dithering gets. As this allocates - * a largish chunk of memory (32K), those who are not as concerned - * with dithering quality can decrease some or all of these. - */ -#ifndef PNG_DITHER_RED_BITS -# define PNG_DITHER_RED_BITS 5 -#endif -#ifndef PNG_DITHER_GREEN_BITS -# define PNG_DITHER_GREEN_BITS 5 -#endif -#ifndef PNG_DITHER_BLUE_BITS -# define PNG_DITHER_BLUE_BITS 5 -#endif - -/* This controls how fine the gamma correction becomes when you - * are only interested in 8 bits anyway. Increasing this value - * results in more memory being used, and more pow() functions - * being called to fill in the gamma tables. Don't set this value - * less then 8, and even that may not work (I haven't tested it). - */ - -#ifndef PNG_MAX_GAMMA_8 -# define PNG_MAX_GAMMA_8 11 -#endif - -/* This controls how much a difference in gamma we can tolerate before - * we actually start doing gamma conversion. - */ -#ifndef PNG_GAMMA_THRESHOLD -# define PNG_GAMMA_THRESHOLD 0.05 -#endif - -#endif /* PNG_INTERNAL */ - -/* The following uses const char * instead of char * for error - * and warning message functions, so some compilers won't complain. - * If you do not want to use const, define PNG_NO_CONST here. - */ - -#ifndef PNG_NO_CONST -# define PNG_CONST const -#else -# define PNG_CONST -#endif - -/* The following defines give you the ability to remove code from the - * library that you will not be using. I wish I could figure out how to - * automate this, but I can't do that without making it seriously hard - * on the users. So if you are not using an ability, change the #define - * to and #undef, and that part of the library will not be compiled. If - * your linker can't find a function, you may want to make sure the - * ability is defined here. Some of these depend upon some others being - * defined. I haven't figured out all the interactions here, so you may - * have to experiment awhile to get everything to compile. If you are - * creating or using a shared library, you probably shouldn't touch this, - * as it will affect the size of the structures, and this will cause bad - * things to happen if the library and/or application ever change. - */ - -/* Any features you will not be using can be undef'ed here */ - -/* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user - * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS - * on the compile line, then pick and choose which ones to define without - * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED - * if you only want to have a png-compliant reader/writer but don't need - * any of the extra transformations. This saves about 80 kbytes in a - * typical installation of the library. (PNG_NO_* form added in version - * 1.0.1c, for consistency) - */ - -/* The size of the png_text structure changed in libpng-1.0.6 when - * iTXt is supported. It is turned off by default, to support old apps - * that malloc the png_text structure instead of calling png_set_text() - * and letting libpng malloc it. It will be turned on by default in - * libpng-1.3.0. - */ - -#ifndef PNG_iTXt_SUPPORTED -# if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) -# define PNG_NO_READ_iTXt -# endif -# if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) -# define PNG_NO_WRITE_iTXt -# endif -#endif - -/* The following support, added after version 1.0.0, can be turned off here en - * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility - * with old applications that require the length of png_struct and png_info - * to remain unchanged. - */ - -#ifdef PNG_LEGACY_SUPPORTED -# define PNG_NO_FREE_ME -# define PNG_NO_READ_UNKNOWN_CHUNKS -# define PNG_NO_WRITE_UNKNOWN_CHUNKS -# define PNG_NO_READ_USER_CHUNKS -# define PNG_NO_READ_iCCP -# define PNG_NO_WRITE_iCCP -# define PNG_NO_READ_iTXt -# define PNG_NO_WRITE_iTXt -# define PNG_NO_READ_sCAL -# define PNG_NO_WRITE_sCAL -# define PNG_NO_READ_sPLT -# define PNG_NO_WRITE_sPLT -# define PNG_NO_INFO_IMAGE -# define PNG_NO_READ_RGB_TO_GRAY -# define PNG_NO_READ_USER_TRANSFORM -# define PNG_NO_WRITE_USER_TRANSFORM -# define PNG_NO_USER_MEM -# define PNG_NO_READ_EMPTY_PLTE -# define PNG_NO_MNG_FEATURES -# define PNG_NO_FIXED_POINT_SUPPORTED -#endif - -/* Ignore attempt to turn off both floating and fixed point support */ -#if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ - !defined(PNG_NO_FIXED_POINT_SUPPORTED) -# define PNG_FIXED_POINT_SUPPORTED -#endif - -#ifndef PNG_NO_FREE_ME -# define PNG_FREE_ME_SUPPORTED -#endif - -#if defined(PNG_READ_SUPPORTED) - -#if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ - !defined(PNG_NO_READ_TRANSFORMS) -# define PNG_READ_TRANSFORMS_SUPPORTED -#endif - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED -# ifndef PNG_NO_READ_EXPAND -# define PNG_READ_EXPAND_SUPPORTED -# endif -# ifndef PNG_NO_READ_SHIFT -# define PNG_READ_SHIFT_SUPPORTED -# endif -# ifndef PNG_NO_READ_PACK -# define PNG_READ_PACK_SUPPORTED -# endif -# ifndef PNG_NO_READ_BGR -# define PNG_READ_BGR_SUPPORTED -# endif -# ifndef PNG_NO_READ_SWAP -# define PNG_READ_SWAP_SUPPORTED -# endif -# ifndef PNG_NO_READ_PACKSWAP -# define PNG_READ_PACKSWAP_SUPPORTED -# endif -# ifndef PNG_NO_READ_INVERT -# define PNG_READ_INVERT_SUPPORTED -# endif -# ifndef PNG_NO_READ_DITHER -# define PNG_READ_DITHER_SUPPORTED -# endif -# ifndef PNG_NO_READ_BACKGROUND -# define PNG_READ_BACKGROUND_SUPPORTED -# endif -# ifndef PNG_NO_READ_16_TO_8 -# define PNG_READ_16_TO_8_SUPPORTED -# endif -# ifndef PNG_NO_READ_FILLER -# define PNG_READ_FILLER_SUPPORTED -# endif -# ifndef PNG_NO_READ_GAMMA -# define PNG_READ_GAMMA_SUPPORTED -# endif -# ifndef PNG_NO_READ_GRAY_TO_RGB -# define PNG_READ_GRAY_TO_RGB_SUPPORTED -# endif -# ifndef PNG_NO_READ_SWAP_ALPHA -# define PNG_READ_SWAP_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_READ_INVERT_ALPHA -# define PNG_READ_INVERT_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_READ_STRIP_ALPHA -# define PNG_READ_STRIP_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_READ_USER_TRANSFORM -# define PNG_READ_USER_TRANSFORM_SUPPORTED -# endif -# ifndef PNG_NO_READ_RGB_TO_GRAY -# define PNG_READ_RGB_TO_GRAY_SUPPORTED -# endif -#endif /* PNG_READ_TRANSFORMS_SUPPORTED */ - -#if !defined(PNG_NO_PROGRESSIVE_READ) && \ - !defined(PNG_PROGRESSIVE_READ_NOT_SUPPORTED) /* if you don't do progressive */ -# define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ -#endif /* about interlacing capability! You'll */ - /* still have interlacing unless you change the following line: */ - -#define PNG_READ_INTERLACING_SUPPORTED /* required for PNG-compliant decoders */ - -#ifndef PNG_NO_READ_COMPOSITE_NODIV -# ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ -# define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ -# endif -#endif - -/* Deprecated, will be removed from version 2.0.0. - Use PNG_MNG_FEATURES_SUPPORTED instead. */ -#ifndef PNG_NO_READ_EMPTY_PLTE -# define PNG_READ_EMPTY_PLTE_SUPPORTED -#endif - -#endif /* PNG_READ_SUPPORTED */ - -#if defined(PNG_WRITE_SUPPORTED) - -# if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ - !defined(PNG_NO_WRITE_TRANSFORMS) -# define PNG_WRITE_TRANSFORMS_SUPPORTED -#endif - -#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED -# ifndef PNG_NO_WRITE_SHIFT -# define PNG_WRITE_SHIFT_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_PACK -# define PNG_WRITE_PACK_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_BGR -# define PNG_WRITE_BGR_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_SWAP -# define PNG_WRITE_SWAP_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_PACKSWAP -# define PNG_WRITE_PACKSWAP_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_INVERT -# define PNG_WRITE_INVERT_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_FILLER -# define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ -# endif -# ifndef PNG_NO_WRITE_SWAP_ALPHA -# define PNG_WRITE_SWAP_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_INVERT_ALPHA -# define PNG_WRITE_INVERT_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_USER_TRANSFORM -# define PNG_WRITE_USER_TRANSFORM_SUPPORTED -# endif -#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -# ifndef PNG_NO_USER_TRANSFORM_PTR -# define PNG_USER_TRANSFORM_PTR_SUPPORTED -# endif -#endif - -#define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant - encoders, but can cause trouble - if left undefined */ - -#if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ - defined(PNG_FLOATING_POINT_SUPPORTED) -# define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED -#endif - -#ifndef PNG_1_0_X -#ifndef PNG_NO_ERROR_NUMBERS -#define PNG_ERROR_NUMBERS_SUPPORTED -#endif -#endif /* PNG_1_0_X */ - -#ifndef PNG_NO_WRITE_FLUSH -# define PNG_WRITE_FLUSH_SUPPORTED -#endif - -/* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ -#ifndef PNG_NO_WRITE_EMPTY_PLTE -# define PNG_WRITE_EMPTY_PLTE_SUPPORTED -#endif - -#endif /* PNG_WRITE_SUPPORTED */ - -#ifndef PNG_NO_STDIO -# define PNG_TIME_RFC1123_SUPPORTED -#endif - -/* This adds extra functions in pngget.c for accessing data from the - * info pointer (added in version 0.99) - * png_get_image_width() - * png_get_image_height() - * png_get_bit_depth() - * png_get_color_type() - * png_get_compression_type() - * png_get_filter_type() - * png_get_interlace_type() - * png_get_pixel_aspect_ratio() - * png_get_pixels_per_meter() - * png_get_x_offset_pixels() - * png_get_y_offset_pixels() - * png_get_x_offset_microns() - * png_get_y_offset_microns() - */ -#if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) -# define PNG_EASY_ACCESS_SUPPORTED -#endif - -/* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 - even when PNG_USE_PNGVCRD or PNG_USE_PNGGCCRD is not defined */ -#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) -# ifndef PNG_ASSEMBLER_CODE_SUPPORTED -# define PNG_ASSEMBLER_CODE_SUPPORTED -# endif -# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) -# define PNG_MMX_CODE_SUPPORTED -# endif -#endif - -/* If you are sure that you don't need thread safety and you are compiling - with PNG_USE_PNGCCRD for an MMX application, you can define this for - faster execution. See pnggccrd.c. -#define PNG_THREAD_UNSAFE_OK -*/ - -#if !defined(PNG_1_0_X) -#if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) -# define PNG_USER_MEM_SUPPORTED -#endif -#endif /* PNG_1_0_X */ - -/* These are currently experimental features, define them if you want */ - -/* very little testing */ -/* -#ifdef PNG_READ_SUPPORTED -# ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED -# define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED -# endif -#endif -*/ - -/* This is only for PowerPC big-endian and 680x0 systems */ -/* some testing */ -/* -#ifdef PNG_READ_SUPPORTED -# ifndef PNG_PNG_READ_BIG_ENDIAN_SUPPORTED -# define PNG_READ_BIG_ENDIAN_SUPPORTED -# endif -#endif -*/ - -/* Buggy compilers (e.g., gcc 2.7.2.2) need this */ -/* -#define PNG_NO_POINTER_INDEXING -*/ - -/* These functions are turned off by default, as they will be phased out. */ -/* -#define PNG_USELESS_TESTS_SUPPORTED -#define PNG_CORRECT_PALETTE_SUPPORTED -*/ - -/* Any chunks you are not interested in, you can undef here. The - * ones that allocate memory may be expecially important (hIST, - * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info - * a bit smaller. - */ - -#if defined(PNG_READ_SUPPORTED) && \ - !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ - !defined(PNG_NO_READ_ANCILLARY_CHUNKS) -# define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED -#endif - -#if defined(PNG_WRITE_SUPPORTED) && \ - !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ - !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) -# define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED -#endif - -#ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED - -#ifdef PNG_NO_READ_TEXT -# define PNG_NO_READ_iTXt -# define PNG_NO_READ_tEXt -# define PNG_NO_READ_zTXt -#endif -#ifndef PNG_NO_READ_bKGD -# define PNG_READ_bKGD_SUPPORTED -# define PNG_bKGD_SUPPORTED -#endif -#ifndef PNG_NO_READ_cHRM -# define PNG_READ_cHRM_SUPPORTED -# define PNG_cHRM_SUPPORTED -#endif -#ifndef PNG_NO_READ_gAMA -# define PNG_READ_gAMA_SUPPORTED -# define PNG_gAMA_SUPPORTED -#endif -#ifndef PNG_NO_READ_hIST -# define PNG_READ_hIST_SUPPORTED -# define PNG_hIST_SUPPORTED -#endif -#ifndef PNG_NO_READ_iCCP -# define PNG_READ_iCCP_SUPPORTED -# define PNG_iCCP_SUPPORTED -#endif -#ifndef PNG_NO_READ_iTXt -# ifndef PNG_READ_iTXt_SUPPORTED -# define PNG_READ_iTXt_SUPPORTED -# endif -# ifndef PNG_iTXt_SUPPORTED -# define PNG_iTXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_READ_oFFs -# define PNG_READ_oFFs_SUPPORTED -# define PNG_oFFs_SUPPORTED -#endif -#ifndef PNG_NO_READ_pCAL -# define PNG_READ_pCAL_SUPPORTED -# define PNG_pCAL_SUPPORTED -#endif -#ifndef PNG_NO_READ_sCAL -# define PNG_READ_sCAL_SUPPORTED -# define PNG_sCAL_SUPPORTED -#endif -#ifndef PNG_NO_READ_pHYs -# define PNG_READ_pHYs_SUPPORTED -# define PNG_pHYs_SUPPORTED -#endif -#ifndef PNG_NO_READ_sBIT -# define PNG_READ_sBIT_SUPPORTED -# define PNG_sBIT_SUPPORTED -#endif -#ifndef PNG_NO_READ_sPLT -# define PNG_READ_sPLT_SUPPORTED -# define PNG_sPLT_SUPPORTED -#endif -#ifndef PNG_NO_READ_sRGB -# define PNG_READ_sRGB_SUPPORTED -# define PNG_sRGB_SUPPORTED -#endif -#ifndef PNG_NO_READ_tEXt -# define PNG_READ_tEXt_SUPPORTED -# define PNG_tEXt_SUPPORTED -#endif -#ifndef PNG_NO_READ_tIME -# define PNG_READ_tIME_SUPPORTED -# define PNG_tIME_SUPPORTED -#endif -#ifndef PNG_NO_READ_tRNS -# define PNG_READ_tRNS_SUPPORTED -# define PNG_tRNS_SUPPORTED -#endif -#ifndef PNG_NO_READ_zTXt -# define PNG_READ_zTXt_SUPPORTED -# define PNG_zTXt_SUPPORTED -#endif -#ifndef PNG_NO_READ_UNKNOWN_CHUNKS -# define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED -# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED -# define PNG_UNKNOWN_CHUNKS_SUPPORTED -# endif -# ifndef PNG_NO_HANDLE_AS_UNKNOWN -# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# endif -#endif -#if !defined(PNG_NO_READ_USER_CHUNKS) && \ - defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) -# define PNG_READ_USER_CHUNKS_SUPPORTED -# define PNG_USER_CHUNKS_SUPPORTED -# ifdef PNG_NO_READ_UNKNOWN_CHUNKS -# undef PNG_NO_READ_UNKNOWN_CHUNKS -# endif -# ifdef PNG_NO_HANDLE_AS_UNKNOWN -# undef PNG_NO_HANDLE_AS_UNKNOWN -# endif -#endif -#ifndef PNG_NO_READ_OPT_PLTE -# define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ -#endif /* optional PLTE chunk in RGB and RGBA images */ -#if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ - defined(PNG_READ_zTXt_SUPPORTED) -# define PNG_READ_TEXT_SUPPORTED -# define PNG_TEXT_SUPPORTED -#endif - -#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ - -#ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED - -#ifdef PNG_NO_WRITE_TEXT -# define PNG_NO_WRITE_iTXt -# define PNG_NO_WRITE_tEXt -# define PNG_NO_WRITE_zTXt -#endif -#ifndef PNG_NO_WRITE_bKGD -# define PNG_WRITE_bKGD_SUPPORTED -# ifndef PNG_bKGD_SUPPORTED -# define PNG_bKGD_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_cHRM -# define PNG_WRITE_cHRM_SUPPORTED -# ifndef PNG_cHRM_SUPPORTED -# define PNG_cHRM_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_gAMA -# define PNG_WRITE_gAMA_SUPPORTED -# ifndef PNG_gAMA_SUPPORTED -# define PNG_gAMA_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_hIST -# define PNG_WRITE_hIST_SUPPORTED -# ifndef PNG_hIST_SUPPORTED -# define PNG_hIST_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_iCCP -# define PNG_WRITE_iCCP_SUPPORTED -# ifndef PNG_iCCP_SUPPORTED -# define PNG_iCCP_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_iTXt -# ifndef PNG_WRITE_iTXt_SUPPORTED -# define PNG_WRITE_iTXt_SUPPORTED -# endif -# ifndef PNG_iTXt_SUPPORTED -# define PNG_iTXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_oFFs -# define PNG_WRITE_oFFs_SUPPORTED -# ifndef PNG_oFFs_SUPPORTED -# define PNG_oFFs_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_pCAL -# define PNG_WRITE_pCAL_SUPPORTED -# ifndef PNG_pCAL_SUPPORTED -# define PNG_pCAL_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sCAL -# define PNG_WRITE_sCAL_SUPPORTED -# ifndef PNG_sCAL_SUPPORTED -# define PNG_sCAL_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_pHYs -# define PNG_WRITE_pHYs_SUPPORTED -# ifndef PNG_pHYs_SUPPORTED -# define PNG_pHYs_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sBIT -# define PNG_WRITE_sBIT_SUPPORTED -# ifndef PNG_sBIT_SUPPORTED -# define PNG_sBIT_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sPLT -# define PNG_WRITE_sPLT_SUPPORTED -# ifndef PNG_sPLT_SUPPORTED -# define PNG_sPLT_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sRGB -# define PNG_WRITE_sRGB_SUPPORTED -# ifndef PNG_sRGB_SUPPORTED -# define PNG_sRGB_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_tEXt -# define PNG_WRITE_tEXt_SUPPORTED -# ifndef PNG_tEXt_SUPPORTED -# define PNG_tEXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_tIME -# define PNG_WRITE_tIME_SUPPORTED -# ifndef PNG_tIME_SUPPORTED -# define PNG_tIME_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_tRNS -# define PNG_WRITE_tRNS_SUPPORTED -# ifndef PNG_tRNS_SUPPORTED -# define PNG_tRNS_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_zTXt -# define PNG_WRITE_zTXt_SUPPORTED -# ifndef PNG_zTXt_SUPPORTED -# define PNG_zTXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS -# define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED -# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED -# define PNG_UNKNOWN_CHUNKS_SUPPORTED -# endif -# ifndef PNG_NO_HANDLE_AS_UNKNOWN -# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# endif -# endif -#endif -#if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ - defined(PNG_WRITE_zTXt_SUPPORTED) -# define PNG_WRITE_TEXT_SUPPORTED -# ifndef PNG_TEXT_SUPPORTED -# define PNG_TEXT_SUPPORTED -# endif -#endif - -#endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ - -/* Turn this off to disable png_read_png() and - * png_write_png() and leave the row_pointers member - * out of the info structure. - */ -#ifndef PNG_NO_INFO_IMAGE -# define PNG_INFO_IMAGE_SUPPORTED -#endif - -/* need the time information for reading tIME chunks */ -#if defined(PNG_tIME_SUPPORTED) -# if !defined(_WIN32_WCE) - /* "time.h" functions are not supported on WindowsCE */ -# include -# endif -#endif - -/* Some typedefs to get us started. These should be safe on most of the - * common platforms. The typedefs should be at least as large as the - * numbers suggest (a png_uint_32 must be at least 32 bits long), but they - * don't have to be exactly that size. Some compilers dislike passing - * unsigned shorts as function parameters, so you may be better off using - * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may - * want to have unsigned int for png_uint_32 instead of unsigned long. - */ - -typedef unsigned long png_uint_32; -typedef long png_int_32; -typedef unsigned short png_uint_16; -typedef short png_int_16; -typedef unsigned char png_byte; - -/* This is usually size_t. It is typedef'ed just in case you need it to - change (I'm not sure if you will or not, so I thought I'd be safe) */ -typedef size_t png_size_t; - -/* The following is needed for medium model support. It cannot be in the - * PNG_INTERNAL section. Needs modification for other compilers besides - * MSC. Model independent support declares all arrays and pointers to be - * large using the far keyword. The zlib version used must also support - * model independent data. As of version zlib 1.0.4, the necessary changes - * have been made in zlib. The USE_FAR_KEYWORD define triggers other - * changes that are needed. (Tim Wegner) - */ - -/* Separate compiler dependencies (problem here is that zlib.h always - defines FAR. (SJT) */ -#ifdef __BORLANDC__ -# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) -# define LDATA 1 -# else -# define LDATA 0 -# endif - /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ -# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) -# define PNG_MAX_MALLOC_64K -# if (LDATA != 1) -# ifndef FAR -# define FAR __far -# endif -# define USE_FAR_KEYWORD -# endif /* LDATA != 1 */ - /* Possibly useful for moving data out of default segment. - * Uncomment it if you want. Could also define FARDATA as - * const if your compiler supports it. (SJT) -# define FARDATA FAR - */ -# endif /* __WIN32__, __FLAT__, __CYGWIN__ */ -#endif /* __BORLANDC__ */ - - -/* Suggest testing for specific compiler first before testing for - * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, - * making reliance oncertain keywords suspect. (SJT) - */ - -/* MSC Medium model */ -#if defined(FAR) -# if defined(M_I86MM) -# define USE_FAR_KEYWORD -# define FARDATA FAR -# include -# endif -#endif - -/* SJT: default case */ -#ifndef FAR -# define FAR -#endif - -/* At this point FAR is always defined */ -#ifndef FARDATA -# define FARDATA -#endif - -/* Typedef for floating-point numbers that are converted - to fixed-point with a multiple of 100,000, e.g., int_gamma */ -typedef png_int_32 png_fixed_point; - -/* Add typedefs for pointers */ -typedef void FAR * png_voidp; -typedef png_byte FAR * png_bytep; -typedef png_uint_32 FAR * png_uint_32p; -typedef png_int_32 FAR * png_int_32p; -typedef png_uint_16 FAR * png_uint_16p; -typedef png_int_16 FAR * png_int_16p; -typedef PNG_CONST char FAR * png_const_charp; -typedef char FAR * png_charp; -typedef png_fixed_point FAR * png_fixed_point_p; - -#ifndef PNG_NO_STDIO -#if defined(_WIN32_WCE) -typedef HANDLE png_FILE_p; -#else -typedef FILE * png_FILE_p; -#endif -#endif - -#ifdef PNG_FLOATING_POINT_SUPPORTED -typedef double FAR * png_doublep; -#endif - -/* Pointers to pointers; i.e. arrays */ -typedef png_byte FAR * FAR * png_bytepp; -typedef png_uint_32 FAR * FAR * png_uint_32pp; -typedef png_int_32 FAR * FAR * png_int_32pp; -typedef png_uint_16 FAR * FAR * png_uint_16pp; -typedef png_int_16 FAR * FAR * png_int_16pp; -typedef PNG_CONST char FAR * FAR * png_const_charpp; -typedef char FAR * FAR * png_charpp; -typedef png_fixed_point FAR * FAR * png_fixed_point_pp; -#ifdef PNG_FLOATING_POINT_SUPPORTED -typedef double FAR * FAR * png_doublepp; -#endif - -/* Pointers to pointers to pointers; i.e., pointer to array */ -typedef char FAR * FAR * FAR * png_charppp; - -/* libpng typedefs for types in zlib. If zlib changes - * or another compression library is used, then change these. - * Eliminates need to change all the source files. - */ -typedef charf * png_zcharp; -typedef charf * FAR * png_zcharpp; -typedef z_stream FAR * png_zstreamp; - -/* - * Define PNG_BUILD_DLL if the module being built is a Windows - * LIBPNG DLL. - * - * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. - * It is equivalent to Microsoft predefined macro _DLL that is - * automatically defined when you compile using the share - * version of the CRT (C Run-Time library) - * - * The cygwin mods make this behavior a little different: - * Define PNG_BUILD_DLL if you are building a dll for use with cygwin - * Define PNG_STATIC if you are building a static library for use with cygwin, - * -or- if you are building an application that you want to link to the - * static library. - * PNG_USE_DLL is defined by default (no user action needed) unless one of - * the other flags is defined. - */ - -#if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) -# define PNG_DLL -#endif -/* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib. - * When building a static lib, default to no GLOBAL ARRAYS, but allow - * command-line override - */ -#if defined(__CYGWIN__) -# if !defined(PNG_STATIC) -# if defined(PNG_USE_GLOBAL_ARRAYS) -# undef PNG_USE_GLOBAL_ARRAYS -# endif -# if !defined(PNG_USE_LOCAL_ARRAYS) -# define PNG_USE_LOCAL_ARRAYS -# endif -# else -# if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS) -# if defined(PNG_USE_GLOBAL_ARRAYS) -# undef PNG_USE_GLOBAL_ARRAYS -# endif -# endif -# endif -# if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) -# define PNG_USE_LOCAL_ARRAYS -# endif -#endif - -/* Do not use global arrays (helps with building DLL's) - * They are no longer used in libpng itself, since version 1.0.5c, - * but might be required for some pre-1.0.5c applications. - */ -#if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) -# if defined(PNG_NO_GLOBAL_ARRAYS) || (defined(__GNUC__) && defined(PNG_DLL)) -# define PNG_USE_LOCAL_ARRAYS -# else -# define PNG_USE_GLOBAL_ARRAYS -# endif -#endif - -#if defined(__CYGWIN__) -# undef PNGAPI -# define PNGAPI __cdecl -# undef PNG_IMPEXP -# define PNG_IMPEXP -#endif - -/* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", - * you may get warnings regarding the linkage of png_zalloc and png_zfree. - * Don't ignore those warnings; you must also reset the default calling - * convention in your compiler to match your PNGAPI, and you must build - * zlib and your applications the same way you build libpng. - */ - -#ifndef PNGAPI - -#if defined(__MINGW32__) && !defined(PNG_MODULEDEF) -# ifndef PNG_NO_MODULEDEF -# define PNG_NO_MODULEDEF -# endif -#endif - -#if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) -# define PNG_IMPEXP -#endif - -#if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ - (( defined(_Windows) || defined(_WINDOWS) || \ - defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) - -# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) -# define PNGAPI __cdecl -# else -# define PNGAPI _cdecl -# endif - -# if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ - 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) -# define PNG_IMPEXP -# endif - -# if !defined(PNG_IMPEXP) - -# define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol -# define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol - - /* Borland/Microsoft */ -# if defined(_MSC_VER) || defined(__BORLANDC__) -# if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) -# define PNG_EXPORT PNG_EXPORT_TYPE1 -# else -# define PNG_EXPORT PNG_EXPORT_TYPE2 -# if defined(PNG_BUILD_DLL) -# define PNG_IMPEXP __export -# else -# define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in - VC++ */ -# endif /* Exists in Borland C++ for - C++ classes (== huge) */ -# endif -# endif - -# if !defined(PNG_IMPEXP) -# if defined(PNG_BUILD_DLL) -# define PNG_IMPEXP __declspec(dllexport) -# else -# define PNG_IMPEXP __declspec(dllimport) -# endif -# endif -# endif /* PNG_IMPEXP */ -#else /* !(DLL || non-cygwin WINDOWS) */ -# if (defined(__IBMC__) || defined(IBMCPP__)) && defined(__OS2__) -# define PNGAPI _System -# define PNG_IMPEXP -# else -# if 0 /* ... other platforms, with other meanings */ -# else -# define PNGAPI -# define PNG_IMPEXP -# endif -# endif -#endif -#endif - -#ifndef PNGAPI -# define PNGAPI -#endif -#ifndef PNG_IMPEXP -# define PNG_IMPEXP -#endif - -#ifndef PNG_EXPORT -# define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol -#endif - -#ifdef PNG_USE_GLOBAL_ARRAYS -# ifndef PNG_EXPORT_VAR -# define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type -# endif -#endif - -/* User may want to use these so they are not in PNG_INTERNAL. Any library - * functions that are passed far data must be model independent. - */ - -#ifndef PNG_ABORT -# define PNG_ABORT() abort() -#endif - -#ifdef PNG_SETJMP_SUPPORTED -# define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) -#else -# define png_jmpbuf(png_ptr) \ - (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) -#endif - -#if defined(USE_FAR_KEYWORD) /* memory model independent fns */ -/* use this to make far-to-near assignments */ -# define CHECK 1 -# define NOCHECK 0 -# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) -# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) -# define png_strcpy _fstrcpy -# define png_strlen _fstrlen -# define png_memcmp _fmemcmp /* SJT: added */ -# define png_memcpy _fmemcpy -# define png_memset _fmemset -#else /* use the usual functions */ -# define CVT_PTR(ptr) (ptr) -# define CVT_PTR_NOCHECK(ptr) (ptr) -# define png_strcpy strcpy -# define png_strlen strlen -# define png_memcmp memcmp /* SJT: added */ -# define png_memcpy memcpy -# define png_memset memset -#endif -/* End of memory model independent support */ - -/* Just a little check that someone hasn't tried to define something - * contradictory. - */ -#if (PNG_ZBUF_SIZE > 65536) && defined(PNG_MAX_MALLOC_64K) -# undef PNG_ZBUF_SIZE -# define PNG_ZBUF_SIZE 65536 -#endif - -#ifdef PNG_READ_SUPPORTED -/* Prior to libpng-1.0.9, this block was in pngasmrd.h */ -#if defined(PNG_INTERNAL) - -/* These are the default thresholds before the MMX code kicks in; if either - * rowbytes or bitdepth is below the threshold, plain C code is used. These - * can be overridden at runtime via the png_set_mmx_thresholds() call in - * libpng 1.2.0 and later. The values below were chosen by Intel. - */ - -#ifndef PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT -# define PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT 128 /* >= */ -#endif -#ifndef PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT -# define PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT 9 /* >= */ -#endif - -/* Set this in the makefile for VC++ on Pentium, not here. */ -/* Platform must be Pentium. Makefile must assemble and load pngvcrd.c . - * MMX will be detected at run time and used if present. - */ -#ifdef PNG_USE_PNGVCRD -# define PNG_HAVE_ASSEMBLER_COMBINE_ROW -# define PNG_HAVE_ASSEMBLER_READ_INTERLACE -# define PNG_HAVE_ASSEMBLER_READ_FILTER_ROW -#endif - -/* Set this in the makefile for gcc/as on Pentium, not here. */ -/* Platform must be Pentium. Makefile must assemble and load pnggccrd.c . - * MMX will be detected at run time and used if present. - */ -#ifdef PNG_USE_PNGGCCRD -# define PNG_HAVE_ASSEMBLER_COMBINE_ROW -# define PNG_HAVE_ASSEMBLER_READ_INTERLACE -# define PNG_HAVE_ASSEMBLER_READ_FILTER_ROW -#endif -/* - see pnggccrd.c for info about what is currently enabled */ - -#endif /* PNG_INTERNAL */ -#endif /* PNG_READ_SUPPORTED */ - -#endif /* PNGCONF_H */ - diff --git a/src/BitmapUtils.cpp b/src/BitmapUtils.cpp index b5a9080e2..5a81a54c8 100644 --- a/src/BitmapUtils.cpp +++ b/src/BitmapUtils.cpp @@ -69,7 +69,13 @@ inline void BMP_EndianFlipShort(short * x) { short t = Endian16_Swap(*x); *x = t * that they do not belong here! * */ -#include "../png.h" +//#include "../png.h" +/* + * MAT SAYS 2014-06-23: on Windows, swift's fork of libxplanemp uses the libpng contained in swift's external dependencies package. + * On other operating systems, it uses the libpng which the developer has installed on their system. There are no libpng or zlib + * headers, source code, or binaries, anywhere in swift's git repository (which includes our fork of libxplanemp). + */ +#include int CreateBitmapFromFile(const char * inFilePath, struct ImageInfo * outImageInfo) { diff --git a/zconf.h b/zconf.h deleted file mode 100644 index 7ada00424..000000000 --- a/zconf.h +++ /dev/null @@ -1,279 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2002 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: zconf.h,v 1.1 2004/04/17 01:09:04 bsupnik Exp $ */ - -#ifndef _ZCONF_H -#define _ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateReset z_inflateReset -# define compress z_compress -# define compress2 z_compress2 -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table - -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) -# define WIN32 -#endif -#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386) -# ifndef __32BIT__ -# define __32BIT__ -# endif -#endif -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#if defined(MSDOS) && !defined(__32BIT__) -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC) -# define STDC -#endif -#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__) -# ifndef STDC -# define STDC -# endif -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Old Borland C incorrectly complains about missing returns: */ -#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) -# define NEED_DUMMY_RETURN -#endif - - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -#endif -#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) -# ifndef __32BIT__ -# define SMALL_MEDIUM -# define FAR _far -# endif -#endif - -/* Compile with -DZLIB_DLL for Windows DLL support */ -#if defined(ZLIB_DLL) -# if defined(_WINDOWS) || defined(WINDOWS) -# ifdef FAR -# undef FAR -# endif -# include -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR _cdecl _export -# endif -# endif -# if defined (__BORLANDC__) -# if (__BORLANDC__ >= 0x0500) && defined (WIN32) -# include -# define ZEXPORT __declspec(dllexport) WINAPI -# define ZEXPORTRVA __declspec(dllexport) WINAPIV -# else -# if defined (_Windows) && defined (__DLL__) -# define ZEXPORT _export -# define ZEXPORTVA _export -# endif -# endif -# endif -#endif - -#if defined (__BEOS__) -# if defined (ZLIB_DLL) -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -#endif - -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif -#ifndef ZEXTERN -# define ZEXTERN extern -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(MACOS) && !defined(TARGET_OS_MAC) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#ifdef HAVE_UNISTD_H -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(inflate_blocks,"INBL") -# pragma map(inflate_blocks_new,"INBLNE") -# pragma map(inflate_blocks_free,"INBLFR") -# pragma map(inflate_blocks_reset,"INBLRE") -# pragma map(inflate_codes_free,"INCOFR") -# pragma map(inflate_codes,"INCO") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_flush,"INFLU") -# pragma map(inflate_mask,"INMA") -# pragma map(inflate_set_dictionary,"INSEDI2") -# pragma map(inflate_copyright,"INCOPY") -# pragma map(inflate_trees_bits,"INTRBI") -# pragma map(inflate_trees_dynamic,"INTRDY") -# pragma map(inflate_trees_fixed,"INTRFI") -# pragma map(inflate_trees_free,"INTRFR") -#endif - -#endif /* _ZCONF_H */ diff --git a/zlib.h b/zlib.h deleted file mode 100644 index 52cb529f6..000000000 --- a/zlib.h +++ /dev/null @@ -1,893 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.1.4, March 11th, 2002 - - Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef _ZLIB_H -#define _ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.1.4" - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. - - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output - (providing more output space) before each call. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ - - char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: ascii or binary */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -/* Allowed flush values; see deflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_ASCII 1 -#define Z_UNKNOWN 2 -/* Possible values of the data_type field */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - /* basic functions */ - -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - the compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - 0.1% larger than avail_in plus 12 bytes. If deflate does not return - Z_STREAM_END, then it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update data_type if it can make a good guess about - the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may some - introduce some output latency (reading input without producing any output) - except when forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. - - If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much - output as possible to the output buffer. The flushing behavior of inflate is - not specified for values of the flush parameter other than Z_SYNC_FLUSH - and Z_FINISH, but the current implementation actually flushes as much output - as possible anyway. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster routine - may be used for the single inflate() call. - - If a preset dictionary is needed at this point (see inflateSetDictionary - below), inflate sets strm-adler to the adler32 checksum of the - dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise - it sets strm->adler to the adler32 checksum of all output produced - so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or - an error code as described below. At the end of the stream, inflate() - checks that its computed adler32 checksum is equal to that saved by the - compressor and returns Z_STREAM_END only if the checksum is correct. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect - adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent - (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if no progress is possible or if there was not - enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR - case, the application may then call inflateSync to look for a good - compression block. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match). Filtered data consists mostly of small values with a - somewhat random distribution. In this case, the compression algorithm is - tuned to compress them better. The effect of Z_FILTERED is to force more - Huffman coding and less string matching; it is somewhat intermediate - between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects - the compression ratio but not the correctness of the compressed output even - if it is not set appropriately. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. - - Upon return of this function, strm->adler is set to the Adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The Adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. If a compressed stream with a larger window size is given as - input, inflate() will return with the error code Z_DATA_ERROR instead of - trying to allocate a larger window. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative - memLevel). msg is set to null if there is no error message. inflateInit2 - does not perform any decompression apart from reading the zlib header if - present: this will be done by inflate(). (So next_in and avail_in may be - modified, but next_out and avail_out are unchanged.) -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate - if this call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the Adler32 value returned by this call of - inflate. The compressor and decompressor must use exactly the same - dictionary (see deflateSetDictionary). - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect Adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - - - /* utility functions */ - -/* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least 0.1% larger than - sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the - compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least 0.1% larger than sourceLen plus - 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted. -*/ - - -typedef voidp gzFile; - -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); -/* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h". (See the description - of deflateInit2 for more information about the strategy parameter.) - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. - - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - const voidp buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). -*/ - -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. -*/ - -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); -/* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); -/* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); - -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running crc with the bytes buf[0..len-1] and return the updated - crc. If buf is NULL, this function returns the required initial value - for the crc. Pre- and post-conditioning (one's complement) is performed - within this function so it shouldn't be done by the application. - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) - - -#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ -#endif - -ZEXTERN const char * ZEXPORT zError OF((int err)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); - -#ifdef __cplusplus -} -#endif - -#endif /* _ZLIB_H */ From e6f88a528565867536e6b4d547b9f4e8591a287a Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Mon, 23 Jun 2014 17:06:40 +0100 Subject: [PATCH 07/29] [swift] fix for when using the latest libpng --- src/BitmapUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BitmapUtils.cpp b/src/BitmapUtils.cpp index 5a81a54c8..cf3ddcce7 100644 --- a/src/BitmapUtils.cpp +++ b/src/BitmapUtils.cpp @@ -908,7 +908,7 @@ int CreateBitmapFromPNG(const char * inFilePath, struct ImageInfo * outImageInf if (png_sig_cmp(png_current_pos,0,8)) goto bail; png_set_interlace_handling(pngPtr); - if(setjmp(pngPtr->jmpbuf)) + if(setjmp(png_jmpbuf(pngPtr))) { goto bail; } From 83858ee83d1d95cbfb41f925da5c3e5e0fa9d4d7 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Tue, 24 Jun 2014 02:22:51 +0100 Subject: [PATCH 08/29] [swift] in the scenario init->cleanup->init, treat already-loaded object as a warning, not an error --- src/XPMPMultiplayerCSL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/XPMPMultiplayerCSL.cpp b/src/XPMPMultiplayerCSL.cpp index 598545a4e..1a6220323 100644 --- a/src/XPMPMultiplayerCSL.cpp +++ b/src/XPMPMultiplayerCSL.cpp @@ -348,7 +348,7 @@ bool LoadOnePackage(const string& inPath, int pass) { gPackageNames[tokens[1]] = inPath; } else { - parse_err = true; + //parse_err = true; // warning, not error XPLMDump(path, lineNum, line) << "XSB WARNING: Package name " << tokens[1].c_str() << " already in use by "<< gPackageNames[tokens[1]].c_str() << " reqested by use by " << inPath.c_str() << "'\n"; } } else { From 20efe9a5f5fd4284e4d9fd7ec71990d2cb366bb4 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Tue, 24 Jun 2014 18:49:12 +0100 Subject: [PATCH 09/29] [swift] change or remove debug text mentioning XSquawkBox --- src/XPMPMultiplayer.cpp | 4 +- src/XPMPMultiplayerCSL.cpp | 78 +++++++++++++++++++------------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index 52cbfa623..c8cf143d7 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -196,8 +196,8 @@ const char * XPMPMultiplayerEnable(void) int result = XPLMAcquirePlanes(&(*ptrs.begin()), NULL, NULL); if (result) XPLMSetActiveAircraftCount(1); - else - XPLMDebugString("WARNING: XSquawkBox did not acquire multiplayer planes!!\n"); + //else + // XPLMDebugString("WARNING: XSquawkBox did not acquire multiplayer planes!!\n"); int total, active; XPLMPluginID who; diff --git a/src/XPMPMultiplayerCSL.cpp b/src/XPMPMultiplayerCSL.cpp index 1a6220323..988ffa994 100644 --- a/src/XPMPMultiplayerCSL.cpp +++ b/src/XPMPMultiplayerCSL.cpp @@ -115,7 +115,7 @@ struct XPLMDump { XPLMDump() { } XPLMDump(const string& inFileName, int lineNum, const char * line) { - XPLMDebugString("XSB WARNING: Parse Error in file "); + XPLMDebugString("xbus WARNING: Parse Error in file "); XPLMDebugString(inFileName.c_str()); XPLMDebugString(" line "); char buf[32]; @@ -267,7 +267,7 @@ bool CSL_Init( obj_init(); bool ok = OBJ_Init(inTexturePath); if (!ok) - XPLMDump() << "XSB WARNING: we failed to find XSB's custom lighting texture at " << inTexturePath << ".\n"; + XPLMDump() << "xbus WARNING: we failed to find xpmp's custom lighting texture at " << inTexturePath << ".\n"; return ok; } @@ -299,7 +299,7 @@ bool LoadOnePackage(const string& inPath, int pass) if (fi != NULL) { if (pass == pass_Load) - XPLMDump() << "XSB: Loading package: " << path << "\n"; + XPLMDump() << "xbus: Loading package: " << path << "\n"; if (pass == pass_Load) gPackages.push_back(CSLPackage_t()); @@ -349,11 +349,11 @@ bool LoadOnePackage(const string& inPath, int pass) gPackageNames[tokens[1]] = inPath; } else { //parse_err = true; // warning, not error - XPLMDump(path, lineNum, line) << "XSB WARNING: Package name " << tokens[1].c_str() << " already in use by "<< gPackageNames[tokens[1]].c_str() << " reqested by use by " << inPath.c_str() << "'\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: Package name " << tokens[1].c_str() << " already in use by "<< gPackageNames[tokens[1]].c_str() << " reqested by use by " << inPath.c_str() << "'\n"; } } else { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: EXPORT_NAME command requires 1 argument.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: EXPORT_NAME command requires 1 argument.\n"; } } @@ -365,13 +365,13 @@ bool LoadOnePackage(const string& inPath, int pass) { if (gPackageNames.count(tokens[1]) == 0) { - XPLMDump(path, lineNum, line) << "XSB WARNING: required package " << tokens[1] << " not found. Aborting processing of this package.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: required package " << tokens[1] << " not found. Aborting processing of this package.\n"; fclose(fi); return true; } } else { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: DEPENDENCY command needs 1 argument.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: DEPENDENCY command needs 1 argument.\n"; } } @@ -391,7 +391,7 @@ bool LoadOnePackage(const string& inPath, int pass) MakePartialPathNativeObj(fullPath); if (!DoPackageSub(fullPath)) { - XPLMDump(path, lineNum, line) << "XSB WARNING: package not found.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; parse_err = true; } pckg->planes.push_back(CSLPlane_t()); @@ -408,7 +408,7 @@ bool LoadOnePackage(const string& inPath, int pass) } } else { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: AIRCRAFT command takes 3 arguments.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: AIRCRAFT command takes 3 arguments.\n"; } } @@ -426,7 +426,7 @@ bool LoadOnePackage(const string& inPath, int pass) MakePartialPathNativeObj(fullPath); if (!DoPackageSub(fullPath)) { - XPLMDump(path, lineNum, line) << "XSB WARNING: package not found.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; parse_err = true; } pckg->planes.push_back(CSLPlane_t()); @@ -438,7 +438,7 @@ bool LoadOnePackage(const string& inPath, int pass) pckg->planes.back().obj_idx = OBJ_LoadModel(fullPath.c_str()); if (pckg->planes.back().obj_idx == -1) { - XPLMDump(path, lineNum, line) << "XSB WARNING: the model " << fullPath << " failed to load.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: the model " << fullPath << " failed to load.\n"; parse_err = true; } #if DEBUG_CSL_LOADING @@ -448,7 +448,7 @@ bool LoadOnePackage(const string& inPath, int pass) #endif } else { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: OBJECT command takes 1 argument.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: OBJECT command takes 1 argument.\n"; } } @@ -458,7 +458,7 @@ bool LoadOnePackage(const string& inPath, int pass) if(tokens.size() != 2) { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: TEXTURE command takes 1 argument.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: TEXTURE command takes 1 argument.\n"; } else { // Load regular texture string texPath = tokens[1]; @@ -467,7 +467,7 @@ bool LoadOnePackage(const string& inPath, int pass) if (!DoPackageSub(texPath)) { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: package not found.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; } pckg->planes.back().texID = OBJ_LoadTexture(texPath.c_str(), false); if (pckg->planes.back().texID == -1) @@ -508,7 +508,7 @@ bool LoadOnePackage(const string& inPath, int pass) else { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: OBJ8_AIRCARFT command takes 1 argument.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: OBJ8_AIRCARFT command takes 1 argument.\n"; } } @@ -553,7 +553,7 @@ bool LoadOnePackage(const string& inPath, int pass) MakePartialPathNativeObj(fullPath); if (!DoPackageSub(fullPath)) { - XPLMDump(path, lineNum, line) << "XSB WARNING: package not found.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; parse_err = true; } @@ -597,7 +597,7 @@ bool LoadOnePackage(const string& inPath, int pass) if (tokens.size() != 2 || (tokens[1] != "YES" && tokens[1] != "NO")) { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: HASGEAR takes one argument that must be YES or NO.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: HASGEAR takes one argument that must be YES or NO.\n"; } else { if (tokens[1] == "YES") pckg->planes.back().moving_gear = true; @@ -605,7 +605,7 @@ bool LoadOnePackage(const string& inPath, int pass) pckg->planes.back().moving_gear = false; else { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: HASGEAR must have a YES or NO argument, but we got " << tokens[1] << ".\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: HASGEAR must have a YES or NO argument, but we got " << tokens[1] << ".\n"; } } } @@ -627,7 +627,7 @@ bool LoadOnePackage(const string& inPath, int pass) pckg->matches[match_group] [group] = static_cast(pckg->planes.size()) - 1; } else { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: ICAO command takes 1 argument.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: ICAO command takes 1 argument.\n"; } } @@ -660,7 +660,7 @@ bool LoadOnePackage(const string& inPath, int pass) } } else { parse_err = true; - XPLMDump(path, lineNum, line) << "XB WARNING: AIRLINE command takes two arguments.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: AIRLINE command takes two arguments.\n"; } } @@ -699,13 +699,13 @@ bool LoadOnePackage(const string& inPath, int pass) } } else { parse_err = true; - XPLMDump(path, lineNum, line) << "XSB WARNING: LIVERY command takes two arguments.\n"; + XPLMDump(path, lineNum, line) << "xbus WARNING: LIVERY command takes two arguments.\n"; } } } fclose(fi); } else { - XPLMDump() << "XSB WARNING: package '" << inPath << "' could not be opened. Error was: " << strerror(errno) << ".\n"; + XPLMDump() << "xbus WARNING: package '" << inPath << "' could not be opened. Error was: " << strerror(errno) << ".\n"; } return parse_err; } @@ -769,7 +769,7 @@ bool CSL_LoadCSL(const char * inFolderPath, const char * inRelatedFile, const ch } fclose(aircraft_fi); } else { - XPLMDump() << "XSB WARNING: could not open ICAO document 8643 at " << inDoc8643 << "\n"; + XPLMDump() << "xbus WARNING: could not open ICAO document 8643 at " << inDoc8643 << "\n"; ok = false; } @@ -798,7 +798,7 @@ bool CSL_LoadCSL(const char * inFolderPath, const char * inRelatedFile, const ch } fclose(related_fi); } else { - XPLMDump() << "XSB WARNING: could not open related.txt at " << inRelatedFile << "\n"; + XPLMDump() << "xbus WARNING: could not open related.txt at " << inRelatedFile << "\n"; ok = false; } @@ -888,7 +888,7 @@ CSLPlane_t * CSL_MatchPlane(const char * inICAO, const char * inAirline, const c if (gIntPrefsFunc("debug", "model_matching", 0)) { - sprintf(buf,"XSB MATCH - ICAO=%s AIRLINE=%s LIVERY=%s GROUP=%s\n", icao.c_str(), airline.c_str(), livery.c_str(), group.c_str()); + sprintf(buf,"xbus MATCH - ICAO=%s AIRLINE=%s LIVERY=%s GROUP=%s\n", icao.c_str(), airline.c_str(), livery.c_str(), group.c_str()); XPLMDebugString(buf); } @@ -912,7 +912,7 @@ CSLPlane_t * CSL_MatchPlane(const char * inICAO, const char * inAirline, const c if (gIntPrefsFunc("debug", "model_matching", 0)) { - sprintf(buf,"XSB MATCH - Group %d key %s\n", n, key.c_str()); + sprintf(buf,"xbus MATCH - Group %d key %s\n", n, key.c_str()); XPLMDebugString(buf); } @@ -930,7 +930,7 @@ CSLPlane_t * CSL_MatchPlane(const char * inICAO, const char * inAirline, const c if (gIntPrefsFunc("debug", "model_matching", 0)) { - sprintf(buf, "XB MATCH - Found: %s\n", gPackages[p].planes[iter->second].file_path.c_str()); + sprintf(buf, "xbus MATCH - Found: %s\n", gPackages[p].planes[iter->second].file_path.c_str()); XPLMDebugString(buf); } @@ -941,7 +941,7 @@ CSLPlane_t * CSL_MatchPlane(const char * inICAO, const char * inAirline, const c if (gIntPrefsFunc("debug", "model_matching", 0)) { - XPLMDebugString("XSB MATCH - No match.\n"); + XPLMDebugString("xbus MATCH - No match.\n"); } @@ -955,7 +955,7 @@ CSLPlane_t * CSL_MatchPlane(const char * inICAO, const char * inAirline, const c if (gIntPrefsFunc("debug", "model_matching", 0)) { - XPLMDebugString("XSB MATCH/acf - Looking for a "); + XPLMDebugString("xbus MATCH/acf - Looking for a "); switch(model_it->second.category) { case 'L': XPLMDebugString(" light "); break; case 'M': XPLMDebugString(" medium "); break; @@ -976,11 +976,11 @@ CSLPlane_t * CSL_MatchPlane(const char * inICAO, const char * inAirline, const c if (gIntPrefsFunc("debug", "model_matching", 0)) { switch(pass) { - case 1: XPLMDebugString("XSB Match/acf - matching WTC and configuration\n"); break; - case 2: XPLMDebugString("XSB Match/acf - matching WTC, #engines and enginetype\n"); break; - case 3: XPLMDebugString("XSB Match/acf - matching WTC, #engines\n"); break; - case 4: XPLMDebugString("XSB Match/acf - matching WTC, enginetype\n"); break; - case 5: XPLMDebugString("XSB Match/acf - matching WTC\n"); break; + case 1: XPLMDebugString("xbus Match/acf - matching WTC and configuration\n"); break; + case 2: XPLMDebugString("xbus Match/acf - matching WTC, #engines and enginetype\n"); break; + case 3: XPLMDebugString("xbus Match/acf - matching WTC, #engines\n"); break; + case 4: XPLMDebugString("xbus Match/acf - matching WTC, enginetype\n"); break; + case 5: XPLMDebugString("xbus Match/acf - matching WTC\n"); break; } } @@ -1019,7 +1019,7 @@ CSLPlane_t * CSL_MatchPlane(const char * inICAO, const char * inAirline, const c // bingo if (gIntPrefsFunc("debug", "model_matching", 0)) { - XPLMDebugString("XSB MATCH/acf - found: "); + XPLMDebugString("xbus MATCH/acf - found: "); XPLMDebugString(it->first.c_str()); XPLMDebugString("\n"); } @@ -1049,17 +1049,17 @@ void CSL_Dump(void) // DIAGNOSTICS - print out everything we know. for (size_t n = 0; n < gPackages.size(); ++n) { - XPLMDump() << "XSB CSL: Package " << n << " path = " << gPackages[n].name << "\n"; + XPLMDump() << "xbus CSL: Package " << n << " path = " << gPackages[n].name << "\n"; for (size_t p = 0; p < gPackages[n].planes.size(); ++p) { - XPLMDump() << "XSB CSL: Plane " << p << " = " << gPackages[n].planes[p].file_path << "\n"; + XPLMDump() << "xbus CSL: Plane " << p << " = " << gPackages[n].planes[p].file_path << "\n"; } for (int t = 0; t < 6; ++t) { - XPLMDump() << "XSB CSL: Table " << t << "\n"; + XPLMDump() << "xbus CSL: Table " << t << "\n"; for (map::iterator i = gPackages[n].matches[t].begin(); i != gPackages[n].matches[t].end(); ++i) { - XPLMDump() << "XSB CSL: " << i->first << " -> " << i->second << "\n"; + XPLMDump() << "xbus CSL: " << i->first << " -> " << i->second << "\n"; } } } From cdef678e617309097321a967f1704efeaa37ea6d Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sun, 22 Jun 2014 01:56:11 +0100 Subject: [PATCH 10/29] [swift] cleanup functions --- include/XPMPMultiplayer.h | 16 ++++++++++++++++ src/XPMPMultiplayer.cpp | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/XPMPMultiplayer.h b/include/XPMPMultiplayer.h index 0f18f8543..63b5485df 100644 --- a/include/XPMPMultiplayer.h +++ b/include/XPMPMultiplayer.h @@ -272,6 +272,22 @@ const char * XPMPMultiplayerInit( */ const char * XPMPMultiplayerEnable(void); +/* + * XPMPMultiplayerDisable + * + * Disable drawing of multiplayer planes. Call this from XPluginDisable to release multiplayer. + * Reverses the actions on XPMPMultiplayerEnable. + */ +void XPMPMultiplayerDisable(void); + +/* + * XPMPMultiplayerCleanup + * + * Clean up the multiplayer library. Call this from XPluginStop to reverse the actions of + * XPMPMultiplayerInit as much as possible. + */ +void XPMPMultiplayerCleanup(void); + /* * XPMPLoadPlanesIfNecessary * diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index c8cf143d7..d42247d0c 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -150,6 +150,13 @@ const char * XPMPMultiplayerInit( else return ""; } +void XPMPMultiplayerCleanup(void) +{ + XPLMUnregisterDrawCallback(XPMPControlPlaneCount, xplm_Phase_Gauges, 0, 0); + XPLMUnregisterDrawCallback(XPMPControlPlaneCount, xplm_Phase_Gauges, 1, (void *) -1); + XPLMUnregisterDrawCallback(XPMPRenderMultiplayerPlanes, xplm_Phase_Airplanes, 0, 0); +} + // We use this array to track Austin's planes, since we have to mess with them. static vector gPlanePaths; @@ -210,6 +217,11 @@ const char * XPMPMultiplayerEnable(void) return ""; } +void XPMPMultiplayerDisable(void) +{ + XPLMReleasePlanes(); +} + // This routine checks plane loading and grabs anyone we're missing. void XPMPLoadPlanesIfNecessary(void) From 321cda2598f1974a22a367da63d36a3a2a9907a2 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Tue, 24 Jun 2014 18:45:15 +0100 Subject: [PATCH 11/29] [swift] refactored initialization into legacy and nextgen parts --- include/XPMPMultiplayer.h | 55 ++++++++++++++++++++++++++++++++++++--- src/XPMPMultiplayer.cpp | 39 ++++++++++++++++++++++----- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/include/XPMPMultiplayer.h b/include/XPMPMultiplayer.h index 63b5485df..e9b735b9b 100644 --- a/include/XPMPMultiplayer.h +++ b/include/XPMPMultiplayer.h @@ -227,9 +227,9 @@ typedef XPMPPlaneCallbackResult (* XPMPPlaneData_f)( void * inRefcon); /* - * XPMPMultiplayerInit + * XPMPMultiplayerInitLegacyData * - * This routine initializes the multiplayer library. + * This routine initializes legacy portions of the multiplayer library. * * inPlaneList is a ptr to a fully qualified file name that is a text file of ICAO -> model * mappings. The xsb_aircraft.txt file can be used as a template. (Please note: other @@ -252,8 +252,13 @@ typedef XPMPPlaneCallbackResult (* XPMPPlaneData_f)( * * Call this once from your XPluginStart routine. * + * Depending on which plane packages are installed this can take between 30 seconds and 15 minutes. + * + * After transitioning to exclusively OBJ8-based packages, this function should no longer be required. + * Instead, make separate calls to XPMPLoadCSLPackages and XPMPSetDefaultPlaneICAO. + * */ -const char * XPMPMultiplayerInit( +const char * XPMPMultiplayerInitLegacyData( const char * inCSLFolder, const char * inRelatedPath, const char * inTexturePath, @@ -262,6 +267,27 @@ const char * XPMPMultiplayerInit( int (* inIntPrefsFunc)(const char *, const char *, int), float (* inFloatPrefsFunc)(const char *, const char *, float)); +/* + * XPMPMultiplayerInit + * + * The two prefs funcs each take an ini section and key and return a value and also take + * a default. The renderer uses them for configuration. Currently the following keys are + * needed: + * + * section key type default description + * planes full_distance float 3.0 + * planes max_full_count int 50 + * + * The return value is a string indicating any problem that may have gone wrong in a human-readable + * form, or an empty string if initalizatoin was okay. + * + * Call this once, typically from your XPluginStart routine. + * + */ +const char * XPMPMultiplayerInit( + int (* inIntPrefsFunc)(const char *, const char *, int), + float (* inFloatPrefsFunc)(const char *, const char *, float)); + /* * XPMPMultiplayerEnable * @@ -288,6 +314,29 @@ void XPMPMultiplayerDisable(void); */ void XPMPMultiplayerCleanup(void); +/* + * XPMPLoadCSLPackage + * + * Loads a collection of planes + * + * inPlaneList is a ptr to a fully qualified file name that is a text file of ICAO -> model + * mappings. The xsb_aircraft.txt file can be used as a template. (Please note: other + * XSB files are NOT necessary and are not necessarily available under open source license.) + * + * inDoc8643 is the path to the ICAO document 8643, available at + * http://www.icao.int/anb/ais/TxtFiles/Doc8643.txt. This file lists all aircraft types + * with their manufacturer, ICAO equipment code and aircraft category. + * + * This is fast if the planes are all OBJ8 (because the objects are loaded asynchronously, + * on demand), otherwise it could take several seconds or minutes depending on the quantity + * and fidelity of the planes. + * + */ +const char * XPMPLoadCSLPackage( + const char * inCSLFolder, + const char * inRelatedPath, + const char * inDoc8643); + /* * XPMPLoadPlanesIfNecessary * diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index d42247d0c..90d28d35f 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -104,7 +104,7 @@ static int XPMPControlPlaneCount( ********************************************************************************/ -const char * XPMPMultiplayerInit( +const char * XPMPMultiplayerInitLegacyData( const char * inCSLFolder, const char * inRelatedPath, const char * inTexturePath, const char * inDoc8643, const char * inDefaultPlane, @@ -114,6 +114,25 @@ const char * XPMPMultiplayerInit( gDefaultPlane = inDefaultPlane; gIntPrefsFunc = inIntPrefsFunc; gFloatPrefsFunc = inFloatPrefsFunc; + + bool problem = false; + + if (!CSL_LoadCSL(inCSLFolder, inRelatedPath, inDoc8643)) + problem = true; + + if (!CSL_Init(inTexturePath)) + problem = true; + + if (problem) return "There were problems initializing XSquawkBox. Please examine X-Plane's error.out file for detailed information."; + else return ""; +} + +const char * XPMPMultiplayerInit( + int (* inIntPrefsFunc)(const char *, const char *, int), + float (* inFloatPrefsFunc)(const char *, const char *, float)) +{ + gIntPrefsFunc = inIntPrefsFunc; + gFloatPrefsFunc = inFloatPrefsFunc; //char myPath[1024]; //char airPath[1024]; //char line[256]; @@ -127,14 +146,8 @@ const char * XPMPMultiplayerInit( // Initialize our OpenGL Utilities OGL_UtilsInit(); - if (!CSL_LoadCSL(inCSLFolder, inRelatedPath, inDoc8643)) - problem = true; - XPMPInitDefaultPlaneRenderer(); - if (!CSL_Init(inTexturePath)) - problem = true; - // Register the plane control calls. XPLMRegisterDrawCallback(XPMPControlPlaneCount, xplm_Phase_Gauges, 0, /* after*/ 0 /* hide planes*/); @@ -223,6 +236,18 @@ void XPMPMultiplayerDisable(void) } +const char * XPMPLoadCSLPackage( + const char * inCSLFolder, const char * inRelatedPath, const char * inDoc8643) +{ + bool problem = false; + + if (!CSL_LoadCSL(inCSLFolder, inRelatedPath, inDoc8643)) + problem = true; + + if (problem) return "There were problems initializing XSquawkBox. Please examine X-Plane's error.out file for detailed information."; + else return ""; +} + // This routine checks plane loading and grabs anyone we're missing. void XPMPLoadPlanesIfNecessary(void) { From 2fb1a300656887cb56e79b0e252d52f89c63c3e5 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sun, 16 Nov 2014 21:36:35 +0000 Subject: [PATCH 12/29] Fixed Clang warnings. --- src/BitmapUtils.cpp | 8 ++++---- src/XOGLUtils.cpp | 4 ++++ src/XObjReadWrite.cpp | 4 ++-- src/XPMPMultiplayerCSL.cpp | 28 +++++++++++++++------------- src/XPMPMultiplayerObj.cpp | 4 ++++ 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/BitmapUtils.cpp b/src/BitmapUtils.cpp index cf3ddcce7..b83187421 100644 --- a/src/BitmapUtils.cpp +++ b/src/BitmapUtils.cpp @@ -34,12 +34,12 @@ inline void BMP_EndianFlipInt(int * x) { int t = Endian32_Swap(*x); *x = t; } inline void BMP_EndianFlipShort(short * x) { short t = Endian16_Swap(*x); *x = t; } #else -#define BMP_EndianFlipInt(x) (x) -#define BMP_EndianFlipShort(x) (x) +#define BMP_EndianFlipInt(x) +#define BMP_EndianFlipShort(x) #endif #else - #define BMP_EndianFlipInt(x) (x) - #define BMP_EndianFlipShort(x) (x) + #define BMP_EndianFlipInt(x) + #define BMP_EndianFlipShort(x) #endif #if BITMAP_USE_JPEG diff --git a/src/XOGLUtils.cpp b/src/XOGLUtils.cpp index 99e6d0e43..0466358e7 100644 --- a/src/XOGLUtils.cpp +++ b/src/XOGLUtils.cpp @@ -151,6 +151,7 @@ bool OGL_UtilsInit() firstTime = false; } +#if IBM // Make sure everything got initialized if(glBindBufferARB && glActiveTextureARB && @@ -162,5 +163,8 @@ bool OGL_UtilsInit() } else return false; +#else + return true; +#endif } diff --git a/src/XObjReadWrite.cpp b/src/XObjReadWrite.cpp index b35ef6ddb..344c63176 100644 --- a/src/XObjReadWrite.cpp +++ b/src/XObjReadWrite.cpp @@ -48,8 +48,8 @@ bool XObjRead(const char * inFile, XObj& outObj) vec_tex vst; vec_rgb vrgb; - float scanned_st_rgb[4][3]={0,0,0 , 0,0,0,// [corner][color or st] - 0,0,0 , 0,0,0}; + float scanned_st_rgb[4][3]={{0,0,0} , {0,0,0},// [corner][color or st] + {0,0,0} , {0,0,0}}; outObj.cmds.clear(); diff --git a/src/XPMPMultiplayerCSL.cpp b/src/XPMPMultiplayerCSL.cpp index 988ffa994..c8b5ec3b2 100644 --- a/src/XPMPMultiplayerCSL.cpp +++ b/src/XPMPMultiplayerCSL.cpp @@ -182,6 +182,7 @@ char * fgets_multiplatform(char * s, int n, FILE * file) // Only bother to read if we have enough space in the char buf. if (n) + { do { c = getc(file); @@ -204,19 +205,20 @@ char * fgets_multiplatform(char * s, int n, FILE * file) // Note that the \r\n IS written to the line. while (c != '\n' && c != '\r' && --n); - // Ben's special code: eat a \n if it follows a \r, etc. Mac stdio - // swizzles these guys a bit, so we will consolidate BOTH \r\n and \n\r into - // just the first. - if (c == '\r') - { - c1 = getc(file); - if (c1 != '\n') ungetc(c1, file); - } - if (c == '\n') - { - c1 = getc(file); - if (c1 != '\r') ungetc(c1, file); - } + // Ben's special code: eat a \n if it follows a \r, etc. Mac stdio + // swizzles these guys a bit, so we will consolidate BOTH \r\n and \n\r into + // just the first. + if (c == '\r') + { + c1 = getc(file); + if (c1 != '\n') ungetc(c1, file); + } + if (c == '\n') + { + c1 = getc(file); + if (c1 != '\r') ungetc(c1, file); + } + } // Unless we're bailing with NULL, we MUST null terminate. *p = 0; diff --git a/src/XPMPMultiplayerObj.cpp b/src/XPMPMultiplayerObj.cpp index 3238ab5f7..ab9db3728 100644 --- a/src/XPMPMultiplayerObj.cpp +++ b/src/XPMPMultiplayerObj.cpp @@ -551,7 +551,9 @@ void OBJ_PlotModel(int model, int texID, int litTexID, float inDistance, double GLint xpBuffer; // See if the card even has VBO. If it does, save xplane's pointer // and bind to 0 for us. +#if IBM if(glBindBufferARB) +#endif { glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &xpBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); @@ -595,7 +597,9 @@ void OBJ_PlotModel(int model, int texID, int litTexID, float inDistance, double glPopClientAttrib(); // If we bound before, we need to put xplane back where it was +#if IBM if(glBindBufferARB) +#endif glBindBufferARB(GL_ARRAY_BUFFER_ARB, xpBuffer); sObjects[model].lods[lodIdx].triangleList.clear(); From c8cdc5a6ad77ac03aab0879fe8f45f9392af8cee Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sun, 16 Nov 2014 23:05:38 +0000 Subject: [PATCH 13/29] Fixed cppcheck warnings. --- src/CSLLoaderThread.cpp | 6 +++--- src/CSLLoaderThread.h | 2 ++ src/TexUtils.cpp | 20 +++++++++----------- src/XObjReadWrite.cpp | 6 +++--- src/XPMPMultiplayer.cpp | 2 +- src/XPMPMultiplayerCSL.cpp | 2 +- src/XPMPMultiplayerObj.cpp | 3 +-- src/XPMPPlaneRenderer.cpp | 2 +- src/XUtils.cpp | 8 +++++++- src/XUtils.h | 2 +- 10 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/CSLLoaderThread.cpp b/src/CSLLoaderThread.cpp index 9f9cb54c1..913ca900c 100644 --- a/src/CSLLoaderThread.cpp +++ b/src/CSLLoaderThread.cpp @@ -35,21 +35,21 @@ void loadjobthread::execute() { case MSG_LOADJOB_OBJ: { - CSLPlane_t* toload = ((loadjob*)msg)->toload; + CSLPlane_t* toload = static_cast(msg)->toload; toload->obj_idx = OBJ_LoadModel(toload->file_path.c_str()); } break; case MSG_LOADJOB_TEX: { - CSLPlane_t* toload = ((loadjob*)msg)->toload; + CSLPlane_t* toload = static_cast(msg)->toload; toload->texID = OBJ_LoadTexture(toload->tex_path.c_str(), false); } break; case MSG_LOADJOB_TEX_LIT: { - CSLPlane_t* toload = ((loadjob*)msg)->toload; + CSLPlane_t* toload = static_cast(msg)->toload; toload->texLitID = OBJ_LoadTexture(toload->texLit_path.c_str(), false); } break; diff --git a/src/CSLLoaderThread.h b/src/CSLLoaderThread.h index 5b52d1b27..1d73b94bb 100644 --- a/src/CSLLoaderThread.h +++ b/src/CSLLoaderThread.h @@ -34,6 +34,8 @@ protected: public: CSLLoaderType() { jq=new pt::jobqueue(); } ~CSLLoaderType() {} + CSLLoaderType(const CSLLoaderType &) = delete; + CSLLoaderType &operator =(const CSLLoaderType &) = delete; void startthreads(); void load(CSLPlane_t* toload); void loadTex(CSLPlane_t* toload); diff --git a/src/TexUtils.cpp b/src/TexUtils.cpp index 3e6460e4f..cbf1f35fa 100644 --- a/src/TexUtils.cpp +++ b/src/TexUtils.cpp @@ -54,7 +54,6 @@ static void HalfBitmap(ImageInfo& ioImage) ioImage.height /= 2; ioImage.width /= 2; int yr = ioImage.height; - int t1, t2, t3, t4; if (ioImage.channels == 3) { @@ -63,9 +62,9 @@ static void HalfBitmap(ImageInfo& ioImage) int xr = ioImage.width; while (xr--) { - t1 = *srcp1++; - t2 = *srcp1++; - t3 = *srcp1++; + int t1 = *srcp1++; + int t2 = *srcp1++; + int t3 = *srcp1++; t1 += *srcp1++; t2 += *srcp1++; @@ -100,10 +99,10 @@ static void HalfBitmap(ImageInfo& ioImage) int xr = ioImage.width; while (xr--) { - t1 = *srcp1++; - t2 = *srcp1++; - t3 = *srcp1++; - t4 = *srcp1++; + int t1 = *srcp1++; + int t2 = *srcp1++; + int t3 = *srcp1++; + int t4 = *srcp1++; t1 += *srcp1++; t2 += *srcp1++; @@ -145,7 +144,6 @@ bool LoadTextureFromFile(const char * inFileName, int inTexNum, bool magentaAlph { bool ok = false; struct ImageInfo im; - long count = 0; #if 1 unsigned char * p; #endif @@ -168,7 +166,7 @@ bool LoadTextureFromFile(const char * inFileName, int inTexNum, bool magentaAlph { #if 1 p = im.data; - count = im.width * im.height; + long count = im.width * im.height; while (count--) { std::swap(p[0], p[2]); @@ -185,7 +183,7 @@ bool LoadTextureFromFile(const char * inFileName, int inTexNum, bool magentaAlph } else { #if 1 p = im.data; - count = im.width * im.height; + long count = im.width * im.height; while (count--) { std::swap(p[0], p[2]); diff --git a/src/XObjReadWrite.cpp b/src/XObjReadWrite.cpp index 344c63176..39b43d113 100644 --- a/src/XObjReadWrite.cpp +++ b/src/XObjReadWrite.cpp @@ -42,7 +42,7 @@ bool XObjRead(const char * inFile, XObj& outObj) { vector tokens; - string ascii, vers, tag, line; + string /*ascii,*/ vers, /*tag,*/ line; int cmd_id, count, obj2_op; int version = 1; vec_tex vst; @@ -65,7 +65,7 @@ bool XObjRead(const char * inFile, XObj& outObj) line = f.get(); BreakString(line, tokens); if (tokens.empty()) return false; - ascii = tokens[0]; + //ascii = tokens[0]; f.next(); if (f.done()) return false; @@ -89,7 +89,7 @@ bool XObjRead(const char * inFile, XObj& outObj) line = f.get(); BreakString(line, tokens); if (tokens.empty()) return false; - tag = tokens[0]; + //tag = tokens[0]; f.next(); if (f.done()) return false; } diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index 90d28d35f..636bac836 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -470,7 +470,7 @@ XPMPPlaneCallbackResult XPMPGetPlaneData( XPMPPlanePtr XPMPPlaneIsValid(XPMPPlaneID inID, XPMPPlaneVector::iterator * outIter) { - XPMPPlanePtr ptr = (XPMPPlanePtr) inID; + XPMPPlanePtr ptr = static_cast(inID); XPMPPlaneVector::iterator iter = std::find(gPlanes.begin(), gPlanes.end(), ptr); if (iter == gPlanes.end()) return NULL; diff --git a/src/XPMPMultiplayerCSL.cpp b/src/XPMPMultiplayerCSL.cpp index c8b5ec3b2..f2502951d 100644 --- a/src/XPMPMultiplayerCSL.cpp +++ b/src/XPMPMultiplayerCSL.cpp @@ -296,7 +296,6 @@ bool LoadOnePackage(const string& inPath, int pass) FILE * fi = fopen(path.c_str(), "r"); XPLMGetVersions(&sim, &xplm, &host); - int lineNum = 0; if (fi != NULL) { @@ -320,6 +319,7 @@ bool LoadOnePackage(const string& inPath, int pass) // tokens.push_back(""); // Go through the file and handle each token. + int lineNum = 0; while(!feof(fi)) { if (!fgets_multiplatform(line, sizeof(line), fi)) diff --git a/src/XPMPMultiplayerObj.cpp b/src/XPMPMultiplayerObj.cpp index ab9db3728..278b7ce8e 100644 --- a/src/XPMPMultiplayerObj.cpp +++ b/src/XPMPMultiplayerObj.cpp @@ -700,7 +700,6 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, return; GLfloat size; - double distance; // Where are we looking? XPLMCameraPosition_t cameraPos; XPLMReadCameraPosition(&cameraPos); @@ -734,7 +733,7 @@ void OBJ_DrawLights(int model, float inDistance, double inX, double inY, float dx = cameraPos.x - static_cast(inX); float dy = cameraPos.y - static_cast(inY); float dz = cameraPos.z - static_cast(inZ); - distance = sqrt((dx * dx) + (dy * dy) + (dz * dz)); + double distance = sqrt((dx * dx) + (dy * dy) + (dz * dz)); // Convert to NM distance *= kMetersToNM; diff --git a/src/XPMPPlaneRenderer.cpp b/src/XPMPPlaneRenderer.cpp index 6dc46c5e3..63b0c4b61 100644 --- a/src/XPMPPlaneRenderer.cpp +++ b/src/XPMPPlaneRenderer.cpp @@ -392,7 +392,7 @@ void XPMPDefaultPlaneRenderer(int is_blend) renderRecord.pitch = pos.pitch; renderRecord.heading = pos.heading; renderRecord.roll = pos.roll; - renderRecord.model=((XPMPPlanePtr)id)->model; + renderRecord.model = static_cast(id)->model; renderRecord.cull = cull; // NO other planes. Doing so causes a lot of things to go nuts! renderRecord.tcas = tcas; diff --git a/src/XUtils.cpp b/src/XUtils.cpp index e56f25dbb..7da67d3aa 100644 --- a/src/XUtils.cpp +++ b/src/XUtils.cpp @@ -42,12 +42,13 @@ static char * my_fgets(char * s, int n, FILE * file) { char * p = s; - int c; if (--n < 0) return(NULL); if (n) + { + int c; do { c = fgetc(file); @@ -65,6 +66,7 @@ static char * my_fgets(char * s, int n, FILE * file) *p++ = c; } while (c != '\n' && c != '\r' && --n); + } *p = 0; @@ -413,6 +415,7 @@ struct XPointPool::XPointPoolImp { return static_cast(pts.size()); } +#if 0 int accumulate(const float xyz[3], const float st[2]) { static char buf[256]; @@ -433,6 +436,7 @@ struct XPointPool::XPointPoolImp { pts.push_back(p); return static_cast(pts.size())-1; } +#endif void get(int i, float xyz[3], float st[2]) { @@ -457,10 +461,12 @@ void XPointPool::clear() mImp->clear(); } +#if 0 int XPointPool::accumulate(const float xyz[3], const float st[2]) { return mImp->accumulate(xyz, st); } +#endif void XPointPool::get(int index, float xyz[3], float st[2]) { diff --git a/src/XUtils.h b/src/XUtils.h index 843e98d02..5d52a84ef 100644 --- a/src/XUtils.h +++ b/src/XUtils.h @@ -109,7 +109,7 @@ public: XPointPool(); ~XPointPool(); void clear(); - int accumulate(const float xyz[3], const float st[2]); + //int accumulate(const float xyz[3], const float st[2]); int count(void); void get(int index, float xyz[3], float st[2]); From 1d6094901f447e35528b2f7f4be822c58e467b83 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Tue, 18 Nov 2014 01:19:51 +0000 Subject: [PATCH 14/29] One more cppcheck warning. --- src/XPMPMultiplayerCSL.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/XPMPMultiplayerCSL.cpp b/src/XPMPMultiplayerCSL.cpp index f2502951d..d7f4d9097 100644 --- a/src/XPMPMultiplayerCSL.cpp +++ b/src/XPMPMultiplayerCSL.cpp @@ -172,8 +172,6 @@ bool DoPackageSub(std::string& ioPath) char * fgets_multiplatform(char * s, int n, FILE * file) { char * p = s; - int c; - int c1; // Save one slot for the null. If we do not have enough memory // to do this, bail. @@ -183,6 +181,7 @@ char * fgets_multiplatform(char * s, int n, FILE * file) // Only bother to read if we have enough space in the char buf. if (n) { + int c; do { c = getc(file); @@ -210,12 +209,12 @@ char * fgets_multiplatform(char * s, int n, FILE * file) // just the first. if (c == '\r') { - c1 = getc(file); + int c1 = getc(file); if (c1 != '\n') ungetc(c1, file); } if (c == '\n') { - c1 = getc(file); + int c1 = getc(file); if (c1 != '\r') ungetc(c1, file); } } From d957d261d3a3c85d2041462078532e613e14a53b Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Fri, 21 Nov 2014 01:37:00 +0000 Subject: [PATCH 15/29] Fixed MinGW warning emitted when optimizations are enabled. --- src/BitmapUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BitmapUtils.cpp b/src/BitmapUtils.cpp index b83187421..43a9193ec 100644 --- a/src/BitmapUtils.cpp +++ b/src/BitmapUtils.cpp @@ -871,7 +871,7 @@ int CreateBitmapFromPNG(const char * inFilePath, struct ImageInfo * outImageInf png_structp pngPtr = NULL; png_infop infoPtr = NULL; - unsigned char * buffer = NULL; + unsigned char * volatile buffer = NULL; FILE * file = NULL; size_t fileLength = 0; outImageInfo->data = NULL; From edf617d7ac25663dbbf39660b02ed0f97711b4f1 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Tue, 16 Jun 2015 00:17:47 +0200 Subject: [PATCH 16/29] Implement and use single command parser methods --- src/XPMPMultiplayerCSL.cpp | 535 ++++++++++++++++++++++++++++++++++-- src/XPMPMultiplayerVars.cpp | 1 - src/XPMPMultiplayerVars.h | 15 +- src/XStringUtils.h | 39 +++ 4 files changed, 569 insertions(+), 21 deletions(-) create mode 100644 src/XStringUtils.h diff --git a/src/XPMPMultiplayerCSL.cpp b/src/XPMPMultiplayerCSL.cpp index d7f4d9097..f0e96a237 100644 --- a/src/XPMPMultiplayerCSL.cpp +++ b/src/XPMPMultiplayerCSL.cpp @@ -24,12 +24,16 @@ #include "XPMPMultiplayerCSL.h" #include "XPLMUtilities.h" #include "XPMPMultiplayerObj.h" +#include "XStringUtils.h" #include "XOGLUtils.h" #include #include //#include "PlatformUtils.h" #include #include +#include +#include +#include using std::max; @@ -125,6 +129,18 @@ struct XPLMDump { XPLMDebugString(line); XPLMDebugString(".\n"); } + + XPLMDump(const string& inFileName, int lineNum, const string& line) { + XPLMDebugString("xbus WARNING: Parse Error in file "); + XPLMDebugString(inFileName.c_str()); + XPLMDebugString(" line "); + char buf[32]; + sprintf(buf,"%d", lineNum); + XPLMDebugString(buf); + XPLMDebugString(".\n "); + XPLMDebugString(line.c_str()); + XPLMDebugString(".\n"); + } XPLMDump& operator<<(const char * rhs) { XPLMDebugString(rhs); @@ -155,16 +171,16 @@ static bool DoPackageSub(std::string& ioPath); bool DoPackageSub(std::string& ioPath) { - for (std::map::iterator i = gPackageNames.begin(); i != gPackageNames.end(); ++i) - { - if (strncmp(i->first.c_str(), ioPath.c_str(), i->first.size()) == 0) - { - ioPath.erase(0, i->first.size()); - ioPath.insert(0, i->second); - return true; - } - } - return false; + for (auto i = gPackages.begin(); i != gPackages.end(); ++i) + { + if (strncmp(i->name.c_str(), ioPath.c_str(), i->name.size()) == 0) + { + ioPath.erase(0, i->name.size()); + ioPath.insert(0, i->path); + return true; + } + } + return false; } @@ -272,6 +288,477 @@ bool CSL_Init( return ok; } +bool ParseExportCommand(const std::vector &tokens, CSLPackage_t &package, const string& path, int lineNum, const string& line) +{ + if (tokens.size() != 2) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: EXPORT_NAME command requires 1 argument.\n"; + return false; + } + + auto p = std::find_if(gPackages.begin(), gPackages.end(), [&tokens](CSLPackage_t p) { return p.name == tokens[1]; } ); + if (p == gPackages.end()) + { + package.path = path; + package.name = tokens[1]; + return true; + } + else + { + XPLMDump(path, lineNum, line) << "xbus WARNING: Package name " << tokens[1].c_str() << " already in use by " << p->path.c_str() << " reqested by use by " << path.c_str() << "'\n"; + return false; + } +} + +bool ParseDependencyCommand(const std::vector &tokens, CSLPackage_t &/*package*/, const string& path, int lineNum, const string& line) +{ + if (tokens.size() != 2) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: DEPENDENCY command needs 1 argument.\n"; + return false; + } + + if (std::count_if(gPackages.begin(), gPackages.end(), [&tokens](CSLPackage_t p) { return p.name == tokens[1]; }) == 0) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: required package " << tokens[1] << " not found. Aborting processing of this package.\n"; + return false; + } + + return true; +} + +bool ParseObjectCommand(const std::vector &tokens, CSLPackage_t &package, const string& path, int lineNum, const string& line) +{ + std::vector dupTokens = tokens; + BreakStringPvt(line.c_str(), dupTokens, 2, " \t\r\n"); + if (tokens.size() != 2) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: OBJECT command takes 1 argument.\n"; + return false; + } + std::string relativePath(tokens[1]); + MakePartialPathNativeObj(relativePath); + std::string fullPath(relativePath); + if (!DoPackageSub(fullPath)) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; + return false; + } + + package.planes.push_back(CSLPlane_t()); + package.planes.back().modelName = relativePath; + package.planes.back().plane_type = plane_Obj; + package.planes.back().file_path = fullPath; + package.planes.back().moving_gear = true; + package.planes.back().texID = 0; + package.planes.back().texLitID = 0; + package.planes.back().obj_idx = OBJ_LoadModel(fullPath.c_str()); + if (package.planes.back().obj_idx == -1) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: the model " << fullPath << " failed to load.\n"; + } +#if DEBUG_CSL_LOADING + XPLMDebugString(" Got Object: "); + XPLMDebugString(fullPath.c_str()); + XPLMDebugString("\n"); +#endif + + return true; +} + +bool ParseTextureCommand(const std::vector &tokens, CSLPackage_t &package, const string& path, int lineNum, const string& line) +{ + if(tokens.size() != 2) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: TEXTURE command takes 1 argument.\n"; + return false; + } + + // Load regular texture + string relativeTexPath = tokens[1]; + MakePartialPathNativeObj(relativeTexPath); + string absoluteTexPath(relativeTexPath); + + if (!DoPackageSub(absoluteTexPath)) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; + return false; + } + + package.planes.back().modelName += " "; + package.planes.back().modelName += relativeTexPath; + package.planes.back().texID = OBJ_LoadTexture(absoluteTexPath.c_str(), false); + if (package.planes.back().texID == -1) + { + XPLMDump(path, lineNum, line) << "Texture " << absoluteTexPath << " failed to load.\n"; + return false; + } + // Load the lit texture + string texLitPath = absoluteTexPath; + string::size_type pos2 = texLitPath.find_last_of("."); + if(pos2 != string::npos) + { + texLitPath.insert(pos2, "LIT"); + package.planes.back().texLitID = OBJ_LoadTexture(texLitPath.c_str(), false); + } + +#if DEBUG_CSL_LOADING + XPLMDebugString(" Got texture: "); + XPLMDebugString(absoluteTexPath.c_str()); + XPLMDebugString("\n"); +#endif + + return true; +} + +bool ParseAircraftCommand(const std::vector &tokens, CSLPackage_t &package, const string& path, int lineNum, const string& line) +{ + // AIRCAFT + if (tokens.size() != 4) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: AIRCRAFT command takes 3 arguments.\n"; + } + + int sim, xplm; + XPLMHostApplicationID host; + XPLMGetVersions(&sim, &xplm, &host); + + if (sim >= atoi(tokens[1].c_str()) && sim <= atoi(tokens[2].c_str())) + { + string relativePath = tokens[3]; + MakePartialPathNativeObj(relativePath); + string absolutePath(relativePath); + if (!DoPackageSub(absolutePath)) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; + return false; + } + package.planes.push_back(CSLPlane_t()); + package.planes.back().modelName = relativePath; + package.planes.back().plane_type = plane_Austin; + package.planes.back().file_path = absolutePath; + package.planes.back().moving_gear = true; + package.planes.back().austin_idx = -1; +#if DEBUG_CSL_LOADING + XPLMDebugString(" Got Airplane: "); + XPLMDebugString(absolutePath.c_str()); + XPLMDebugString("\n"); +#endif + + } + + return true; +} + +bool ParseObj8AircraftCommand(const std::vector &tokens, CSLPackage_t &package, const string& path, int lineNum, const string& line) +{ + // OBJ8_AIRCRAFT + if (tokens.size() != 2) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: OBJ8_AIRCARFT command takes 1 argument.\n"; + } + + package.planes.push_back(CSLPlane_t()); + package.planes.back().plane_type = plane_Obj8; + package.planes.back().file_path = tokens[1]; + package.planes.back().moving_gear = true; + package.planes.back().texID = 0; + package.planes.back().texLitID = 0; + package.planes.back().obj_idx = -1; + return true; +} + +bool ParseObj8Command(const std::vector &tokens, CSLPackage_t &package, const string& path, int lineNum, const string& line) +{ + // OBJ8 + if (tokens.size() != 4) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: OBJ8_AIRCARFT command takes 1 argument.\n"; + } + + // err - obj8 record at stupid place in file + if(package.planes.empty() || package.planes.back().plane_type != plane_Obj8) return false; + + obj_for_acf att; + + if(tokens[1] == "GLASS") + att.draw_type = draw_glass; + else if(tokens[1] == "LIGHTS") + att.draw_type = draw_lights; + else if(tokens[1] == "LOW_LOD") + att.draw_type = draw_low_lod; + else if(tokens[1] == "SOLID") + att.draw_type = draw_solid; + else { + // err crap enum + } + + if(tokens[2] == "YES") + att.needs_animation = true; + else if(tokens[2] == "NO") + att.needs_animation = false; + else + { + // crap flag + } + + string relativePath = tokens[3]; + MakePartialPathNativeObj(relativePath); + package.planes.back().modelName = relativePath; + string absolutePath(relativePath); + if (!DoPackageSub(absolutePath)) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; + return false; + } + + char xsystem[1024]; + XPLMGetSystemPath(xsystem); + + #if APL + HFS2PosixPath(xsystem, xsystem, 1024); + #endif + + size_t sys_len = strlen(xsystem); + if(absolutePath.size() > sys_len) + absolutePath.erase(absolutePath.begin(),absolutePath.begin() + sys_len); + else + { + // should probaby freak out here. + } + + att.handle = NULL; + att.file = absolutePath; + + package.planes.back().attachments.push_back(att); + + return true; +} + +bool ParseHasGearCommand(const std::vector &tokens, CSLPackage_t &package, const string& path, int lineNum, const string& line) +{ + // HASGEAR YES|NO + if (tokens.size() != 2 || (tokens[1] != "YES" && tokens[1] != "NO")) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: HASGEAR takes one argument that must be YES or NO.\n"; + return false; + } + + if (tokens[1] == "YES") + { + package.planes.back().moving_gear = true; + return true; + } + else if (tokens[1] == "NO") + { + package.planes.back().moving_gear = false; + return true; + } + else + { + XPLMDump(path, lineNum, line) << "xbus WARNING: HASGEAR must have a YES or NO argument, but we got " << tokens[1] << ".\n"; + return false; + } +} + +bool ParseIcaoCommand(const std::vector &tokens, CSLPackage_t &package, const string& path, int lineNum, const string& line) +{ + // ICAO + if (tokens.size() != 2) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: ICAO command takes 1 argument.\n"; + return false; + } + + std::string icao = tokens[1]; + package.planes.back().icao = icao; + std::string group = gGroupings[icao]; + if (package.matches[match_icao].count(icao) == 0) + package.matches[match_icao] [icao] = static_cast(package.planes.size()) - 1; + if (!group.empty()) + if (package.matches[match_group].count(group) == 0) + package.matches[match_group] [group] = static_cast(package.planes.size()) - 1; + + return true; +} + +bool ParseAirlineCommand(const std::vector &tokens, CSLPackage_t &package, const string& path, int lineNum, const string& line) +{ + // AIRLINE + if (tokens.size() != 3) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: AIRLINE command takes two arguments.\n"; + return false; + } + + std::string icao = tokens[1]; + package.planes.back().icao = icao; + std::string airline = tokens[2]; + package.planes.back().airline = airline; + std::string group = gGroupings[icao]; + if (package.matches[match_icao_airline].count(icao + " " + airline) == 0) + package.matches[match_icao_airline] [icao + " " + airline] = static_cast(package.planes.size()) - 1; +#if USE_DEFAULTING + if (package.matches[match_icao ].count(icao ) == 0) + package.matches[match_icao ] [icao ] = package.planes.size() - 1; +#endif + if (!group.empty()) + { +#if USE_DEFAULTING + if (package.matches[match_group ].count(group ) == 0) + package.matches[match_group ] [group ] = package.planes.size() - 1; +#endif + if (package.matches[match_group_airline].count(group + " " + airline) == 0) + package.matches[match_group_airline] [group + " " + airline] = static_cast(package.planes.size()) - 1; + } + + return true; +} + +bool ParseLiveryCommand(const std::vector &tokens, CSLPackage_t &package, const string& path, int lineNum, const string& line) +{ + // LIVERY + if (tokens.size() != 4) + { + XPLMDump(path, lineNum, line) << "xbus WARNING: LIVERY command takes two arguments.\n"; + return false; + } + + std::string icao = tokens[1]; + package.planes.back().icao = icao; + std::string airline = tokens[2]; + package.planes.back().airline = airline; + std::string livery = tokens[3]; + package.planes.back().livery = livery; + std::string group = gGroupings[icao]; +#if USE_DEFAULTING + if (package.matches[match_icao ].count(icao ) == 0) + package.matches[match_icao ] [icao ] = package.planes.size() - 1; + if (package.matches[match_icao ].count(icao ) == 0) + package.matches[match_icao_airline ] [icao + " " + airline ] = package.planes.size() - 1; +#endif + if (package.matches[match_icao_airline_livery ].count(icao + " " + airline + " " + livery) == 0) + package.matches[match_icao_airline_livery ] [icao + " " + airline + " " + livery] = static_cast(package.planes.size()) - 1; + if (!group.empty()) + { +#if USE_DEFAULTING + if (package.matches[match_group ].count(group ) == 0) + package.matches[match_group ] [group ] = package.planes.size() - 1; + if (package.matches[match_group_airline ].count(group + " " + airline ) == 0) + package.matches[match_group_airline ] [group + " " + airline ] = package.planes.size() - 1; +#endif + if (package.matches[match_group_airline_livery ].count(group + " " + airline + " " + livery) == 0) + package.matches[match_group_airline_livery ] [group + " " + airline + " " + livery] = static_cast(package.planes.size()) - 1; + } + + return true; +} + +bool ParseDummyCommand(const std::vector & /* tokens */, CSLPackage_t & /* package */, const string& /* path */, int /*lineNum*/, const string& /*line*/) +{ + return true; +} + +std::string GetFileContent(const std::string &filename) +{ + std::string content; + std::ifstream in(filename, std::ios::in | std::ios::binary); + if (in) + { + content = std::string((std::istreambuf_iterator(in)), std::istreambuf_iterator()); + } + return content; +} + +CSLPackage_t ParsePackageHeader(const string& path, const string& content) +{ + using command = std::function &, CSLPackage_t &, const string&, int, const string&)>; + + static const std::map commands + { + { "EXPORT_NAME", &ParseExportCommand } + }; + + CSLPackage_t package; + stringstream sin(content); + if (!sin.good()) { return package; } + + std::string line; + int lineNum = 0; + + while (std::getline(sin, line)) + { + ++lineNum; + auto tokens = tokenize(line, " \t\r\n"); + if (!tokens.empty()) + { + auto it = commands.find(tokens[0]); + if (it != commands.end()) + { + bool result = it->second(tokens, package, path, lineNum, line); + // Stop loop once we found EXPORT command + if (result) break; + } + } + } + + return package; +} + + +void ParseFullPackage(const std::string &content, CSLPackage_t &package) +{ + using command = std::function &, CSLPackage_t &, const string&, int, const string&)>; + + static const std::map commands + { + { "EXPORT_NAME", &ParseDummyCommand }, + { "DEPENDENCY", &ParseDependencyCommand }, + { "OBJECT", &ParseObjectCommand }, + { "TEXTURE", &ParseTextureCommand }, + { "AIRCRAFT", &ParseAircraftCommand }, + { "OBJ8_AIRCRAFT", &ParseObj8AircraftCommand }, + { "OBJ8", &ParseObj8Command }, + { "HASGEAR", &ParseHasGearCommand }, + { "ICAO", &ParseIcaoCommand }, + { "AIRLINE", &ParseAirlineCommand }, + { "LIVERY", &ParseLiveryCommand }, + }; + + stringstream sin(content); + if (!sin.good()) { return; } // exit if file not found + + std::string line; + int lineNum = 0; + while (std::getline(sin, line)) + { + ++lineNum; + auto tokens = tokenize(line, " \t\r\n"); + if (!tokens.empty()) + { + auto it = commands.find(tokens[0]); + if (it != commands.end()) + { + bool result = it->second(tokens, package, package.path, lineNum, line); + if (!result) + { + XPLMDebugString("xbus WARNING: Ignoring CSL package!"); + XPLMDebugString(tokens[0].c_str()); + XPLMDebugString("\n"); + break; + } + } + else + { + XPLMDebugString("xbus WARNING: Unrecognized command in xsb_aircraft.txt: "); + XPLMDebugString(tokens[0].c_str()); + XPLMDebugString("\n"); + break; + } + } + } +} + // This routine loads one CSL package. bool LoadOnePackage(const string& inPath, int pass) { @@ -834,13 +1321,27 @@ bool CSL_LoadCSL(const char * inFolderPath, const char * inRelatedFile, const ch } free(name_buf); free(index_buf); - - for (int pass = 0; pass < pass_Count; ++pass) - for (size_t n = 0; n < pckgs.size(); ++n) - { - if (LoadOnePackage(pckgs[n], pass)) - ok = false; - } + + // First read all headers. This is required to resolve the DEPENDENCIES + for (const auto &packagePath : pckgs) + { + std::string packageFile(packagePath); + packageFile += "/"; //XPLMGetDirectorySeparator(); + packageFile += "xsb_aircraft.txt"; + std::string packageContent = GetFileContent(packageFile); + auto package = ParsePackageHeader(packagePath, packageContent); + if (package.hasValidHeader()) gPackages.push_back(package); + } + + // Now we do a full run + for (auto &package : gPackages) + { + std::string packageFile(package.path); + packageFile += "/"; //XPLMGetDirectorySeparator(); + packageFile += "xsb_aircraft.txt"; + std::string packageContent = GetFileContent(packageFile); + ParseFullPackage(packageContent, package); + } #if 0 ::Microseconds((UnsignedWide*) &t2); diff --git a/src/XPMPMultiplayerVars.cpp b/src/XPMPMultiplayerVars.cpp index a268f5356..d2ef60aa3 100644 --- a/src/XPMPMultiplayerVars.cpp +++ b/src/XPMPMultiplayerVars.cpp @@ -36,7 +36,6 @@ int gEnableCount = 1; vector gPackages; map gGroupings; -map gPackageNames; string gDefaultPlane; map gAircraftCodes; diff --git a/src/XPMPMultiplayerVars.h b/src/XPMPMultiplayerVars.h index a7ca3c482..839573b43 100644 --- a/src/XPMPMultiplayerVars.h +++ b/src/XPMPMultiplayerVars.h @@ -77,6 +77,12 @@ enum { // It has a type, a single file path for whatever we have to load, // and then implementation-specifc stuff. struct CSLPlane_t { + + string modelName; // Unique model name + string icao; // Icao type of this model + string airline; // Airline identifier. Can be empty. + string livery; // Livery identifier. Can be empty. + int plane_type; // What kind are we? string file_path; // Where do we load from (oz and obj, debug-use-only for OBJ8) bool moving_gear; // Does gear retract? @@ -111,7 +117,13 @@ enum { // keys to the internal index of the plane. struct CSLPackage_t { + bool hasValidHeader() const + { + return !name.empty() && !path.empty(); + } + string name; + string path; vector planes; map matches[match_count]; @@ -121,9 +133,6 @@ extern vector gPackages; extern map gGroupings; -extern map gPackageNames; - - /**************** Model matching using ICAO doc 8643 (http://www.icao.int/anb/ais/TxtFiles/Doc8643.txt) ***********/ diff --git a/src/XStringUtils.h b/src/XStringUtils.h new file mode 100644 index 000000000..bc9329912 --- /dev/null +++ b/src/XStringUtils.h @@ -0,0 +1,39 @@ +#ifndef STRING_UTILS_H +#define STRING_UTILS_H + +#include +#include +#include + +std::vector tokenize(const std::string &str, const std::string &delim) +{ + std::string dup = str; + std::vector result; + if (delim.empty()) + { + result.push_back(dup); + return result; + } + + if (dup.empty()) return result; + + while (true) + { + auto position = dup.find_first_of(delim); + std::string token = dup.substr(0, position); + + if (!token.empty()) + { + result.push_back(token); + } + + // Nothing remaining + if (position == std::string::npos) return result; + + dup = dup.substr(position + 1); + } +} + + +#endif // STRING_UTILS_H + From 6944ace30e9b7cfb6b092e09dd217d73b75da54d Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Tue, 16 Jun 2015 00:18:52 +0200 Subject: [PATCH 17/29] Remove obsolete method LoadOnePackage --- src/XPMPMultiplayerCSL.cpp | 441 ------------------------------------- 1 file changed, 441 deletions(-) diff --git a/src/XPMPMultiplayerCSL.cpp b/src/XPMPMultiplayerCSL.cpp index f0e96a237..8749dd874 100644 --- a/src/XPMPMultiplayerCSL.cpp +++ b/src/XPMPMultiplayerCSL.cpp @@ -276,8 +276,6 @@ void BreakStringPvt(const char * inString, std::vector& outStrings, * CSL LOADING ************************************************************************/ -static bool LoadOnePackage(const string& inPath, int pass); - bool CSL_Init( const char* inTexturePath) { @@ -759,445 +757,6 @@ void ParseFullPackage(const std::string &content, CSLPackage_t &package) } } -// This routine loads one CSL package. -bool LoadOnePackage(const string& inPath, int pass) -{ - string group, icao, livery, airline; - bool parse_err = false; - char line[1024*4]; - int sim, xplm; - XPLMHostApplicationID host; - -#if DEBUG_CSL_LOADING - XPLMDump() << "LoadOnePackage was passed inPath of: " << inPath << ".\n"; -#endif - // First locate and attempt to load the xsb_aircraft.txt file from th is package. - string path(inPath); - path += "/"; //XPLMGetDirectorySeparator(); - path += "xsb_aircraft.txt"; -#if DEBUG_CSL_LOADING - XPLMDump() << "LoadOnePackage attempting to open: " << path << ".\n"; -#endif - - FILE * fi = fopen(path.c_str(), "r"); - - XPLMGetVersions(&sim, &xplm, &host); - - if (fi != NULL) - { - if (pass == pass_Load) - XPLMDump() << "xbus: Loading package: " << path << "\n"; - - if (pass == pass_Load) - gPackages.push_back(CSLPackage_t()); - CSLPackage_t * pckg = (pass == pass_Load) ? &gPackages.back() : NULL; - if (pass == pass_Load) - pckg->name = path; - - std::vector tokens; - - // BEN SEZ: we need to understand why thsi hack would be needed! - // I dont know why - but this seems to fix a Linux STL issue, somehow -Martin -// tokens.push_back(""); -// tokens.push_back(""); -// tokens.push_back(""); -// tokens.push_back(""); -// tokens.push_back(""); - - // Go through the file and handle each token. - int lineNum = 0; - while(!feof(fi)) - { - if (!fgets_multiplatform(line, sizeof(line), fi)) - break; - ++lineNum; - - if (line[0] == '#') continue; - - char * p = line; - while (*p) - { - if (*p == '\n' || *p == '\r') *p = 0; - ++p; - } - - BreakStringPvt(line, tokens, 4, " \t\r\n"); - - //---------------------------------------------------------------------------------------------------- - // PACKAGE MANAGEMENT - //---------------------------------------------------------------------------------------------------- - - // EXPORT_NAME - if (!tokens.empty() && tokens[0] == "EXPORT_NAME" && pass == pass_Depend) - { - if (tokens.size() == 2) - { - if (gPackageNames.count(tokens[1]) == 0) - { - gPackageNames[tokens[1]] = inPath; - } else { - //parse_err = true; // warning, not error - XPLMDump(path, lineNum, line) << "xbus WARNING: Package name " << tokens[1].c_str() << " already in use by "<< gPackageNames[tokens[1]].c_str() << " reqested by use by " << inPath.c_str() << "'\n"; - } - } else { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: EXPORT_NAME command requires 1 argument.\n"; - } - } - - - // DEPENDENCY - if (!tokens.empty() && tokens[0] == "DEPENDENCY" && pass == pass_Load) - { - if (tokens.size() == 2) - { - if (gPackageNames.count(tokens[1]) == 0) - { - XPLMDump(path, lineNum, line) << "xbus WARNING: required package " << tokens[1] << " not found. Aborting processing of this package.\n"; - fclose(fi); - return true; - } - } else { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: DEPENDENCY command needs 1 argument.\n"; - } - } - - //---------------------------------------------------------------------------------------------------- - // AUSTIN OLD SCHOOL ACFS - //---------------------------------------------------------------------------------------------------- - - // AIRCAFT - if (!tokens.empty() && tokens[0] == "AIRCRAFT" && pass == pass_Load) - { - if (tokens.size() == 4) - { - if (sim >= atoi(tokens[1].c_str()) && - sim <= atoi(tokens[2].c_str())) - { - std::string fullPath = tokens[3]; - MakePartialPathNativeObj(fullPath); - if (!DoPackageSub(fullPath)) - { - XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; - parse_err = true; - } - pckg->planes.push_back(CSLPlane_t()); - pckg->planes.back().plane_type = plane_Austin; - pckg->planes.back().file_path = fullPath; - pckg->planes.back().moving_gear = true; - pckg->planes.back().austin_idx = -1; -#if DEBUG_CSL_LOADING - XPLMDebugString(" Got Airplane: "); - XPLMDebugString(fullPath.c_str()); - XPLMDebugString("\n"); -#endif - - } - } else { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: AIRCRAFT command takes 3 arguments.\n"; - } - } - - //---------------------------------------------------------------------------------------------------- - // OBJ7 DRAWN WITH OUR CODE - //---------------------------------------------------------------------------------------------------- - - // OBJECT - if (!tokens.empty() && tokens[0] == "OBJECT" && pass == pass_Load) - { - BreakStringPvt(line, tokens, 2, " \t\r\n"); - if (tokens.size() == 2) - { - std::string fullPath = tokens[1]; - MakePartialPathNativeObj(fullPath); - if (!DoPackageSub(fullPath)) - { - XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; - parse_err = true; - } - pckg->planes.push_back(CSLPlane_t()); - pckg->planes.back().plane_type = plane_Obj; - pckg->planes.back().file_path = fullPath; - pckg->planes.back().moving_gear = true; - pckg->planes.back().texID = 0; - pckg->planes.back().texLitID = 0; - pckg->planes.back().obj_idx = OBJ_LoadModel(fullPath.c_str()); - if (pckg->planes.back().obj_idx == -1) - { - XPLMDump(path, lineNum, line) << "xbus WARNING: the model " << fullPath << " failed to load.\n"; - parse_err = true; - } -#if DEBUG_CSL_LOADING - XPLMDebugString(" Got Object: "); - XPLMDebugString(fullPath.c_str()); - XPLMDebugString("\n"); -#endif - } else { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: OBJECT command takes 1 argument.\n"; - } - } - - // TEXTURE - if (!tokens.empty() && tokens[0] == "TEXTURE" && pass == pass_Load) - { - if(tokens.size() != 2) - { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: TEXTURE command takes 1 argument.\n"; - } else { - // Load regular texture - string texPath = tokens[1]; - MakePartialPathNativeObj(texPath); - - if (!DoPackageSub(texPath)) - { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; - } - pckg->planes.back().texID = OBJ_LoadTexture(texPath.c_str(), false); - if (pckg->planes.back().texID == -1) - { - parse_err = true; - XPLMDump(path, lineNum, line) << "Texture " << texPath << " failed to load.\n"; - } - // Load the lit texture - string texLitPath = texPath; - string::size_type pos2 = texLitPath.find_last_of("."); - if(pos2 != string::npos) - { - texLitPath.insert(pos2, "LIT"); - pckg->planes.back().texLitID = OBJ_LoadTexture(texLitPath.c_str(), false); - } - } - } - - //---------------------------------------------------------------------------------------------------- - // OBJ8 MULTI-OBJ WITH SIM RENDERING - //---------------------------------------------------------------------------------------------------- - - // OBJ8_AIRCRAFT - if (!tokens.empty() && tokens[0] == "OBJ8_AIRCRAFT" && pass == pass_Load) - { - BreakStringPvt(line, tokens, 2, " \t\r\n"); - - if(tokens.size() == 2) - { - pckg->planes.push_back(CSLPlane_t()); - pckg->planes.back().plane_type = plane_Obj8; - pckg->planes.back().file_path = tokens[1]; // debug str - pckg->planes.back().moving_gear = true; - pckg->planes.back().texID = 0; - pckg->planes.back().texLitID = 0; - pckg->planes.back().obj_idx = -1; - } - else - { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: OBJ8_AIRCARFT command takes 1 argument.\n"; - } - } - - // OBJ8 - if (!tokens.empty() && tokens[0] == "OBJ8" && pass == pass_Load) - { - BreakStringPvt(line, tokens, 4, " \t\r\n"); - - if(tokens.size() == 4) - { - if(pckg->planes.empty() || pckg->planes.back().plane_type != plane_Obj8) - { - // err - obj8 record at stupid place in file - } - else - { - - obj_for_acf att; - - if(tokens[1] == "GLASS") - att.draw_type = draw_glass; - else if(tokens[1] == "LIGHTS") - att.draw_type = draw_lights; - else if(tokens[1] == "LOW_LOD") - att.draw_type = draw_low_lod; - else if(tokens[1] == "SOLID") - att.draw_type = draw_solid; - else { - // err crap enum - } - - if(tokens[2] == "YES") - att.needs_animation = true; - else if(tokens[2] == "NO") - att.needs_animation = false; - else - { - // crap flag - } - std::string fullPath = tokens[3]; - - MakePartialPathNativeObj(fullPath); - if (!DoPackageSub(fullPath)) - { - XPLMDump(path, lineNum, line) << "xbus WARNING: package not found.\n"; - parse_err = true; - } - - char xsystem[1024]; - XPLMGetSystemPath(xsystem); - - #if APL - HFS2PosixPath(xsystem, xsystem, 1024); - #endif - - size_t sys_len = strlen(xsystem); - if(fullPath.size() > sys_len) - fullPath.erase(fullPath.begin(),fullPath.begin() + sys_len); - else - { - // should probaby freak out here. - } - - att.handle = NULL; - att.file = fullPath; - - pckg->planes.back().attachments.push_back(att); - } - } - else - { - // err - f---ed line. - } - } - - //---------------------------------------------------------------------------------------------------- - // MATCHING CRAP AND OTHER COMMON META-DATA - //---------------------------------------------------------------------------------------------------- - - - // HASGEAR YES|NO - // This line specifies whether the previous plane has retractable gear. - // Useful for preventing XSB from rolling up a C152's gear on takeoff! - if (!tokens.empty() && tokens[0] == "HASGEAR" && pass == pass_Load) - { - if (tokens.size() != 2 || (tokens[1] != "YES" && tokens[1] != "NO")) - { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: HASGEAR takes one argument that must be YES or NO.\n"; - } else { - if (tokens[1] == "YES") - pckg->planes.back().moving_gear = true; - else if (tokens[1] == "NO") - pckg->planes.back().moving_gear = false; - else { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: HASGEAR must have a YES or NO argument, but we got " << tokens[1] << ".\n"; - } - } - } - - // ICAO - // This line maps one ICAO code to the previous airline, without - // specifying an airline or livery. - if (!tokens.empty() && tokens[0] == "ICAO" && pass == pass_Load) - { - BreakStringPvt(line, tokens, 0, " \t"); - if (tokens.size() == 2) - { - icao = tokens[1]; - group = gGroupings[icao]; - if (pckg->matches[match_icao].count(icao) == 0) - pckg->matches[match_icao] [icao] = static_cast(pckg->planes.size()) - 1; - if (!group.empty()) - if (pckg->matches[match_group].count(group) == 0) - pckg->matches[match_group] [group] = static_cast(pckg->planes.size()) - 1; - } else { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: ICAO command takes 1 argument.\n"; - } - } - - // AIRLINE - // This line maps one ICAO code to the previous airline, with - // an airline but without a livery. This will also create - // an ICAO-only association for non-airline-specific matching. - if (!tokens.empty() && tokens[0] == "AIRLINE" && pass == pass_Load) - { - BreakStringPvt(line, tokens, 0, " \t"); - if (tokens.size() == 3) - { - icao = tokens[1]; - airline = tokens[2]; - group = gGroupings[icao]; - if (pckg->matches[match_icao_airline].count(icao + " " + airline) == 0) - pckg->matches[match_icao_airline] [icao + " " + airline] = static_cast(pckg->planes.size()) - 1; -#if USE_DEFAULTING - if (pckg->matches[match_icao ].count(icao ) == 0) - pckg->matches[match_icao ] [icao ] = pckg->planes.size() - 1; -#endif - if (!group.empty()) - { -#if USE_DEFAULTING - if (pckg->matches[match_group ].count(group ) == 0) - pckg->matches[match_group ] [group ] = pckg->planes.size() - 1; -#endif - if (pckg->matches[match_group_airline].count(group + " " + airline) == 0) - pckg->matches[match_group_airline] [group + " " + airline] = static_cast(pckg->planes.size()) - 1; - } - } else { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: AIRLINE command takes two arguments.\n"; - } - } - - // LIVERY - // This line maps one ICAO code to the previous airline, with - // an airline and livery. This will also create - // an ICAO-only and ICAO/airline association for non-airline-specific - // matching. - if (!tokens.empty() && tokens[0] == "LIVERY" && pass == pass_Load) - { - BreakStringPvt(line, tokens, 0, " \t"); - if (tokens.size() == 4) - { - icao = tokens[1]; - airline = tokens[2]; - livery = tokens[3]; - group = gGroupings[icao]; -#if USE_DEFAULTING - if (pckg->matches[match_icao ].count(icao ) == 0) - pckg->matches[match_icao ] [icao ] = pckg->planes.size() - 1; - if (pckg->matches[match_icao ].count(icao ) == 0) - pckg->matches[match_icao_airline ] [icao + " " + airline ] = pckg->planes.size() - 1; -#endif - if (pckg->matches[match_icao_airline_livery ].count(icao + " " + airline + " " + livery) == 0) - pckg->matches[match_icao_airline_livery ] [icao + " " + airline + " " + livery] = static_cast(pckg->planes.size()) - 1; - if (!group.empty()) - { -#if USE_DEFAULTING - if (pckg->matches[match_group ].count(group ) == 0) - pckg->matches[match_group ] [group ] = pckg->planes.size() - 1; - if (pckg->matches[match_group_airline ].count(group + " " + airline ) == 0) - pckg->matches[match_group_airline ] [group + " " + airline ] = pckg->planes.size() - 1; -#endif - if (pckg->matches[match_group_airline_livery ].count(group + " " + airline + " " + livery) == 0) - pckg->matches[match_group_airline_livery ] [group + " " + airline + " " + livery] = static_cast(pckg->planes.size()) - 1; - } - } else { - parse_err = true; - XPLMDump(path, lineNum, line) << "xbus WARNING: LIVERY command takes two arguments.\n"; - } - } - } - fclose(fi); - } else { - XPLMDump() << "xbus WARNING: package '" << inPath << "' could not be opened. Error was: " << strerror(errno) << ".\n"; - } - return parse_err; -} - // This routine loads the related.txt file and also all packages. bool CSL_LoadCSL(const char * inFolderPath, const char * inRelatedFile, const char * inDoc8643) { From 3de2779f80658af028161cd2f314a5f289373784 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Thu, 11 Jun 2015 01:17:13 +0200 Subject: [PATCH 18/29] Make installed model info available from libxplanemp --- include/XPMPMultiplayer.h | 19 +++++++++++++++++++ src/XPMPMultiplayer.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/include/XPMPMultiplayer.h b/include/XPMPMultiplayer.h index e9b735b9b..4c2a95286 100644 --- a/include/XPMPMultiplayer.h +++ b/include/XPMPMultiplayer.h @@ -346,6 +346,25 @@ const char * XPMPLoadCSLPackage( */ void XPMPLoadPlanesIfNecessary(void); +/* + * XPMPGetNumberOfInstalledModels + * + * This routine returns the number of found models. + * + */ +int XPMPGetNumberOfInstalledModels(void); + +/* + * XPMPGetModelInfo + * + * Call this routine with an index to get all available info for this model. Valid + * index is between 0 and XPMPGetNumberOfInstalledModels(). If you pass an index + * out of this range, the out parameters are unchanged. + * Make sure the size of all char arrays is big enough. + * + */ +void XPMPGetModelInfo(int inIndex, const char **outModelName, const char **outIcao, const char **outAirline, const char **outLivery); + /* * XPMPCreatePlane * diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index 636bac836..98a52e61c 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -44,6 +44,7 @@ #include #include #include +#include // This prints debug info on our process of loading Austin's planes. #define DEBUG_MANUAL_LOADING 0 @@ -281,6 +282,37 @@ void XPMPLoadPlanesIfNecessary(void) } +int XPMPGetNumberOfInstalledModels(void) +{ + int number = 0; + for (const auto& package : gPackages) + { + number += package.planes.size(); + } + return number; +} + +void XPMPGetModelInfo(int inIndex, const char** outModelName, const char** outIcao, const char** outAirline, const char** outLivery) +{ + int counter = 0; + for (const auto& package : gPackages) + { + + if (counter + static_cast(package.planes.size()) < inIndex + 1) + { + counter += package.planes.size(); + continue; + } + + int positionInPackage = inIndex - counter; + *outModelName = package.planes[positionInPackage].modelName.c_str(); + *outIcao = package.planes[positionInPackage].icao.c_str(); + *outAirline = package.planes[positionInPackage].airline.c_str(); + *outLivery = package.planes[positionInPackage].livery.c_str(); + break; + } +} + /******************************************************************************** * PLANE OBJECT SUPPORT ********************************************************************************/ From fdf149610c80011aebb4a047f8682e0760cf573c Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Thu, 18 Jun 2015 23:13:49 +0200 Subject: [PATCH 19/29] XPMPCreatePlaneWithModelName adds plane with a defined model name It bypasses the internal model matching of libxplanemp and lets external applications do the model matching themselves. --- include/XPMPMultiplayer.h | 8 +++++++ src/XPMPMultiplayer.cpp | 46 ++++++++++++++++++++++++++++++++++++++- src/XPMPMultiplayerVars.h | 4 ++-- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/include/XPMPMultiplayer.h b/include/XPMPMultiplayer.h index 4c2a95286..4dabe6c5b 100644 --- a/include/XPMPMultiplayer.h +++ b/include/XPMPMultiplayer.h @@ -379,6 +379,14 @@ void XPMPGetModelInfo(int inIndex, const char **outModelName, const char **outIc XPMPPlaneData_f inDataFunc, void * inRefcon); + XPMPPlaneID XPMPCreatePlaneWithModelName( + const char * inModelName, + const char * inICAOCode, + const char * inAirline, + const char * inLivery, + XPMPPlaneData_f inDataFunc, + void * inRefcon); + /* * XPMPDestroyPlane * diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index 98a52e61c..948499831 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -27,6 +27,7 @@ #include "XPMPMultiplayerCSL.h" #include +#include #include #include #include @@ -345,7 +346,50 @@ XPMPPlaneID XPMPCreatePlane( iter->first.first(plane, xpmp_PlaneNotification_Created, iter->first.second); } return plane; -} +} + +bool CompareCaseInsensitive(string strFirst, string strSecond) +{ + // Convert both strings to upper case by transfrom() before compare. + transform(strFirst.begin(), strFirst.end(), strFirst.begin(), static_cast(std::toupper)); + transform(strSecond.begin(), strSecond.end(), strSecond.begin(), static_cast(std::toupper)); + return strFirst == strSecond; +} + +XPMPPlaneID XPMPCreatePlaneWithModelName(const char *inModelName, const char *inICAOCode, const char *inAirline, const char *inLivery, XPMPPlaneData_f inDataFunc, void *inRefcon) +{ + XPMPPlanePtr plane = new XPMPPlane_t; + plane->icao = inICAOCode; + plane->livery = inLivery; + plane->airline = inAirline; + plane->dataFunc = inDataFunc; + plane->ref = inRefcon; + + // Find the model + for (auto &package : gPackages) + { + auto cslPlane = std::find_if(package.planes.begin(), package.planes.end(), [inModelName](CSLPlane_t p) { return CompareCaseInsensitive(p.modelName, inModelName); }); + if (cslPlane != package.planes.end()) + { + plane->model = &(*cslPlane); + } + } + if (!plane->model) return nullptr; + + plane->pos.size = sizeof(plane->pos); + plane->surface.size = sizeof(plane->surface); + plane->radar.size = sizeof(plane->radar); + plane->posAge = plane->radarAge = plane->surfaceAge = -1; + + gPlanes.push_back(plane); + + for (XPMPPlaneNotifierVector::iterator iter = gObservers.begin(); iter != + gObservers.end(); ++iter) + { + iter->first.first(plane, xpmp_PlaneNotification_Created, iter->first.second); + } + return plane; +} void XPMPDestroyPlane(XPMPPlaneID inID) { diff --git a/src/XPMPMultiplayerVars.h b/src/XPMPMultiplayerVars.h index 839573b43..5b9ad2b70 100644 --- a/src/XPMPMultiplayerVars.h +++ b/src/XPMPMultiplayerVars.h @@ -154,12 +154,12 @@ struct XPMPPlane_t { string icao; string airline; string livery; - CSLPlane_t * model; // May be null if no good match + CSLPlane_t * model = nullptr; // May be null if no good match bool good_livery; // is our paint correctly matched? // This callback is used to pull data from the client for posiitons, etc. XPMPPlaneData_f dataFunc; - void * ref; + void * ref = nullptr; // This is last known data we got for the plane, with timestamps. int posAge; From f61761f46610cf4ddc48129710e2e4976a08f0c3 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Fri, 25 Sep 2015 21:51:24 +0100 Subject: [PATCH 20/29] Better implementation of CompareCaseInsensitive. --- src/XPMPMultiplayer.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index 948499831..714a06ff0 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -348,12 +348,9 @@ XPMPPlaneID XPMPCreatePlane( return plane; } -bool CompareCaseInsensitive(string strFirst, string strSecond) +bool CompareCaseInsensitive(const string &a, const string &b) { - // Convert both strings to upper case by transfrom() before compare. - transform(strFirst.begin(), strFirst.end(), strFirst.begin(), static_cast(std::toupper)); - transform(strSecond.begin(), strSecond.end(), strSecond.begin(), static_cast(std::toupper)); - return strFirst == strSecond; + return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin(), [](char aa, char bb) { return toupper(aa) == toupper(bb); }); } XPMPPlaneID XPMPCreatePlaneWithModelName(const char *inModelName, const char *inICAOCode, const char *inAirline, const char *inLivery, XPMPPlaneData_f inDataFunc, void *inRefcon) From bc2cd6ab1e493bcf3781544265590b067fda0423 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Tue, 3 Nov 2015 23:57:00 +0000 Subject: [PATCH 21/29] Explicit conversions to inhibit MSVC2015 warnings. --- src/XPMPMultiplayer.cpp | 6 +++--- src/XPMPMultiplayerObj8.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index 714a06ff0..40e390058 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -285,12 +285,12 @@ void XPMPLoadPlanesIfNecessary(void) int XPMPGetNumberOfInstalledModels(void) { - int number = 0; + size_t number = 0; for (const auto& package : gPackages) { number += package.planes.size(); } - return number; + return static_cast(number); } void XPMPGetModelInfo(int inIndex, const char** outModelName, const char** outIcao, const char** outAirline, const char** outLivery) @@ -301,7 +301,7 @@ void XPMPGetModelInfo(int inIndex, const char** outModelName, const char** outIc if (counter + static_cast(package.planes.size()) < inIndex + 1) { - counter += package.planes.size(); + counter += static_cast(package.planes.size()); continue; } diff --git a/src/XPMPMultiplayerObj8.cpp b/src/XPMPMultiplayerObj8.cpp index 2a77ecbd2..d8f8ac6e8 100644 --- a/src/XPMPMultiplayerObj8.cpp +++ b/src/XPMPMultiplayerObj8.cpp @@ -171,7 +171,7 @@ void obj_init() NULL, NULL, NULL, NULL, obj_get_float_array, NULL, - NULL, NULL, reinterpret_cast(i), NULL); + NULL, NULL, reinterpret_cast(static_cast(i)), NULL); } } From 2b90b0caee2ef90b7af1a8346b9035a7128f5246 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Tue, 3 Nov 2015 23:57:14 +0000 Subject: [PATCH 22/29] Using safer casts. --- src/XPCAircraft.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/XPCAircraft.cpp b/src/XPCAircraft.cpp index 104a56664..79653629e 100644 --- a/src/XPCAircraft.cpp +++ b/src/XPCAircraft.cpp @@ -6,7 +6,7 @@ XPCAircraft::XPCAircraft( const char * inLivery) { mPlane = XPMPCreatePlane(inICAOCode, inAirline, inLivery, AircraftCB, - reinterpret_cast(this)); + static_cast(this)); } XPCAircraft::~XPCAircraft() @@ -20,7 +20,7 @@ XPMPPlaneCallbackResult XPCAircraft::AircraftCB( void * ioData, void * inRefcon) { - XPCAircraft * me = reinterpret_cast(inRefcon); + XPCAircraft * me = static_cast(inRefcon); switch(inDataType) { case xpmpDataType_Position: return me->GetPlanePosition((XPMPPlanePosition_t *) ioData); From 13fef465d87f14a7cb0a1b2235f4da1768ea332a Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Tue, 10 Nov 2015 14:34:59 +0100 Subject: [PATCH 23/29] Fix gcc clobbered warning --- src/BitmapUtils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BitmapUtils.cpp b/src/BitmapUtils.cpp index 43a9193ec..fa32476f5 100644 --- a/src/BitmapUtils.cpp +++ b/src/BitmapUtils.cpp @@ -872,10 +872,10 @@ int CreateBitmapFromPNG(const char * inFilePath, struct ImageInfo * outImageInf png_structp pngPtr = NULL; png_infop infoPtr = NULL; unsigned char * volatile buffer = NULL; - FILE * file = NULL; + FILE * volatile file = NULL; size_t fileLength = 0; outImageInfo->data = NULL; - char** rows = NULL; + char** volatile rows = NULL; double lcl_gamma; // This will be the gamma of the file if it has one. #if APL // Macs and PCs have different gamma responses. double screen_gamma=1.8; // Darks look darker and brights brighter on the PC. From 3ca44d43fb7c2d23d2fe8a1d23d481b20539b3ba Mon Sep 17 00:00:00 2001 From: Chris Collins Date: Tue, 23 Jun 2015 21:36:47 +1000 Subject: [PATCH 24/29] BUGFIX: When we have valid stale plane data, let the renderer know it's stale, not invalid --- src/XPMPMultiplayer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index 40e390058..a3689c27a 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -508,6 +508,7 @@ XPMPPlaneCallbackResult XPMPGetPlaneData( XPMPPlanePosition_t * posD = (XPMPPlanePosition_t *) outData; memcpy(posD, &plane->pos, XPMP_TMIN(posD->size, plane->pos.size)); + result = xpmpData_Unchanged; break; } @@ -522,6 +523,8 @@ XPMPPlaneCallbackResult XPMPGetPlaneData( XPMPPlaneSurfaces_t * surfD = (XPMPPlaneSurfaces_t *) outData; memcpy(surfD, &plane->surface, XPMP_TMIN(surfD->size, plane->surface.size)); + result = xpmpData_Unchanged; + break; } case xpmpDataType_Radar: @@ -535,6 +538,8 @@ XPMPPlaneCallbackResult XPMPGetPlaneData( XPMPPlaneRadar_t * radD = (XPMPPlaneRadar_t *) outData; memcpy(radD, &plane->radar, XPMP_TMIN(radD->size, plane->radar.size)); + result = xpmpData_Unchanged; + break; } } From ed59e03a9ad072038947835d0f64988f5238a42b Mon Sep 17 00:00:00 2001 From: Chris Collins Date: Wed, 24 Jun 2015 12:31:38 +1000 Subject: [PATCH 25/29] Fix missing include --- src/XPMPPlaneRenderer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/XPMPPlaneRenderer.cpp b/src/XPMPPlaneRenderer.cpp index 63b0c4b61..953d4d8ae 100644 --- a/src/XPMPPlaneRenderer.cpp +++ b/src/XPMPPlaneRenderer.cpp @@ -26,6 +26,7 @@ #include "XPMPMultiplayerCSL.h" #include "XPMPMultiplayerVars.h" #include "XPMPMultiplayerObj.h" +#include "XPMPMultiplayerObj8.h" #include "XPLMGraphics.h" #include "XPLMDisplay.h" From 5e236443acf6c1bcdb2a2a6485d24216412feb7c Mon Sep 17 00:00:00 2001 From: Chris Collins Date: Wed, 24 Jun 2015 19:01:35 +1000 Subject: [PATCH 26/29] cmake-ify for Linux. Remove use of printf. --- CMakeLists.txt | 44 +++++++++++++++++++++++++++++++++++ cmake/Modules/FindXPSDK.cmake | 41 ++++++++++++++++++++++++++++++++ src/XPMPMultiplayerObj.cpp | 11 ++++++--- 3 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 cmake/Modules/FindXPSDK.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..57d784c5f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 3.0) +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules" ${CMAKE_MODULE_PATH}) + +find_package(XPSDK REQUIRED) + +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + add_definitions(-DLIN=1) + #set(XPMP_PLATFORM_SOURCES + # src/PlatformUtils.lin.cpp) +elseif(CMAKE_SYSTEM_NAME MATCHES "Windows") + add_definitions(-DIBM=1) + #set(XPMP_PLATFORM_SOURCES + # src/PlatformUtils.win.cpp) +elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") + add_definitions(-DAPL=1) + #set(XPMP_PLATFORM_SOURCES + # src/PlatformUtils.mac.cpp) +endif() + +add_definitions(-DXPLM200=1 -DXPLM210=1) + +add_library(xplanemp + ${XPMP_PLATFORM_SOURCES} + src/BitmapUtils.cpp + src/TexUtils.cpp + src/XObjDefs.cpp + src/XObjReadWrite.cpp + src/XOGLUtils.cpp + src/XPCAircraft.cpp + src/XPMPMultiplayer.cpp + src/XPMPMultiplayerCSL.cpp + src/XPMPMultiplayerObj8.cpp + src/XPMPMultiplayerObj.cpp + src/XPMPMultiplayerVars.cpp + src/XPMPPlaneRenderer.cpp + src/XUtils.cpp) +target_include_directories(xplanemp + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${XPSDK_XPLM_INCLUDE_DIRS} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src) +target_link_libraries(xplanemp + PUBLIC ${XPSDK_XPLM_LIBRARIES}) diff --git a/cmake/Modules/FindXPSDK.cmake b/cmake/Modules/FindXPSDK.cmake new file mode 100644 index 000000000..24bb463a2 --- /dev/null +++ b/cmake/Modules/FindXPSDK.cmake @@ -0,0 +1,41 @@ +find_path(XPSDK_DIR + NAMES + CHeaders/XPLM/XPLMDefs.h + CHeaders/Wrappers/XPCDisplay.h) +if(XPSDK_DIR) + set(XPSDK_FOUND) + if(CMAKE_SIZE_OF_VOID_P EQUAL 8) + set(WSIZE "_64") + endif() + if(CMAKE_SYSTEM_NAME MATCHES "Linux") + set(XPSDK_ARCH "Lin") + elseif(CMAKE_SYSTEM_NAME MATCHES "Windows") + set(XPSDK_ARCH "Win") + elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(XPSDK_ARCH "Mac") + endif() + + set(XPSDK_INCLUDE_DIRS ${XPSDK_DIR}/CHeaders) + set(XPSDK_LIBRARY_DIRS ${XPSDK_DIR}/Libraries/${XPARCH}) + + # linux doesn't have linking stubs for XPLM/XPWidgets! + if(CMAKE_SYSTEM_NAME MATCHES "Windows") + set(XPSDK_XPLM_LIBRARIES ${XPSDK_LIBRARY_DIRS}/XPLM${WSIZE}.lib) + set(XPSDK_XPWIDGETS_LIBRARIES ${XPSDK_LIBRARY_DIRS}/XPWidgets${WSIZE}.lib) + elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(XPSDK_XPLM_LIBRARIES ${XPSDK_LIBRARY_DIRS}/XPLM.framework) + set(XPSDK_XPWIDGETS_LIBRARIES ${XPSDK_LIBRARY_DIRS}/XPWidgets.framework) + endif() + + set(XPSDK_XPLM_INCLUDE_DIRS ${XPSDK_DIR}/CHeaders/XPLM) + set(XPSDK_XPWIDGETS_INCLUDE_DIRS ${XPSDK_DIR}/CHeaders/Widgets) + set(XPSDK_WRAPPERS_INCLUDE_DIRS ${XPSDK_DIR}/CHeaders/Wrappers) + file(GLOB XPSDK_WRAPPERS_SOURCES ${XPSDK_DIR}/CHeaders/Wrappers/*.cpp) +else() + set(XPSDK_FOUND) + set(XPSDK_NOT_FOUND_MESSAGE "Could not find the XPlane Plugin SDK - please set XPSDK_DIR to the top directory of the SDK") + if(XPSDK_FIND_REQUIRED) + message(SEND_ERROR "Couldn't find Required XPlane Plugin SDK") + endif() +endif() + diff --git a/src/XPMPMultiplayerObj.cpp b/src/XPMPMultiplayerObj.cpp index 278b7ce8e..0aa050dbc 100644 --- a/src/XPMPMultiplayerObj.cpp +++ b/src/XPMPMultiplayerObj.cpp @@ -31,7 +31,8 @@ #include #include -#include +#include +#include #include "XPLMGraphics.h" #include "XPLMUtilities.h" @@ -345,8 +346,12 @@ int OBJ_LoadModel(const char * inFilePath) tex_path += sObjects.back().obj.texture; tex_path += ".png"; sObjects.back().texnum = OBJ_LoadTexture(tex_path.c_str(), false); - if(sObjects.back().texnum == 0) - printf("WARNING: %s failed to load for %s.\n", tex_path.c_str(),inFilePath); + if(sObjects.back().texnum == 0) { + char debug[500]; + snprintf(debug, 500, "WARNING: %s failed to load for %s.\n", tex_path.c_str(),inFilePath); + debug[499] = '\0'; + XPLMDebugString(debug); + } tex_path = path; p = tex_path.find_last_of("\\:/");//XPLMGetDirectorySeparator()); From 7ae92c47a4a034aa5112a62e0f12b777ddb4b08f Mon Sep 17 00:00:00 2001 From: Chris Collins Date: Wed, 24 Jun 2015 21:23:29 +1000 Subject: [PATCH 27/29] CMakeFiles for XSB --- CMakeLists.txt | 15 ++++++++++----- cmake/Modules/FindXPSDK.cmake | 14 +++++++------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 57d784c5f..1df048c82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,11 @@ cmake_minimum_required(VERSION 3.0) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules" ${CMAKE_MODULE_PATH}) - find_package(XPSDK REQUIRED) + if(CMAKE_SYSTEM_NAME MATCHES "Linux") add_definitions(-DLIN=1) + find_package(PNG) #set(XPMP_PLATFORM_SOURCES # src/PlatformUtils.lin.cpp) elseif(CMAKE_SYSTEM_NAME MATCHES "Windows") @@ -16,6 +17,9 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") #set(XPMP_PLATFORM_SOURCES # src/PlatformUtils.mac.cpp) endif() +if(PNG_FOUND) + add_definitions(-DBITMAP_USE_PNG=1) +endif() add_definitions(-DXPLM200=1 -DXPLM210=1) @@ -36,9 +40,10 @@ add_library(xplanemp src/XUtils.cpp) target_include_directories(xplanemp PUBLIC + ${XPSDK_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/include - ${XPSDK_XPLM_INCLUDE_DIRS} - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/src) + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${PNG_INCLUDE_DIRS}) target_link_libraries(xplanemp - PUBLIC ${XPSDK_XPLM_LIBRARIES}) + PUBLIC ${XPSDK_XPLM_LIBRARIES} ${PNG_LIBRARIES}) +set_target_properties(xplanemp PROPERTIES POSITION_INDEPENDENT_CODE ON) diff --git a/cmake/Modules/FindXPSDK.cmake b/cmake/Modules/FindXPSDK.cmake index 24bb463a2..f48a0f231 100644 --- a/cmake/Modules/FindXPSDK.cmake +++ b/cmake/Modules/FindXPSDK.cmake @@ -3,20 +3,24 @@ find_path(XPSDK_DIR CHeaders/XPLM/XPLMDefs.h CHeaders/Wrappers/XPCDisplay.h) if(XPSDK_DIR) - set(XPSDK_FOUND) + set(XPSDK_FOUND TRUE) if(CMAKE_SIZE_OF_VOID_P EQUAL 8) set(WSIZE "_64") endif() if(CMAKE_SYSTEM_NAME MATCHES "Linux") set(XPSDK_ARCH "Lin") + set(XPSDK_DEFINITIONS "-DLIN=1") elseif(CMAKE_SYSTEM_NAME MATCHES "Windows") set(XPSDK_ARCH "Win") + set(XPSDK_DEFINITIONS "-DIBM=1") elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") set(XPSDK_ARCH "Mac") + set(XPSDK_DEFINITIONS "-DAPL=1") endif() - set(XPSDK_INCLUDE_DIRS ${XPSDK_DIR}/CHeaders) - set(XPSDK_LIBRARY_DIRS ${XPSDK_DIR}/Libraries/${XPARCH}) + set(XPSDK_INCLUDE_DIRS ${XPSDK_DIR}/CHeaders/XPLM ${XPSDK_DIR}/CHeaders/Widgets ${XPSDK_DIR}/CHeaders/Wrappers) + set(XPSDK_LIBRARY_DIRS ${XPSDK_DIR}/Libraries/${XPSDK_ARCH}) + file(GLOB XPSDK_WRAPPERS_SOURCES ${XPSDK_DIR}/CHeaders/Wrappers/*.cpp) # linux doesn't have linking stubs for XPLM/XPWidgets! if(CMAKE_SYSTEM_NAME MATCHES "Windows") @@ -27,10 +31,6 @@ if(XPSDK_DIR) set(XPSDK_XPWIDGETS_LIBRARIES ${XPSDK_LIBRARY_DIRS}/XPWidgets.framework) endif() - set(XPSDK_XPLM_INCLUDE_DIRS ${XPSDK_DIR}/CHeaders/XPLM) - set(XPSDK_XPWIDGETS_INCLUDE_DIRS ${XPSDK_DIR}/CHeaders/Widgets) - set(XPSDK_WRAPPERS_INCLUDE_DIRS ${XPSDK_DIR}/CHeaders/Wrappers) - file(GLOB XPSDK_WRAPPERS_SOURCES ${XPSDK_DIR}/CHeaders/Wrappers/*.cpp) else() set(XPSDK_FOUND) set(XPSDK_NOT_FOUND_MESSAGE "Could not find the XPlane Plugin SDK - please set XPSDK_DIR to the top directory of the SDK") From 9c6fa160324b9a73bf00f1c5b6e1d6d67b5fab54 Mon Sep 17 00:00:00 2001 From: Chris Collins Date: Thu, 25 Jun 2015 02:48:38 +1000 Subject: [PATCH 28/29] Fix to build on OSX --- CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1df048c82..c3eac82a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,8 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") add_definitions(-DAPL=1) #set(XPMP_PLATFORM_SOURCES # src/PlatformUtils.mac.cpp) + find_library(OPENGL OpenGL) + set(XPMP_PLATFORM_LIBRARIES ${OPENGL}) endif() if(PNG_FOUND) add_definitions(-DBITMAP_USE_PNG=1) @@ -45,5 +47,8 @@ target_include_directories(xplanemp ${CMAKE_CURRENT_SOURCE_DIR}/src ${PNG_INCLUDE_DIRS}) target_link_libraries(xplanemp - PUBLIC ${XPSDK_XPLM_LIBRARIES} ${PNG_LIBRARIES}) + PUBLIC ${XPSDK_XPLM_LIBRARIES} + ${PNG_LIBRARIES} + ${XPMP_PLATFORM_LIBRARIES}) set_target_properties(xplanemp PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(xplanemp PUBLIC XUTILS_EXCLUDE_MAC_CRAP=1) \ No newline at end of file From 8fd66aa8fa3887995756e2e04f8d92305366389e Mon Sep 17 00:00:00 2001 From: Chris Collins Date: Thu, 25 Jun 2015 10:23:45 +1000 Subject: [PATCH 29/29] don't force PIC here, let enclosing project do it --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c3eac82a9..1800e0ad8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,5 +50,5 @@ target_link_libraries(xplanemp PUBLIC ${XPSDK_XPLM_LIBRARIES} ${PNG_LIBRARIES} ${XPMP_PLATFORM_LIBRARIES}) -set_target_properties(xplanemp PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_compile_definitions(xplanemp PUBLIC XUTILS_EXCLUDE_MAC_CRAP=1) \ No newline at end of file +target_compile_definitions(xplanemp PUBLIC XUTILS_EXCLUDE_MAC_CRAP=1) +