[ SEA-GHOST MINI SHELL]
/*
* Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
* All Rights Reserved
*
* This file is a component of an X Window System-specific implementation
* of Xcms based on the TekColor Color Management System. Permission is
* hereby granted to use, copy, modify, sell, and otherwise distribute this
* software and its documentation for any purpose and without fee, provided
* that this copyright, permission, and disclaimer notice is reproduced in
* all copies of this software and in supporting documentation. TekColor
* is a trademark of Tektronix, Inc.
*
* Tektronix makes no representation about the suitability of this software
* for any purpose. It is provided "as is" and with all faults.
*
* TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
* INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE. IN NO EVENT SHALL TEKTRONIX BE LIABLE FOR ANY
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
* RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER IN AN ACTION OF
* CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR THE PERFORMANCE OF THIS SOFTWARE.
*
*
* DESCRIPTION
* Public include file for X Color Management System
*/
#ifndef _X11_XCMS_H_
#define _X11_XCMS_H_
#include <X11/Xlib.h>
/* The Xcms structs are full of implicit padding to properly align members.
We can't clean that up without breaking ABI, so tell clang not to bother
complaining about it. */
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpadded"
#endif
/*
* XCMS Status Values
*/
#define XcmsFailure 0
#define XcmsSuccess 1
#define XcmsSuccessWithCompression 2
/*
* Color Space Format ID's
* Color Space ID's are of XcmsColorFormat type.
*
* bit 31
* 0 == Device-Independent
* 1 == Device-Dependent
*
* bit 30:
* 0 == Registered with X Consortium
* 1 == Unregistered
*/
#define XcmsUndefinedFormat (XcmsColorFormat)0x00000000
#define XcmsCIEXYZFormat (XcmsColorFormat)0x00000001
#define XcmsCIEuvYFormat (XcmsColorFormat)0x00000002
#define XcmsCIExyYFormat (XcmsColorFormat)0x00000003
#define XcmsCIELabFormat (XcmsColorFormat)0x00000004
#define XcmsCIELuvFormat (XcmsColorFormat)0x00000005
#define XcmsTekHVCFormat (XcmsColorFormat)0x00000006
#define XcmsRGBFormat (XcmsColorFormat)0x80000000
#define XcmsRGBiFormat (XcmsColorFormat)0x80000001
/*
* State of XcmsPerScrnInfo
*/
#define XcmsInitNone 0x00 /* no initialization attempted */
#define XcmsInitSuccess 0x01 /* initialization successful */
#define XcmsInitFailure 0xff /* failure, use defaults */
#define DisplayOfCCC(ccc) ((ccc)->dpy)
#define ScreenNumberOfCCC(ccc) ((ccc)->screenNumber)
#define VisualOfCCC(ccc) ((ccc)->visual)
#define ClientWhitePointOfCCC(ccc) (&(ccc)->clientWhitePt)
#define ScreenWhitePointOfCCC(ccc) (&(ccc)->pPerScrnInfo->screenWhitePt)
#define FunctionSetOfCCC(ccc) ((ccc)->pPerScrnInfo->functionSet)
typedef unsigned long XcmsColorFormat; /* Color Space Format ID */
typedef double XcmsFloat;
/*
* Device RGB
*/
typedef struct {
unsigned short red; /* scaled from 0x0000 to 0xffff */
unsigned short green; /* scaled from 0x0000 to 0xffff */
unsigned short blue; /* scaled from 0x0000 to 0xffff */
} XcmsRGB;
/*
* RGB Intensity
*/
typedef struct {
XcmsFloat red; /* 0.0 - 1.0 */
XcmsFloat green; /* 0.0 - 1.0 */
XcmsFloat blue; /* 0.0 - 1.0 */
} XcmsRGBi;
/*
* CIE XYZ
*/
typedef struct {
XcmsFloat X;
XcmsFloat Y;
XcmsFloat Z;
} XcmsCIEXYZ;
/*
* CIE u'v'Y
*/
typedef struct {
XcmsFloat u_prime; /* 0.0 - 1.0 */
XcmsFloat v_prime; /* 0.0 - 1.0 */
XcmsFloat Y; /* 0.0 - 1.0 */
} XcmsCIEuvY;
/*
* CIE xyY
*/
typedef struct {
XcmsFloat x; /* 0.0 - 1.0 */
XcmsFloat y; /* 0.0 - 1.0 */
XcmsFloat Y; /* 0.0 - 1.0 */
} XcmsCIExyY;
/*
* CIE L*a*b*
*/
typedef struct {
XcmsFloat L_star; /* 0.0 - 100.0 */
XcmsFloat a_star;
XcmsFloat b_star;
} XcmsCIELab;
/*
* CIE L*u*v*
*/
typedef struct {
XcmsFloat L_star; /* 0.0 - 100.0 */
XcmsFloat u_star;
XcmsFloat v_star;
} XcmsCIELuv;
/*
* TekHVC
*/
typedef struct {
XcmsFloat H; /* 0.0 - 360.0 */
XcmsFloat V; /* 0.0 - 100.0 */
XcmsFloat C; /* 0.0 - 100.0 */
} XcmsTekHVC;
/*
* PAD
*/
typedef struct {
XcmsFloat pad0;
XcmsFloat pad1;
XcmsFloat pad2;
XcmsFloat pad3;
} XcmsPad;
/*
* XCMS Color Structure
*/
typedef struct {
union {
XcmsRGB RGB;
XcmsRGBi RGBi;
XcmsCIEXYZ CIEXYZ;
XcmsCIEuvY CIEuvY;
XcmsCIExyY CIExyY;
XcmsCIELab CIELab;
XcmsCIELuv CIELuv;
XcmsTekHVC TekHVC;
XcmsPad Pad;
} spec; /* the color specification */
unsigned long pixel; /* pixel value (as needed) */
XcmsColorFormat format; /* the specification format */
} XcmsColor;
/*
* XCMS Per Screen related data
*/
typedef struct _XcmsPerScrnInfo {
XcmsColor screenWhitePt; /* Screen White point */
XPointer functionSet; /* pointer to Screen Color Characterization */
/* Function Set structure */
XPointer screenData; /* pointer to corresponding Screen Color*/
/* Characterization Data */
unsigned char state; /* XcmsInitNone, XcmsInitSuccess, XcmsInitFailure */
char pad[3];
} XcmsPerScrnInfo;
typedef struct _XcmsCCC *XcmsCCC;
typedef Status (*XcmsCompressionProc)( /* Gamut Compression Proc */
XcmsCCC /* ccc */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
unsigned int /* index */,
Bool* /* compression_flags_return */
);
typedef Status (*XcmsWhiteAdjustProc)( /* White Point Adjust Proc */
XcmsCCC /* ccc */,
XcmsColor* /* initial_white_point*/,
XcmsColor* /* target_white_point*/,
XcmsColorFormat /* target_format */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
Bool* /* compression_flags_return */
);
/*
* XCMS Color Conversion Context
*/
typedef struct _XcmsCCC {
Display *dpy; /* X Display */
int screenNumber; /* X screen number */
Visual *visual; /* X Visual */
XcmsColor clientWhitePt; /* Client White Point */
XcmsCompressionProc gamutCompProc; /* Gamut Compression Function */
XPointer gamutCompClientData; /* Gamut Comp Func Client Data */
XcmsWhiteAdjustProc whitePtAdjProc; /* White Point Adjustment Function */
XPointer whitePtAdjClientData; /* White Pt Adj Func Client Data */
XcmsPerScrnInfo *pPerScrnInfo; /* pointer to per screen information */
/* associated with the above display */
/* screenNumber */
} XcmsCCCRec;
typedef Status (*XcmsScreenInitProc)( /* Screen Initialization Proc */
Display* /* dpy */,
int /* screen_number */,
XcmsPerScrnInfo* /* screen_info */
);
typedef void (*XcmsScreenFreeProc)(
XPointer /* screenData */
);
/*
* Function List Pointer -- pointer to an array of function pointers.
* The end of list is indicated by a NULL pointer.
*/
/*
* XXX: The use of the XcmsConversionProc type is broken. The
* device-independent colour conversion code uses it as:
typedef Status (*XcmsConversionProc)(XcmsCCC, XcmsColor *, XcmsColor *,
unsigned int);
* while the device-dependent code uses it as:
typedef Status (*XcmsConversionProc)(XcmsCCC, XcmsColor *, unsigned int,
Bool *);
* Until this is reworked, it's probably best to leave it unprotoized.
* The code works regardless.
*/
typedef Status (*XcmsDDConversionProc)( /* using device-dependent version */
XcmsCCC /* ccc */,
XcmsColor* /* pcolors_in_out */,
unsigned int /* ncolors */,
Bool* /* pCompressed */
);
typedef Status (*XcmsDIConversionProc)( /* using device-independent version */
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* pcolors_in_out */,
unsigned int /* ncolors */
);
typedef XcmsDIConversionProc XcmsConversionProc;
typedef XcmsConversionProc *XcmsFuncListPtr;
typedef int (*XcmsParseStringProc)( /* Color String Parsing Proc */
char* /* color_string */,
XcmsColor* /* color_return */
);
/*
* Color Space -- per Color Space related data (Device-Independent
* or Device-Dependent)
*/
typedef struct _XcmsColorSpace {
const char *prefix; /* Prefix of string format. */
XcmsColorFormat id; /* Format ID number. */
XcmsParseStringProc parseString;
/* String format parsing function */
XcmsFuncListPtr to_CIEXYZ; /* Pointer to an array of function */
/* pointers such that when the */
/* functions are executed in sequence */
/* will convert a XcmsColor structure */
/* from this color space to CIEXYZ */
/* space. */
XcmsFuncListPtr from_CIEXYZ;/* Pointer to an array of function */
/* pointers such that when the */
/* functions are executed in sequence */
/* will convert a XcmsColor structure */
/* from CIEXYZ space to this color */
/* space. */
int inverse_flag; /* If 1, indicates that for 0 <= i < n */
/* where n is the number of function */
/* pointers in the lists to_CIEXYZ */
/* and from_CIEXYZ; for each function */
/* to_CIEXYZ[i] its inverse function */
/* is from_CIEXYZ[n - i]. */
} XcmsColorSpace;
/*
* Screen Color Characterization Function Set -- per device class
* color space conversion functions.
*/
typedef struct _XcmsFunctionSet {
XcmsColorSpace **DDColorSpaces;
/* Pointer to an array of pointers to */
/* Device-DEPENDENT color spaces */
/* understood by this SCCFuncSet. */
XcmsScreenInitProc screenInitProc;
/* Screen initialization function that */
/* reads Screen Color Characterization*/
/* Data off properties on the screen's*/
/* root window. */
XcmsScreenFreeProc screenFreeProc;
/* Function that frees the SCCData */
/* structures. */
} XcmsFunctionSet;
_XFUNCPROTOBEGIN
extern Status XcmsAddColorSpace (
XcmsColorSpace* /* pColorSpace */
);
extern Status XcmsAddFunctionSet (
XcmsFunctionSet* /* functionSet */
);
extern Status XcmsAllocColor (
Display* /* dpy */,
Colormap /* colormap */,
XcmsColor* /* color_in_out */,
XcmsColorFormat /* result_format */
);
extern Status XcmsAllocNamedColor (
Display* /* dpy */,
Colormap /* colormap */,
_Xconst char* /* color_string */,
XcmsColor* /* color_scrn_return */,
XcmsColor* /* color_exact_return */,
XcmsColorFormat /* result_format */
);
extern XcmsCCC XcmsCCCOfColormap (
Display* /* dpy */,
Colormap /* colormap */
);
extern Status XcmsCIELabClipab(
XcmsCCC /* ccc */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
unsigned int /* index */,
Bool* /* compression_flags_return */
);
extern Status XcmsCIELabClipL(
XcmsCCC /* ccc */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
unsigned int /* index */,
Bool* /* compression_flags_return */
);
extern Status XcmsCIELabClipLab(
XcmsCCC /* ccc */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
unsigned int /* index */,
Bool* /* compression_flags_return */
);
extern Status XcmsCIELabQueryMaxC (
XcmsCCC /* ccc */,
XcmsFloat /* hue_angle */,
XcmsFloat /* L_star */,
XcmsColor* /* color_return */
);
extern Status XcmsCIELabQueryMaxL (
XcmsCCC /* ccc */,
XcmsFloat /* hue_angle */,
XcmsFloat /* chroma */,
XcmsColor* /* color_return */
);
extern Status XcmsCIELabQueryMaxLC (
XcmsCCC /* ccc */,
XcmsFloat /* hue_angle */,
XcmsColor* /* color_return */
);
extern Status XcmsCIELabQueryMinL (
XcmsCCC /* ccc */,
XcmsFloat /* hue_angle */,
XcmsFloat /* chroma */,
XcmsColor* /* color_return */
);
extern Status XcmsCIELabToCIEXYZ (
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* colors */,
unsigned int /* ncolors */
);
extern Status XcmsCIELabWhiteShiftColors(
XcmsCCC /* ccc */,
XcmsColor* /* initial_white_point*/,
XcmsColor* /* target_white_point*/,
XcmsColorFormat /* target_format */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
Bool* /* compression_flags_return */
);
extern Status XcmsCIELuvClipL(
XcmsCCC /* ccc */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
unsigned int /* index */,
Bool* /* compression_flags_return */
);
extern Status XcmsCIELuvClipLuv(
XcmsCCC /* ccc */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
unsigned int /* index */,
Bool* /* compression_flags_return */
);
extern Status XcmsCIELuvClipuv(
XcmsCCC /* ccc */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
unsigned int /* index */,
Bool* /* compression_flags_return */
);
extern Status XcmsCIELuvQueryMaxC (
XcmsCCC /* ccc */,
XcmsFloat /* hue_angle */,
XcmsFloat /* L_star */,
XcmsColor* /* color_return */
);
extern Status XcmsCIELuvQueryMaxL (
XcmsCCC /* ccc */,
XcmsFloat /* hue_angle */,
XcmsFloat /* chroma */,
XcmsColor* /* color_return */
);
extern Status XcmsCIELuvQueryMaxLC (
XcmsCCC /* ccc */,
XcmsFloat /* hue_angle */,
XcmsColor* /* color_return */
);
extern Status XcmsCIELuvQueryMinL (
XcmsCCC /* ccc */,
XcmsFloat /* hue_angle */,
XcmsFloat /* chroma */,
XcmsColor* /* color_return */
);
extern Status XcmsCIELuvToCIEuvY (
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* colors */,
unsigned int /* ncolors */
);
extern Status XcmsCIELuvWhiteShiftColors(
XcmsCCC /* ccc */,
XcmsColor* /* initial_white_point*/,
XcmsColor* /* target_white_point*/,
XcmsColorFormat /* target_format */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
Bool* /* compression_flags_return */
);
extern Status XcmsCIEXYZToCIELab (
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* colors */,
unsigned int /* ncolors */
);
extern Status XcmsCIEXYZToCIEuvY (
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* colors */,
unsigned int /* ncolors */
);
extern Status XcmsCIEXYZToCIExyY (
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* colors */,
unsigned int /* ncolors */
);
extern Status XcmsCIEXYZToRGBi (
XcmsCCC /* ccc */,
XcmsColor* /* colors */,
unsigned int /* ncolors */,
Bool* /* compression_flags_return */
);
extern Status XcmsCIEuvYToCIELuv (
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* colors */,
unsigned int /* ncolors */
);
extern Status XcmsCIEuvYToCIEXYZ (
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* colors */,
unsigned int /* ncolors */
);
extern Status XcmsCIEuvYToTekHVC (
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* colors */,
unsigned int /* ncolors */
);
extern Status XcmsCIExyYToCIEXYZ (
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* colors */,
unsigned int /* ncolors */
);
extern XcmsColor *XcmsClientWhitePointOfCCC (
XcmsCCC /* ccc */
);
extern Status XcmsConvertColors (
XcmsCCC /* ccc */,
XcmsColor* /* colorArry_in_out */,
unsigned int /* nColors */,
XcmsColorFormat /* targetFormat */,
Bool* /* compArry_return */
);
extern XcmsCCC XcmsCreateCCC (
Display* /* dpy */,
int /* screenNumber */,
Visual* /* visual */,
XcmsColor* /* clientWhitePt */,
XcmsCompressionProc /* gamutCompProc */,
XPointer /* gamutCompClientData */,
XcmsWhiteAdjustProc /* whitePtAdjProc */,
XPointer /* whitePtAdjClientData */
);
extern XcmsCCC XcmsDefaultCCC (
Display* /* dpy */,
int /* screenNumber */
);
extern Display *XcmsDisplayOfCCC (
XcmsCCC /* ccc */
);
extern XcmsColorFormat XcmsFormatOfPrefix (
char* /* prefix */
);
extern void XcmsFreeCCC (
XcmsCCC /* ccc */
);
extern Status XcmsLookupColor (
Display* /* dpy */,
Colormap /* colormap */,
_Xconst char* /* color_string */,
XcmsColor* /* pColor_exact_in_out */,
XcmsColor* /* pColor_scrn_in_out */,
XcmsColorFormat /* result_format */
);
extern char *XcmsPrefixOfFormat (
XcmsColorFormat /* id */
);
extern Status XcmsQueryBlack (
XcmsCCC /* ccc */,
XcmsColorFormat /* target_format */,
XcmsColor* /* color_return */
);
extern Status XcmsQueryBlue (
XcmsCCC /* ccc */,
XcmsColorFormat /* target_format */,
XcmsColor* /* color_return */
);
extern Status XcmsQueryColor (
Display* /* dpy */,
Colormap /* colormap */,
XcmsColor* /* pColor_in_out */,
XcmsColorFormat /* result_format */
);
extern Status XcmsQueryColors (
Display* /* dpy */,
Colormap /* colormap */,
XcmsColor* /* colorArry_in_out */,
unsigned int /* nColors */,
XcmsColorFormat /* result_format */
);
extern Status XcmsQueryGreen (
XcmsCCC /* ccc */,
XcmsColorFormat /* target_format */,
XcmsColor* /* color_return */
);
extern Status XcmsQueryRed (
XcmsCCC /* ccc */,
XcmsColorFormat /* target_format */,
XcmsColor* /* color_return */
);
extern Status XcmsQueryWhite (
XcmsCCC /* ccc */,
XcmsColorFormat /* target_format */,
XcmsColor* /* color_return */
);
extern Status XcmsRGBiToCIEXYZ (
XcmsCCC /* ccc */,
XcmsColor* /* colors */,
unsigned int /* ncolors */,
Bool* /* compression_flags_return */
);
extern Status XcmsRGBiToRGB (
XcmsCCC /* ccc */,
XcmsColor* /* colors */,
unsigned int /* ncolors */,
Bool* /* compression_flags_return */
);
extern Status XcmsRGBToRGBi (
XcmsCCC /* ccc */,
XcmsColor* /* colors */,
unsigned int /* ncolors */,
Bool* /* compression_flags_return */
);
extern int XcmsScreenNumberOfCCC (
XcmsCCC /* ccc */
);
extern XcmsColor *XcmsScreenWhitePointOfCCC (
XcmsCCC /* ccc */
);
extern XcmsCCC XcmsSetCCCOfColormap(
Display* /* dpy */,
Colormap /* colormap */,
XcmsCCC /* ccc */
);
extern XcmsCompressionProc XcmsSetCompressionProc (
XcmsCCC /* ccc */,
XcmsCompressionProc /* compression_proc */,
XPointer /* client_data */
);
extern XcmsWhiteAdjustProc XcmsSetWhiteAdjustProc (
XcmsCCC /* ccc */,
XcmsWhiteAdjustProc /* white_adjust_proc */,
XPointer /* client_data */
);
extern Status XcmsSetWhitePoint (
XcmsCCC /* ccc */,
XcmsColor* /* color */
);
extern Status XcmsStoreColor (
Display* /* dpy */,
Colormap /* colormap */,
XcmsColor* /* pColor_in */
);
extern Status XcmsStoreColors (
Display* /* dpy */,
Colormap /* colormap */,
XcmsColor* /* colorArry_in */,
unsigned int /* nColors */,
Bool* /* compArry_return */
);
extern Status XcmsTekHVCClipC(
XcmsCCC /* ccc */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
unsigned int /* index */,
Bool* /* compression_flags_return */
);
extern Status XcmsTekHVCClipV(
XcmsCCC /* ccc */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
unsigned int /* index */,
Bool* /* compression_flags_return */
);
extern Status XcmsTekHVCClipVC(
XcmsCCC /* ccc */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
unsigned int /* index */,
Bool* /* compression_flags_return */
);
extern Status XcmsTekHVCQueryMaxC (
XcmsCCC /* ccc */,
XcmsFloat /* hue */,
XcmsFloat /* value */,
XcmsColor* /* color_return */
);
extern Status XcmsTekHVCQueryMaxV (
XcmsCCC /* ccc */,
XcmsFloat /* hue */,
XcmsFloat /* chroma */,
XcmsColor* /* color_return */
);
extern Status XcmsTekHVCQueryMaxVC (
XcmsCCC /* ccc */,
XcmsFloat /* hue */,
XcmsColor* /* color_return */
);
extern Status XcmsTekHVCQueryMaxVSamples (
XcmsCCC /* ccc */,
XcmsFloat /* hue */,
XcmsColor* /* colors_return */,
unsigned int /* nsamples */
);
extern Status XcmsTekHVCQueryMinV (
XcmsCCC /* ccc */,
XcmsFloat /* hue */,
XcmsFloat /* chroma */,
XcmsColor* /* color_return */
);
extern Status XcmsTekHVCToCIEuvY (
XcmsCCC /* ccc */,
XcmsColor* /* white_point */,
XcmsColor* /* colors */,
unsigned int /* ncolors */
);
extern Status XcmsTekHVCWhiteShiftColors(
XcmsCCC /* ccc */,
XcmsColor* /* initial_white_point*/,
XcmsColor* /* target_white_point*/,
XcmsColorFormat /* target_format */,
XcmsColor* /* colors_in_out */,
unsigned int /* ncolors */,
Bool* /* compression_flags_return */
);
extern Visual *XcmsVisualOfCCC (
XcmsCCC /* ccc */
);
#ifdef __clang__
#pragma clang diagnostic pop
#endif
_XFUNCPROTOEND
#endif /* _X11_XCMS_H_ */
SEA-GHOST - SHELL CODING BY SEA-GHOST