From 14ff4f5dbee74aae3aa1c1cdb76552536c75ba1d Mon Sep 17 00:00:00 2001 From: csBlueChip Date: Thu, 13 Aug 2009 17:35:15 +0000 Subject: [PATCH] Sorry --- GRRLIB-400/GRRLIB/GRRLIB.c | 1389 ------- GRRLIB-400/GRRLIB/GRRLIB.h | 177 - GRRLIB-400/GRRLIB/GRRLIB_addon.c | 133 - GRRLIB-400/GRRLIB/GRRLIB_addon.h | 33 - GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.c | 32 - GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.h | 14 - .../GRRLIB/GRRLIB_addon/GRRLIBbutton.png | Bin 377 -> 0 bytes GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBfont.c | 231 -- GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBfont.h | 14 - GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBfont.png | Bin 3559 -> 0 bytes GRRLIB-400/lib/libjpeg.a | Bin 184618 -> 0 bytes GRRLIB-400/lib/libjpeg/jconfig.h | 45 - GRRLIB-400/lib/libjpeg/jmorecfg.h | 363 -- GRRLIB-400/lib/libjpeg/jpeglib.h | 1097 ----- GRRLIB-400/lib/libjpeg/jpgogc.h | 29 - GRRLIB-400/lib/libpng.a | Bin 237236 -> 0 bytes GRRLIB-400/lib/libpng/png.h | 3569 ----------------- GRRLIB-400/lib/libpng/pngconf.h | 1481 ------- GRRLIB-400/lib/libpng/pngu/pngu.c | 1129 ------ GRRLIB-400/lib/libpng/pngu/pngu.h | 171 - 20 files changed, 9907 deletions(-) delete mode 100644 GRRLIB-400/GRRLIB/GRRLIB.c delete mode 100644 GRRLIB-400/GRRLIB/GRRLIB.h delete mode 100644 GRRLIB-400/GRRLIB/GRRLIB_addon.c delete mode 100644 GRRLIB-400/GRRLIB/GRRLIB_addon.h delete mode 100644 GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.c delete mode 100644 GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.h delete mode 100644 GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.png delete mode 100644 GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBfont.c delete mode 100644 GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBfont.h delete mode 100644 GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBfont.png delete mode 100644 GRRLIB-400/lib/libjpeg.a delete mode 100644 GRRLIB-400/lib/libjpeg/jconfig.h delete mode 100644 GRRLIB-400/lib/libjpeg/jmorecfg.h delete mode 100644 GRRLIB-400/lib/libjpeg/jpeglib.h delete mode 100644 GRRLIB-400/lib/libjpeg/jpgogc.h delete mode 100644 GRRLIB-400/lib/libpng.a delete mode 100644 GRRLIB-400/lib/libpng/png.h delete mode 100644 GRRLIB-400/lib/libpng/pngconf.h delete mode 100644 GRRLIB-400/lib/libpng/pngu/pngu.c delete mode 100644 GRRLIB-400/lib/libpng/pngu/pngu.h diff --git a/GRRLIB-400/GRRLIB/GRRLIB.c b/GRRLIB-400/GRRLIB/GRRLIB.c deleted file mode 100644 index 82c3a46..0000000 --- a/GRRLIB-400/GRRLIB/GRRLIB.c +++ /dev/null @@ -1,1389 +0,0 @@ -/*=========================================== - GRRLIB (GX version) 4.0.0 - Code : NoNameNo - Additional Code : Crayon & Xane - GX hints : RedShade -===========================================*/ - -#include -#include -#include -#include -#include -#include -#include "../lib/libpng/pngu/pngu.h" -#include "../lib/libjpeg/jpeglib.h" -#include "GRRLIB.h" -#include - - -#define DEFAULT_FIFO_SIZE (256 * 1024) /**< GX fifo buffer size. */ - - -u32 fb = 0; -void *xfb[2] = {NULL, NULL}; -Mtx GXmodelView2D; -GXRModeObj *rmode; -void *gp_fifo = NULL; - -// Declare Static Functions -static GRRLIB_drawSettings GRRLIB_Settings; -static void RawTo4x4RGBA(const unsigned char *src, void *dst, const unsigned int width, const unsigned int height); - -// Declare Inline Functions -inline void GRRLIB_FillScreen(u32 color); -inline void GRRLIB_Plot(f32 x, f32 y, u32 color); -inline void GRRLIB_Line(f32 x1, f32 y1, f32 x2, f32 y2, u32 color); -inline void GRRLIB_Rectangle(f32 x, f32 y, f32 width, f32 height, u32 color, u8 filled); -inline void GRRLIB_Circle(f32 x, f32 y, f32 radius, u32 color, u8 filled); -inline void GRRLIB_DrawImg(f32 xpos, f32 ypos, struct GRRLIB_texImg *tex, float degrees, float scaleX, f32 scaleY, u32 color ); -inline void GRRLIB_DrawImgQuad(Vector pos[4], struct GRRLIB_texImg *tex, u32 color); -inline void GRRLIB_DrawTile(f32 xpos, f32 ypos, struct GRRLIB_texImg *tex, float degrees, float scaleX, f32 scaleY, u32 color, int frame); -inline void GRRLIB_DrawTileQuad(Vector pos[4], struct GRRLIB_texImg *tex, u32 color,int frame); - - -/** - * Turn AntiAliasing on/off. - * @param aa Set to true to enable AntiAliasing (Default: Enabled). - */ -void GRRLIB_SetAntiAliasing(bool aa) { - GRRLIB_Settings.antialias = aa; -} - -/** - * Get current AntiAliasing setting. - * @return True if AntiAliasing is enabled. - */ -bool GRRLIB_GetAntiAliasing() { - return GRRLIB_Settings.antialias; -} - -/** - * Set a blending mode. - * @param blendmode The blending mode to use (Default: GRRLIB_BLEND_ALPHA). - */ -void GRRLIB_SetBlend(unsigned char blendmode) { - GRRLIB_Settings.blend = blendmode; - switch (GRRLIB_Settings.blend) { - case GRRLIB_BLEND_ALPHA: - GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR); - break; - case GRRLIB_BLEND_ADD: - GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_DSTALPHA, GX_LO_CLEAR); - break; - case GRRLIB_BLEND_SCREEN: - GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCCLR, GX_BL_DSTALPHA, GX_LO_CLEAR); - break; - case GRRLIB_BLEND_MULTI: - GX_SetBlendMode(GX_BM_SUBSTRACT, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR); - break; - case GRRLIB_BLEND_INV: - GX_SetBlendMode(GX_BM_BLEND, GX_BL_INVSRCCLR, GX_BL_INVSRCCLR, GX_LO_CLEAR); - break; - } -} - -/** - * Get the current blending mode. - * @return The current blending mode. - */ -unsigned char GRRLIB_GetBlend() { - return GRRLIB_Settings.blend; -} - -/** - * Clear screen with a specific color. - * @param color The color to use to fill the screen. - */ -inline void GRRLIB_FillScreen(u32 color) { - GRRLIB_Rectangle(-40, -40, 680, 520, color, 1); -} - -/** - * Draw a dot. - * @param x Specifies the x-coordinate of the dot. - * @param y Specifies the y-coordinate of the dot. - * @param color The color of the dot in RGBA format. - */ -inline void GRRLIB_Plot(f32 x, f32 y, u32 color) { - Vector v[] = {{x,y,0.0f}}; - u32 ncolor[] = {color}; - - GRRLIB_NPlot(v, ncolor, 1); -} - -/** - * Draw an array of points. - * @param v Array containing the points. - * @param color The color of the points in RGBA format. - * @param n Number of points in the vector array. - */ -void GRRLIB_NPlot(Vector v[], u32 color[], long n) { - GRRLIB_GXEngine(v, color, n, GX_POINTS); -} - -/** - * Draw a line. - * @param x1 Starting point for line for the x coordinate. - * @param y1 Starting point for line for the y coordinate. - * @param x2 Ending point for line for the x coordinate. - * @param y2 Ending point for line for the x coordinate. - * @param color Line color in RGBA format. - */ -inline void GRRLIB_Line(f32 x1, f32 y1, f32 x2, f32 y2, u32 color) { - Vector v[] = {{x1,y1,0.0f}, {x2,y2,0.0f}}; - u32 ncolor[] = {color,color}; - - GRRLIB_NGone(v, ncolor, 2); -} - -/** - * Draw a rectangle. - * @param x Specifies the x-coordinate of the upper-left corner of the rectangle. - * @param y Specifies the y-coordinate of the upper-left corner of the rectangle. - * @param width The width of the rectangle. - * @param height The height of the rectangle. - * @param color The color of the rectangle in RGBA format. - * @param filled Set to true to fill the rectangle. - */ -inline void GRRLIB_Rectangle(f32 x, f32 y, f32 width, f32 height, u32 color, u8 filled) { - f32 x2 = x+width; - f32 y2 = y+height; - Vector v[] = {{x,y,0.0f}, {x2,y,0.0f}, {x2,y2,0.0f}, {x,y2,0.0f}, {x,y,0.0f}}; - u32 ncolor[] = {color,color,color,color,color}; - - if (!filled) { - GRRLIB_NGone(v, ncolor, 5); - } - else { - GRRLIB_NGoneFilled(v, ncolor, 4); - } -} - -/** - * Draw a circle. - * @author Dark_Link - * @param x Specifies the x-coordinate of the circle. - * @param y Specifies the y-coordinate of the circle. - * @param radius The radius of the circle. - * @param color The color of the circle in RGBA format. - * @param filled Set to true to fill the circle. - */ -inline void GRRLIB_Circle(f32 x, f32 y, f32 radius, u32 color, u8 filled) { - Vector v[36]; - u32 ncolor[36]; - u32 a; - f32 ra; - f32 G_DTOR = M_DTOR * 10; - - for (a = 0; a < 36; a++) { - ra = a * G_DTOR; - - v[a].x = cos(ra) * radius + x; - v[a].y = sin(ra) * radius + y; - v[a].z = 0.0f; - ncolor[a] = color; - } - - if (!filled) { - GRRLIB_GXEngine(v, ncolor, 36, GX_LINESTRIP); - } - else { - GRRLIB_GXEngine(v, ncolor, 36, GX_TRIANGLEFAN); - } -} - -/** - * Draw a polygon. - * @param v The vector containing the coordinates of the polygon. - * @param color The color of the filled polygon in RGBA format. - * @param n Number of points in the vector. - */ -void GRRLIB_NGone(Vector v[], u32 color[], long n) { - GRRLIB_GXEngine(v, color, n, GX_LINESTRIP); -} - -/** - * Draw a filled polygon. - * @param v The vector containing the coordinates of the polygon. - * @param color The color of the filled polygon in RGBA format. - * @param n Number of points in the vector. - */ -void GRRLIB_NGoneFilled(Vector v[], u32 color[], long n) { - GRRLIB_GXEngine(v, color, n, GX_TRIANGLEFAN); -} - -/** - * Convert a raw BMP (RGB, no alpha) to 4x4RGBA. - * @author DragonMinded - * @param src - * @param dst - * @param width - * @param height -*/ -static void RawTo4x4RGBA(const unsigned char *src, void *dst, const unsigned int width, const unsigned int height) { - unsigned int block; - unsigned int i; - unsigned int c; - unsigned int ar; - unsigned int gb; - unsigned char *p = (unsigned char*)dst; - - for (block = 0; block < height; block += 4) { - for (i = 0; i < width; i += 4) { - /* Alpha and Red */ - for (c = 0; c < 4; ++c) { - for (ar = 0; ar < 4; ++ar) { - /* Alpha pixels */ - *p++ = 255; - /* Red pixels */ - *p++ = src[((i + ar) + ((block + c) * width)) * 3]; - } - } - - /* Green and Blue */ - for (c = 0; c < 4; ++c) { - for (gb = 0; gb < 4; ++gb) { - /* Green pixels */ - *p++ = src[(((i + gb) + ((block + c) * width)) * 3) + 1]; - /* Blue pixels */ - *p++ = src[(((i + gb) + ((block + c) * width)) * 3) + 2]; - } - } - } /* i */ - } /* block */ -} - -/** - * Initialize a tile set. - * @param tex The texture to initialize. - * @param tilew Width of the tile. - * @param tileh Height of the tile. - * @param tilestart Offset for starting position (Used in fonts). - */ -void GRRLIB_InitTileSet(struct GRRLIB_texImg *tex, unsigned int tilew, unsigned int tileh, unsigned int tilestart) { - tex->tilew = tilew; - tex->tileh = tileh; - if (tilew) // Avoid division by zero - tex->nbtilew = tex->w / tilew; - if (tileh) // Avoid division by zero - tex->nbtileh = tex->h / tileh; - tex->tilestart = tilestart; - tex->tiledtex = true; - GRRLIB_SetHandle( tex, 0, 0 ); -} - -/** - * Load a texture from a buffer. - * @param my_png the PNG buffer to load. - * @return A GRRLIB_texImg structure filled with image informations. - */ -GRRLIB_texImg *GRRLIB_LoadTexturePNG(const unsigned char my_png[]) { - PNGUPROP imgProp; - IMGCTX ctx; - GRRLIB_texImg *my_texture = (struct GRRLIB_texImg *)calloc(1, sizeof(GRRLIB_texImg)); - - if(my_texture != NULL) { - ctx = PNGU_SelectImageFromBuffer(my_png); - PNGU_GetImageProperties(ctx, &imgProp); - my_texture->data = memalign(32, imgProp.imgWidth * imgProp.imgHeight * 4); - if(my_texture->data != NULL) { - PNGU_DecodeTo4x4RGBA8(ctx, imgProp.imgWidth, imgProp.imgHeight, my_texture->data, 255); - PNGU_ReleaseImageContext(ctx); - my_texture->w = imgProp.imgWidth; - my_texture->h = imgProp.imgHeight; - GRRLIB_SetHandle( my_texture, 0, 0 ); - GRRLIB_FlushTex( my_texture ); - } - } - return my_texture; -} - -/** - * Load a texture from a buffer. - * Take care to have the JPG finnish with 0xFF 0xD9!! - * @author DrTwox - * @param my_jpg The JPEG buffer to load. - * @return A GRRLIB_texImg structure filled with image informations. - */ -GRRLIB_texImg *GRRLIB_LoadTextureJPG(const unsigned char my_jpg[]) { - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - GRRLIB_texImg *my_texture = (struct GRRLIB_texImg *)calloc(1, sizeof(GRRLIB_texImg)); - int n = 0; - unsigned int i; - - if(my_texture == NULL) - return NULL; - - if ((my_jpg[0]==0xFF) && (my_jpg[1]==0xD8) && (my_jpg[2]==0xFF)) { - while(true) { - if ((my_jpg[n]==0xFF) && (my_jpg[n+1]==0xD9)) - break; - n++; - } - n+=2; - } - - jpeg_create_decompress(&cinfo); - cinfo.err = jpeg_std_error(&jerr); - cinfo.progress = NULL; - jpeg_memory_src(&cinfo, my_jpg, n); - jpeg_read_header(&cinfo, TRUE); - jpeg_start_decompress(&cinfo); - unsigned char *tempBuffer = (unsigned char*) malloc(cinfo.output_width * cinfo.output_height * cinfo.num_components); - JSAMPROW row_pointer[1]; - row_pointer[0] = (unsigned char*) malloc(cinfo.output_width * cinfo.num_components); - size_t location = 0; - while (cinfo.output_scanline < cinfo.output_height) { - jpeg_read_scanlines(&cinfo, row_pointer, 1); - for (i = 0; i < cinfo.image_width * cinfo.num_components; i++) { - /* Put the decoded scanline into the tempBuffer */ - tempBuffer[ location++ ] = row_pointer[0][i]; - } - } - - /* Create a buffer to hold the final texture */ - my_texture->data = memalign(32, cinfo.output_width * cinfo.output_height * 4); - RawTo4x4RGBA(tempBuffer, my_texture->data, cinfo.output_width, cinfo.output_height); - - /* Done - Do cleanup and release allocated memory */ - jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - free(row_pointer[0]); - free(tempBuffer); - - my_texture->w = cinfo.output_width; - my_texture->h = cinfo.output_height; - GRRLIB_SetHandle( my_texture, 0, 0 ); - GRRLIB_FlushTex( my_texture ); - return my_texture; -} - -/** - * Print formatted output. - * @param xpos Specifies the x-coordinate of the upper-left corner of the text. - * @param ypos Specifies the y-coordinate of the upper-left corner of the text. - * @param bmf The ByteMap font to use. - * @param zoom This is a factor by which the text size will be increase or decrease. - * @param text Text to draw. - * @param ... Optional arguments. - */ -void GRRLIB_PrintBMF(f32 xpos, f32 ypos, struct GRRLIB_bytemapFont *bmf, f32 zoom, const char *text, ...) { - unsigned int i, j, x, y, n, size; - char tmp[1024]; - - va_list argp; - va_start(argp, text); - size = vsprintf(tmp, text, argp); - va_end(argp); - - GRRLIB_texImg *tex_BMfont = GRRLIB_CreateEmptyTexture(640, 480); - - for (i=0; inbChar; j++) { - if (tmp[i] == bmf->charDef[j].character) { - n=0; - for (y=0; ycharDef[j].height; y++) { - for (x=0; xcharDef[j].width; x++) { - if (bmf->charDef[j].data[n]) { - GRRLIB_SetPixelTotexImg(xpos + x + bmf->charDef[j].relx, ypos + y + bmf->charDef[j].rely, - tex_BMfont, bmf->palette[bmf->charDef[j].data[n]]); - } - n++; - } - } - xpos += bmf->charDef[j].shift + bmf->addSpace; - break; - } - } - } - - GRRLIB_FlushTex( tex_BMfont ); - GRRLIB_DrawImg(0, 0, tex_BMfont, 0, 1, 1, 0xFFFFFFFF); - free(tex_BMfont->data); - free(tex_BMfont); -} - -/** - * Load a ByteMap font structure from a buffer. - * @param my_bmf The ByteMap font buffer to load. - * @return A GRRLIB_bytemapFont structure filled with BMF informations. - */ -GRRLIB_bytemapFont *GRRLIB_LoadBMF(const unsigned char my_bmf[]) { - GRRLIB_bytemapFont *fontArray = (struct GRRLIB_bytemapFont *)malloc(sizeof(GRRLIB_bytemapFont)); - int i, j = 1; - u8 lineheight, usedcolors, highestcolor, nbPalette; - short int sizeover, sizeunder, sizeinner, numcolpal; - u16 nbPixels; - - if (fontArray != NULL && my_bmf[0]==0xE1 && my_bmf[1]==0xE6 && my_bmf[2]==0xD5 && my_bmf[3]==0x1A) { - fontArray->version = my_bmf[4]; - lineheight = my_bmf[5]; - sizeover = my_bmf[6]; - sizeunder = my_bmf[7]; - fontArray->addSpace = my_bmf[8]; - sizeinner = my_bmf[9]; - usedcolors = my_bmf[10]; - highestcolor = my_bmf[11]; - nbPalette = my_bmf[16]; - numcolpal = 3 * nbPalette; - fontArray->palette = (u32 *)calloc(nbPalette + 1, sizeof(u32)); - for (i=0; i < numcolpal; i+=3) { - fontArray->palette[j++] = ((((my_bmf[i+17]<<2)+3)<<24) | (((my_bmf[i+18]<<2)+3)<<16) | (((my_bmf[i+19]<<2)+3)<<8) | 0xFF); - } - j = my_bmf[17 + numcolpal]; - fontArray->name = (char *)calloc(j + 1, sizeof(char)); - memcpy(fontArray->name, &my_bmf[18 + numcolpal], j); - j = 18 + numcolpal + j; - fontArray->nbChar = (my_bmf[j] | my_bmf[j+1]<<8); - fontArray->charDef = (GRRLIB_bytemapChar *)calloc(fontArray->nbChar, sizeof(GRRLIB_bytemapChar)); - j++; - for (i=0; i < fontArray->nbChar; i++) { - fontArray->charDef[i].character = my_bmf[++j]; - fontArray->charDef[i].width = my_bmf[++j]; - fontArray->charDef[i].height = my_bmf[++j]; - fontArray->charDef[i].relx = my_bmf[++j]; - fontArray->charDef[i].rely = my_bmf[++j]; - fontArray->charDef[i].shift = my_bmf[++j]; - nbPixels = fontArray->charDef[i].width * fontArray->charDef[i].height; - fontArray->charDef[i].data = (u8 *)malloc(nbPixels); - if (nbPixels && fontArray->charDef[i].data) { - memcpy(fontArray->charDef[i].data, &my_bmf[++j], nbPixels); - j += (nbPixels - 1); - } - } - } - return fontArray; -} - -/** - * Free memory allocated by ByteMap fonts. - * @param bmf A GRRLIB_bytemapFont structure. - */ -void GRRLIB_FreeBMF(GRRLIB_bytemapFont *bmf) { - unsigned int i; - - for (i=0; inbChar; i++) { - free(bmf->charDef[i].data); - } - free(bmf->charDef); - free(bmf->palette); - free(bmf->name); -} - -/** - * Load a texture from a buffer. - * @param my_img The JPEG or PNG buffer to load. - * @return A GRRLIB_texImg structure filled with image informations. - */ -GRRLIB_texImg *GRRLIB_LoadTexture(const unsigned char my_img[]) { - if (my_img[0]==0xFF && my_img[1]==0xD8 && my_img[2]==0xFF) { - return (GRRLIB_LoadTextureJPG(my_img)); - } - else { - return (GRRLIB_LoadTexturePNG(my_img)); - } -} - -/** - * Free memory allocated for texture. - * @param tex A GRRLIB_texImg structure. - */ -void GRRLIB_FreeTexture(struct GRRLIB_texImg *tex) { - free(tex->data); - free(tex); - tex = NULL; -} - -/** - * Create an empty texture. - * @param w Width of the new texture to create. - * @param h Height of the new texture to create. - * @return A GRRLIB_texImg structure newly created. - */ -GRRLIB_texImg *GRRLIB_CreateEmptyTexture(unsigned int w, unsigned int h) { - GRRLIB_texImg *my_texture = (struct GRRLIB_texImg *)calloc(1, sizeof(GRRLIB_texImg)); - - if(my_texture != NULL) { - my_texture->data = memalign(32, h * w * 4); - my_texture->w = w; - my_texture->h = h; - - // Initialize the texture - memset(my_texture->data, '\0', (h * w) << 2); - - GRRLIB_SetHandle(my_texture, 0, 0); - GRRLIB_FlushTex(my_texture); - } - return my_texture; -} - -/** - * Make a snapshot of the screen in a texture. - * @param tex A pointer to a texture representing the screen or NULL if an error occurs. - */ -void GRRLIB_Screen2Texture(GRRLIB_texImg *tex) { - if(tex->data != NULL) { - GX_SetTexCopySrc(0, 0, rmode->fbWidth, rmode->efbHeight); - GX_SetTexCopyDst(rmode->fbWidth, rmode->efbHeight, GX_TF_RGBA8, GX_FALSE); - GX_CopyTex(tex->data, GX_FALSE); - GX_PixModeSync(); - GRRLIB_FlushTex(tex); - } -} - -/** - * Draw a texture. - * @param xpos Specifies the x-coordinate of the upper-left corner. - * @param ypos Specifies the y-coordinate of the upper-left corner. - * @param tex The texture to draw. - * @param degrees Angle of rotation. - * @param scaleX Specifies the x-coordinate scale. -1 could be used for flipping the texture horizontally. - * @param scaleY Specifies the y-coordinate scale. -1 could be used for flipping the texture vertically. - * @param color Color in RGBA format. - */ -inline void GRRLIB_DrawImg(f32 xpos, f32 ypos, struct GRRLIB_texImg *tex, float degrees, float scaleX, f32 scaleY, u32 color) { - if (tex == NULL || tex->data == NULL) { - return; - } - - GXTexObj texObj; - u16 width, height; - Mtx m, m1, m2, mv; - - GX_InitTexObj(&texObj, tex->data, tex->w, tex->h, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - if (GRRLIB_Settings.antialias == false) { - GX_InitTexObjLOD(&texObj, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1); - } - - GX_LoadTexObj(&texObj, GX_TEXMAP0); - GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); - GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); - - width = tex->w * 0.5; - height = tex->h * 0.5; - guMtxIdentity(m1); - guMtxScaleApply(m1, m1, scaleX, scaleY, 1.0); - Vector axis = (Vector) {0, 0, 1}; - guMtxRotAxisDeg (m2, &axis, degrees); - guMtxConcat(m2, m1, m); - - guMtxTransApply(m, m, xpos+width+tex->handlex-tex->offsetx+(scaleX*( -tex->handley*sin(-DegToRad(degrees)) - tex->handlex*cos(-DegToRad(degrees)) )), ypos+height+tex->handley-tex->offsety+(scaleX*( -tex->handley*cos(-DegToRad(degrees)) + tex->handlex*sin(-DegToRad(degrees)) )), 0); - guMtxConcat(GXmodelView2D, m, mv); - - GX_LoadPosMtxImm(mv, GX_PNMTX0); - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position3f32(-width, -height, 0); - GX_Color1u32(color); - GX_TexCoord2f32(0, 0); - - GX_Position3f32(width, -height, 0); - GX_Color1u32(color); - GX_TexCoord2f32(1, 0); - - GX_Position3f32(width, height, 0); - GX_Color1u32(color); - GX_TexCoord2f32(1, 1); - - GX_Position3f32(-width, height, 0); - GX_Color1u32(color); - GX_TexCoord2f32(0, 1); - GX_End(); - GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); - - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); -} - -/** - * Draw a textured quad. - * @param pos Vector array of the 4 points. - * @param tex The texture to draw. - * @param color Color in RGBA format. - */ -inline void GRRLIB_DrawImgQuad(Vector pos[4], struct GRRLIB_texImg *tex, u32 color) { - if (tex == NULL || tex->data == NULL) { - return; - } - - GXTexObj texObj; - Mtx m, m1, m2, mv; - - GX_InitTexObj(&texObj, tex->data, tex->w, tex->h, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - if (GRRLIB_Settings.antialias == false) { - GX_InitTexObjLOD(&texObj, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1); - } - - GX_LoadTexObj(&texObj, GX_TEXMAP0); - GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); - GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); - - guMtxIdentity(m1); - guMtxScaleApply(m1, m1, 1, 1, 1.0); - Vector axis = (Vector) {0, 0, 1}; - guMtxRotAxisDeg (m2, &axis, 0); - guMtxConcat(m2, m1, m); - - guMtxConcat(GXmodelView2D, m, mv); - - GX_LoadPosMtxImm(mv, GX_PNMTX0); - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position3f32(pos[0].x, pos[0].y, 0); - GX_Color1u32(color); - GX_TexCoord2f32(0, 0); - - GX_Position3f32(pos[1].x, pos[1].y, 0); - GX_Color1u32(color); - GX_TexCoord2f32(1, 0); - - GX_Position3f32(pos[2].x, pos[2].y, 0); - GX_Color1u32(color); - GX_TexCoord2f32(1, 1); - - GX_Position3f32(pos[3].x, pos[3].y, 0); - GX_Color1u32(color); - GX_TexCoord2f32(0, 1); - GX_End(); - GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); - - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); -} - -/** - * Draw a tile. - * @param xpos Specifies the x-coordinate of the upper-left corner. - * @param ypos Specifies the y-coordinate of the upper-left corner. - * @param tex The texture containing the tile to draw. - * @param degrees Angle of rotation. - * @param scaleX Specifies the x-coordinate scale. -1 could be used for flipping the texture horizontally. - * @param scaleY Specifies the y-coordinate scale. -1 could be used for flipping the texture vertically. - * @param color Color in RGBA format. - * @param frame Specifies the frame to draw. - */ -inline void GRRLIB_DrawTile(f32 xpos, f32 ypos, struct GRRLIB_texImg *tex, float degrees, float scaleX, f32 scaleY, u32 color, int frame) { - if (tex == NULL || tex->data == NULL) { - return; - } - - GXTexObj texObj; - f32 width, height; - Mtx m, m1, m2, mv; - - // Frame Correction by spiffen - f32 FRAME_CORR = 0.001f; - f32 s1 = (((frame%tex->nbtilew))/(f32)tex->nbtilew)+(FRAME_CORR/tex->w); - f32 s2 = (((frame%tex->nbtilew)+1)/(f32)tex->nbtilew)-(FRAME_CORR/tex->w); - f32 t1 = (((int)(frame/tex->nbtilew))/(f32)tex->nbtileh)+(FRAME_CORR/tex->h); - f32 t2 = (((int)(frame/tex->nbtilew)+1)/(f32)tex->nbtileh)-(FRAME_CORR/tex->h); - - GX_InitTexObj(&texObj, tex->data, tex->tilew*tex->nbtilew, tex->tileh*tex->nbtileh, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - if (GRRLIB_Settings.antialias == false) { - GX_InitTexObjLOD(&texObj, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1); - } - GX_LoadTexObj(&texObj, GX_TEXMAP0); - - GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); - GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); - - width = tex->tilew * 0.5f; - height = tex->tileh * 0.5f; - guMtxIdentity(m1); - guMtxScaleApply(m1, m1, scaleX, scaleY, 1.0f); - - Vector axis = (Vector) {0, 0, 1}; - guMtxRotAxisDeg(m2, &axis, degrees); - guMtxConcat(m2, m1, m); - guMtxTransApply(m, m, xpos+width+tex->handlex-tex->offsetx+(scaleX*( -tex->handley*sin(-DegToRad(degrees)) - tex->handlex*cos(-DegToRad(degrees)) )), ypos+height+tex->handley-tex->offsety+(scaleX*( -tex->handley*cos(-DegToRad(degrees)) + tex->handlex*sin(-DegToRad(degrees)) )), 0); - guMtxConcat(GXmodelView2D, m, mv); - - GX_LoadPosMtxImm(mv, GX_PNMTX0); - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position3f32(-width, -height, 0); - GX_Color1u32(color); - GX_TexCoord2f32(s1, t1); - - GX_Position3f32(width, -height, 0); - GX_Color1u32(color); - GX_TexCoord2f32(s2, t1); - - GX_Position3f32(width, height, 0); - GX_Color1u32(color); - GX_TexCoord2f32(s2, t2); - - GX_Position3f32(-width, height, 0); - GX_Color1u32(color); - GX_TexCoord2f32(s1, t2); - GX_End(); - GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); - - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); -} - -/** - * Draw a tile in a quad. - * @param pos Vector array of the 4 points. - * @param tex The texture to draw. - * @param color Color in RGBA format. - * @param frame Specifies the frame to draw. - */ -inline void GRRLIB_DrawTileQuad(Vector pos[4], struct GRRLIB_texImg *tex, u32 color, int frame) { - if (tex == NULL || tex->data == NULL) { - return; - } - - GXTexObj texObj; - Mtx m, m1, m2, mv; - - // Frame Correction by spiffen - f32 FRAME_CORR = 0.001f; - f32 s1 = (((frame%tex->nbtilew))/(f32)tex->nbtilew)+(FRAME_CORR/tex->w); - f32 s2 = (((frame%tex->nbtilew)+1)/(f32)tex->nbtilew)-(FRAME_CORR/tex->w); - f32 t1 = (((int)(frame/tex->nbtilew))/(f32)tex->nbtileh)+(FRAME_CORR/tex->h); - f32 t2 = (((int)(frame/tex->nbtilew)+1)/(f32)tex->nbtileh)-(FRAME_CORR/tex->h); - - GX_InitTexObj(&texObj, tex->data, tex->tilew*tex->nbtilew, tex->tileh*tex->nbtileh, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - if (GRRLIB_Settings.antialias == false) { - GX_InitTexObjLOD(&texObj, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1); - } - GX_LoadTexObj(&texObj, GX_TEXMAP0); - - GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); - GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); - - guMtxIdentity(m1); - guMtxScaleApply(m1, m1, 1, 1, 1.0f); - - Vector axis = (Vector) {0, 0, 1}; - guMtxRotAxisDeg(m2, &axis, 0); - guMtxConcat(m2, m1, m); - - guMtxConcat(GXmodelView2D, m, mv); - - GX_LoadPosMtxImm(mv, GX_PNMTX0); - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position3f32(pos[0].x, pos[0].y, 0); - GX_Color1u32(color); - GX_TexCoord2f32(s1, t1); - - GX_Position3f32(pos[1].x, pos[1].y, 0); - GX_Color1u32(color); - GX_TexCoord2f32(s2, t1); - - GX_Position3f32(pos[2].x, pos[2].y, 0); - GX_Color1u32(color); - GX_TexCoord2f32(s2, t2); - - GX_Position3f32(pos[3].x, pos[3].y, 0); - GX_Color1u32(color); - GX_TexCoord2f32(s1, t2); - GX_End(); - GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); - - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); -} - -/** - * Print formatted output. - * @param xpos Specifies the x-coordinate of the upper-left corner of the text. - * @param ypos Specifies the y-coordinate of the upper-left corner of the text. - * @param tex The texture containing the character set. - * @param color Text color in RGBA format. The alpha channel is used to change the opacity of the text. - * @param zoom This is a factor by which the text size will be increase or decrease. - * @param text Text to draw. - * @param ... Optional arguments. - */ -void GRRLIB_Printf(f32 xpos, f32 ypos, struct GRRLIB_texImg *tex, u32 color, f32 zoom, const char *text, ...) { - if (tex == NULL || tex->data == NULL) { - return; - } - - int i, size; - char tmp[1024]; - - va_list argp; - va_start(argp, text); - size = vsprintf(tmp, text, argp); - va_end(argp); - - for (i = 0; i < size; i++) { - u8 c = tmp[i]-tex->tilestart; - GRRLIB_DrawTile(xpos+i*tex->tilew*zoom, ypos, tex, 0, zoom, zoom, color, c); - } -} - -/** - * Determine whether the specified point lies within the specified rectangle. - * @param hotx Specifies the x-coordinate of the upper-left corner of the rectangle. - * @param hoty Specifies the y-coordinate of the upper-left corner of the rectangle. - * @param hotw The width of the rectangle. - * @param hoth The height of the rectangle. - * @param wpadx Specifies the x-coordinate of the point. - * @param wpady Specifies the y-coordinate of the point. - * @return If the specified point lies within the rectangle, the return value is true otherwise it's false. - */ -bool GRRLIB_PtInRect(int hotx, int hoty, int hotw, int hoth, int wpadx, int wpady) { - return(((wpadx>=hotx) & (wpadx<=(hotx+hotw))) & ((wpady>=hoty) & (wpady<=(hoty+hoth)))); -} - -/** - * Determine whether a specified rectangle lies within another rectangle. - * @param rect1x Specifies the x-coordinate of the upper-left corner of the rectangle. - * @param rect1y Specifies the y-coordinate of the upper-left corner of the rectangle. - * @param rect1w Specifies the width of the rectangle. - * @param rect1h Specifies the height of the rectangle. - * @param rect2x Specifies the x-coordinate of the upper-left corner of the rectangle. - * @param rect2y Specifies the y-coordinate of the upper-left corner of the rectangle. - * @param rect2w Specifies the width of the rectangle. - * @param rect2h Specifies the height of the rectangle. - * @return If the specified rectangle lies within the other rectangle, the return value is true otherwise it's false. - */ -bool GRRLIB_RectInRect(int rect1x, int rect1y, int rect1w, int rect1h, int rect2x, int rect2y, int rect2w, int rect2h) { - return ((rect1x >= rect2x) && (rect1y >= rect2y) && - (rect1x+rect1w <= rect2x+rect2w) && (rect1y+rect1h <= rect2y+rect2h)); -} - -/** - * Determine whether a part of a specified rectangle lies on another rectangle. - * @param rect1x Specifies the x-coordinate of the upper-left corner of the first rectangle. - * @param rect1y Specifies the y-coordinate of the upper-left corner of the first rectangle. - * @param rect1w Specifies the width of the first rectangle. - * @param rect1h Specifies the height of the first rectangle. - * @param rect2x Specifies the x-coordinate of the upper-left corner of the second rectangle. - * @param rect2y Specifies the y-coordinate of the upper-left corner of the second rectangle. - * @param rect2w Specifies the width of the second rectangle. - * @param rect2h Specifies the height of the second rectangle. - * @return If the specified rectangle lies on the other rectangle, the return value is true otherwise it's false. - */ -bool GRRLIB_RectOnRect(int rect1x, int rect1y, int rect1w, int rect1h, int rect2x, int rect2y, int rect2w, int rect2h) { - return (GRRLIB_PtInRect(rect1x, rect1y, rect1w, rect1h, rect2x, rect2y) || - GRRLIB_PtInRect(rect1x, rect1y, rect1w, rect1h, rect2x+rect2w, rect2y) || - GRRLIB_PtInRect(rect1x, rect1y, rect1w, rect1h, rect2x+rect2w, rect2y+rect2h) || - GRRLIB_PtInRect(rect1x, rect1y, rect1w, rect1h, rect2x, rect2y+rect2h)); -} - -/** - * Clip the drawing area to an rectangle. - * @param x The x-coordinate of the rectangle. - * @param y The y-coordinate of the rectangle. - * @param width The width of the rectangle. - * @param height The height of the rectangle. - */ -void GRRLIB_ClipDrawing(int x, int y, int width, int height) { - GX_SetClipMode( GX_CLIP_ENABLE ); - GX_SetScissor( x, y, width, height ); -} - -/** - * Reset the clipping to normal. - */ -void GRRLIB_ClipReset() { - GX_SetClipMode( GX_CLIP_ENABLE ); - GX_SetScissor( 0, 0, rmode->fbWidth, rmode->efbHeight ); -} - -/** - * Set a texture's X and Y handles. e.g. for rotation. - * @param tex The texture to set the handle on. - * @param x The x-coordinate of the handle. - * @param y The y-coordinate of the handle. - */ -void GRRLIB_SetHandle(struct GRRLIB_texImg *tex, int x, int y) { - if (tex->tiledtex) { - tex->handlex = -(((int)tex->tilew)/2) + x; - tex->handley = -(((int)tex->tileh)/2) + y; - } else { - tex->handlex = -(((int)tex->w)/2) + x; - tex->handley = -(((int)tex->h)/2) + y; - } -} - -/** - * Center a texture's handles. e.g. for rotation. - * @param tex The texture to center. - * @param enabled - */ -void GRRLIB_SetMidHandle(struct GRRLIB_texImg *tex, bool enabled) { - if (enabled) { - if (tex->tiledtex) { - tex->offsetx = (((int)tex->tilew)/2); - tex->offsety = (((int)tex->tileh)/2); - } else { - tex->offsetx = (((int)tex->w)/2); - tex->offsety = (((int)tex->h)/2); - } - GRRLIB_SetHandle(tex, tex->offsetx, tex->offsety); - } else { - GRRLIB_SetHandle(tex, 0, 0); - tex->offsetx = 0; - tex->offsety = 0; - } -} - -/** - * Return the color value of a pixel from a GRRLIB_texImg. - * @param x Specifies the x-coordinate of the pixel in the texture. - * @param y Specifies the y-coordinate of the pixel in the texture. - * @param tex The texture to get the color from. - * @return The color of a pixel in RGBA format. - */ -u32 GRRLIB_GetPixelFromtexImg(int x, int y, struct GRRLIB_texImg *tex) { - u8 *truc = (u8*)tex->data; - u32 offset; - - offset = (((y >> 2)<<4)*tex->w) + ((x >> 2)<<6) + ((((y&3) << 2) + (x&3) ) << 1); // Fuckin equation found by NoNameNo ;) - - return ((*(truc+offset+1)<<24) | (*(truc+offset+32)<<16) | (*(truc+offset+33)<<8) | *(truc+offset)); -} - -/** - * Set the color value of a pixel to a GRRLIB_texImg. - * @see GRRLIB_FlushTex - * @param x Specifies the x-coordinate of the pixel in the texture. - * @param y Specifies the y-coordinate of the pixel in the texture. - * @param tex The texture to set the color to. - * @param color The color of the pixel in RGBA format. - */ -void GRRLIB_SetPixelTotexImg(int x, int y, GRRLIB_texImg *tex, u32 color) { - u8 *truc = (u8*)tex->data; - u32 offset; - - offset = (((y >> 2)<<4)*tex->w) + ((x >> 2)<<6) + ((((y&3) << 2) + (x&3) ) << 1); // Fuckin equation found by NoNameNo ;) - - *(truc+offset) = color & 0xFF; - *(truc+offset+1) = (color>>24) & 0xFF; - *(truc+offset+32) = (color>>16) & 0xFF; - *(truc+offset+33) = (color>>8) & 0xFF; -} - -/** - * Write the contents of a texture in the data cache down to main memory. - * For performance the CPU holds a data cache where modifications are stored before they get written down to mainmemory. - * @param tex The texture to flush. - */ -void GRRLIB_FlushTex(struct GRRLIB_texImg *tex) { - DCFlushRange(tex->data, tex->w * tex->h * 4); -} - -/** - * Change a texture to gray scale. - * @see GRRLIB_FlushTex - * @param texsrc The texture source. - * @param texdest The texture grayscaled destination. - */ -void GRRLIB_BMFX_Grayscale(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest) { - unsigned int x, y; - u8 gray; - u32 color; - - for (y = 0; y < texsrc->h; y++) { - for (x = 0; x < texsrc->w; x++) { - color = GRRLIB_GetPixelFromtexImg(x, y, texsrc); - - gray = (((color >> 24 & 0xFF)*77 + (color >> 16 & 0xFF)*150 + (color >> 8 & 0xFF)*28) / (255)); - - GRRLIB_SetPixelTotexImg(x, y, texdest, - ((gray << 24) | (gray << 16) | (gray << 8) | (color & 0xFF))); - } - } - GRRLIB_SetHandle( texdest, 0, 0 ); -} - -/** - * Invert colors of the texture. - * @see GRRLIB_FlushTex - * @param texsrc The texture source. - * @param texdest The texture destination. - */ -void GRRLIB_BMFX_Invert(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest) { - unsigned int x, y; - u32 color; - - for (y = 0; y < texsrc->h; y++) { - for (x = 0; x < texsrc->w; x++) { - color = GRRLIB_GetPixelFromtexImg(x, y, texsrc); - GRRLIB_SetPixelTotexImg(x, y, texdest, - ((0xFFFFFF - (color >> 8 & 0xFFFFFF)) << 8) | (color & 0xFF)); - } - } -} - -/** - * Flip texture horizontal. - * @see GRRLIB_FlushTex - * @param texsrc The texture source. - * @param texdest The texture destination. - */ -void GRRLIB_BMFX_FlipH(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest) { - unsigned int x, y, txtWidth = texsrc->w - 1; - - for (y = 0; y < texsrc->h; y++) { - for (x = 0; x < texsrc->w; x++) { - GRRLIB_SetPixelTotexImg(txtWidth - x, y, texdest, - GRRLIB_GetPixelFromtexImg(x, y, texsrc)); - } - } -} - -/** - * Flip texture vertical. - * @see GRRLIB_FlushTex - * @param texsrc The texture source. - * @param texdest The texture destination. - */ -void GRRLIB_BMFX_FlipV(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest) { - unsigned int x, y, texHeight = texsrc->h - 1; - - for (y = 0; y < texsrc->h; y++) { - for (x = 0; x < texsrc->w; x++) { - GRRLIB_SetPixelTotexImg(x, texHeight - y, texdest, - GRRLIB_GetPixelFromtexImg(x, y, texsrc)); - } - } -} - -/** - * A texture effect (Blur). - * @see GRRLIB_FlushTex - * @param texsrc The texture source. - * @param texdest The texture destination. - * @param factor The blur factor. - */ -void GRRLIB_BMFX_Blur(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest, u32 factor) { - int numba = (1+(factor<<1))*(1+(factor<<1)); - u32 x, y; - s32 k, l; - int tmp = 0; - int newr, newg, newb, newa; - u32 colours[numba]; - u32 thiscol; - - for (x = 0; x < texsrc->w; x++) { - for (y = 0; y < texsrc->h; y++) { - newr = 0; - newg = 0; - newb = 0; - newa = 0; - - tmp = 0; - thiscol = GRRLIB_GetPixelFromtexImg(x, y, texsrc); - - for (k = x - factor; k <= x + factor; k++) { - for (l = y - factor; l <= y + factor; l++) { - if (k < 0) { colours[tmp] = thiscol; } - else if (k >= texsrc->w) { colours[tmp] = thiscol; } - else if (l < 0) { colours[tmp] = thiscol; } - else if (l >= texsrc->h) { colours[tmp] = thiscol; } - else { colours[tmp] = GRRLIB_GetPixelFromtexImg(k, l, texsrc); } - tmp++; - } - } - - for (tmp = 0; tmp < numba; tmp++) { - newr += (colours[tmp] >> 24) & 0xFF; - newg += (colours[tmp] >> 16) & 0xFF; - newb += (colours[tmp] >> 8) & 0xFF; - newa += colours[tmp] & 0xFF; - } - - newr /= numba; - newg /= numba; - newb /= numba; - newa /= numba; - - GRRLIB_SetPixelTotexImg(x, y, texdest, (newr<<24) | (newg<<16) | (newb<<8) | newa); - } - } -} - -/** - * A texture effect (Pixelate). - * @see GRRLIB_FlushTex - * @param texsrc The texture source. - * @param texdest The texture destination. - * @param factor The factor level of the effect. - */ -void GRRLIB_BMFX_Pixelate(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest, u32 factor) { - unsigned int x, y; - unsigned int xx, yy; - u32 rgb; - - for (x = 0; x < texsrc->w - 1 - factor; x += factor) { - for (y = 0; y < texsrc->h - 1 - factor; y +=factor) { - rgb = GRRLIB_GetPixelFromtexImg(x, y, texsrc); - for (xx = x; xx < x + factor; xx++) { - for (yy = y; yy < y + factor; yy++) { - GRRLIB_SetPixelTotexImg(xx, yy, texdest, rgb); - } - } - } - } -} - -/** - * A texture effect (Scatter). - * @see GRRLIB_FlushTex - * @param texsrc The texture source. - * @param texdest The texture destination. - * @param factor The factor level of the effect. - */ -void GRRLIB_BMFX_Scatter(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest, u32 factor) { - unsigned int x, y; - u32 val1, val2; - u32 val3, val4; - int factorx2 = factor*2; - - for (y = 0; y < texsrc->h; y++) { - for (x = 0; x < texsrc->w; x++) { - val1 = x + (int) (factorx2 * (rand() / (RAND_MAX + 1.0))) - factor; - val2 = y + (int) (factorx2 * (rand() / (RAND_MAX + 1.0))) - factor; - - if ((val1 >= texsrc->w) || (val2 >= texsrc->h)) { - } - else { - val3 = GRRLIB_GetPixelFromtexImg(x, y, texsrc); - val4 = GRRLIB_GetPixelFromtexImg(val1, val2, texsrc); - GRRLIB_SetPixelTotexImg(x, y, texdest, val4); - GRRLIB_SetPixelTotexImg(val1, val2, texdest, val3); - } - } - } -} - -/** - * Draws a vector. - */ -void GRRLIB_GXEngine(Vector v[], u32 color[], long n, u8 fmt) { - int i; - - GX_Begin(fmt, GX_VTXFMT0, n); - for (i = 0; i < n; i++) { - GX_Position3f32(v[i].x, v[i].y, v[i].z); - GX_Color1u32(color[i]); - } - GX_End(); -} - -/** - * Initialize GRRLIB. Call this at the beginning your code. - * @see GRRLIB_Exit - */ -void GRRLIB_Init() { - f32 yscale; - u32 xfbHeight; - Mtx44 perspective; - - VIDEO_Init(); - rmode = VIDEO_GetPreferredMode(NULL); - if (rmode == NULL) - return; - - // Video Mode Correction - switch (rmode->viTVMode) { - case VI_DEBUG_PAL: // PAL 50hz 576i - rmode = &TVPal574IntDfScale; - break; - } - - // Widescreen patch by CashMan's Productions (http://www.CashMan-Productions.fr.nf) - if (CONF_GetAspectRatio() == CONF_ASPECT_16_9) { - rmode->viWidth = 678; - rmode->viXOrigin = (VI_MAX_WIDTH_NTSC - 678)/2; - } - - VIDEO_Configure(rmode); - xfb[0] = (u32 *)MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode)); - xfb[1] = (u32 *)MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode)); - if (xfb[0] == NULL || xfb[1] == NULL) - return; - - VIDEO_SetNextFramebuffer(xfb[fb]); - VIDEO_SetBlack(true); - VIDEO_Flush(); - VIDEO_WaitVSync(); - if (rmode->viTVMode & VI_NON_INTERLACE) { - VIDEO_WaitVSync(); - } - - gp_fifo = (u8 *) memalign(32, DEFAULT_FIFO_SIZE); - if (gp_fifo == NULL) - return; - memset(gp_fifo, 0, DEFAULT_FIFO_SIZE); - GX_Init(gp_fifo, DEFAULT_FIFO_SIZE); - - // Clears the BG to color and clears the z-buffer - GX_SetCopyClear((GXColor){ 0, 0, 0, 0xff }, GX_MAX_Z24); - - // Other GX setup - yscale = GX_GetYScaleFactor(rmode->efbHeight, rmode->xfbHeight); - xfbHeight = GX_SetDispCopyYScale(yscale); - GX_SetDispCopySrc(0, 0, rmode->fbWidth, rmode->efbHeight); - GX_SetDispCopyDst(rmode->fbWidth, xfbHeight); - GX_SetCopyFilter(rmode->aa, rmode->sample_pattern, GX_TRUE, rmode->vfilter); - GX_SetFieldMode(rmode->field_rendering, ((rmode->viHeight == 2 * rmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); - - if (rmode->aa) { - // Set 16 bit RGB565 - GX_SetPixelFmt(GX_PF_RGB565_Z16, GX_ZC_LINEAR); - } else { - // Set 24 bit Z24 - GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); - } - - GX_SetDispCopyGamma(GX_GM_1_0); - - // Setup the vertex descriptor - // Tells the flipper to expect direct data - GX_ClearVtxDesc(); - GX_InvVtxCache(); - GX_InvalidateTexAll(); - - GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); - GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); - GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); - - GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); - GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); - GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); - GX_SetZMode(GX_FALSE, GX_LEQUAL, GX_TRUE); - - GX_SetNumChans(1); - GX_SetNumTexGens(1); - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); - GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); - - guMtxIdentity(GXmodelView2D); - guMtxTransApply(GXmodelView2D, GXmodelView2D, 0.0F, 0.0F, -100.0F); - GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); - - guOrtho(perspective, 0, rmode->efbHeight, 0, rmode->fbWidth, 0, 1000.0f); - GX_LoadProjectionMtx(perspective, GX_ORTHOGRAPHIC); - - GX_SetViewport(0, 0, rmode->fbWidth, rmode->efbHeight, 0, 1); - GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR); - GX_SetAlphaUpdate(GX_TRUE); - GX_SetAlphaCompare(GX_GREATER, 0, GX_AOP_AND, GX_ALWAYS, 0); - GX_SetColorUpdate(GX_ENABLE); - GX_SetCullMode(GX_CULL_NONE); - GRRLIB_ClipReset(); - - VIDEO_SetBlack(false); - - // Default settings - GRRLIB_Settings.antialias = true; - GRRLIB_Settings.blend = GRRLIB_BLEND_ALPHA; -} - -/** - * Call this function after drawing. - */ -void GRRLIB_Render() { - GX_DrawDone(); - GX_InvalidateTexAll(); - - fb ^= 1; // Flip framebuffer - GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); - GX_SetColorUpdate(GX_TRUE); - GX_CopyDisp(xfb[fb], GX_TRUE); - - VIDEO_SetNextFramebuffer(xfb[fb]); - VIDEO_Flush(); - VIDEO_WaitVSync(); -} - -/** - * Call this before exiting your application. - */ -void GRRLIB_Exit() { - GX_SetClipMode( GX_CLIP_DISABLE ); - GX_SetScissor( 0, 0, rmode->fbWidth, rmode->efbHeight ); - GRRLIB_FillScreen( 0x000000FF ); - GRRLIB_Render(); - GX_DrawDone(); - GX_AbortFrame(); - - if (xfb[0] != NULL) { - free(MEM_K1_TO_K0(xfb[0])); - xfb[0] = NULL; - } - if (xfb[1] != NULL) { - free(MEM_K1_TO_K0(xfb[1])); - xfb[1] = NULL; - } - if (gp_fifo != NULL) { - free(gp_fifo); - gp_fifo = NULL; - } -} - -/** - * Reads a pixel directly from the FrontBuffer. - * Since the FB is stored in YCbCr, - * @param x The x-coordinate within the FB. - * @param y The y-coordinate within the FB. - * @param R1 A pointer to a variable receiving the first Red value. - * @param G1 A pointer to a variable receiving the first Green value. - * @param B1 A pointer to a variable receiving the first Blue value. - * @param R2 A pointer to a variable receiving the second Red value. - * @param G2 A pointer to a variable receiving the second Green value. - * @param B2 A pointer to a variable receiving the second Blue value. - */ -void GRRLIB_GetPixelFromFB(int x, int y, u8 *R1, u8 *G1, u8 *B1, u8* R2, u8 *G2, u8 *B2 ) { - // Position Correction - if (x > (rmode->fbWidth/2)) { x = (rmode->fbWidth/2); } - if (x < 0) { x = 0; } - if (y > rmode->efbHeight) { y = rmode->efbHeight; } - if (y < 0) { y = 0; } - - // Preparing FB for reading - u32 Buffer = (((u32 *)xfb[fb])[y*(rmode->fbWidth/2)+x]); - u8 *Colors = (u8 *) &Buffer; - - /** Color channel: - Colors[0] = Y1 - Colors[1] = Cb - Colors[2] = Y2 - Colors[3] = Cr */ - - *R1 = GRRLIB_ClampVar8( 1.164 * (Colors[0] - 16) + 1.596 * (Colors[3] - 128) ); - *G1 = GRRLIB_ClampVar8( 1.164 * (Colors[0] - 16) - 0.813 * (Colors[3] - 128) - 0.392 * (Colors[1] - 128) ); - *B1 = GRRLIB_ClampVar8( 1.164 * (Colors[0] - 16) + 2.017 * (Colors[1] - 128) ); - - *R2 = GRRLIB_ClampVar8( 1.164 * (Colors[2] - 16) + 1.596 * (Colors[3] - 128) ); - *G2 = GRRLIB_ClampVar8( 1.164 * (Colors[2] - 16) - 0.813 * (Colors[3] - 128) - 0.392 * (Colors[1] - 128) ); - *B2 = GRRLIB_ClampVar8( 1.164 * (Colors[2] - 16) + 2.017 * (Colors[1] - 128) ); -} - -/** - * A helper function for the YCbCr -> RGB conversion. - * Clamps the given value into a range of 0 - 255 and thus preventing an overflow. - * @param Value The value to clamp. - * @return Returns a clean, clamped unsigned char. - */ -u8 GRRLIB_ClampVar8(float Value) { - /* Using float to increase the precision. - This makes a full spectrum (0 - 255) possible. */ - Value = roundf(Value); - if (Value < 0) { - Value = 0; - } else if (Value > 255) { - Value = 255; - } - return (u8)Value; -} - -/** - * Converts RGBA values to u32 color. - * @param r Amount of red (0 - 255). - * @param g Amount of green (0 - 255). - * @param b Amount of blue (0 - 255). - * @param a Amount of alpha (0 - 255). - * @return Returns the color in u32 format. - */ -u32 GRRLIB_GetColor(u8 r, u8 g, u8 b, u8 a) { - return (r << 24) | (g << 16) | (b << 8) | a; -} diff --git a/GRRLIB-400/GRRLIB/GRRLIB.h b/GRRLIB-400/GRRLIB/GRRLIB.h deleted file mode 100644 index cc0d2c8..0000000 --- a/GRRLIB-400/GRRLIB/GRRLIB.h +++ /dev/null @@ -1,177 +0,0 @@ -/*=========================================== - GRRLIB (GX version) 4.0.0 - Code : NoNameNo - Additional Code : Crayon & Xane - GX hints : RedShade -===========================================*/ - -#ifndef __GXHDR__ -#define __GXHDR__ - -/** - * @file GRRLIB.h - * GRRLIB library. - */ - -#include - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - - -/** - * GRRLIB Blending Modes - */ -#define GRRLIB_BLEND_ALPHA 0 /**< Alpha Blending. */ -#define GRRLIB_BLEND_ADD 1 /**< Additive Blending. */ -#define GRRLIB_BLEND_SCREEN 2 /**< Alpha Light Blending. */ -#define GRRLIB_BLEND_MULTI 3 /**< Multiply Blending. */ -#define GRRLIB_BLEND_INV 4 /**< Invert Color Blending. */ -#define GRRLIB_BLEND_NONE GRRLIB_BLEND_ALPHA -#define GRRLIB_BLEND_LIGHT GRRLIB_BLEND_ADD -#define GRRLIB_BLEND_SHADE GRRLIB_BLEND_MULTI - - -/** - * Structure to hold the current drawing settings. - */ -typedef struct GRRLIB_drawSettings { - bool antialias; /**< Flag for AntiAlias On/Off. */ - unsigned char blend; /**< Blending Mode. */ -} GRRLIB_drawSettings; - -/** - * Structure to hold the texture informations. - */ -typedef struct GRRLIB_texImg { - unsigned int w; /**< Width of the texture. */ - unsigned int h; /**< Height of the texture. */ - int handlex; /**< Handle x of the texture. */ - int handley; /**< Handle y of the texture. */ - int offsetx; /**< Offset x of the texture. */ - int offsety; /**< Offset y of the texture. */ - bool tiledtex; /**< Is it a tiled texture? */ - unsigned int tilew; /**< Widht of a tile. */ - unsigned int tileh; /**< Height of a tile. */ - unsigned int nbtilew; /**< Number of tiles for the x axis. */ - unsigned int nbtileh; /**< Number of tiles for the y axis. */ - unsigned int tilestart; /**< Offset for starting position. */ - void *data; /**< Pointer to the texture data. */ -} GRRLIB_texImg; - -/** - * Structure to hold the bytemap character informations. - */ -typedef struct GRRLIB_bytemapChar { - u8 character; /**< Which character. */ - u8 width; /**< Character width. */ - u8 height; /**< Character height. */ - s8 relx; /**< Horizontal offset according to cursor (-128 to 127). */ - s8 rely; /**< Vertical offset according to cursor (-128 to 127). */ - u8 shift; /**< Horizontal cursor shift after drawing the character. */ - u8 *data; /**< Character data itself (uncompressed, 8 bits per pixel). */ -} GRRLIB_bytemapChar; - -/** - * Structure to hold the bytemap font informations. - */ -typedef struct GRRLIB_bytemapFont { - u8 version; /**< Version. */ - s8 addSpace; /**< Add-space after each char (-128 to 127). */ - u32 *palette; /**< Font palette. */ - char *name; /**< Font name. */ - u16 nbChar; /**< Number of characters in font. */ - GRRLIB_bytemapChar *charDef; /**< List of bitmap character definitions. */ -} GRRLIB_bytemapFont; - - -void GRRLIB_SetAntiAliasing(bool aa); -bool GRRLIB_GetAntiAliasing(); - -void GRRLIB_SetBlend(unsigned char blendmode); -unsigned char GRRLIB_GetBlend(); - - -extern void GRRLIB_FillScreen(u32 color); - -extern void GRRLIB_Plot(f32 x, f32 y, u32 color); -void GRRLIB_NPlot(Vector v[], u32 color[], long n); - -extern void GRRLIB_Line(f32 x1, f32 y1, f32 x2, f32 y2, u32 color); - -extern void GRRLIB_Rectangle(f32 x, f32 y, f32 width, f32 height, u32 color, u8 filled); -extern void GRRLIB_Circle(f32 x, f32 y, f32 radius, u32 color, u8 filled); -void GRRLIB_NGone(Vector v[], u32 color[], long n); -void GRRLIB_NGoneFilled(Vector v[], u32 color[], long n); - -GRRLIB_texImg *GRRLIB_CreateEmptyTexture(unsigned int, unsigned int); -void GRRLIB_Screen2Texture(GRRLIB_texImg *tex); -GRRLIB_texImg *GRRLIB_LoadTexture(const unsigned char my_img[]); -GRRLIB_texImg *GRRLIB_LoadTextureJPG(const unsigned char my_jpg[]); -GRRLIB_texImg *GRRLIB_LoadTexturePNG(const unsigned char my_png[]); - -void GRRLIB_FreeTexture(struct GRRLIB_texImg *tex); - -GRRLIB_bytemapFont *GRRLIB_LoadBMF(const unsigned char my_bmf[]); -void GRRLIB_FreeBMF(GRRLIB_bytemapFont *bmf); - -void GRRLIB_InitTileSet(struct GRRLIB_texImg *tex, unsigned int tilew, unsigned int tileh, unsigned int tilestart); - -extern void GRRLIB_DrawImg(f32 xpos, f32 ypos, struct GRRLIB_texImg *tex, float degrees, float scaleX, f32 scaleY, u32 color); -extern void GRRLIB_DrawImgQuad(Vector pos[4], struct GRRLIB_texImg *tex, u32 color); -extern void GRRLIB_DrawTile(f32 xpos, f32 ypos, struct GRRLIB_texImg *tex, float degrees, float scaleX, f32 scaleY, u32 color, int frame); -extern void GRRLIB_DrawTileQuad(Vector pos[4], struct GRRLIB_texImg *tex, u32 color,int frame); - -void GRRLIB_Printf(f32 xpos, f32 ypos, struct GRRLIB_texImg *tex, u32 color, f32 zoom, const char *text, ...); -void GRRLIB_PrintBMF(f32 xpos, f32 ypos, struct GRRLIB_bytemapFont *bmf, f32 zoom, const char *text, ...); - -bool GRRLIB_PtInRect(int hotx, int hoty, int hotw, int hoth, int wpadx, int wpady); -bool GRRLIB_RectInRect(int rect1x, int rect1y, int rect1w, int rect1h, int rect2x, int rect2y, int rect2w, int rect2h); -bool GRRLIB_RectOnRect(int rect1x, int rect1y, int rect1w, int rect1h, int rect2x, int rect2y, int rect2w, int rect2h); - -void GRRLIB_ClipDrawing(int x, int y, int width, int height); -void GRRLIB_ClipReset(); - -void GRRLIB_SetHandle(struct GRRLIB_texImg *tex, int x, int y); -void GRRLIB_SetMidHandle(struct GRRLIB_texImg *tex, bool enabled); - -u32 GRRLIB_GetPixelFromtexImg(int x, int y, struct GRRLIB_texImg *tex); -void GRRLIB_SetPixelTotexImg(int x, int y, struct GRRLIB_texImg *tex, u32 color); - -void GRRLIB_FlushTex(struct GRRLIB_texImg *tex); - -void GRRLIB_BMFX_Grayscale(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest); -void GRRLIB_BMFX_Invert(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest); -void GRRLIB_BMFX_FlipH(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest); -void GRRLIB_BMFX_FlipV(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest); -void GRRLIB_BMFX_Blur(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest, u32 factor); -void GRRLIB_BMFX_Scatter(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest, u32 factor); -void GRRLIB_BMFX_Pixelate(struct GRRLIB_texImg *texsrc, GRRLIB_texImg *texdest, u32 factor); - -void GRRLIB_GXEngine(Vector v[], u32 color[], long count, u8 fmt); - - -void GRRLIB_Init(); - -void GRRLIB_Render(); - -void GRRLIB_Exit(); - -void GRRLIB_GetPixelFromFB(int x, int y, u8 *R1, u8 *G1, u8 *B1, u8* R2, u8 *G2, u8 *B2); -u8 GRRLIB_ClampVar8(float Value); - -u32 GRRLIB_GetColor(u8 r, u8 g, u8 b, u8 a); - - -#ifdef __cplusplus - } -#endif /* __cplusplus */ - -#endif - -/** - * @mainpage GRRLIB Documentation - * @image html grrlib_logo.png - * Welcome to the GRRLIB documentation. - */ diff --git a/GRRLIB-400/GRRLIB/GRRLIB_addon.c b/GRRLIB-400/GRRLIB/GRRLIB_addon.c deleted file mode 100644 index 71960f1..0000000 --- a/GRRLIB-400/GRRLIB/GRRLIB_addon.c +++ /dev/null @@ -1,133 +0,0 @@ -/*=========================================== - GRRLIB (GX version) 4.0.0 addon - Code : NoNameNo - Additional Code : Crayon & Xane - GX hints : RedShade -===========================================*/ - -#include -#include -#include -#include -#include -#include "../lib/libpng/pngu/pngu.h" -#include "GRRLIB.h" -#include - -#include "GRRLIB_addon/GRRLIBfont.h" -#include "GRRLIB_addon/GRRLIBbutton.h" - -extern u32 fb; -extern void *xfb[2]; -extern GXRModeObj *rmode; - -GRRLIB_texImg *tex_GRRLIBfont; -GRRLIB_texImg *tex_GRRLIBbutton; - -/** - * Initalize all addon requirement - */ -void GRRLIB_addon_Init(){ - tex_GRRLIBfont = GRRLIB_LoadTexture(GRRLIBfont); - GRRLIB_InitTileSet(tex_GRRLIBfont, 16, 19, 32); - - tex_GRRLIBbutton = GRRLIB_LoadTexture(GRRLIBbutton); - GRRLIB_InitTileSet(tex_GRRLIBbutton, 4, 24, 0); -} - -/** - * Free all addon requirement - */ -void GRRLIB_addon_Exit(){ - GRRLIB_FreeTexture(tex_GRRLIBfont); - GRRLIB_FreeTexture(tex_GRRLIBbutton); -} - -/** - * Load a texture from a file. - * @param filename The JPEG or PNG filename to load. - * @return A GRRLIB_texImg structure filled with image informations. - */ -GRRLIB_texImg *GRRLIB_LoadTextureFromFile(const char *filename) { - fatInitDefault(); - FILE *fd = fopen(filename, "rb"); - - fseek(fd, 0, SEEK_END); - long lsize = ftell(fd); - rewind(fd); - - unsigned char *buffer = (unsigned char*) malloc (sizeof(unsigned char)*lsize); - fread (buffer, 1, lsize, fd); - GRRLIB_texImg *tex = GRRLIB_LoadTexture(buffer); - free(buffer); - - fclose(fd); - return tex; -} - -/** - * Make a PNG screenshot on the SD card. - * libfat is required to use the function. - * @param File name of the file to write. - * @return true if every thing worked, false otherwise. - */ -bool GRRLIB_ScrShot(const char* File) { - int ErrorCode = -1; - IMGCTX pngContext; - - if(fatInitDefault() && (pngContext = PNGU_SelectImageFromDevice(File))) { - ErrorCode = PNGU_EncodeFromYCbYCr(pngContext, rmode->fbWidth, rmode->efbHeight, xfb[fb], 0); - PNGU_ReleaseImageContext(pngContext); - } - return !ErrorCode; -} - -/** - * Easy Button Maker. - * @param indice Index number of your button. - * @param x top-left corner X position of the button. - * @param y top-left corner Y position of the button. - * @param col color of your button. - * @param wpadx your X wpad posistion. - * @param wpady your Y wpad posistion. - * @param WPADDown your wpad button Down Status. - * @param WPADHeld your wpad button Held Status. - * @param but The wpad button you want to check. - * @param resdown You will find here the downed button index number. - * @param resheld You will find here the helded button index number. - * @param toto Text on the button. - */ -void GRRLIB_addon_Button(int indice, int x,int y,u32 col, int wpadx, int wpady, u32 WPADDown, u32 WPADHeld, int but, int *resdown, int *resheld, char toto[]){ - int butwidth=strlen(toto)*16+8; - Vector bg[]={{x+4,y,0},{x+4+strlen(toto)*16,y,0},{x+4+strlen(toto)*16,y+24,0},{x+4,y+24,0}}; - if((toto[0]=='^') && ((toto[1]=='U') || (toto[1]=='D') || (toto[1]=='L') || (toto[1]=='R'))){ - butwidth=1*16+8; - bg[1].x=x+4+1*16; - bg[2].x=x+4+1*16; - } - - GRRLIB_DrawTile(x,y, tex_GRRLIBbutton , 0, 1, 1, col,0 ); - GRRLIB_DrawTileQuad(bg, tex_GRRLIBbutton, col,1 ); - GRRLIB_DrawTile(bg[1].x,y, tex_GRRLIBbutton , 0, 1, 1, col,2); - - if(GRRLIB_PtInRect(x, y, butwidth, 24, wpadx, wpady)) { - if((toto[0]=='^') && (toto[1]=='U')) GRRLIB_Printf(x+4, y+2, tex_GRRLIBfont, 0xFFFFFFFF, 1, "%c", 0xa1); - else if((toto[0]=='^') && (toto[1]=='D')) GRRLIB_Printf(x+4, y+2, tex_GRRLIBfont, 0xFFFFFFFF, 1, "%c", 0xa2); - else if((toto[0]=='^') && (toto[1]=='L')) GRRLIB_Printf(x+4, y+2, tex_GRRLIBfont, 0xFFFFFFFF, 1, "%c", 0xa3); - else if((toto[0]=='^') && (toto[1]=='R')) GRRLIB_Printf(x+4, y+2, tex_GRRLIBfont, 0xFFFFFFFF, 1, "%c", 0xa4); - else GRRLIB_Printf(x+4, y+2, tex_GRRLIBfont, 0xFFFFFFFF, 1, toto); - if(WPADDown & but) { - *resdown=indice; - } - if(WPADHeld & but) { - *resheld=indice; - } - } - else{ - if((toto[0]=='^') && (toto[1]=='U')) GRRLIB_Printf(x+4, y+2, tex_GRRLIBfont, 0xFFFFFF77, 1, "%c", 0xa1); - else if((toto[0]=='^') && (toto[1]=='D')) GRRLIB_Printf(x+4, y+2, tex_GRRLIBfont, 0xFFFFFF77, 1, "%c", 0xa2); - else if((toto[0]=='^') && (toto[1]=='L')) GRRLIB_Printf(x+4, y+2, tex_GRRLIBfont, 0xFFFFFF77, 1, "%c", 0xa3); - else if((toto[0]=='^') && (toto[1]=='R')) GRRLIB_Printf(x+4, y+2, tex_GRRLIBfont, 0xFFFFFF77, 1, "%c", 0xa4); - else GRRLIB_Printf(x+4, y+2, tex_GRRLIBfont, 0xFFFFFF77, 1, toto); - } -} diff --git a/GRRLIB-400/GRRLIB/GRRLIB_addon.h b/GRRLIB-400/GRRLIB/GRRLIB_addon.h deleted file mode 100644 index a832d09..0000000 --- a/GRRLIB-400/GRRLIB/GRRLIB_addon.h +++ /dev/null @@ -1,33 +0,0 @@ -/*=========================================== - GRRLIB (GX version) 4.0.0 addon - Code : NoNameNo - Additional Code : Crayon & Xane - GX hints : RedShade -===========================================*/ - -#ifndef __GRRLIB_ADDON__ -#define __GRRLIB_ADDON__ - -/** - * @file GRRLIBaddon.h - * GRRLIB library. - */ - - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - -void GRRLIB_addon_Init(); -void GRRLIB_addon_Exit(); -GRRLIB_texImg *GRRLIB_LoadTextureFromFile(const char *filename); -bool GRRLIB_ScrShot(const char*); -void GRRLIB_addon_Button(int indice, int x,int y,u32 col, int wpadx, int wpady, u32 WPADDown, u32 WPADHeld, int but, int *resdown, int *resheld, char toto[]); - - -#ifdef __cplusplus - } -#endif /* __cplusplus */ - -#endif - diff --git a/GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.c b/GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.c deleted file mode 100644 index 2593403..0000000 --- a/GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - This file was autogenerated by raw2c. -Visit http://www.devkitpro.org -*/ - -const unsigned char GRRLIBbutton[] = { - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x18, 0x08, 0x06, 0x00, 0x00, 0x00, 0xce, 0x32, 0x1c, - 0x6a, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, - 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93, - 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, - 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd9, 0x03, - 0x13, 0x02, 0x17, 0x23, 0x58, 0x89, 0x44, 0x6c, 0x00, 0x00, 0x00, 0xf9, 0x49, 0x44, 0x41, 0x54, - 0x38, 0xcb, 0xed, 0x93, 0xcd, 0x8d, 0xc5, 0x20, 0x0c, 0x84, 0x07, 0x30, 0x01, 0x29, 0x8d, 0xa4, - 0xac, 0x94, 0x96, 0x0a, 0x52, 0x4f, 0x0a, 0x48, 0x0b, 0xf9, 0x01, 0x0c, 0xde, 0x43, 0x44, 0xf4, - 0x0e, 0x79, 0x64, 0xf7, 0xbe, 0x96, 0x10, 0x17, 0x7f, 0xf2, 0x8c, 0x19, 0x14, 0x00, 0x2c, 0xcb, - 0x22, 0x22, 0x02, 0x11, 0xc1, 0x53, 0x29, 0xa5, 0xa0, 0x94, 0xc2, 0x30, 0x0c, 0x4a, 0xcd, 0xf3, - 0x2c, 0x31, 0x46, 0xe4, 0x9c, 0x91, 0x73, 0x7e, 0x04, 0x8c, 0x31, 0x30, 0xc6, 0xa0, 0xeb, 0x3a, - 0xd0, 0xbe, 0xef, 0x08, 0x21, 0x80, 0x99, 0x9b, 0x00, 0x11, 0x81, 0x99, 0x41, 0xc7, 0x71, 0xe0, - 0x3c, 0x4f, 0xa4, 0x94, 0x9a, 0x80, 0xb5, 0x16, 0xa5, 0x14, 0x50, 0x8c, 0x11, 0x21, 0x84, 0x57, - 0xa0, 0x94, 0x02, 0xad, 0xf5, 0x05, 0xc4, 0x18, 0x5f, 0x01, 0x11, 0xb9, 0xa4, 0xa5, 0x94, 0x50, - 0x0f, 0x33, 0x3f, 0x02, 0x44, 0x74, 0xdf, 0x14, 0x42, 0x40, 0x9d, 0xf2, 0x0d, 0xc8, 0x39, 0x43, - 0x44, 0x2e, 0x49, 0xcc, 0x8c, 0xea, 0xa3, 0x94, 0xf2, 0x15, 0xb8, 0x27, 0x7c, 0xca, 0x69, 0x79, - 0xd0, 0x5a, 0x23, 0xa5, 0x74, 0x01, 0xcc, 0xfc, 0xea, 0xe1, 0x06, 0x6a, 0x73, 0x6b, 0x4b, 0x55, - 0xbf, 0xb5, 0x16, 0xb4, 0xae, 0x2b, 0xb6, 0x6d, 0xc3, 0x79, 0x9e, 0xcd, 0x09, 0xde, 0x7b, 0xf4, - 0x7d, 0x0f, 0x8d, 0x3f, 0xd6, 0x3f, 0xf0, 0x2b, 0xa0, 0xfe, 0xd7, 0xb7, 0xaa, 0x7d, 0x54, 0x73, - 0x52, 0x23, 0xdc, 0x8a, 0x86, 0x31, 0x06, 0xe4, 0x9c, 0xbb, 0x5f, 0xd8, 0x5a, 0xfb, 0x2c, 0x43, - 0x6b, 0x78, 0xef, 0xe1, 0x9c, 0x83, 0x02, 0x80, 0x71, 0x1c, 0x25, 0x84, 0xd0, 0x4c, 0xab, 0x73, - 0x0e, 0xd3, 0x34, 0xa9, 0x1f, 0x23, 0x30, 0xc3, 0x86, 0xb8, 0x36, 0x6a, 0xe5, 0x00, 0x00, 0x00, - 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 -}; -const int GRRLIBbutton_size = sizeof(GRRLIBbutton); diff --git a/GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.h b/GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.h deleted file mode 100644 index 099faa3..0000000 --- a/GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - This file was autogenerated by raw2c. -Visit http://www.devkitpro.org -*/ - -//--------------------------------------------------------------------------------- -#ifndef _GRRLIBbutton_h_ -#define _GRRLIBbutton_h_ -//--------------------------------------------------------------------------------- -extern const unsigned char GRRLIBbutton[]; -extern const int GRRLIBbutton_size; -//--------------------------------------------------------------------------------- -#endif //_GRRLIBbutton_h_ -//--------------------------------------------------------------------------------- diff --git a/GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.png b/GRRLIB-400/GRRLIB/GRRLIB_addon/GRRLIBbutton.png deleted file mode 100644 index 2a5f48ce62264a4643d33fb3fe3e525fffc594a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377 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 diff --git a/GRRLIB-400/lib/libjpeg.a b/GRRLIB-400/lib/libjpeg.a deleted file mode 100644 index 7a4fc0ddb1c0efd40eb02601f05e6ee139c639dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184618 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¬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 diff --git a/GRRLIB-400/lib/libjpeg/jconfig.h b/GRRLIB-400/lib/libjpeg/jconfig.h deleted file mode 100644 index 9594ec5..0000000 --- a/GRRLIB-400/lib/libjpeg/jconfig.h +++ /dev/null @@ -1,45 +0,0 @@ -/* jconfig.h. Generated automatically by configure. */ -/* jconfig.cfg --- source file edited by configure script */ -/* see jconfig.doc for explanations */ - -#define HAVE_PROTOTYPES -#define HAVE_UNSIGNED_CHAR -#define HAVE_UNSIGNED_SHORT -#undef void -#undef const -#undef CHAR_IS_UNSIGNED -#define HAVE_STDDEF_H -#define HAVE_STDLIB_H -#undef NEED_BSD_STRINGS -#undef NEED_SYS_TYPES_H -#undef NEED_FAR_POINTERS -#undef NEED_SHORT_EXTERNAL_NAMES -/* Define this if you get warnings about undefined structures. */ -#undef INCOMPLETE_TYPES_BROKEN - -#ifdef JPEG_INTERNALS - -#undef RIGHT_SHIFT_IS_UNSIGNED -#define INLINE __inline__ -/* These are for configuring the JPEG memory manager. */ -#undef DEFAULT_MAX_MEM -#undef NO_MKTEMP - -#endif /* JPEG_INTERNALS */ - -#ifdef JPEG_CJPEG_DJPEG - -#define BMP_SUPPORTED /* BMP image file format */ -#define GIF_SUPPORTED /* GIF image file format */ -#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ -#undef RLE_SUPPORTED /* Utah RLE image file format */ -#define TARGA_SUPPORTED /* Targa image file format */ - -#undef TWO_FILE_COMMANDLINE -#undef NEED_SIGNAL_CATCHER -#undef DONT_USE_B_MODE - -/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ -#undef PROGRESS_REPORT - -#endif /* JPEG_CJPEG_DJPEG */ diff --git a/GRRLIB-400/lib/libjpeg/jmorecfg.h b/GRRLIB-400/lib/libjpeg/jmorecfg.h deleted file mode 100644 index 54a7d1c..0000000 --- a/GRRLIB-400/lib/libjpeg/jmorecfg.h +++ /dev/null @@ -1,363 +0,0 @@ -/* - * jmorecfg.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains additional configuration options that customize the - * JPEG software for special applications or support machine-dependent - * optimizations. Most users will not need to touch this file. - */ - - -/* - * Define BITS_IN_JSAMPLE as either - * 8 for 8-bit sample values (the usual setting) - * 12 for 12-bit sample values - * Only 8 and 12 are legal data precisions for lossy JPEG according to the - * JPEG standard, and the IJG code does not support anything else! - * We do not support run-time selection of data precision, sorry. - */ - -#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ - - -/* - * Maximum number of components (color channels) allowed in JPEG image. - * To meet the letter of the JPEG spec, set this to 255. However, darn - * few applications need more than 4 channels (maybe 5 for CMYK + alpha - * mask). We recommend 10 as a reasonable compromise; use 4 if you are - * really short on memory. (Each allowed component costs a hundred or so - * bytes of storage, whether actually used in an image or not.) - */ - -#define MAX_COMPONENTS 10 /* maximum number of image components */ - - -/* - * Basic data types. - * You may need to change these if you have a machine with unusual data - * type sizes; for example, "char" not 8 bits, "short" not 16 bits, - * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, - * but it had better be at least 16. - */ - -/* Representation of a single sample (pixel element value). - * We frequently allocate large arrays of these, so it's important to keep - * them small. But if you have memory to burn and access to char or short - * arrays is very slow on your hardware, you might want to change these. - */ - -#if BITS_IN_JSAMPLE == 8 -/* JSAMPLE should be the smallest type that will hold the values 0..255. - * You can use a signed char by having GETJSAMPLE mask it with 0xFF. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JSAMPLE; -#ifdef CHAR_IS_UNSIGNED -#define GETJSAMPLE(value) ((int) (value)) -#else -#define GETJSAMPLE(value) ((int) (value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - -#define MAXJSAMPLE 255 -#define CENTERJSAMPLE 128 - -#endif /* BITS_IN_JSAMPLE == 8 */ - - -#if BITS_IN_JSAMPLE == 12 -/* JSAMPLE should be the smallest type that will hold the values 0..4095. - * On nearly all machines "short" will do nicely. - */ - -typedef short JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#define MAXJSAMPLE 4095 -#define CENTERJSAMPLE 2048 - -#endif /* BITS_IN_JSAMPLE == 12 */ - - -/* Representation of a DCT frequency coefficient. - * This should be a signed value of at least 16 bits; "short" is usually OK. - * Again, we allocate large arrays of these, but you can change to int - * if you have memory to burn and "short" is really slow. - */ - -typedef short JCOEF; - - -/* Compressed datastreams are represented as arrays of JOCTET. - * These must be EXACTLY 8 bits wide, at least once they are written to - * external storage. Note that when using the stdio data source/destination - * managers, this is also the data type passed to fread/fwrite. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JOCTET; -#define GETJOCTET(value) (value) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JOCTET; -#ifdef CHAR_IS_UNSIGNED -#define GETJOCTET(value) (value) -#else -#define GETJOCTET(value) ((value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - - -/* These typedefs are used for various table entries and so forth. - * They must be at least as wide as specified; but making them too big - * won't cost a huge amount of memory, so we don't provide special - * extraction code like we did for JSAMPLE. (In other words, these - * typedefs live at a different point on the speed/space tradeoff curve.) - */ - -/* UINT8 must hold at least the values 0..255. */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char UINT8; -#else /* not HAVE_UNSIGNED_CHAR */ -#ifdef CHAR_IS_UNSIGNED -typedef char UINT8; -#else /* not CHAR_IS_UNSIGNED */ -typedef short UINT8; -#endif /* CHAR_IS_UNSIGNED */ -#endif /* HAVE_UNSIGNED_CHAR */ - -/* UINT16 must hold at least the values 0..65535. */ - -#ifdef HAVE_UNSIGNED_SHORT -typedef unsigned short UINT16; -#else /* not HAVE_UNSIGNED_SHORT */ -typedef unsigned int UINT16; -#endif /* HAVE_UNSIGNED_SHORT */ - -/* INT16 must hold at least the values -32768..32767. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ -typedef short INT16; -#endif - -/* INT32 must hold at least signed 32-bit values. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ -typedef long INT32; -#endif - -/* Datatype used for image dimensions. The JPEG standard only supports - * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore - * "unsigned int" is sufficient on all machines. However, if you need to - * handle larger images and you don't mind deviating from the spec, you - * can change this datatype. - */ - -typedef unsigned int JDIMENSION; - -#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ - - -/* These macros are used in all function definitions and extern declarations. - * You could modify them if you need to change function linkage conventions; - * in particular, you'll need to do that to make the library a Windows DLL. - * Another application is to make all functions global for use with debuggers - * or code profilers that require it. - */ - -/* a function called through method pointers: */ -#define METHODDEF(type) static type -/* a function used only in its module: */ -#define LOCAL(type) static type -/* a function referenced thru EXTERNs: */ -#define GLOBAL(type) type -/* a reference to a GLOBAL function: */ -#define EXTERN(type) extern type - - -/* This macro is used to declare a "method", that is, a function pointer. - * We want to supply prototype parameters if the compiler can cope. - * Note that the arglist parameter must be parenthesized! - * Again, you can customize this if you need special linkage keywords. - */ - -#ifdef HAVE_PROTOTYPES -#define JMETHOD(type,methodname,arglist) type (*methodname) arglist -#else -#define JMETHOD(type,methodname,arglist) type (*methodname) () -#endif - - -/* Here is the pseudo-keyword for declaring pointers that must be "far" - * on 80x86 machines. Most of the specialized coding for 80x86 is handled - * by just saying "FAR *" where such a pointer is needed. In a few places - * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. - */ - -#ifdef NEED_FAR_POINTERS -#define FAR far -#else -#define FAR -#endif - - -/* - * On a few systems, type boolean and/or its values FALSE, TRUE may appear - * in standard header files. Or you may have conflicts with application- - * specific header files that you want to include together with these files. - * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. - */ - -#ifndef HAVE_BOOLEAN -typedef int boolean; -#endif -#ifndef FALSE /* in case these macros already exist */ -#define FALSE 0 /* values of boolean */ -#endif -#ifndef TRUE -#define TRUE 1 -#endif - - -/* - * The remaining options affect code selection within the JPEG library, - * but they don't need to be visible to most applications using the library. - * To minimize application namespace pollution, the symbols won't be - * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. - */ - -#ifdef JPEG_INTERNALS -#define JPEG_INTERNAL_OPTIONS -#endif - -#ifdef JPEG_INTERNAL_OPTIONS - - -/* - * These defines indicate whether to include various optional functions. - * Undefining some of these symbols will produce a smaller but less capable - * library. Note that you can leave certain source files out of the - * compilation/linking process if you've #undef'd the corresponding symbols. - * (You may HAVE to do that if your compiler doesn't like null source files.) - */ - -/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ - -/* Capability options common to encoder and decoder: */ - -#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ -#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ -#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ - -/* Encoder capability options: */ - -#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ -/* Note: if you selected 12-bit data precision, it is dangerous to turn off - * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit - * precision, so jchuff.c normally uses entropy optimization to compute - * usable tables for higher precision. If you don't want to do optimization, - * you'll have to supply different default Huffman tables. - * The exact same statements apply for progressive JPEG: the default tables - * don't work for progressive mode. (This may get fixed, however.) - */ -#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ - -/* Decoder capability options: */ - -#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ -#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ -#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ -#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ -#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ -#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ -#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ - -/* more capability options later, no doubt */ - - -/* - * Ordering of RGB data in scanlines passed to or from the application. - * If your application wants to deal with data in the order B,G,R, just - * change these macros. You can also deal with formats such as R,G,B,X - * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing - * the offsets will also change the order in which colormap data is organized. - * RESTRICTIONS: - * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. - * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not - * useful if you are using JPEG color spaces other than YCbCr or grayscale. - * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE - * is not 3 (they don't understand about dummy color components!). So you - * can't use color quantization if you change that value. - */ - -#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ -#define RGB_GREEN 1 /* Offset of Green */ -#define RGB_BLUE 2 /* Offset of Blue */ -#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ - - -/* Definitions for speed-related optimizations. */ - - -/* If your compiler supports inline functions, define INLINE - * as the inline keyword; otherwise define it as empty. - */ - -#ifndef INLINE -#ifdef __GNUC__ /* for instance, GNU C knows about inline */ -#define INLINE __inline__ -#endif -#ifndef INLINE -#define INLINE /* default is to define it as empty */ -#endif -#endif - - -/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying - * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER - * as short on such a machine. MULTIPLIER must be at least 16 bits wide. - */ - -#ifndef MULTIPLIER -#define MULTIPLIER int /* type for fastest integer multiply */ -#endif - - -/* FAST_FLOAT should be either float or double, whichever is done faster - * by your compiler. (Note that this type is only used in the floating point - * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) - * Typically, float is faster in ANSI C compilers, while double is faster in - * pre-ANSI compilers (because they insist on converting to double anyway). - * The code below therefore chooses float if we have ANSI-style prototypes. - */ - -#ifndef FAST_FLOAT -#ifdef HAVE_PROTOTYPES -#define FAST_FLOAT float -#else -#define FAST_FLOAT double -#endif -#endif - -#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/GRRLIB-400/lib/libjpeg/jpeglib.h b/GRRLIB-400/lib/libjpeg/jpeglib.h deleted file mode 100644 index 6febf78..0000000 --- a/GRRLIB-400/lib/libjpeg/jpeglib.h +++ /dev/null @@ -1,1097 +0,0 @@ -/* - * jpeglib.h - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the application interface for the JPEG library. - * Most applications using the library need only include this file, - * and perhaps jerror.h if they want to know the exact error codes. - */ - -#ifndef JPEGLIB_H -#define JPEGLIB_H - -/* - * First we include the configuration files that record how this - * installation of the JPEG library is set up. jconfig.h can be - * generated automatically for many systems. jmorecfg.h contains - * manual configuration options that most people need not worry about. - */ - -#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ -#include "jconfig.h" /* widely used configuration options */ -#endif -#include "jmorecfg.h" /* seldom changed options */ - - -/* Version ID for the JPEG library. - * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60". - */ - -#define JPEG_LIB_VERSION 62 /* Version 6b */ - - -/* Various constants determining the sizes of things. - * All of these are specified by the JPEG standard, so don't change them - * if you want to be compatible. - */ - -#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ -#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ -#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ -#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ -#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ -#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ -#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ -/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; - * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. - * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU - * to handle it. We even let you do this from the jconfig.h file. However, - * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe - * sometimes emits noncompliant files doesn't mean you should too. - */ -#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ -#ifndef D_MAX_BLOCKS_IN_MCU -#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ -#endif - - -/* Data structures for images (arrays of samples and of DCT coefficients). - * On 80x86 machines, the image arrays are too big for near pointers, - * but the pointer arrays can fit in near memory. - */ - -typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ -typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ -typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ - -typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ -typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ -typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ -typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ - -typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ - - -/* Types for JPEG compression parameters and working tables. */ - - -/* DCT coefficient quantization tables. */ - -typedef struct { - /* This array gives the coefficient quantizers in natural array order - * (not the zigzag order in which they are stored in a JPEG DQT marker). - * CAUTION: IJG versions prior to v6a kept this array in zigzag order. - */ - UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JQUANT_TBL; - - -/* Huffman coding tables. */ - -typedef struct { - /* These two fields directly represent the contents of a JPEG DHT marker */ - UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ - /* length k bits; bits[0] is unused */ - UINT8 huffval[256]; /* The symbols, in order of incr code length */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JHUFF_TBL; - - -/* Basic info about one component (color channel). */ - -typedef struct { - /* These values are fixed over the whole image. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOF marker. */ - int component_id; /* identifier for this component (0..255) */ - int component_index; /* its index in SOF or cinfo->comp_info[] */ - int h_samp_factor; /* horizontal sampling factor (1..4) */ - int v_samp_factor; /* vertical sampling factor (1..4) */ - int quant_tbl_no; /* quantization table selector (0..3) */ - /* These values may vary between scans. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOS marker. */ - /* The decompressor output side may not use these variables. */ - int dc_tbl_no; /* DC entropy table selector (0..3) */ - int ac_tbl_no; /* AC entropy table selector (0..3) */ - - /* Remaining fields should be treated as private by applications. */ - - /* These values are computed during compression or decompression startup: */ - /* Component's size in DCT blocks. - * Any dummy blocks added to complete an MCU are not counted; therefore - * these values do not depend on whether a scan is interleaved or not. - */ - JDIMENSION width_in_blocks; - JDIMENSION height_in_blocks; - /* Size of a DCT block in samples. Always DCTSIZE for compression. - * For decompression this is the size of the output from one DCT block, - * reflecting any scaling we choose to apply during the IDCT step. - * Values of 1,2,4,8 are likely to be supported. Note that different - * components may receive different IDCT scalings. - */ - int DCT_scaled_size; - /* The downsampled dimensions are the component's actual, unpadded number - * of samples at the main buffer (preprocessing/compression interface), thus - * downsampled_width = ceil(image_width * Hi/Hmax) - * and similarly for height. For decompression, IDCT scaling is included, so - * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) - */ - JDIMENSION downsampled_width; /* actual width in samples */ - JDIMENSION downsampled_height; /* actual height in samples */ - /* This flag is used only for decompression. In cases where some of the - * components will be ignored (eg grayscale output from YCbCr image), - * we can skip most computations for the unused components. - */ - boolean component_needed; /* do we need the value of this component? */ - - /* These values are computed before starting a scan of the component. */ - /* The decompressor output side may not use these variables. */ - int MCU_width; /* number of blocks per MCU, horizontally */ - int MCU_height; /* number of blocks per MCU, vertically */ - int MCU_blocks; /* MCU_width * MCU_height */ - int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ - int last_col_width; /* # of non-dummy blocks across in last MCU */ - int last_row_height; /* # of non-dummy blocks down in last MCU */ - - /* Saved quantization table for component; NULL if none yet saved. - * See jdinput.c comments about the need for this information. - * This field is currently used only for decompression. - */ - JQUANT_TBL * quant_table; - - /* Private per-component storage for DCT or IDCT subsystem. */ - void * dct_table; -} jpeg_component_info; - - -/* The script for encoding a multiple-scan file is an array of these: */ - -typedef struct { - int comps_in_scan; /* number of components encoded in this scan */ - int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ - int Ss, Se; /* progressive JPEG spectral selection parms */ - int Ah, Al; /* progressive JPEG successive approx. parms */ -} jpeg_scan_info; - -/* The decompressor can save APPn and COM markers in a list of these: */ - -typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; - -struct jpeg_marker_struct { - jpeg_saved_marker_ptr next; /* next in list, or NULL */ - UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ - unsigned int original_length; /* # bytes of data in the file */ - unsigned int data_length; /* # bytes of data saved at data[] */ - JOCTET FAR * data; /* the data contained in the marker */ - /* the marker length word is not counted in data_length or original_length */ -}; - -/* Known color spaces. */ - -typedef enum { - JCS_UNKNOWN, /* error/unspecified */ - JCS_GRAYSCALE, /* monochrome */ - JCS_RGB, /* red/green/blue */ - JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ - JCS_CMYK, /* C/M/Y/K */ - JCS_YCCK /* Y/Cb/Cr/K */ -} J_COLOR_SPACE; - -/* DCT/IDCT algorithm options. */ - -typedef enum { - JDCT_ISLOW, /* slow but accurate integer algorithm */ - JDCT_IFAST, /* faster, less accurate integer method */ - JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ -} J_DCT_METHOD; - -#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ -#define JDCT_DEFAULT JDCT_ISLOW -#endif -#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ -#define JDCT_FASTEST JDCT_IFAST -#endif - -/* Dithering options for decompression. */ - -typedef enum { - JDITHER_NONE, /* no dithering */ - JDITHER_ORDERED, /* simple ordered dither */ - JDITHER_FS /* Floyd-Steinberg error diffusion dither */ -} J_DITHER_MODE; - - -/* Common fields between JPEG compression and decompression master structs. */ - -#define jpeg_common_fields \ - struct jpeg_error_mgr * err; /* Error handler module */\ - struct jpeg_memory_mgr * mem; /* Memory manager module */\ - struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ - void * client_data; /* Available for use by application */\ - boolean is_decompressor; /* So common code can tell which is which */\ - int global_state /* For checking call sequence validity */ - -/* Routines that are to be used by both halves of the library are declared - * to receive a pointer to this structure. There are no actual instances of - * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. - */ -struct jpeg_common_struct { - jpeg_common_fields; /* Fields common to both master struct types */ - /* Additional fields follow in an actual jpeg_compress_struct or - * jpeg_decompress_struct. All three structs must agree on these - * initial fields! (This would be a lot cleaner in C++.) - */ -}; - -typedef struct jpeg_common_struct * j_common_ptr; -typedef struct jpeg_compress_struct * j_compress_ptr; -typedef struct jpeg_decompress_struct * j_decompress_ptr; - - -/* Master record for a compression instance */ - -struct jpeg_compress_struct { - jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ - - /* Destination for compressed data */ - struct jpeg_destination_mgr * dest; - - /* Description of source image --- these fields must be filled in by - * outer application before starting compression. in_color_space must - * be correct before you can even call jpeg_set_defaults(). - */ - - JDIMENSION image_width; /* input image width */ - JDIMENSION image_height; /* input image height */ - int input_components; /* # of color components in input image */ - J_COLOR_SPACE in_color_space; /* colorspace of input image */ - - double input_gamma; /* image gamma of input image */ - - /* Compression parameters --- these fields must be set before calling - * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to - * initialize everything to reasonable defaults, then changing anything - * the application specifically wants to change. That way you won't get - * burnt when new parameters are added. Also note that there are several - * helper routines to simplify changing parameters. - */ - - int data_precision; /* bits of precision in image data */ - - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - int num_scans; /* # of entries in scan_info array */ - const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ - /* The default value of scan_info is NULL, which causes a single-scan - * sequential JPEG file to be emitted. To create a multi-scan file, - * set num_scans and scan_info to point to an array of scan definitions. - */ - - boolean raw_data_in; /* TRUE=caller supplies downsampled data */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - int smoothing_factor; /* 1..100, or 0 for no input smoothing */ - J_DCT_METHOD dct_method; /* DCT algorithm selector */ - - /* The restart interval can be specified in absolute MCUs by setting - * restart_interval, or in MCU rows by setting restart_in_rows - * (in which case the correct restart_interval will be figured - * for each scan). - */ - unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ - int restart_in_rows; /* if > 0, MCU rows per restart interval */ - - /* Parameters controlling emission of special markers. */ - - boolean write_JFIF_header; /* should a JFIF marker be written? */ - UINT8 JFIF_major_version; /* What to write for the JFIF version number */ - UINT8 JFIF_minor_version; - /* These three values are not used by the JPEG code, merely copied */ - /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ - /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ - /* ratio is defined by X_density/Y_density even when density_unit=0. */ - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean write_Adobe_marker; /* should an Adobe marker be written? */ - - /* State variable: index of next scanline to be written to - * jpeg_write_scanlines(). Application may use this to control its - * processing loop, e.g., "while (next_scanline < image_height)". - */ - - JDIMENSION next_scanline; /* 0 .. image_height-1 */ - - /* Remaining fields are known throughout compressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during compression startup - */ - boolean progressive_mode; /* TRUE if scan script uses progressive mode */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ - /* The coefficient controller receives data in units of MCU rows as defined - * for fully interleaved scans (whether the JPEG file is interleaved or not). - * There are v_samp_factor * DCTSIZE sample rows of each component in an - * "iMCU" (interleaved MCU) row. - */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[C_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - /* - * Links to compression subobjects (methods and private variables of modules) - */ - struct jpeg_comp_master * master; - struct jpeg_c_main_controller * main; - struct jpeg_c_prep_controller * prep; - struct jpeg_c_coef_controller * coef; - struct jpeg_marker_writer * marker; - struct jpeg_color_converter * cconvert; - struct jpeg_downsampler * downsample; - struct jpeg_forward_dct * fdct; - struct jpeg_entropy_encoder * entropy; - jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ - int script_space_size; -}; - - -/* Master record for a decompression instance */ - -struct jpeg_decompress_struct { - jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ - - /* Source of compressed data */ - struct jpeg_source_mgr * src; - - /* Basic description of image --- filled in by jpeg_read_header(). */ - /* Application may inspect these values to decide how to process image. */ - - JDIMENSION image_width; /* nominal image width (from SOF marker) */ - JDIMENSION image_height; /* nominal image height */ - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - /* Decompression processing parameters --- these fields must be set before - * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes - * them to default values. - */ - - J_COLOR_SPACE out_color_space; /* colorspace for output */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - double output_gamma; /* image gamma wanted in output */ - - boolean buffered_image; /* TRUE=multiple output passes */ - boolean raw_data_out; /* TRUE=downsampled data wanted */ - - J_DCT_METHOD dct_method; /* IDCT algorithm selector */ - boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ - boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ - - boolean quantize_colors; /* TRUE=colormapped output wanted */ - /* the following are ignored if not quantize_colors: */ - J_DITHER_MODE dither_mode; /* type of color dithering to use */ - boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ - int desired_number_of_colors; /* max # colors to use in created colormap */ - /* these are significant only in buffered-image mode: */ - boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ - boolean enable_external_quant;/* enable future use of external colormap */ - boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ - - /* Description of actual output image that will be returned to application. - * These fields are computed by jpeg_start_decompress(). - * You can also use jpeg_calc_output_dimensions() to determine these values - * in advance of calling jpeg_start_decompress(). - */ - - JDIMENSION output_width; /* scaled image width */ - JDIMENSION output_height; /* scaled image height */ - int out_color_components; /* # of color components in out_color_space */ - int output_components; /* # of color components returned */ - /* output_components is 1 (a colormap index) when quantizing colors; - * otherwise it equals out_color_components. - */ - int rec_outbuf_height; /* min recommended height of scanline buffer */ - /* If the buffer passed to jpeg_read_scanlines() is less than this many rows - * high, space and time will be wasted due to unnecessary data copying. - * Usually rec_outbuf_height will be 1 or 2, at most 4. - */ - - /* When quantizing colors, the output colormap is described by these fields. - * The application can supply a colormap by setting colormap non-NULL before - * calling jpeg_start_decompress; otherwise a colormap is created during - * jpeg_start_decompress or jpeg_start_output. - * The map has out_color_components rows and actual_number_of_colors columns. - */ - int actual_number_of_colors; /* number of entries in use */ - JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ - - /* State variables: these variables indicate the progress of decompression. - * The application may examine these but must not modify them. - */ - - /* Row index of next scanline to be read from jpeg_read_scanlines(). - * Application may use this to control its processing loop, e.g., - * "while (output_scanline < output_height)". - */ - JDIMENSION output_scanline; /* 0 .. output_height-1 */ - - /* Current input scan number and number of iMCU rows completed in scan. - * These indicate the progress of the decompressor input side. - */ - int input_scan_number; /* Number of SOS markers seen so far */ - JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ - - /* The "output scan number" is the notional scan being displayed by the - * output side. The decompressor will not allow output scan/row number - * to get ahead of input scan/row, but it can fall arbitrarily far behind. - */ - int output_scan_number; /* Nominal scan number being displayed */ - JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ - - /* Current progression status. coef_bits[c][i] indicates the precision - * with which component c's DCT coefficient i (in zigzag order) is known. - * It is -1 when no data has yet been received, otherwise it is the point - * transform (shift) value for the most recent scan of the coefficient - * (thus, 0 at completion of the progression). - * This pointer is NULL when reading a non-progressive file. - */ - int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ - - /* Internal JPEG parameters --- the application usually need not look at - * these fields. Note that the decompressor output side may not use - * any parameters that can change between scans. - */ - - /* Quantization and Huffman tables are carried forward across input - * datastreams when processing abbreviated JPEG datastreams. - */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - /* These parameters are never carried across datastreams, since they - * are given in SOF/SOS markers or defined to be reset by SOI. - */ - - int data_precision; /* bits of precision in image data */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ - - /* These fields record data obtained from optional markers recognized by - * the JPEG library. - */ - boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ - /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ - UINT8 JFIF_major_version; /* JFIF version number */ - UINT8 JFIF_minor_version; - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ - UINT8 Adobe_transform; /* Color transform code from Adobe marker */ - - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - - /* Aside from the specific data retained from APPn markers known to the - * library, the uninterpreted contents of any or all APPn and COM markers - * can be saved in a list for examination by the application. - */ - jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ - - /* Remaining fields are known throughout decompressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during decompression startup - */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ - /* The coefficient controller's input and output progress is measured in - * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows - * in fully interleaved JPEG scans, but are used whether the scan is - * interleaved or not. We define an iMCU row as v_samp_factor DCT block - * rows of each component. Therefore, the IDCT output contains - * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. - */ - - JSAMPLE * sample_range_limit; /* table for fast range-limiting */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - * Note that the decompressor output side must not use these fields. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[D_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - /* This field is shared between entropy decoder and marker parser. - * It is either zero or the code of a JPEG marker that has been - * read from the data source, but has not yet been processed. - */ - int unread_marker; - - /* - * Links to decompression subobjects (methods, private variables of modules) - */ - struct jpeg_decomp_master * master; - struct jpeg_d_main_controller * main; - struct jpeg_d_coef_controller * coef; - struct jpeg_d_post_controller * post; - struct jpeg_input_controller * inputctl; - struct jpeg_marker_reader * marker; - struct jpeg_entropy_decoder * entropy; - struct jpeg_inverse_dct * idct; - struct jpeg_upsampler * upsample; - struct jpeg_color_deconverter * cconvert; - struct jpeg_color_quantizer * cquantize; -}; - - -/* "Object" declarations for JPEG modules that may be supplied or called - * directly by the surrounding application. - * As with all objects in the JPEG library, these structs only define the - * publicly visible methods and state variables of a module. Additional - * private fields may exist after the public ones. - */ - - -/* Error handler object */ - -struct jpeg_error_mgr { - /* Error exit handler: does not return to caller */ - JMETHOD(void, error_exit, (j_common_ptr cinfo)); - /* Conditionally emit a trace or warning message */ - JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); - /* Routine that actually outputs a trace or error message */ - JMETHOD(void, output_message, (j_common_ptr cinfo)); - /* Format a message string for the most recent JPEG error or message */ - JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); -#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ - /* Reset error state variables at start of a new image */ - JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); - - /* The message ID code and any parameters are saved here. - * A message can have one string parameter or up to 8 int parameters. - */ - int msg_code; -#define JMSG_STR_PARM_MAX 80 - union { - int i[8]; - char s[JMSG_STR_PARM_MAX]; - } msg_parm; - - /* Standard state variables for error facility */ - - int trace_level; /* max msg_level that will be displayed */ - - /* For recoverable corrupt-data errors, we emit a warning message, - * but keep going unless emit_message chooses to abort. emit_message - * should count warnings in num_warnings. The surrounding application - * can check for bad data by seeing if num_warnings is nonzero at the - * end of processing. - */ - long num_warnings; /* number of corrupt-data warnings */ - - /* These fields point to the table(s) of error message strings. - * An application can change the table pointer to switch to a different - * message list (typically, to change the language in which errors are - * reported). Some applications may wish to add additional error codes - * that will be handled by the JPEG library error mechanism; the second - * table pointer is used for this purpose. - * - * First table includes all errors generated by JPEG library itself. - * Error code 0 is reserved for a "no such error string" message. - */ - const char * const * jpeg_message_table; /* Library errors */ - int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ - /* Second table can be added by application (see cjpeg/djpeg for example). - * It contains strings numbered first_addon_message..last_addon_message. - */ - const char * const * addon_message_table; /* Non-library errors */ - int first_addon_message; /* code for first string in addon table */ - int last_addon_message; /* code for last string in addon table */ -}; - - -/* Progress monitor object */ - -struct jpeg_progress_mgr { - JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); - - long pass_counter; /* work units completed in this pass */ - long pass_limit; /* total number of work units in this pass */ - int completed_passes; /* passes completed so far */ - int total_passes; /* total number of passes expected */ -}; - - -/* Data destination object for compression */ - -struct jpeg_destination_mgr { - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - - JMETHOD(void, init_destination, (j_compress_ptr cinfo)); - JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); - JMETHOD(void, term_destination, (j_compress_ptr cinfo)); -}; - - -/* Data source object for decompression */ - -struct jpeg_source_mgr { - const JOCTET * next_input_byte; /* => next byte to read from buffer */ - size_t bytes_in_buffer; /* # of bytes remaining in buffer */ - - JMETHOD(void, init_source, (j_decompress_ptr cinfo)); - JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); - JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); - JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); - JMETHOD(void, term_source, (j_decompress_ptr cinfo)); -}; - - -/* Memory manager object. - * Allocates "small" objects (a few K total), "large" objects (tens of K), - * and "really big" objects (virtual arrays with backing store if needed). - * The memory manager does not allow individual objects to be freed; rather, - * each created object is assigned to a pool, and whole pools can be freed - * at once. This is faster and more convenient than remembering exactly what - * to free, especially where malloc()/free() are not too speedy. - * NB: alloc routines never return NULL. They exit to error_exit if not - * successful. - */ - -#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ -#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ -#define JPOOL_NUMPOOLS 2 - -typedef struct jvirt_sarray_control * jvirt_sarray_ptr; -typedef struct jvirt_barray_control * jvirt_barray_ptr; - - -struct jpeg_memory_mgr { - /* Method pointers */ - JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, - JDIMENSION samplesperrow, - JDIMENSION numrows)); - JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, - JDIMENSION blocksperrow, - JDIMENSION numrows)); - JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION samplesperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION blocksperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); - JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, - jvirt_sarray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, - jvirt_barray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); - JMETHOD(void, self_destruct, (j_common_ptr cinfo)); - - /* Limit on memory allocation for this JPEG object. (Note that this is - * merely advisory, not a guaranteed maximum; it only affects the space - * used for virtual-array buffers.) May be changed by outer application - * after creating the JPEG object. - */ - long max_memory_to_use; - - /* Maximum allocation request accepted by alloc_large. */ - long max_alloc_chunk; -}; - - -/* Routine signature for application-supplied marker processing methods. - * Need not pass marker code since it is stored in cinfo->unread_marker. - */ -typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); - - -/* Declarations for routines called by application. - * The JPP macro hides prototype parameters from compilers that can't cope. - * Note JPP requires double parentheses. - */ - -#ifdef HAVE_PROTOTYPES -#define JPP(arglist) arglist -#else -#define JPP(arglist) () -#endif - - -/* Short forms of external names for systems with brain-damaged linkers. - * We shorten external names to be unique in the first six letters, which - * is good enough for all known systems. - * (If your compiler itself needs names to be unique in less than 15 - * characters, you are out of luck. Get a better compiler.) - */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_std_error jStdError -#define jpeg_CreateCompress jCreaCompress -#define jpeg_CreateDecompress jCreaDecompress -#define jpeg_destroy_compress jDestCompress -#define jpeg_destroy_decompress jDestDecompress -#define jpeg_stdio_dest jStdDest -#define jpeg_stdio_src jStdSrc -#define jpeg_set_defaults jSetDefaults -#define jpeg_set_colorspace jSetColorspace -#define jpeg_default_colorspace jDefColorspace -#define jpeg_set_quality jSetQuality -#define jpeg_set_linear_quality jSetLQuality -#define jpeg_add_quant_table jAddQuantTable -#define jpeg_quality_scaling jQualityScaling -#define jpeg_simple_progression jSimProgress -#define jpeg_suppress_tables jSuppressTables -#define jpeg_alloc_quant_table jAlcQTable -#define jpeg_alloc_huff_table jAlcHTable -#define jpeg_start_compress jStrtCompress -#define jpeg_write_scanlines jWrtScanlines -#define jpeg_finish_compress jFinCompress -#define jpeg_write_raw_data jWrtRawData -#define jpeg_write_marker jWrtMarker -#define jpeg_write_m_header jWrtMHeader -#define jpeg_write_m_byte jWrtMByte -#define jpeg_write_tables jWrtTables -#define jpeg_read_header jReadHeader -#define jpeg_start_decompress jStrtDecompress -#define jpeg_read_scanlines jReadScanlines -#define jpeg_finish_decompress jFinDecompress -#define jpeg_read_raw_data jReadRawData -#define jpeg_has_multiple_scans jHasMultScn -#define jpeg_start_output jStrtOutput -#define jpeg_finish_output jFinOutput -#define jpeg_input_complete jInComplete -#define jpeg_new_colormap jNewCMap -#define jpeg_consume_input jConsumeInput -#define jpeg_calc_output_dimensions jCalcDimensions -#define jpeg_save_markers jSaveMarkers -#define jpeg_set_marker_processor jSetMarker -#define jpeg_read_coefficients jReadCoefs -#define jpeg_write_coefficients jWrtCoefs -#define jpeg_copy_critical_parameters jCopyCrit -#define jpeg_abort_compress jAbrtCompress -#define jpeg_abort_decompress jAbrtDecompress -#define jpeg_abort jAbort -#define jpeg_destroy jDestroy -#define jpeg_resync_to_restart jResyncRestart -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Default error-management setup */ -EXTERN(struct jpeg_error_mgr *) jpeg_std_error - JPP((struct jpeg_error_mgr * err)); - -/* Initialization of JPEG compression objects. - * jpeg_create_compress() and jpeg_create_decompress() are the exported - * names that applications should call. These expand to calls on - * jpeg_CreateCompress and jpeg_CreateDecompress with additional information - * passed for version mismatch checking. - * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. - */ -#define jpeg_create_compress(cinfo) \ - jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_compress_struct)) -#define jpeg_create_decompress(cinfo) \ - jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_decompress_struct)) -EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, - int version, size_t structsize)); -EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, - int version, size_t structsize)); -/* Destruction of JPEG compression objects */ -EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); - -/* Standard data source and destination managers: stdio streams. */ -/* Caller is responsible for opening the file before and closing after. */ -EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); -EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); -EXTERN(void) jpeg_memory_src JPP((j_decompress_ptr cinfo, const JOCTET *buffer, size_t bufsize)); - -/* Default parameter setup for compression */ -EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); -/* Compression parameter setup aids */ -EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, - J_COLOR_SPACE colorspace)); -EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, - boolean force_baseline)); -EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, - int scale_factor, - boolean force_baseline)); -EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, - const unsigned int *basic_table, - int scale_factor, - boolean force_baseline)); -EXTERN(int) jpeg_quality_scaling JPP((int quality)); -EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, - boolean suppress)); -EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); -EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); - -/* Main entry points for compression */ -EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, - boolean write_all_tables)); -EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION num_lines)); -EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); - -/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION num_lines)); - -/* Write a special marker. See libjpeg.doc concerning safe usage. */ -EXTERN(void) jpeg_write_marker - JPP((j_compress_ptr cinfo, int marker, - const JOCTET * dataptr, unsigned int datalen)); -/* Same, but piecemeal. */ -EXTERN(void) jpeg_write_m_header - JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); -EXTERN(void) jpeg_write_m_byte - JPP((j_compress_ptr cinfo, int val)); - -/* Alternate compression function: just write an abbreviated table file */ -EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); - -/* Decompression startup: read start of JPEG datastream to see what's there */ -EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, - boolean require_image)); -/* Return value is one of: */ -#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ -#define JPEG_HEADER_OK 1 /* Found valid image datastream */ -#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ -/* If you pass require_image = TRUE (normal case), you need not check for - * a TABLES_ONLY return code; an abbreviated file will cause an error exit. - * JPEG_SUSPENDED is only possible if you use a data source module that can - * give a suspension return (the stdio source module doesn't). - */ - -/* Main entry points for decompression */ -EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); -EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION max_lines)); -EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); - -/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION max_lines)); - -/* Additional entry points for buffered-image mode. */ -EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, - int scan_number)); -EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); -EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); -/* Return value is one of: */ -/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ -#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ -#define JPEG_REACHED_EOI 2 /* Reached end of image */ -#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ -#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ - -/* Precalculate output dimensions for current decompression parameters. */ -EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); - -/* Control saving of COM and APPn markers into marker_list. */ -EXTERN(void) jpeg_save_markers - JPP((j_decompress_ptr cinfo, int marker_code, - unsigned int length_limit)); - -/* Install a special processing method for COM or APPn markers. */ -EXTERN(void) jpeg_set_marker_processor - JPP((j_decompress_ptr cinfo, int marker_code, - jpeg_marker_parser_method routine)); - -/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ -EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays)); -EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, - j_compress_ptr dstinfo)); - -/* If you choose to abort compression or decompression before completing - * jpeg_finish_(de)compress, then you need to clean up to release memory, - * temporary files, etc. You can just call jpeg_destroy_(de)compress - * if you're done with the JPEG object, but if you want to clean it up and - * reuse it, call this: - */ -EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); - -/* Generic versions of jpeg_abort and jpeg_destroy that work on either - * flavor of JPEG object. These may be more convenient in some places. - */ -EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); -EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); - -/* Default restart-marker-resync procedure for use by data source modules */ -EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, - int desired)); - - -/* These marker codes are exported since applications and data source modules - * are likely to want to use them. - */ - -#define JPEG_RST0 0xD0 /* RST0 marker code */ -#define JPEG_EOI 0xD9 /* EOI marker code */ -#define JPEG_APP0 0xE0 /* APP0 marker code */ -#define JPEG_COM 0xFE /* COM marker code */ - - -/* If we have a brain-damaged compiler that emits warnings (or worse, errors) - * for structure definitions that are never filled in, keep it quiet by - * supplying dummy definitions for the various substructures. - */ - -#ifdef INCOMPLETE_TYPES_BROKEN -#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ -struct jvirt_sarray_control { long dummy; }; -struct jvirt_barray_control { long dummy; }; -struct jpeg_comp_master { long dummy; }; -struct jpeg_c_main_controller { long dummy; }; -struct jpeg_c_prep_controller { long dummy; }; -struct jpeg_c_coef_controller { long dummy; }; -struct jpeg_marker_writer { long dummy; }; -struct jpeg_color_converter { long dummy; }; -struct jpeg_downsampler { long dummy; }; -struct jpeg_forward_dct { long dummy; }; -struct jpeg_entropy_encoder { long dummy; }; -struct jpeg_decomp_master { long dummy; }; -struct jpeg_d_main_controller { long dummy; }; -struct jpeg_d_coef_controller { long dummy; }; -struct jpeg_d_post_controller { long dummy; }; -struct jpeg_input_controller { long dummy; }; -struct jpeg_marker_reader { long dummy; }; -struct jpeg_entropy_decoder { long dummy; }; -struct jpeg_inverse_dct { long dummy; }; -struct jpeg_upsampler { long dummy; }; -struct jpeg_color_deconverter { long dummy; }; -struct jpeg_color_quantizer { long dummy; }; -#endif /* JPEG_INTERNALS */ -#endif /* INCOMPLETE_TYPES_BROKEN */ - - -/* - * The JPEG library modules define JPEG_INTERNALS before including this file. - * The internal structure declarations are read only when that is true. - * Applications using the library should not include jpegint.h, but may wish - * to include jerror.h. - */ - -#ifdef JPEG_INTERNALS -#include "jpegint.h" /* fetch private declarations */ -#include "jerror.h" /* fetch error codes too */ -#endif - -#endif /* JPEGLIB_H */ diff --git a/GRRLIB-400/lib/libjpeg/jpgogc.h b/GRRLIB-400/lib/libjpeg/jpgogc.h deleted file mode 100644 index 33380eb..0000000 --- a/GRRLIB-400/lib/libjpeg/jpgogc.h +++ /dev/null @@ -1,29 +0,0 @@ -/**************************************************************************** -* libjpeg - 6b wrapper -* -* The version of libjpeg used in libOGC has been modified to include a memory -* source data manager (jmemsrc.c). -* -* softdev November 2006 -****************************************************************************/ -#ifndef __JPGLIB__ -#define __JPGLIB__ - -#include - -typedef struct { - char *inbuffer; - char *outbuffer; - int inbufferlength; - int outbufferlength; - int width; - int height; - int num_colours; - int dct_method; - int dither_mode; - int greyscale; -} JPEGIMG; - -int JPEG_Decompress(JPEGIMG * jpgimg); - -#endif diff --git a/GRRLIB-400/lib/libpng.a b/GRRLIB-400/lib/libpng.a deleted file mode 100644 index 67ff51fe6ec1a5d9bc28aa53563f86df386f8cec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237236 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 TCxyT3LTu@SS)W&t4Y#)`;eN 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

U(v4-uFlynmZqj{%|+nQRr_! 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 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 */ -#ifndef PNG_NO_WRITE_FILTERING - 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 */ -#endif - 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_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) -/* 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_ASSEMBLER_CODE_SUPPORTED) -# if !defined(PNG_1_0_X) -# if defined(PNG_MMX_CODE_SUPPORTED) - png_byte mmx_bitdepth_threshold; - png_uint_32 mmx_rowbytes_threshold; -# endif - png_uint_32 asm_flags; -# endif -#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 - -/* New members added in libpng-1.0.16 and 1.2.6 */ - png_byte compression_type; - -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - png_uint_32 user_width_max; - png_uint_32 user_height_max; -#endif - -/* New member added in libpng-1.0.25 and 1.2.17 */ -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) - /* storage for unknown chunk that the library doesn't recognize. */ - png_unknown_chunk unknown_chunk; -#endif - -/* New members added in libpng-1.2.26 */ - png_uint_32 old_big_row_buf_size, old_prev_row_size; -}; - - -/* This triggers a compiler error in png.c, if png.c and png.h - * do not agree upon the version number. - */ -typedef png_structp version_1_2_29; - -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)); - -#ifdef PNG_WRITE_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) - PNGARG((png_structp png_ptr)); -#endif - -#ifdef PNG_WRITE_SUPPORTED -extern PNG_EXPORT(void,png_set_compression_buffer_size) - PNGARG((png_structp png_ptr, png_uint_32 size)); -#endif - -/* 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)); - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* 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,\ - png_sizeof(png_info)); -#endif - -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)); - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* read the information before the actual image data. */ -extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif - -#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)); -#if !defined(PNG_1_0_X) -extern PNG_EXPORT(void,png_set_expand_gray_1_2_4_to_8) PNGARG((png_structp - png_ptr)); -#endif -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)); -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* Deprecated */ -extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); -#endif -#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 8-bit Gray or 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 -/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ -#if !defined(PNG_1_0_X) -extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr, - png_uint_32 filler, int flags)); -#endif -#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_1_0_X) || defined (PNG_1_2_X) -#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 -#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)); - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* 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)); -#endif - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* read a row of data. */ -extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, - png_bytep row, - png_bytep display_row)); -#endif - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* read the whole image into memory at once. */ -extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, - png_bytepp image)); -#endif - -/* 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)); - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* read the end of the PNG file. */ -extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif - -/* 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 */ - -#ifndef PNG_NO_ERROR_TEXT -/* 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)); -#else -/* Fatal error in PNG image of libpng - can't continue */ -extern PNG_EXPORT(void,png_err) PNGARG((png_structp png_ptr)); -#endif - -#ifndef PNG_NO_WARNINGS -/* 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)); - -#ifdef PNG_READ_SUPPORTED -/* 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)); -#endif /* PNG_READ_SUPPORTED */ -#endif /* PNG_NO_WARNINGS */ - -/* 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)); -#else -#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 -#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 behaviour - = 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_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 - -/* For use in png_set_keep_unknown, added to version 1.2.6 */ -#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 -#define PNG_HANDLE_CHUNK_NEVER 1 -#define PNG_HANDLE_CHUNK_IF_SAFE 2 -#define PNG_HANDLE_CHUNK_ALWAYS 3 - -/* Added to version 1.2.0 */ -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) -#if defined(PNG_MMX_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 -#endif /* PNG_MMX_CODE_SUPPORTED */ - -#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 */ - -#if !defined(PNG_1_0_X) -/* png.c, pnggccrd.c, or pngvcrd.c */ -extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - -/* 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 */ - -/* Added at libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED -extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp - png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max)); -extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp - png_ptr)); -extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp - png_ptr)); -#endif - -/* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */ - -#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 */ - -/* 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) -# define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) -# define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) -# define png_get_int_32(buf) ( *((png_int_32p) (buf))) -#else -extern PNG_EXPORT(png_uint_32,png_get_uint_32) PNGARG((png_bytep buf)); -extern PNG_EXPORT(png_uint_16,png_get_uint_16) PNGARG((png_bytep buf)); -extern PNG_EXPORT(png_int_32,png_get_int_32) PNGARG((png_bytep buf)); -#endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ -extern PNG_EXPORT(png_uint_32,png_get_uint_31) - PNGARG((png_structp png_ptr, png_bytep buf)); -/* No png_get_int_16 -- may be added if there's a real need for it. */ - -/* Place a 32-bit number into a buffer in PNG byte order (big-endian). - */ -extern PNG_EXPORT(void,png_save_uint_32) - PNGARG((png_bytep buf, png_uint_32 i)); -extern PNG_EXPORT(void,png_save_int_32) - PNGARG((png_bytep buf, png_int_32 i)); - -/* 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. - */ -extern PNG_EXPORT(void,png_save_uint_16) - PNGARG((png_bytep buf, unsigned int i)); -/* No png_save_int_16 -- may be added if there's a real need for it. */ - -/* ************************************************************************* */ - -/* 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. - */ - - -/* Various modes of operation, that are visible to applications because - * they are used for unknown chunk location. - */ -#define PNG_HAVE_IHDR 0x01 -#define PNG_HAVE_PLTE 0x02 -#define PNG_HAVE_IDAT 0x04 -#define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ -#define PNG_HAVE_IEND 0x10 - -#if defined(PNG_INTERNAL) - -/* More modes of operation. Note that after an init, mode is set to - * zero automatically when the structure is created. - */ -#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 -#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ - -/* 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 */ - /* 0x800000L Unused */ -#define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */ -#define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */ - /* 0x4000000L unused */ - /* 0x8000000L unused */ - /* 0x10000000L unused */ - /* 0x20000000L unused */ - /* 0x40000000L unused */ - -/* 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 -#define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ -#define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ - /* 0x800000L unused */ - /* 0x1000000L unused */ - /* 0x2000000L unused */ - /* 0x4000000L unused */ - /* 0x8000000L unused */ - /* 0x10000000L unused */ - /* 0x20000000L unused */ - /* 0x40000000L unused */ - -#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))) - -/* Added to libpng-1.2.6 JB */ -#define PNG_ROWBYTES(pixel_bits, width) \ - ((pixel_bits) >= 8 ? \ - ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \ - (( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) ) - -/* PNG_OUT_OF_RANGE returns true if value is outside the range - ideal-delta..ideal+delta. Each argument is evaluated twice. - "ideal" and "delta" should be constants, normally simple - integers, "value" a variable. Added to libpng-1.2.6 JB */ -#define PNG_OUT_OF_RANGE(value, ideal, delta) \ - ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) - -/* 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 (PNG_CONST png_byte FARDATA) png_sig[8]; -#else -#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 png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} -#define PNG_IDAT png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} -#define PNG_IEND png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} -#define PNG_PLTE png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} -#define PNG_bKGD png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} -#define PNG_cHRM png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} -#define PNG_gAMA png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} -#define PNG_hIST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} -#define PNG_iCCP png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} -#define PNG_iTXt png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} -#define PNG_oFFs png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} -#define PNG_pCAL png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} -#define PNG_sCAL png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} -#define PNG_pHYs png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} -#define PNG_sBIT png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} -#define PNG_sPLT png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} -#define PNG_sRGB png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} -#define PNG_tEXt png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} -#define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} -#define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} -#define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} - -#ifdef PNG_USE_GLOBAL_ARRAYS -PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_IDAT[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_IEND[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_PLTE[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_bKGD[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_cHRM[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_gAMA[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_hIST[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_iCCP[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_iTXt[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_oFFs[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_pCAL[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_sCAL[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_pHYs[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_sBIT[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_sPLT[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_sRGB[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_tEXt[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5]; -#endif /* PNG_USE_GLOBAL_ARRAYS */ - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* 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, png_sizeof(png_struct)); -#endif - -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)); -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -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)); -#endif - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* 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, png_sizeof(png_struct)); -#endif - -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)); - -#ifdef PNG_SIZE_T -/* Function to convert a sizeof an item to png_sizeof item */ - PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); -#endif - -/* 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 - -/* 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) -#if defined(PNG_MMX_CODE_SUPPORTED) -/* png.c */ /* PRIVATE */ -PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); -#endif -#endif - -#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) -PNG_EXTERN png_uint_32 png_get_pixels_per_inch PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -PNG_EXTERN png_uint_32 png_get_x_pixels_per_inch PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -PNG_EXTERN png_uint_32 png_get_y_pixels_per_inch PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -PNG_EXTERN float png_get_x_offset_inches PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -PNG_EXTERN float png_get_y_offset_inches PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -#if defined(PNG_pHYs_SUPPORTED) -PNG_EXTERN png_uint_32 png_get_pHYs_dpi PNGARG((png_structp png_ptr, -png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); -#endif /* PNG_pHYs_SUPPORTED */ -#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ - -/* 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/GRRLIB-400/lib/libpng/pngconf.h b/GRRLIB-400/lib/libpng/pngconf.h deleted file mode 100644 index 06a182f..0000000 --- a/GRRLIB-400/lib/libpng/pngconf.h +++ /dev/null @@ -1,1481 +0,0 @@ - -/* pngconf.h - machine configurable file for libpng - * - * libpng version 1.2.29 - May 8, 2008 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2008 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 - -#define PNG_1_2_X - -/* - * PNG_USER_CONFIG has to be defined on the compiler command line. This - * includes the resource compiler for Windows DLL configurations. - */ -#ifdef PNG_USER_CONFIG -# ifndef PNG_USER_PRIVATEBUILD -# define PNG_USER_PRIVATEBUILD -# endif -#include "pngusr.h" -#endif - -/* PNG_CONFIGURE_LIBPNG is set by the "configure" script. */ -#ifdef PNG_CONFIGURE_LIBPNG -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#endif - -/* - * Added at libpng-1.2.8 - * - * If you create a private DLL you need to define in "pngusr.h" the followings: - * #define PNG_USER_PRIVATEBUILD - * e.g. #define PNG_USER_PRIVATEBUILD "Build by MyCompany for xyz reasons." - * #define PNG_USER_DLLFNAME_POSTFIX - * e.g. // private DLL "libpng13gx.dll" - * #define PNG_USER_DLLFNAME_POSTFIX "gx" - * - * The following macros are also at your disposal if you want to complete the - * DLL VERSIONINFO structure. - * - PNG_USER_VERSIONINFO_COMMENTS - * - PNG_USER_VERSIONINFO_COMPANYNAME - * - PNG_USER_VERSIONINFO_LEGALTRADEMARKS - */ - -#ifdef __STDC__ -#ifdef SPECIALBUILD -# pragma message("PNG_LIBPNG_SPECIALBUILD (and deprecated SPECIALBUILD)\ - are now LIBPNG reserved macros. Use PNG_USER_PRIVATEBUILD instead.") -#endif - -#ifdef PRIVATEBUILD -# pragma message("PRIVATEBUILD is deprecated.\ - Use PNG_USER_PRIVATEBUILD instead.") -# define PNG_USER_PRIVATEBUILD PRIVATEBUILD -#endif -#endif /* __STDC__ */ - -#ifndef PNG_VERSION_INFO_ONLY - -/* End of material added to libpng-1.2.8 */ - -/* Added at libpng-1.2.19, removed at libpng-1.2.20 because it caused trouble - Restored at libpng-1.2.21 */ -#if !defined(PNG_NO_WARN_UNINITIALIZED_ROW) && \ - !defined(PNG_WARN_UNINITIALIZED_ROW) -# define PNG_WARN_UNINITIALIZED_ROW 1 -#endif -/* End of material added at libpng-1.2.19/1.2.21 */ - -/* 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 - /* If you encounter a compiler error here, see the explanation - * near the end of INSTALL. - */ - __pngconf.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 -# ifndef _BSD_SOURCE -# define _BSD_SOURCE -# endif -# 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 - -/* This provides the non-ANSI (far) memory allocation routines. */ -#if defined(__TURBOC__) && defined(__MSDOS__) -# include -# include -#endif - -/* I have no idea why is this necessary... */ -#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 support was added. iTXt support was turned off by default through - * libpng-1.2.x, to support old apps that malloc the png_text structure - * instead of calling png_set_text() and letting libpng malloc it. It - * was turned on by default in libpng-1.3.0. - */ - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -# ifndef PNG_NO_iTXt_SUPPORTED -# define PNG_NO_iTXt_SUPPORTED -# endif -# ifndef PNG_NO_READ_iTXt -# define PNG_NO_READ_iTXt -# endif -# ifndef PNG_NO_WRITE_iTXt -# define PNG_NO_WRITE_iTXt -# endif -#endif - -#if !defined(PNG_NO_iTXt_SUPPORTED) -# if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) -# define PNG_READ_iTXt -# endif -# if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) -# define PNG_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_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 in 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 - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* 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 - -#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_NO_WRITE_INTERLACING_SUPPORTED) && \ - !defined(PNG_WRITE_INTERLACING_SUPPORTED) -#define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant - encoders, but can cause trouble - if left undefined */ -#endif - -#if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ - !defined(PNG_WRITE_WEIGHTED_FILTER) && \ - defined(PNG_FLOATING_POINT_SUPPORTED) -# define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED -#endif - -#ifndef PNG_NO_WRITE_FLUSH -# define PNG_WRITE_FLUSH_SUPPORTED -#endif - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ -#ifndef PNG_NO_WRITE_EMPTY_PLTE -# define PNG_WRITE_EMPTY_PLTE_SUPPORTED -#endif -#endif - -#endif /* PNG_WRITE_SUPPORTED */ - -#ifndef PNG_1_0_X -# ifndef PNG_NO_ERROR_NUMBERS -# define PNG_ERROR_NUMBERS_SUPPORTED -# endif -#endif /* PNG_1_0_X */ - -#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 - -#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 - * and removed from version 1.2.20. The following will be removed - * from libpng-1.4.0 -*/ - -#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_OPTIMIZED_CODE) -# ifndef PNG_OPTIMIZED_CODE_SUPPORTED -# define PNG_OPTIMIZED_CODE_SUPPORTED -# endif -#endif - -#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) -# ifndef PNG_ASSEMBLER_CODE_SUPPORTED -# define PNG_ASSEMBLER_CODE_SUPPORTED -# endif - -# if defined(__GNUC__) && defined(__x86_64__) && (__GNUC__ < 4) - /* work around 64-bit gcc compiler bugs in gcc-3.x */ -# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) -# define PNG_NO_MMX_CODE -# endif -# endif - -# if defined(__APPLE__) -# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) -# define PNG_NO_MMX_CODE -# endif -# endif - -# if (defined(__MWERKS__) && ((__MWERKS__ < 0x0900) || macintosh)) -# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) -# define PNG_NO_MMX_CODE -# endif -# endif - -# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) -# define PNG_MMX_CODE_SUPPORTED -# endif - -#endif -/* end of obsolete code to be removed from libpng-1.4.0 */ - -#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 */ - -/* Added at libpng-1.2.6 */ -#if !defined(PNG_1_0_X) -#ifndef PNG_SET_USER_LIMITS_SUPPORTED -#if !defined(PNG_NO_SET_USER_LIMITS) && !defined(PNG_SET_USER_LIMITS_SUPPORTED) -# define PNG_SET_USER_LIMITS_SUPPORTED -#endif -#endif -#endif /* PNG_1_0_X */ - -/* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGS no matter - * how large, set these limits to 0x7fffffffL - */ -#ifndef PNG_USER_WIDTH_MAX -# define PNG_USER_WIDTH_MAX 1000000L -#endif -#ifndef PNG_USER_HEIGHT_MAX -# define PNG_USER_HEIGHT_MAX 1000000L -#endif - -/* 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 */ -/* -#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED -# define PNG_READ_BIG_ENDIAN_SUPPORTED -#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) */ -#ifdef PNG_SIZE_T - typedef PNG_SIZE_T png_size_t; -# define png_sizeof(x) png_convert_size(sizeof (x)) -#else - typedef size_t png_size_t; -# define png_sizeof(x) sizeof (x) -#endif - -/* 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; - -#if defined(PNG_1_0_X) || defined(PNG_1_2_X) -/* SPC - Is this stuff deprecated? */ -/* It'll be removed as of libpng-1.3.0 - GR-P */ -/* 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; -#endif /* (PNG_1_0_X) || defined(PNG_1_2_X) */ - -/* - * 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)) || defined(_MSC_VER) -# 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. - */ - -#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__) )) - -# ifndef PNGAPI -# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) -# define PNGAPI __cdecl -# else -# define PNGAPI _cdecl -# endif -# 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__) -# ifndef PNGAPI -# define PNGAPI _System -# endif -# else -# if 0 /* ... other platforms, with other meanings */ -# endif -# endif -#endif - -#ifndef PNGAPI -# define PNGAPI -#endif -#ifndef PNG_IMPEXP -# define PNG_IMPEXP -#endif - -#ifdef PNG_BUILDSYMS -# ifndef PNG_EXPORT -# define PNG_EXPORT(type,symbol) PNG_FUNCTION_EXPORT symbol END -# endif -# ifdef PNG_USE_GLOBAL_ARRAYS -# ifndef PNG_EXPORT_VAR -# define PNG_EXPORT_VAR(type) PNG_DATA_EXPORT -# endif -# endif -#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_snprintf _fsnprintf /* Added to v 1.2.19 */ -# 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) -# ifndef PNG_NO_SNPRINTF -# ifdef _MSC_VER -# define png_snprintf _snprintf /* Added to v 1.2.19 */ -# define png_snprintf2 _snprintf -# define png_snprintf6 _snprintf -# else -# define png_snprintf snprintf /* Added to v 1.2.19 */ -# define png_snprintf2 snprintf -# define png_snprintf6 snprintf -# endif -# else - /* You don't have or don't want to use snprintf(). Caution: Using - * sprintf instead of snprintf exposes your application to accidental - * or malevolent buffer overflows. If you don't have snprintf() - * as a general rule you should provide one (you can get one from - * Portable OpenSSH). */ -# define png_snprintf(s1,n,fmt,x1) sprintf(s1,fmt,x1) -# define png_snprintf2(s1,n,fmt,x1,x2) sprintf(s1,fmt,x1,x2) -# define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ - sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) -# endif -# 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 > 65536L) && defined(PNG_MAX_MALLOC_64K) -# undef PNG_ZBUF_SIZE -# define PNG_ZBUF_SIZE 65536L -#endif - -/* Added at libpng-1.2.8 */ -#endif /* PNG_VERSION_INFO_ONLY */ - -#endif /* PNGCONF_H */ diff --git a/GRRLIB-400/lib/libpng/pngu/pngu.c b/GRRLIB-400/lib/libpng/pngu/pngu.c deleted file mode 100644 index f2a07c7..0000000 --- a/GRRLIB-400/lib/libpng/pngu/pngu.c +++ /dev/null @@ -1,1129 +0,0 @@ -/******************************************************************************************** - -PNGU Version : 0.2b - -Coder : frontier -YCbCr fix by Xane - -More info : http://frontier-dev.net - -********************************************************************************************/ -#include -#include -#include -#include "pngu.h" -#include "../png.h" - - -// Constants -#define PNGU_SOURCE_BUFFER 1 -#define PNGU_SOURCE_DEVICE 2 - - -// Prototypes of helper functions -int pngu_info (IMGCTX ctx); -int pngu_decode (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, PNGU_u32 stripAlpha); -void pngu_free_info (IMGCTX ctx); -void pngu_read_data_from_buffer (png_structp png_ptr, png_bytep data, png_size_t length); -void pngu_write_data_to_buffer (png_structp png_ptr, png_bytep data, png_size_t length); -void pngu_flush_data_to_buffer (png_structp png_ptr); -int pngu_clamp (float value); - - -// PNGU Image context struct -struct _IMGCTX -{ - int source; - void *buffer; - char *filename; - PNGU_u32 cursor; - - PNGU_u32 propRead; - PNGUPROP prop; - - PNGU_u32 infoRead; - png_structp png_ptr; - png_infop info_ptr; - FILE *fd; - - png_bytep *row_pointers; - png_bytep img_data; -}; - - -// PNGU Implementation // - -IMGCTX PNGU_SelectImageFromBuffer (const void *buffer) -{ - IMGCTX ctx = NULL; - - if (!buffer) - return NULL; - - ctx = malloc (sizeof (struct _IMGCTX)); - if (!ctx) - return NULL; - - ctx->buffer = (void *) buffer; - ctx->source = PNGU_SOURCE_BUFFER; - ctx->cursor = 0; - ctx->filename = NULL; - ctx->propRead = 0; - ctx->infoRead = 0; - - return ctx; -} - - -IMGCTX PNGU_SelectImageFromDevice (const char *filename) -{ - IMGCTX ctx = NULL; - - if (!filename) - return NULL; - - ctx = malloc (sizeof (struct _IMGCTX)); - if (!ctx) - return NULL; - - ctx->buffer = NULL; - ctx->source = PNGU_SOURCE_DEVICE; - ctx->cursor = 0; - - ctx->filename = malloc (strlen (filename) + 1); - if (!ctx->filename) - { - free (ctx); - return NULL; - } - strcpy(ctx->filename, filename); - - ctx->propRead = 0; - ctx->infoRead = 0; - - return ctx; -} - - -void PNGU_ReleaseImageContext (IMGCTX ctx) -{ - if (!ctx) - return; - - if (ctx->filename) - free (ctx->filename); - - if ((ctx->propRead) && (ctx->prop.trans)) - free (ctx->prop.trans); - - pngu_free_info (ctx); - - free (ctx); -} - - -int PNGU_GetImageProperties (IMGCTX ctx, PNGUPROP *imgprop) -{ - int res; - - if (!ctx->propRead) - { - res = pngu_info (ctx); - if (res != PNGU_OK) - return res; - } - - *imgprop = ctx->prop; - - return PNGU_OK; -} - - -int PNGU_DecodeToYCbYCr (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride) -{ - int result; - PNGU_u32 x, y, buffWidth; - - // width needs to be divisible by two - if (width % 2) - return PNGU_ODD_WIDTH; - - // stride needs to be divisible by two - if (stride % 2) - return PNGU_ODD_STRIDE; - - result = pngu_decode (ctx, width, height, 1); - if (result != PNGU_OK) - return result; - - // Copy image to the output buffer - buffWidth = (width + stride) / 2; - for (y = 0; y < height; y++) - for (x = 0; x < (width / 2); x++) - ((PNGU_u32 *)buffer)[y*buffWidth+x] = PNGU_RGB8_TO_YCbYCr (*(ctx->row_pointers[y]+x*6), *(ctx->row_pointers[y]+x*6+1), *(ctx->row_pointers[y]+x*6+2), - *(ctx->row_pointers[y]+x*6+3), *(ctx->row_pointers[y]+x*6+4), *(ctx->row_pointers[y]+x*6+5)); - - // Free resources - free (ctx->img_data); - free (ctx->row_pointers); - - // Success - return PNGU_OK; -} - - -int PNGU_DecodeToRGB565 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride) -{ - int result; - PNGU_u32 x, y, buffWidth; - - result = pngu_decode (ctx, width, height, 1); - if (result != PNGU_OK) - return result; - - buffWidth = width + stride; - - // Copy image to the output buffer - for (y = 0; y < height; y++) - for (x = 0; x < width; x++) - ((PNGU_u16 *)buffer)[y*buffWidth+x] = - (((PNGU_u16) (ctx->row_pointers[y][x*3] & 0xF8)) << 8) | - (((PNGU_u16) (ctx->row_pointers[y][x*3+1] & 0xFC)) << 3) | - (((PNGU_u16) (ctx->row_pointers[y][x*3+2] & 0xF8)) >> 3); - - // Free resources - free (ctx->img_data); - free (ctx->row_pointers); - - // Success - return PNGU_OK; -} - - -int PNGU_DecodeToRGBA8 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride, PNGU_u8 default_alpha) -{ - int result; - PNGU_u32 x, y, buffWidth; - - result = pngu_decode (ctx, width, height, 0); - if (result != PNGU_OK) - return result; - - buffWidth = width + stride; - - // Check is source image has an alpha channel - if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA) ) - { - // Alpha channel present, copy image to the output buffer - for (y = 0; y < height; y++) - memcpy (buffer + (y * buffWidth * 4), ctx->row_pointers[y], width * 4); - } - else - { - // No alpha channel present, copy image to the output buffer - for (y = 0; y < height; y++) - for (x = 0; x < width; x++) - ((PNGU_u32 *)buffer)[y*buffWidth+x] = - (((PNGU_u32) ctx->row_pointers[y][x*3]) << 24) | - (((PNGU_u32) ctx->row_pointers[y][x*3+1]) << 16) | - (((PNGU_u32) ctx->row_pointers[y][x*3+2]) << 8) | - ((PNGU_u32) default_alpha); - } - - // Free resources - free (ctx->img_data); - free (ctx->row_pointers); - - // Success - return PNGU_OK; -} - - -int PNGU_DecodeTo4x4RGB565 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer) -{ - int result; - PNGU_u32 x, y, qwidth, qheight; - - // width and height need to be divisible by four - if ((width % 4) || (height % 4)) - return PNGU_INVALID_WIDTH_OR_HEIGHT; - - result = pngu_decode (ctx, width, height, 1); - if (result != PNGU_OK) - return result; - - // Copy image to the output buffer - qwidth = width / 4; - qheight = height / 4; - - for (y = 0; y < qheight; y++) - for (x = 0; x < qwidth; x++) - { - int blockbase = (y * qwidth + x) * 4; - - PNGU_u64 field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*12)); - PNGU_u64 field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase] = - (((field64 & 0xF800000000000000ULL) | ((field64 & 0xFC000000000000ULL) << 3) | ((field64 & 0xF80000000000ULL) << 5)) | - (((field64 & 0xF800000000ULL) << 8) | ((field64 & 0xFC000000ULL) << 11) | ((field64 & 0xF80000ULL) << 13)) | - (((field64 & 0xF800ULL) << 16) | ((field64 & 0xFCULL) << 19) | ((field32 & 0xF8000000ULL) >> 11)) | - (((field32 & 0xF80000ULL) >> 8) | ((field32 & 0xFC00ULL) >> 5) | ((field32 & 0xF8ULL) >> 3))); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+1]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+1] = - (((field64 & 0xF800000000000000ULL) | ((field64 & 0xFC000000000000ULL) << 3) | ((field64 & 0xF80000000000ULL) << 5)) | - (((field64 & 0xF800000000ULL) << 8) | ((field64 & 0xFC000000ULL) << 11) | ((field64 & 0xF80000ULL) << 13)) | - (((field64 & 0xF800ULL) << 16) | ((field64 & 0xFCULL) << 19) | ((field32 & 0xF8000000ULL) >> 11)) | - (((field32 & 0xF80000ULL) >> 8) | ((field32 & 0xFC00ULL) >> 5) | ((field32 & 0xF8ULL) >> 3))); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+2]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+2] = - (((field64 & 0xF800000000000000ULL) | ((field64 & 0xFC000000000000ULL) << 3) | ((field64 & 0xF80000000000ULL) << 5)) | - (((field64 & 0xF800000000ULL) << 8) | ((field64 & 0xFC000000ULL) << 11) | ((field64 & 0xF80000ULL) << 13)) | - (((field64 & 0xF800ULL) << 16) | ((field64 & 0xFCULL) << 19) | ((field32 & 0xF8000000ULL) >> 11)) | - (((field32 & 0xF80000ULL) >> 8) | ((field32 & 0xFC00ULL) >> 5) | ((field32 & 0xF8ULL) >> 3))); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+3]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+3] = - (((field64 & 0xF800000000000000ULL) | ((field64 & 0xFC000000000000ULL) << 3) | ((field64 & 0xF80000000000ULL) << 5)) | - (((field64 & 0xF800000000ULL) << 8) | ((field64 & 0xFC000000ULL) << 11) | ((field64 & 0xF80000ULL) << 13)) | - (((field64 & 0xF800ULL) << 16) | ((field64 & 0xFCULL) << 19) | ((field32 & 0xF8000000ULL) >> 11)) | - (((field32 & 0xF80000ULL) >> 8) | ((field32 & 0xFC00ULL) >> 5) | ((field32 & 0xF8ULL) >> 3))); - } - - // Free resources - free (ctx->img_data); - free (ctx->row_pointers); - - // Success - return PNGU_OK; -} - - -int PNGU_DecodeTo4x4RGB5A3 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u8 default_alpha) -{ - int result; - PNGU_u32 x, y, qwidth, qheight; - PNGU_u64 alphaMask; - - // width and height need to be divisible by four - if ((width % 4) || (height % 4)) - return PNGU_INVALID_WIDTH_OR_HEIGHT; - - result = pngu_decode (ctx, width, height, 0); - if (result != PNGU_OK) - return result; - - // Init some vars - qwidth = width / 4; - qheight = height / 4; - - // Check is source image has an alpha channel - if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA) ) - { - // Alpha channel present, copy image to the output buffer - for (y = 0; y < qheight; y++) - for (x = 0; x < qwidth; x++) - { - int blockbase = (y * qwidth + x) * 4; - PNGU_u64 tmp; - - PNGU_u64 fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*16)); - PNGU_u64 fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*16+8)); - // If first pixel is opaque set MSB to 1 and encode colors in RGB555, else set MSB to 0 and encode colors in ARGB3444 - if ((fieldA & 0xE000000000ULL) == 0xE000000000ULL) - tmp = 0x8000000000000000ULL | ((fieldA & 0xF800000000000000ULL) >> 1) | ((fieldA & 0xF8000000000000ULL) << 2) | ((fieldA & 0xF80000000000ULL) << 5); - else - tmp = ((fieldA & 0xE000000000ULL) << 23) | ((fieldA & 0xF000000000000000ULL) >> 4) | (fieldA & 0xF0000000000000ULL) | ((fieldA & 0xF00000000000ULL) << 4); - - // If second pixel is opaque set MSB to 1 and encode colors in RGB555, else set MSB to 0 and encode colors in ARGB3444 - if ((fieldA & 0xE0ULL) == 0xE0ULL) - tmp = tmp | 0x800000000000ULL | ((fieldA & 0xF8000000ULL) << 15) | ((fieldA & 0xF80000ULL) << 18) | ((fieldA & 0xF800ULL) << 21); - else - tmp = tmp | ((fieldA & 0xE0ULL) << 39) | ((fieldA & 0xF0000000ULL) << 12) | ((fieldA & 0xF00000ULL) << 16) | ((fieldA & 0xF000ULL) << 20); - - // If third pixel is opaque set MSB to 1 and encode colors in RGB555, else set MSB to 0 and encode colors in ARGB3444 - if ((fieldB & 0xE000000000ULL) == 0xE000000000ULL) - tmp = tmp | 0x80000000ULL | ((fieldB & 0xF800000000000000ULL) >> 33) | ((fieldB & 0xF8000000000000ULL) >> 30) | ((fieldB & 0xF80000000000ULL) >> 27); - else - tmp = tmp | ((fieldB & 0xE000000000ULL) >> 9) | ((fieldB & 0xF000000000000000ULL) >> 36) | ((fieldB & 0xF0000000000000ULL) >> 32) | ((fieldB & 0xF00000000000ULL) >> 28); - - // If fourth pixel is opaque set MSB to 1 and encode colors in RGB555, else set MSB to 0 and encode colors in ARGB3444 - if ((fieldB & 0xE0ULL) == 0xE0ULL) - tmp = tmp | 0x8000ULL | ((fieldB & 0xF8000000ULL) >> 17) | ((fieldB & 0xF80000ULL) >> 14) | ((fieldB & 0xF800ULL) >> 11); - else - tmp = tmp | ((fieldB & 0xE0ULL) << 7) | ((fieldB & 0xF0000000ULL) >> 20) | ((fieldB & 0xF00000ULL) >> 16) | ((fieldB & 0xF000ULL) >> 12); - ((PNGU_u64 *) buffer)[blockbase] = tmp; - - fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*16)); - fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*16+8)); - if ((fieldA & 0xE000000000ULL) == 0xE000000000ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = 0x8000000000000000ULL | ((fieldA & 0xF800000000000000ULL) >> 1) | ((fieldA & 0xF8000000000000ULL) << 2) | ((fieldA & 0xF80000000000ULL) << 5); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = ((fieldA & 0xE000000000ULL) << 23) | ((fieldA & 0xF000000000000000ULL) >> 4) | (fieldA & 0xF0000000000000ULL) | ((fieldA & 0xF00000000000ULL) << 4); - - if ((fieldA & 0xE0ULL) == 0xE0ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = tmp | 0x800000000000ULL | ((fieldA & 0xF8000000ULL) << 15) | ((fieldA & 0xF80000ULL) << 18) | ((fieldA & 0xF800ULL) << 21); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = tmp | ((fieldA & 0xE0ULL) << 39) | ((fieldA & 0xF0000000ULL) << 12) | ((fieldA & 0xF00000ULL) << 16) | ((fieldA & 0xF000ULL) << 20); - - if ((fieldB & 0xE000000000ULL) == 0xE000000000ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = tmp | 0x80000000ULL | ((fieldB & 0xF800000000000000ULL) >> 33) | ((fieldB & 0xF8000000000000ULL) >> 30) | ((fieldB & 0xF80000000000ULL) >> 27); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = tmp | ((fieldB & 0xE000000000ULL) >> 9) | ((fieldB & 0xF000000000000000ULL) >> 36) | ((fieldB & 0xF0000000000000ULL) >> 32) | ((fieldB & 0xF00000000000ULL) >> 28); - - if ((fieldB & 0xE0ULL) == 0xE0ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = tmp | 0x8000ULL | ((fieldB & 0xF8000000ULL) >> 17) | ((fieldB & 0xF80000ULL) >> 14) | ((fieldB & 0xF800ULL) >> 11); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = tmp | ((fieldB & 0xE0ULL) << 7) | ((fieldB & 0xF0000000ULL) >> 20) | ((fieldB & 0xF00000ULL) >> 16) | ((fieldB & 0xF000ULL) >> 12); - ((PNGU_u64 *) buffer)[blockbase+1] = tmp; - - fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*16)); - fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*16+8)); - if ((fieldA & 0xE000000000ULL) == 0xE000000000ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = 0x8000000000000000ULL | ((fieldA & 0xF800000000000000ULL) >> 1) | ((fieldA & 0xF8000000000000ULL) << 2) | ((fieldA & 0xF80000000000ULL) << 5); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = ((fieldA & 0xE000000000ULL) << 23) | ((fieldA & 0xF000000000000000ULL) >> 4) | (fieldA & 0xF0000000000000ULL) | ((fieldA & 0xF00000000000ULL) << 4); - - if ((fieldA & 0xE0ULL) == 0xE0ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = tmp | 0x800000000000ULL | ((fieldA & 0xF8000000ULL) << 15) | ((fieldA & 0xF80000ULL) << 18) | ((fieldA & 0xF800ULL) << 21); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = tmp | ((fieldA & 0xE0ULL) << 39) | ((fieldA & 0xF0000000ULL) << 12) | ((fieldA & 0xF00000ULL) << 16) | ((fieldA & 0xF000ULL) << 20); - - if ((fieldB & 0xE000000000ULL) == 0xE000000000ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = tmp | 0x80000000ULL | ((fieldB & 0xF800000000000000ULL) >> 33) | ((fieldB & 0xF8000000000000ULL) >> 30) | ((fieldB & 0xF80000000000ULL) >> 27); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = tmp | ((fieldB & 0xE000000000ULL) >> 9) | ((fieldB & 0xF000000000000000ULL) >> 36) | ((fieldB & 0xF0000000000000ULL) >> 32) | ((fieldB & 0xF00000000000ULL) >> 28); - - if ((fieldB & 0xE0ULL) == 0xE0ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = tmp | 0x8000ULL | ((fieldB & 0xF8000000ULL) >> 17) | ((fieldB & 0xF80000ULL) >> 14) | ((fieldB & 0xF800ULL) >> 11); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = tmp | ((fieldB & 0xE0ULL) << 7) | ((fieldB & 0xF0000000ULL) >> 20) | ((fieldB & 0xF00000ULL) >> 16) | ((fieldB & 0xF000ULL) >> 12); - ((PNGU_u64 *) buffer)[blockbase+2] = tmp; - - fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*16)); - fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*16+8)); - if ((fieldA & 0xE000000000ULL) == 0xE000000000ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = 0x8000000000000000ULL | ((fieldA & 0xF800000000000000ULL) >> 1) | ((fieldA & 0xF8000000000000ULL) << 2) | ((fieldA & 0xF80000000000ULL) << 5); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = ((fieldA & 0xE000000000ULL) << 23) | ((fieldA & 0xF000000000000000ULL) >> 4) | (fieldA & 0xF0000000000000ULL) | ((fieldA & 0xF00000000000ULL) << 4); - - if ((fieldA & 0xE0ULL) == 0xE0ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = tmp | 0x800000000000ULL | ((fieldA & 0xF8000000ULL) << 15) | ((fieldA & 0xF80000ULL) << 18) | ((fieldA & 0xF800ULL) << 21); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = tmp | ((fieldA & 0xE0ULL) << 39) | ((fieldA & 0xF0000000ULL) << 12) | ((fieldA & 0xF00000ULL) << 16) | ((fieldA & 0xF000ULL) << 20); - - if ((fieldB & 0xE000000000ULL) == 0xE000000000ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = tmp | 0x80000000ULL | ((fieldB & 0xF800000000000000ULL) >> 33) | ((fieldB & 0xF8000000000000ULL) >> 30) | ((fieldB & 0xF80000000000ULL) >> 27); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = tmp | ((fieldB & 0xE000000000ULL) >> 9) | ((fieldB & 0xF000000000000000ULL) >> 36) | ((fieldB & 0xF0000000000000ULL) >> 32) | ((fieldB & 0xF00000000000ULL) >> 28); - - if ((fieldB & 0xE0ULL) == 0xE0ULL) - // Opaque pixel, so set MSB to 1 and encode colors in RGB555 - tmp = tmp | 0x8000ULL | ((fieldB & 0xF8000000ULL) >> 17) | ((fieldB & 0xF80000ULL) >> 14) | ((fieldB & 0xF800ULL) >> 11); - else - // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 - tmp = tmp | ((fieldB & 0xE0ULL) << 7) | ((fieldB & 0xF0000000ULL) >> 20) | ((fieldB & 0xF00000ULL) >> 16) | ((fieldB & 0xF000ULL) >> 12); - ((PNGU_u64 *) buffer)[blockbase+3] = tmp; - } - } - else - { - // No alpha channel present, copy image to the output buffer - default_alpha = (default_alpha >> 5); - if (default_alpha == 7) - { - // The user wants an opaque texture, so set MSB to 1 and encode colors in RGB555 - alphaMask = 0x8000800080008000ULL; - - for (y = 0; y < qheight; y++) - for (x = 0; x < qwidth; x++) - { - int blockbase = (y * qwidth + x) * 4; - - PNGU_u64 field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*12)); - PNGU_u64 field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase] = - alphaMask | ((field64 & 0xF800000000000000ULL) >> 1) | ((field64 & 0xF8000000000000ULL) << 2) | - ((field64 & 0xF80000000000ULL) << 5) | ((field64 & 0xF800000000ULL) << 7) | ((field64 & 0xF8000000ULL) << 10) | - ((field64 & 0xF80000ULL) << 13) | ((field64 & 0xF800ULL) << 15) | ((field64 & 0xF8ULL) << 18) | - ((field32 & 0xF8000000ULL) >> 11) | ((field32 & 0xF80000ULL) >> 9) | ((field32 & 0xF800ULL) >> 6) | ((field32 & 0xF8ULL) >> 3); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+1]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+1] = - alphaMask | ((field64 & 0xF800000000000000ULL) >> 1) | ((field64 & 0xF8000000000000ULL) << 2) | - ((field64 & 0xF80000000000ULL) << 5) | ((field64 & 0xF800000000ULL) << 7) | ((field64 & 0xF8000000ULL) << 10) | - ((field64 & 0xF80000ULL) << 13) | ((field64 & 0xF800ULL) << 15) | ((field64 & 0xF8ULL) << 18) | - ((field32 & 0xF8000000ULL) >> 11) | ((field32 & 0xF80000ULL) >> 9) | ((field32 & 0xF800ULL) >> 6) | ((field32 & 0xF8ULL) >> 3); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+2]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+2] = - alphaMask | ((field64 & 0xF800000000000000ULL) >> 1) | ((field64 & 0xF8000000000000ULL) << 2) | - ((field64 & 0xF80000000000ULL) << 5) | ((field64 & 0xF800000000ULL) << 7) | ((field64 & 0xF8000000ULL) << 10) | - ((field64 & 0xF80000ULL) << 13) | ((field64 & 0xF800ULL) << 15) | ((field64 & 0xF8ULL) << 18) | - ((field32 & 0xF8000000ULL) >> 11) | ((field32 & 0xF80000ULL) >> 9) | ((field32 & 0xF800ULL) >> 6) | ((field32 & 0xF8ULL) >> 3); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+3]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+3] = - alphaMask | ((field64 & 0xF800000000000000ULL) >> 1) | ((field64 & 0xF8000000000000ULL) << 2) | - ((field64 & 0xF80000000000ULL) << 5) | ((field64 & 0xF800000000ULL) << 7) | ((field64 & 0xF8000000ULL) << 10) | - ((field64 & 0xF80000ULL) << 13) | ((field64 & 0xF800ULL) << 15) | ((field64 & 0xF8ULL) << 18) | - ((field32 & 0xF8000000ULL) >> 11) | ((field32 & 0xF80000ULL) >> 9) | ((field32 & 0xF800ULL) >> 6) | ((field32 & 0xF8ULL) >> 3); - } - } - else - { - // The user wants a translucid texture, so set MSB to 0 and encode colors in ARGB3444 - default_alpha = (default_alpha << 4); - alphaMask = (((PNGU_u64) default_alpha) << 56) | (((PNGU_u64) default_alpha) << 40) | - (((PNGU_u64) default_alpha) << 24) | (((PNGU_u64) default_alpha) << 8); - - for (y = 0; y < qheight; y++) - for (x = 0; x < qwidth; x++) - { - int blockbase = (y * qwidth + x) * 4; - - PNGU_u64 field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*12)); - PNGU_u64 field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase] = - alphaMask | ((field64 & 0xF000000000000000ULL) >> 4) | (field64 & 0xF0000000000000ULL) | ((field64 & 0xF00000000000ULL) << 4) | - ((field64 & 0xF000000000ULL) << 4) | ((field64 & 0xF0000000ULL) << 8) | ((field64 & 0xF00000ULL) << 12) | - ((field64 & 0xF000ULL) << 12) | ((field64 & 0xF0ULL) << 16) | ((field32 & 0xF0000000ULL) >> 12) | - ((field32 & 0xF00000ULL) >> 12) | ((field32 & 0xF000ULL) >> 8) | ((field32 & 0xF0ULL) >> 4); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+1]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+1] = - alphaMask | ((field64 & 0xF000000000000000ULL) >> 4) | (field64 & 0xF0000000000000ULL) | ((field64 & 0xF00000000000ULL) << 4) | - ((field64 & 0xF000000000ULL) << 4) | ((field64 & 0xF0000000ULL) << 8) | ((field64 & 0xF00000ULL) << 12) | - ((field64 & 0xF000ULL) << 12) | ((field64 & 0xF0ULL) << 16) | ((field32 & 0xF0000000ULL) >> 12) | - ((field32 & 0xF00000ULL) >> 12) | ((field32 & 0xF000ULL) >> 8) | ((field32 & 0xF0ULL) >> 4); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+2]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+2] = - alphaMask | ((field64 & 0xF000000000000000ULL) >> 4) | (field64 & 0xF0000000000000ULL) | ((field64 & 0xF00000000000ULL) << 4) | - ((field64 & 0xF000000000ULL) << 4) | ((field64 & 0xF0000000ULL) << 8) | ((field64 & 0xF00000ULL) << 12) | - ((field64 & 0xF000ULL) << 12) | ((field64 & 0xF0ULL) << 16) | ((field32 & 0xF0000000ULL) >> 12) | - ((field32 & 0xF00000ULL) >> 12) | ((field32 & 0xF000ULL) >> 8) | ((field32 & 0xF0ULL) >> 4); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+3]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+3] = - alphaMask | ((field64 & 0xF000000000000000ULL) >> 4) | (field64 & 0xF0000000000000ULL) | ((field64 & 0xF00000000000ULL) << 4) | - ((field64 & 0xF000000000ULL) << 4) | ((field64 & 0xF0000000ULL) << 8) | ((field64 & 0xF00000ULL) << 12) | - ((field64 & 0xF000ULL) << 12) | ((field64 & 0xF0ULL) << 16) | ((field32 & 0xF0000000ULL) >> 12) | - ((field32 & 0xF00000ULL) >> 12) | ((field32 & 0xF000ULL) >> 8) | ((field32 & 0xF0ULL) >> 4); - } - } - } - - // Free resources - free (ctx->img_data); - free (ctx->row_pointers); - - // Success - return PNGU_OK; -} - - -int PNGU_DecodeTo4x4RGBA8 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u8 default_alpha) -{ - int result; - PNGU_u32 x, y, qwidth, qheight; - PNGU_u64 alphaMask; - - // width and height need to be divisible by four - if ((width % 4) || (height % 4)) - return PNGU_INVALID_WIDTH_OR_HEIGHT; - - result = pngu_decode (ctx, width, height, 0); - if (result != PNGU_OK) - return result; - - // Init some variables - qwidth = width / 4; - qheight = height / 4; - - // Check is source image has an alpha channel - if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA) ) - { - // Alpha channel present, copy image to the output buffer - for (y = 0; y < qheight; y++) - for (x = 0; x < qwidth; x++) - { - int blockbase = (y * qwidth + x) * 8; - - PNGU_u64 fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*16)); - PNGU_u64 fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*16+8)); - ((PNGU_u64 *) buffer)[blockbase] = - ((fieldA & 0xFF00000000ULL) << 24) | ((fieldA & 0xFF00000000000000ULL) >> 8) | - ((fieldA & 0xFFULL) << 40) | ((fieldA & 0xFF000000ULL) << 8) | - ((fieldB & 0xFF00000000ULL) >> 8) | ((fieldB & 0xFF00000000000000ULL) >> 40) | - ((fieldB & 0xFFULL) << 8) | ((fieldB & 0xFF000000ULL) >> 24); - ((PNGU_u64 *) buffer)[blockbase+4] = - ((fieldA & 0xFFFF0000000000ULL) << 8) | ((fieldA & 0xFFFF00ULL) << 24) | - ((fieldB & 0xFFFF0000000000ULL) >> 24) | ((fieldB & 0xFFFF00ULL) >> 8); - - fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*16)); - fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*16+8)); - ((PNGU_u64 *) buffer)[blockbase+1] = - ((fieldA & 0xFF00000000ULL) << 24) | ((fieldA & 0xFF00000000000000ULL) >> 8) | - ((fieldA & 0xFFULL) << 40) | ((fieldA & 0xFF000000ULL) << 8) | - ((fieldB & 0xFF00000000ULL) >> 8) | ((fieldB & 0xFF00000000000000ULL) >> 40) | - ((fieldB & 0xFFULL) << 8) | ((fieldB & 0xFF000000ULL) >> 24); - ((PNGU_u64 *) buffer)[blockbase+5] = - ((fieldA & 0xFFFF0000000000ULL) << 8) | ((fieldA & 0xFFFF00ULL) << 24) | - ((fieldB & 0xFFFF0000000000ULL) >> 24) | ((fieldB & 0xFFFF00ULL) >> 8); - - fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*16)); - fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*16+8)); - ((PNGU_u64 *) buffer)[blockbase+2] = - ((fieldA & 0xFF00000000ULL) << 24) | ((fieldA & 0xFF00000000000000ULL) >> 8) | - ((fieldA & 0xFFULL) << 40) | ((fieldA & 0xFF000000ULL) << 8) | - ((fieldB & 0xFF00000000ULL) >> 8) | ((fieldB & 0xFF00000000000000ULL) >> 40) | - ((fieldB & 0xFFULL) << 8) | ((fieldB & 0xFF000000ULL) >> 24); - ((PNGU_u64 *) buffer)[blockbase+6] = - ((fieldA & 0xFFFF0000000000ULL) << 8) | ((fieldA & 0xFFFF00ULL) << 24) | - ((fieldB & 0xFFFF0000000000ULL) >> 24) | ((fieldB & 0xFFFF00ULL) >> 8); - - fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*16)); - fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*16+8)); - ((PNGU_u64 *) buffer)[blockbase+3] = - ((fieldA & 0xFF00000000ULL) << 24) | ((fieldA & 0xFF00000000000000ULL) >> 8) | - ((fieldA & 0xFFULL) << 40) | ((fieldA & 0xFF000000ULL) << 8) | - ((fieldB & 0xFF00000000ULL) >> 8) | ((fieldB & 0xFF00000000000000ULL) >> 40) | - ((fieldB & 0xFFULL) << 8) | ((fieldB & 0xFF000000ULL) >> 24); - ((PNGU_u64 *) buffer)[blockbase+7] = - ((fieldA & 0xFFFF0000000000ULL) << 8) | ((fieldA & 0xFFFF00ULL) << 24) | - ((fieldB & 0xFFFF0000000000ULL) >> 24) | ((fieldB & 0xFFFF00ULL) >> 8); - } - } - else - { - // No alpha channel present, copy image to the output buffer - alphaMask = (((PNGU_u64)default_alpha) << 56) | (((PNGU_u64)default_alpha) << 40) | - (((PNGU_u64)default_alpha) << 24) | (((PNGU_u64)default_alpha) << 8); - - for (y = 0; y < qheight; y++) - for (x = 0; x < qwidth; x++) - { - int blockbase = (y * qwidth + x) * 8; - - PNGU_u64 field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*12)); - PNGU_u64 field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase] = - (((field64 & 0xFF00000000000000ULL) >> 8) | (field64 & 0xFF00000000ULL) | - ((field64 & 0xFF00ULL) << 8) | ((field32 & 0xFF0000ULL) >> 16) | alphaMask); - ((PNGU_u64 *) buffer)[blockbase+4] = - (((field64 & 0xFFFF0000000000ULL) << 8) | ((field64 & 0xFFFF0000ULL) << 16) | - ((field64 & 0xFFULL) << 24) | ((field32 & 0xFF000000ULL) >> 8) | (field32 & 0xFFFFULL)); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+1]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+1] = - (((field64 & 0xFF00000000000000ULL) >> 8) | (field64 & 0xFF00000000ULL) | - ((field64 & 0xFF00ULL) << 8) | ((field32 & 0xFF0000ULL) >> 16) | alphaMask); - ((PNGU_u64 *) buffer)[blockbase+5] = - (((field64 & 0xFFFF0000000000ULL) << 8) | ((field64 & 0xFFFF0000ULL) << 16) | - ((field64 & 0xFFULL) << 24) | ((field32 & 0xFF000000ULL) >> 8) | (field32 & 0xFFFFULL)); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+2]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+2] = - (((field64 & 0xFF00000000000000ULL) >> 8) | (field64 & 0xFF00000000ULL) | - ((field64 & 0xFF00ULL) << 8) | ((field32 & 0xFF0000ULL) >> 16) | alphaMask); - ((PNGU_u64 *) buffer)[blockbase+6] = - (((field64 & 0xFFFF0000000000ULL) << 8) | ((field64 & 0xFFFF0000ULL) << 16) | - ((field64 & 0xFFULL) << 24) | ((field32 & 0xFF000000ULL) >> 8) | (field32 & 0xFFFFULL)); - - field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*12)); - field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+3]+x*12+8)); - ((PNGU_u64 *) buffer)[blockbase+3] = - (((field64 & 0xFF00000000000000ULL) >> 8) | (field64 & 0xFF00000000ULL) | - ((field64 & 0xFF00ULL) << 8) | ((field32 & 0xFF0000ULL) >> 16) | alphaMask); - ((PNGU_u64 *) buffer)[blockbase+7] = - (((field64 & 0xFFFF0000000000ULL) << 8) | ((field64 & 0xFFFF0000ULL) << 16) | - ((field64 & 0xFFULL) << 24) | ((field32 & 0xFF000000ULL) >> 8) | (field32 & 0xFFFFULL)); - } - } - - // Free resources - free (ctx->img_data); - free (ctx->row_pointers); - - // Success - return PNGU_OK; -} - - -int PNGU_EncodeFromYCbYCr (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride) -{ - png_uint_32 rowbytes; - PNGU_u32 x, y, buffWidth; - - // Erase from the context any readed info - pngu_free_info (ctx); - ctx->propRead = 0; - - // Check if the user has selected a file to write the image - if (ctx->source == PNGU_SOURCE_BUFFER); - - else if (ctx->source == PNGU_SOURCE_DEVICE) - { - // Open file - if (!(ctx->fd = fopen (ctx->filename, "wb"))) - return PNGU_CANT_OPEN_FILE; - } - - else - return PNGU_NO_FILE_SELECTED; - - // Allocation of libpng structs - ctx->png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!(ctx->png_ptr)) - { - if (ctx->source == PNGU_SOURCE_DEVICE) - fclose (ctx->fd); - return PNGU_LIB_ERROR; - } - - ctx->info_ptr = png_create_info_struct (ctx->png_ptr); - if (!(ctx->info_ptr)) - { - png_destroy_write_struct (&(ctx->png_ptr), (png_infopp)NULL); - if (ctx->source == PNGU_SOURCE_DEVICE) - fclose (ctx->fd); - return PNGU_LIB_ERROR; - } - - if (ctx->source == PNGU_SOURCE_BUFFER) - { - // Installation of our custom data writer function - ctx->cursor = 0; - png_set_write_fn (ctx->png_ptr, ctx, pngu_write_data_to_buffer, pngu_flush_data_to_buffer); - } - else if (ctx->source == PNGU_SOURCE_DEVICE) - { - // Default data writer uses function fwrite, so it needs to use our FILE* - png_init_io (ctx->png_ptr, ctx->fd); - } - - // Setup output file properties - png_set_IHDR (ctx->png_ptr, ctx->info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - - // Allocate memory to store the image in RGB format - rowbytes = width * 3; - if (rowbytes % 4) - rowbytes = ((rowbytes / 4) + 1) * 4; // Add extra padding so each row starts in a 4 byte boundary - - ctx->img_data = malloc (rowbytes * height); - if (!ctx->img_data) - { - png_destroy_write_struct (&(ctx->png_ptr), (png_infopp)NULL); - if (ctx->source == PNGU_SOURCE_DEVICE) - fclose (ctx->fd); - return PNGU_LIB_ERROR; - } - - ctx->row_pointers = malloc (sizeof (png_bytep) * height); - if (!ctx->row_pointers) - { - png_destroy_write_struct (&(ctx->png_ptr), (png_infopp)NULL); - if (ctx->source == PNGU_SOURCE_DEVICE) - fclose (ctx->fd); - return PNGU_LIB_ERROR; - } - - // Encode YCbYCr image into RGB8 format - buffWidth = (width + stride) / 2; - for (y = 0; y < height; y++) - { - ctx->row_pointers[y] = ctx->img_data + (y * rowbytes); - - for (x = 0; x < (width / 2); x++) - PNGU_YCbYCr_TO_RGB8 ( ((PNGU_u32 *)buffer)[y*buffWidth+x], - ((PNGU_u8 *) ctx->row_pointers[y]+x*6), ((PNGU_u8 *) ctx->row_pointers[y]+x*6+1), - ((PNGU_u8 *) ctx->row_pointers[y]+x*6+2), ((PNGU_u8 *) ctx->row_pointers[y]+x*6+3), - ((PNGU_u8 *) ctx->row_pointers[y]+x*6+4), ((PNGU_u8 *) ctx->row_pointers[y]+x*6+5) ); - } - - // Tell libpng where is our image data - png_set_rows (ctx->png_ptr, ctx->info_ptr, ctx->row_pointers); - - // Write file header and image data - png_write_png (ctx->png_ptr, ctx->info_ptr, PNG_TRANSFORM_IDENTITY, NULL); - - // Tell libpng we have no more data to write - png_write_end (ctx->png_ptr, (png_infop) NULL); - - // Free resources - free (ctx->img_data); - free (ctx->row_pointers); - png_destroy_write_struct (&(ctx->png_ptr), &(ctx->info_ptr)); - if (ctx->source == PNGU_SOURCE_DEVICE) - fclose (ctx->fd); - - // Success - return PNGU_OK; -} - - -// This function is taken from a libogc example -PNGU_u32 PNGU_RGB8_TO_YCbYCr (PNGU_u8 r1, PNGU_u8 g1, PNGU_u8 b1, PNGU_u8 r2, PNGU_u8 g2, PNGU_u8 b2) -{ - int y1, cb1, cr1, y2, cb2, cr2, cb, cr; - - y1 = (299 * r1 + 587 * g1 + 114 * b1) / 1000; - cb1 = (-16874 * r1 - 33126 * g1 + 50000 * b1 + 12800000) / 100000; - cr1 = (50000 * r1 - 41869 * g1 - 8131 * b1 + 12800000) / 100000; - - y2 = (299 * r2 + 587 * g2 + 114 * b2) / 1000; - cb2 = (-16874 * r2 - 33126 * g2 + 50000 * b2 + 12800000) / 100000; - cr2 = (50000 * r2 - 41869 * g2 - 8131 * b2 + 12800000) / 100000; - - cb = (cb1 + cb2) >> 1; - cr = (cr1 + cr2) >> 1; - - return (PNGU_u32) ((y1 << 24) | (cb << 16) | (y2 << 8) | cr); -} - - -void PNGU_YCbYCr_TO_RGB8 (PNGU_u32 ycbycr, PNGU_u8 *r1, PNGU_u8 *g1, PNGU_u8 *b1, PNGU_u8 *r2, PNGU_u8 *g2, PNGU_u8 *b2) -{ - PNGU_u8 *Colors = (PNGU_u8 *) &ycbycr; - - *r1 = pngu_clamp( 1.164 * (Colors[0] - 16) + 1.596 * (Colors[3] - 128) ); - *g1 = pngu_clamp( 1.164 * (Colors[0] - 16) - 0.813 * (Colors[3] - 128) - 0.392 * (Colors[1] - 128) ); - *b1 = pngu_clamp( 1.164 * (Colors[0] - 16) + 2.017 * (Colors[1] - 128) ); - - *r2 = pngu_clamp( 1.164 * (Colors[2] - 16) + 1.596 * (Colors[3] - 128) ); - *g2 = pngu_clamp( 1.164 * (Colors[2] - 16) - 0.813 * (Colors[3] - 128) - 0.392 * (Colors[1] - 128) ); - *b2 = pngu_clamp( 1.164 * (Colors[2] - 16) + 2.017 * (Colors[1] - 128) ); -} - - -int pngu_info (IMGCTX ctx) -{ - png_byte magic[8]; - png_uint_32 width; - png_uint_32 height; - png_color_16p background; - png_bytep trans; - png_color_16p trans_values; - int scale, i; - - // Check if there is a file selected and if it is a valid .png - if (ctx->source == PNGU_SOURCE_BUFFER) - memcpy (magic, ctx->buffer, 8); - - else if (ctx->source == PNGU_SOURCE_DEVICE) - { - // Open file - if (!(ctx->fd = fopen (ctx->filename, "rb"))) - return PNGU_CANT_OPEN_FILE; - - // Load first 8 bytes into magic buffer - if (fread (magic, 1, 8, ctx->fd) != 8) - { - fclose (ctx->fd); - return PNGU_CANT_READ_FILE; - } - } - - else - return PNGU_NO_FILE_SELECTED;; - - if (png_sig_cmp(magic, 0, 8) != 0) - { - if (ctx->source == PNGU_SOURCE_DEVICE) - fclose (ctx->fd); - return PNGU_FILE_IS_NOT_PNG; - } - - // Allocation of libpng structs - ctx->png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!(ctx->png_ptr)) - { - if (ctx->source == PNGU_SOURCE_DEVICE) - fclose (ctx->fd); - return PNGU_LIB_ERROR; - } - - ctx->info_ptr = png_create_info_struct (ctx->png_ptr); - if (!(ctx->info_ptr)) - { - if (ctx->source == PNGU_SOURCE_DEVICE) - fclose (ctx->fd); - png_destroy_read_struct (&(ctx->png_ptr), (png_infopp)NULL, (png_infopp)NULL); - return PNGU_LIB_ERROR; - } - - if (ctx->source == PNGU_SOURCE_BUFFER) - { - // Installation of our custom data provider function - ctx->cursor = 0; - png_set_read_fn (ctx->png_ptr, ctx, pngu_read_data_from_buffer); - } - else if (ctx->source == PNGU_SOURCE_DEVICE) - { - // Default data provider uses function fread, so it needs to use our FILE* - png_init_io (ctx->png_ptr, ctx->fd); - png_set_sig_bytes (ctx->png_ptr, 8); // We have read 8 bytes already to check PNG authenticity - } - - // Read png header - png_read_info (ctx->png_ptr, ctx->info_ptr); - - // Query image properties if they have not been queried before - if (!ctx->propRead) - { - png_get_IHDR(ctx->png_ptr, ctx->info_ptr, &width, &height, - (int *) &(ctx->prop.imgBitDepth), - (int *) &(ctx->prop.imgColorType), - NULL, NULL, NULL); - - ctx->prop.imgWidth = width; - ctx->prop.imgHeight = height; - switch (ctx->prop.imgColorType) - { - case PNG_COLOR_TYPE_GRAY: - ctx->prop.imgColorType = PNGU_COLOR_TYPE_GRAY; - break; - case PNG_COLOR_TYPE_GRAY_ALPHA: - ctx->prop.imgColorType = PNGU_COLOR_TYPE_GRAY_ALPHA; - break; - case PNG_COLOR_TYPE_PALETTE: - ctx->prop.imgColorType = PNGU_COLOR_TYPE_PALETTE; - break; - case PNG_COLOR_TYPE_RGB: - ctx->prop.imgColorType = PNGU_COLOR_TYPE_RGB; - break; - case PNG_COLOR_TYPE_RGB_ALPHA: - ctx->prop.imgColorType = PNGU_COLOR_TYPE_RGB_ALPHA; - break; - default: - ctx->prop.imgColorType = PNGU_COLOR_TYPE_UNKNOWN; - break; - } - - // Constant used to scale 16 bit values to 8 bit values - scale = 1; - if (ctx->prop.imgBitDepth == 16) - scale = 256; - - // Query background color, if any. - ctx->prop.validBckgrnd = 0; - if (((ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA)) && - (png_get_bKGD (ctx->png_ptr, ctx->info_ptr, &background))) - { - ctx->prop.validBckgrnd = 1; - ctx->prop.bckgrnd.r = background->red / scale; - ctx->prop.bckgrnd.g = background->green / scale; - ctx->prop.bckgrnd.b = background->blue / scale; - } - else if (((ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA)) && - (png_get_bKGD (ctx->png_ptr, ctx->info_ptr, &background))) - { - ctx->prop.validBckgrnd = 1; - ctx->prop.bckgrnd.r = ctx->prop.bckgrnd.g = ctx->prop.bckgrnd.b = background->gray / scale; - } - - // Query list of transparent colors, if any. - ctx->prop.numTrans = 0; - ctx->prop.trans = NULL; - if (((ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA)) && - (png_get_tRNS (ctx->png_ptr, ctx->info_ptr, &trans, (int *) &(ctx->prop.numTrans), &trans_values))) - { - if (ctx->prop.numTrans) - { - ctx->prop.trans = malloc (sizeof (PNGUCOLOR) * ctx->prop.numTrans); - if (ctx->prop.trans) - for (i = 0; i < ctx->prop.numTrans; i++) - { - ctx->prop.trans[i].r = trans_values[i].red / scale; - ctx->prop.trans[i].g = trans_values[i].green / scale; - ctx->prop.trans[i].b = trans_values[i].blue / scale; - } - else - ctx->prop.numTrans = 0; - } - } - else if (((ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA)) && - (png_get_tRNS (ctx->png_ptr, ctx->info_ptr, &trans, (int *) &(ctx->prop.numTrans), &trans_values))) - { - if (ctx->prop.numTrans) - { - ctx->prop.trans = malloc (sizeof (PNGUCOLOR) * ctx->prop.numTrans); - if (ctx->prop.trans) - for (i = 0; i < ctx->prop.numTrans; i++) - ctx->prop.trans[i].r = ctx->prop.trans[i].g = ctx->prop.trans[i].b = - trans_values[i].gray / scale; - else - ctx->prop.numTrans = 0; - } - } - - ctx->propRead = 1; - } - - // Success - ctx->infoRead = 1; - - return PNGU_OK; -} - - -int pngu_decode (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, PNGU_u32 stripAlpha) -{ - png_uint_32 rowbytes; - int i; - - // Read info if it hasn't been read before - if (!ctx->infoRead) - { - i = pngu_info (ctx); - if (i != PNGU_OK) - return i; - } - - // Check if the user has specified the real width and height of the image - if ( (ctx->prop.imgWidth != width) || (ctx->prop.imgHeight != height) ) - return PNGU_INVALID_WIDTH_OR_HEIGHT; - - // Check if color type is supported by PNGU - if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_PALETTE) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_UNKNOWN) ) - return PNGU_UNSUPPORTED_COLOR_TYPE; - - // Scale 16 bit samples to 8 bit - if (ctx->prop.imgBitDepth == 16) - png_set_strip_16 (ctx->png_ptr); - - // Remove alpha channel if we don't need it - if (stripAlpha && ((ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA))) - png_set_strip_alpha (ctx->png_ptr); - - // Expand 1, 2 and 4 bit samples to 8 bit - if (ctx->prop.imgBitDepth < 8) - png_set_packing (ctx->png_ptr); - - // Transform grayscale images to RGB - if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA) ) - png_set_gray_to_rgb (ctx->png_ptr); - - // Flush transformations - png_read_update_info (ctx->png_ptr, ctx->info_ptr); - - // Allocate memory to store the image - rowbytes = png_get_rowbytes (ctx->png_ptr, ctx->info_ptr); - if (rowbytes % 4) - rowbytes = ((rowbytes / 4) + 1) * 4; // Add extra padding so each row starts in a 4 byte boundary - - ctx->img_data = malloc (rowbytes * ctx->prop.imgHeight); - if (!ctx->img_data) - { - pngu_free_info (ctx); - return PNGU_LIB_ERROR; - } - - ctx->row_pointers = malloc (sizeof (png_bytep) * ctx->prop.imgHeight); - if (!ctx->row_pointers) - { - free (ctx->img_data); - pngu_free_info (ctx); - return PNGU_LIB_ERROR; - } - - for (i = 0; i < ctx->prop.imgHeight; i++) - ctx->row_pointers[i] = ctx->img_data + (i * rowbytes); - - // Transform the image and copy it to our allocated memory - png_read_image (ctx->png_ptr, ctx->row_pointers); - - // Free resources - pngu_free_info (ctx); - - // Success - return PNGU_OK; -} - - -void pngu_free_info (IMGCTX ctx) -{ - if (ctx->infoRead) - { - if (ctx->source == PNGU_SOURCE_DEVICE) - fclose (ctx->fd); - - png_destroy_read_struct (&(ctx->png_ptr), &(ctx->info_ptr), (png_infopp)NULL); - - ctx->infoRead = 0; - } -} - - -// Custom data provider function used for reading from memory buffers. -void pngu_read_data_from_buffer (png_structp png_ptr, png_bytep data, png_size_t length) -{ - IMGCTX ctx = (IMGCTX) png_get_io_ptr (png_ptr); - memcpy (data, ctx->buffer + ctx->cursor, length); - ctx->cursor += length; -} - - -// Custom data writer function used for writing to memory buffers. -void pngu_write_data_to_buffer (png_structp png_ptr, png_bytep data, png_size_t length) -{ - IMGCTX ctx = (IMGCTX) png_get_io_ptr (png_ptr); - memcpy (ctx->buffer + ctx->cursor, data, length); - ctx->cursor += length; -} - - -// Custom data flusher function used for writing to memory buffers. -void pngu_flush_data_to_buffer (png_structp png_ptr) -{ - // Nothing to do here -} - - -// Function used in YCbYCr to RGB decoding -int pngu_clamp(float Value) { - Value = roundf(Value); - if (Value < 0) { - Value = 0; - } else if (Value > 255) { - Value = 255; - } - return (int)Value; -} - diff --git a/GRRLIB-400/lib/libpng/pngu/pngu.h b/GRRLIB-400/lib/libpng/pngu/pngu.h deleted file mode 100644 index b5e172b..0000000 --- a/GRRLIB-400/lib/libpng/pngu/pngu.h +++ /dev/null @@ -1,171 +0,0 @@ -/******************************************************************************************** - -PNGU Version : 0.2a - -Coder : frontier - -More info : http://frontier-dev.net - -********************************************************************************************/ -#ifndef __PNGU__ -#define __PNGU__ - -// Return codes -#define PNGU_OK 0 -#define PNGU_ODD_WIDTH 1 -#define PNGU_ODD_STRIDE 2 -#define PNGU_INVALID_WIDTH_OR_HEIGHT 3 -#define PNGU_FILE_IS_NOT_PNG 4 -#define PNGU_UNSUPPORTED_COLOR_TYPE 5 -#define PNGU_NO_FILE_SELECTED 6 -#define PNGU_CANT_OPEN_FILE 7 -#define PNGU_CANT_READ_FILE 8 -#define PNGU_LIB_ERROR 9 - -// Color types -#define PNGU_COLOR_TYPE_GRAY 1 -#define PNGU_COLOR_TYPE_GRAY_ALPHA 2 -#define PNGU_COLOR_TYPE_PALETTE 3 -#define PNGU_COLOR_TYPE_RGB 4 -#define PNGU_COLOR_TYPE_RGB_ALPHA 5 -#define PNGU_COLOR_TYPE_UNKNOWN 6 - - -#ifdef __cplusplus - extern "C" { -#endif - -// Types -typedef unsigned char PNGU_u8; -typedef unsigned short PNGU_u16; -typedef unsigned int PNGU_u32; -typedef unsigned long long PNGU_u64; - -typedef struct -{ - PNGU_u8 r; - PNGU_u8 g; - PNGU_u8 b; -} PNGUCOLOR; - -typedef struct -{ - PNGU_u32 imgWidth; // In pixels - PNGU_u32 imgHeight; // In pixels - PNGU_u32 imgBitDepth; // In bitx - PNGU_u32 imgColorType; // PNGU_COLOR_TYPE_* - PNGU_u32 validBckgrnd; // Non zero if there is a background color - PNGUCOLOR bckgrnd; // Backgroun color - PNGU_u32 numTrans; // Number of transparent colors - PNGUCOLOR *trans; // Transparent colors -} PNGUPROP; - -// Image context, always initialize with SelectImageFrom* and free with ReleaseImageContext -struct _IMGCTX; -typedef struct _IMGCTX *IMGCTX; - - -/**************************************************************************** -* Pixel conversion * -****************************************************************************/ - -// Macro to convert RGB8 values to RGB565 -#define PNGU_RGB8_TO_RGB565(r,g,b) ( ((((PNGU_u16) r) & 0xF8U) << 8) | ((((PNGU_u16) g) & 0xFCU) << 3) | (((PNGU_u16) b) >> 3) ) - -// Macro to convert RGBA8 values to RGB5A3 -#define PNGU_RGB8_TO_RGB5A3(r,g,b,a) (PNGU_u16) (((a & 0xE0U) == 0xE0U) ? \ - (0x8000U | ((((PNGU_u16) r) & 0xF8U) << 7) | ((((PNGU_u16) g) & 0xF8U) << 2) | (((PNGU_u16) b) >> 3)) : \ - (((((PNGU_u16) a) & 0xE0U) << 7) | ((((PNGU_u16) r) & 0xF0U) << 4) | (((PNGU_u16) g) & 0xF0U) | ((((PNGU_u16) b) & 0xF0U) >> 4))) - -// Function to convert two RGB8 values to YCbYCr -PNGU_u32 PNGU_RGB8_TO_YCbYCr (PNGU_u8 r1, PNGU_u8 g1, PNGU_u8 b1, PNGU_u8 r2, PNGU_u8 g2, PNGU_u8 b2); - -// Function to convert an YCbYCr to two RGB8 values. -void PNGU_YCbYCr_TO_RGB8 (PNGU_u32 ycbycr, PNGU_u8 *r1, PNGU_u8 *g1, PNGU_u8 *b1, PNGU_u8 *r2, PNGU_u8 *g2, PNGU_u8 *b2); - - -/**************************************************************************** -* Image context handling * -****************************************************************************/ - -// Selects a PNG file, previosly loaded into a buffer, and creates an image context for subsequent procesing. -IMGCTX PNGU_SelectImageFromBuffer (const void *buffer); - -// Selects a PNG file, from any devoptab device, and creates an image context for subsequent procesing. -IMGCTX PNGU_SelectImageFromDevice (const char *filename); - -// Frees resources associated with an image context. Always call this function when you no longer need the IMGCTX. -void PNGU_ReleaseImageContext (IMGCTX ctx); - - -/**************************************************************************** -* Miscelaneous * -****************************************************************************/ - -// Retrieves info from selected PNG file, including image dimensions, color format, background and transparency colors. -int PNGU_GetImageProperties (IMGCTX ctx, PNGUPROP *fileproperties); - - -/**************************************************************************** -* Image conversion * -****************************************************************************/ - -// Expands selected image into an YCbYCr buffer. You need to specify context, image dimensions, -// destination address and stride in pixels (stride = buffer width - image width). -int PNGU_DecodeToYCbYCr (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride); - -// Macro for decoding an image inside a buffer at given coordinates. -#define PNGU_DECODE_TO_COORDS_YCbYCr(ctx,coordX,coordY,imgWidth,imgHeight,bufferWidth,bufferHeight,buffer) \ - \ - PNGU_DecodeToYCbYCr (ctx, imgWidth, imgHeight, ((void *) buffer) + (coordY) * (bufferWidth) * 2 + \ - (coordX) * 2, (bufferWidth) - (imgWidth)) - -// Expands selected image into a linear RGB565 buffer. You need to specify context, image dimensions, -// destination address and stride in pixels (stride = buffer width - image width). -int PNGU_DecodeToRGB565 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride); - -// Macro for decoding an image inside a buffer at given coordinates. -#define PNGU_DECODE_TO_COORDS_RGB565(ctx,coordX,coordY,imgWidth,imgHeight,bufferWidth,bufferHeight,buffer) \ - \ - PNGU_DecodeToRGB565 (ctx, imgWidth, imgHeight, ((void *) buffer) + (coordY) * (bufferWidth) * 2 + \ - (coordX) * 2, (bufferWidth) - (imgWidth)) - -// Expands selected image into a linear RGBA8 buffer. You need to specify context, image dimensions, -// destination address, stride in pixels and default alpha value, which is used if the source image -// doesn't have an alpha channel. -int PNGU_DecodeToRGBA8 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride, PNGU_u8 default_alpha); - -// Macro for decoding an image inside a buffer at given coordinates. -#define PNGU_DECODE_TO_COORDS_RGBA8(ctx,coordX,coordY,imgWidth,imgHeight,default_alpha,bufferWidth,bufferHeight,buffer) \ - \ - PNGU_DecodeToRGBA8 (ctx, imgWidth, imgHeight, ((void *) buffer) + (coordY) * (bufferWidth) * 2 + \ - (coordX) * 2, (bufferWidth) - (imgWidth), default_alpha) - -// Expands selected image into a 4x4 tiled RGB565 buffer. You need to specify context, image dimensions -// and destination address. -int PNGU_DecodeTo4x4RGB565 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer); - -// Expands selected image into a 4x4 tiled RGB5A3 buffer. You need to specify context, image dimensions, -// destination address and default alpha value, which is used if the source image doesn't have an alpha channel. -int PNGU_DecodeTo4x4RGB5A3 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u8 default_alpha); - -// Expands selected image into a 4x4 tiled RGBA8 buffer. You need to specify context, image dimensions, -// destination address and default alpha value, which is used if the source image doesn't have an alpha channel. -int PNGU_DecodeTo4x4RGBA8 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u8 default_alpha); - -// Encodes an YCbYCr image in PNG format and stores it in the selected device or memory buffer. You need to -// specify context, image dimensions, destination address and stride in pixels (stride = buffer width - image width). -int PNGU_EncodeFromYCbYCr (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride); - -// Macro for encoding an image stored into an YCbYCr buffer at given coordinates. -#define PNGU_ENCODE_TO_COORDS_YCbYCr(ctx,coordX,coordY,imgWidth,imgHeight,bufferWidth,bufferHeight,buffer) \ - \ - PNGU_EncodeFromYCbYCr (ctx, imgWidth, imgHeight, ((void *) buffer) + (coordY) * (bufferWidth) * 2 + \ - (coordX) * 2, (bufferWidth) - (imgWidth)) - -#ifdef __cplusplus - } -#endif - -#endif -