Single Photo displayed on LPC4088
Dependencies: DMBasicGUI DMSupport
Diff: easyGUIFixed/GuiGraph.h
- Revision:
- 0:9140ec6aa604
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easyGUIFixed/GuiGraph.h Fri Jul 28 14:19:12 2017 +0000 @@ -0,0 +1,1750 @@ +/* ************************************************************************ */ +/* */ +/* (C)2004-2015 IBIS Solutions ApS */ +/* sales@easyGUI.com */ +/* www.easyGUI.com */ +/* */ +/* Graphics include library */ +/* v6.0.9.005 */ +/* */ +/* GuiLib.c include file - do NOT reference it in your linker setup */ +/* */ +/* ************************************************************************ */ + +//============================================================================== +#define GuiLib_DEG 10 +#define GuiLib_DEG360 360 * GuiLib_DEG + +#define GuiLib_RAD 4096 +#define GuiLib_RAD_QUARTER_PI 3217 +#define GuiLib_RAD_HALF_PI 6434 +#define GuiLib_RAD_PI 12868 +#define GuiLib_RAD_2_PI 25736 +#define GuiLib_RAD_TO_DEG 573 + +//============================================================================== + +//------------------------------------------------------------------------------ +GuiConst_INT32S GuiLib_DegToRad( + GuiConst_INT32S Angle) +{ + return ((GuiLib_RAD * Angle) / GuiLib_RAD_TO_DEG); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32S GuiLib_RadToDeg( + GuiConst_INT32S Angle) +{ + return ((GuiLib_RAD_TO_DEG * Angle) / GuiLib_RAD); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32S GuiLib_SinRad( + GuiConst_INT32S Angle) +{ + GuiConst_INT32S A, B, X2; + + Angle %= GuiLib_RAD_2_PI; + + if (Angle > GuiLib_RAD_PI) + X2 = GuiLib_RAD_2_PI - Angle; + else + X2 = Angle; + if (X2 > GuiLib_RAD_HALF_PI) + X2 = GuiLib_RAD_PI - X2; + + A = ((((X2 * X2) >> 12) * X2) / 6) >> 12; + B = ((((A * X2) >> 12) * X2) / 20) >> 12; + B = X2 - A + B - ((((B * X2) / 42) * X2) >> 24); + + if (Angle > GuiLib_RAD_PI) + return (-B); + else + return (B); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32S GuiLib_SinDeg( + GuiConst_INT32S Angle) +{ + return (GuiLib_SinRad(GuiLib_DegToRad(Angle))); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32S GuiLib_CosRad( + GuiConst_INT32S Angle) +{ + GuiConst_INT32S A, B, C, X2; + + Angle %= GuiLib_RAD_2_PI; + + if (Angle > GuiLib_RAD_PI) + Angle = GuiLib_RAD_2_PI - Angle; + if (Angle > GuiLib_RAD_HALF_PI) + X2 = GuiLib_RAD_PI - Angle; + else + X2 = Angle; + + A = (X2 * X2) >> 13; + B = ((((A * X2) >> 12) * X2) / 12) >> 12; + C = (((B * X2) / 30) * X2) >> 24; + C = GuiLib_RAD - A + B - C + (((((C * X2) / 8) * X2) / 7) >> 24); + if (Angle > GuiLib_RAD_HALF_PI) + return (-C); + else + return (C); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32S GuiLib_CosDeg( + GuiConst_INT32S Angle) +{ + return (GuiLib_CosRad(GuiLib_DegToRad(Angle))); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32U GuiLib_Sqrt( + GuiConst_INT32U X) +{ + GuiConst_INT32U X1, X2; + + if (X == 0) + return (0); + + X1 = (X / 2) + 1; + X2 = (X1 + (X / X1)) / 2; + while (X2 < X1) + { + X1 = X2; + X2 = (X1 + (X / X1)) / 2; + } + return (X1); +} + +//------------------------------------------------------------------------------ +GuiConst_INT8U GuiLib_GetRedRgbColor( + GuiConst_INT32U RgbColor) +{ + return (RgbColor & 0x000000FF); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32U GuiLib_SetRedRgbColor( + GuiConst_INT32U RgbColor, + GuiConst_INT8U RedColor) +{ + return ((RgbColor & 0x00FFFF00) | RedColor); +} + +//------------------------------------------------------------------------------ +GuiConst_INT8U GuiLib_GetGreenRgbColor( + GuiConst_INT32U RgbColor) +{ + return (GuiConst_INT8U)((RgbColor & 0x0000FF00) >> 8); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32U GuiLib_SetGreenRgbColor( + GuiConst_INT32U RgbColor, + GuiConst_INT8U GreenColor) +{ + return ((RgbColor & 0x00FF00FF) | ((GuiConst_INT32U)GreenColor << 8)); +} + +//------------------------------------------------------------------------------ +GuiConst_INT8U GuiLib_GetBlueRgbColor( + GuiConst_INT32U RgbColor) +{ + return (GuiConst_INT8U)((RgbColor & 0x00FF0000) >> 16); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32U GuiLib_SetBlueRgbColor( + GuiConst_INT32U RgbColor, + GuiConst_INT8U BlueColor) +{ + return ((RgbColor & 0xFF00FFFF) | ((GuiConst_INT32U)BlueColor << 16)); +} + +//------------------------------------------------------------------------------ +GuiConst_INTCOLOR GuiLib_RgbToPixelColor( + GuiConst_INT32U RgbColor) +{ +#ifdef GuiConst_COLOR_MODE_GRAY + return ((GuiConst_COLOR_MAX * + (GuiConst_INT16U)GuiLib_RgbColorToGrayScale(RgbColor)) / 255); +#else +#ifdef GuiConst_COLOR_MODE_PALETTE + GuiConst_INT16U ColorR, ColorG, ColorB; + GuiConst_INT16U I, I2, byte, shift; + GuiConst_INT16U Rating, NewRating; + GuiConst_INT32U PColor; + + ColorR = RgbColor & 0x000000FF; + ColorG = (RgbColor & 0x0000FF00) >> 8; + ColorB = (RgbColor & 0x00FF0000) >> 16; +#ifndef GuiConst_COLOR_RGB_STANDARD + ColorR = (GuiConst_COLORCODING_R_MAX * ColorR) / 255; + ColorG = (GuiConst_COLORCODING_G_MAX * ColorG) / 255; + ColorB = (GuiConst_COLORCODING_B_MAX * ColorB) / 255; +#endif + Rating = 0xFFFF; + for (I = 0; I < GuiConst_PALETTE_SIZE; I++) + { + PColor = 0; + for (byte=0,shift=0;byte < GuiConst_COLOR_BYTE_SIZE; byte++, shift +=8) + PColor |= ((GuiConst_INT32U)GuiStruct_Palette[I][byte] << shift); + + NewRating = + abs(ColorR - ((PColor & GuiConst_COLORCODING_R_MASK) >> + GuiConst_COLORCODING_R_START)) + + abs(ColorG - ((PColor & GuiConst_COLORCODING_G_MASK) >> + GuiConst_COLORCODING_G_START)) + + abs(ColorB - ((PColor & GuiConst_COLORCODING_B_MASK) >> + GuiConst_COLORCODING_B_START)); + if (NewRating < Rating) + { + Rating = NewRating; + I2 = I; + } + } + return (I2); +#else +#ifdef GuiConst_COLOR_RGB_STANDARD + return (RgbColor); +#else + return ((((GuiConst_COLORCODING_R_MAX * + (RgbColor & 0x000000FF)) / 255) << GuiConst_COLORCODING_R_START) | + (((GuiConst_COLORCODING_G_MAX * + ((RgbColor & 0x0000FF00) >> 8)) / 255) << GuiConst_COLORCODING_G_START) | + (((GuiConst_COLORCODING_B_MAX * + ((RgbColor & 0x00FF0000) >> 16)) / 255) << GuiConst_COLORCODING_B_START)); +#endif +#endif +#endif +} +//------------------------------------------------------------------------------ +GuiConst_INTCOLOR GuiLib_Rgb888ToPixelColor( + GuiConst_INT8U Red, GuiConst_INT8U Green, GuiConst_INT8U Blue) +{ +#ifdef GuiConst_COLOR_MODE_GRAY + return ((GuiConst_COLOR_MAX * + (GuiConst_INT16U)GuiLib_Rgb888ColorToGrayScale(Red, Green, Blue)) / 255); +#else +#ifdef GuiConst_COLOR_MODE_PALETTE + GuiConst_INT16U ColorR, ColorG, ColorB; + GuiConst_INT16U I, I2, byte, shift; + GuiConst_INT16U Rating, NewRating; + GuiConst_INT32U PColor; + + ColorR = Red; + ColorG = Green; + ColorB = Blue; +#ifndef GuiConst_COLOR_RGB_STANDARD + ColorR = (GuiConst_COLORCODING_R_MAX * ColorR) / 255; + ColorG = (GuiConst_COLORCODING_G_MAX * ColorG) / 255; + ColorB = (GuiConst_COLORCODING_B_MAX * ColorB) / 255; +#endif + Rating = 0xFFFF; + for (I = 0; I < GuiConst_PALETTE_SIZE; I++) + { + PColor = 0; + for (byte=0,shift=0;byte < GuiConst_COLOR_BYTE_SIZE; byte++, shift +=8) + PColor |= ((GuiConst_INT32U)GuiStruct_Palette[I][byte] << shift); + + NewRating = + abs(ColorR - ((PColor & GuiConst_COLORCODING_R_MASK) >> + GuiConst_COLORCODING_R_START)) + + abs(ColorG - ((PColor & GuiConst_COLORCODING_G_MASK) >> + GuiConst_COLORCODING_G_START)) + + abs(ColorB - ((PColor & GuiConst_COLORCODING_B_MASK) >> + GuiConst_COLORCODING_B_START)); + if (NewRating < Rating) + { + Rating = NewRating; + I2 = I; + } + } + return (I2); +#else +#ifdef GuiConst_COLOR_RGB_STANDARD + return (Red | (Green << 8) | (Blue << 16)); +#else + return ((((GuiConst_COLORCODING_R_MAX * Red) / 255) + << GuiConst_COLORCODING_R_START) | + (((GuiConst_COLORCODING_G_MAX * Green) / 255) + << GuiConst_COLORCODING_G_START) | + (((GuiConst_COLORCODING_B_MAX * Blue) / 255) + << GuiConst_COLORCODING_B_START)); +#endif +#endif +#endif +} +//------------------------------------------------------------------------------ +GuiConst_INT32U GuiLib_PixelToRgbColor( + GuiConst_INTCOLOR PixelColor) +{ +#ifdef GuiConst_COLOR_MODE_GRAY + GuiConst_INT16U GrayValue; + + GrayValue = (255 * PixelColor) / GuiConst_COLOR_MAX; + return (GuiLib_GrayScaleToRgbColor((GuiConst_INT8U)GrayValue)); +#else + GuiConst_INT32U PColor; +#ifdef GuiConst_COLOR_MODE_PALETTE + GuiConst_INT16U byte, shift; +#endif +#ifndef GuiConst_COLOR_RGB_STANDARD + GuiConst_INT32U ColorR, ColorG, ColorB; +#endif + +#ifdef GuiConst_COLOR_MODE_PALETTE + PColor = 0; + for (byte=0,shift=0;byte < GuiConst_COLOR_BYTE_SIZE; byte++, shift +=8) + PColor |= ((GuiConst_INT32U)GuiStruct_Palette[PixelColor][byte] << shift); +#else + PColor = PixelColor; +#endif + +#ifdef GuiConst_COLOR_RGB_STANDARD + return (PColor); +#else + ColorR = + (PColor & GuiConst_COLORCODING_R_MASK) >> GuiConst_COLORCODING_R_START; + ColorG = + (PColor & GuiConst_COLORCODING_G_MASK) >> GuiConst_COLORCODING_G_START; + ColorB = + (PColor & GuiConst_COLORCODING_B_MASK) >> GuiConst_COLORCODING_B_START; + ColorR = (255 * ColorR) / GuiConst_COLORCODING_R_MAX; + ColorG = (255 * ColorG) / GuiConst_COLORCODING_G_MAX; + ColorB = (255 * ColorB) / GuiConst_COLORCODING_B_MAX; + return (ColorR | (ColorG << 8) | (ColorB << 16)); +#endif +#endif +} + +//------------------------------------------------------------------------------ +GuiConst_INT8U GuiLib_RgbColorToGrayScale( + GuiConst_INT32U RgbColor) +{ + return (((RgbColor & 0x000000FF) + + ((RgbColor & 0x0000FF00) >> 8) + + ((RgbColor & 0x00FF0000) >> 16)) / 3); +} + +//------------------------------------------------------------------------------ +GuiConst_INT8U GuiLib_Rgb888ColorToGrayScale( + GuiConst_INT8U Red, GuiConst_INT8U Green, GuiConst_INT8U Blue) +{ + return ((Red + Green + Blue) / 3); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32U GuiLib_GrayScaleToRgbColor( + GuiConst_INT8U GrayValue) +{ + return ((GuiConst_INT32U)GrayValue | + ((GuiConst_INT32U)GrayValue << 8) | + ((GuiConst_INT32U)GrayValue << 16)); +} + +//------------------------------------------------------------------------------ +GuiConst_INT8U GuiLib_PixelColorToGrayScale( + GuiConst_INTCOLOR PixelColor) +{ + return (GuiLib_RgbColorToGrayScale(GuiLib_PixelToRgbColor(PixelColor))); +} + +//------------------------------------------------------------------------------ +GuiConst_INTCOLOR GuiLib_GrayScaleToPixelColor( + GuiConst_INT8U GrayValue) +{ + return (GuiLib_RgbToPixelColor(GuiLib_GrayScaleToRgbColor(GrayValue))); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32U GuiLib_BrightenRgbColor( + GuiConst_INT32U RgbColor, + GuiConst_INT16U Amount) +{ + GuiConst_INT32U ColorR, ColorG, ColorB; + + if (Amount == 0) + return (RgbColor); + else + { + ColorR = 255 - ((GuiConst_INT32U)(255 - GuiLib_GetRedRgbColor(RgbColor)) * + (1000 - Amount) / 1000); + ColorG = 255 - ((GuiConst_INT32U)(255 - GuiLib_GetGreenRgbColor(RgbColor)) * + (1000 - Amount) / 1000); + ColorB = 255 - ((GuiConst_INT32U)(255 - GuiLib_GetBlueRgbColor(RgbColor)) * + (1000 - Amount) / 1000); + return (ColorR | (ColorG << 8) | (ColorB << 16)); + } +} + +//------------------------------------------------------------------------------ +GuiConst_INTCOLOR GuiLib_BrightenPixelColor( + GuiConst_INTCOLOR PixelColor, + GuiConst_INT16U Amount) +{ + return (GuiLib_RgbToPixelColor( + GuiLib_BrightenRgbColor(GuiLib_PixelToRgbColor(PixelColor), Amount))); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32U GuiLib_DarkenRgbColor( + GuiConst_INT32U RgbColor, + GuiConst_INT16U Amount) +{ + GuiConst_INT32U ColorR, ColorG, ColorB; + + if (Amount == 0) + return (RgbColor); + else + { + ColorR = (GuiConst_INT32U)GuiLib_GetRedRgbColor(RgbColor) * + (1000 - Amount) / 1000; + ColorG = (GuiConst_INT32U)GuiLib_GetGreenRgbColor(RgbColor) * + (1000 - Amount) / 1000; + ColorB = (GuiConst_INT32U)GuiLib_GetBlueRgbColor(RgbColor) * + (1000 - Amount) / 1000; + return (ColorR | (ColorG << 8) | (ColorB << 16)); + } +} + +//------------------------------------------------------------------------------ +GuiConst_INTCOLOR GuiLib_DarkenPixelColor( + GuiConst_INTCOLOR PixelColor, + GuiConst_INT16U Amount) +{ + return (GuiLib_RgbToPixelColor( + GuiLib_DarkenRgbColor(GuiLib_PixelToRgbColor(PixelColor), Amount))); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32U GuiLib_MiddleRgbColor( + GuiConst_INT32U RgbColor1, + GuiConst_INT32U RgbColor2, + GuiConst_INT16U Amount) +{ + GuiConst_INT32S ColorR, ColorG, ColorB; + + if (Amount == 0) + return (RgbColor1); + else if (Amount >= 1000) + return (RgbColor2); + else + { + ColorR = (GuiConst_INT32U)GuiLib_GetRedRgbColor(RgbColor1); + ColorR = ColorR + (((GuiConst_INT32S)Amount * + ((GuiConst_INT32S)GuiLib_GetRedRgbColor(RgbColor2) - ColorR)) / 1000); + ColorG = (GuiConst_INT32U)GuiLib_GetGreenRgbColor(RgbColor1); + ColorG = ColorG + (((GuiConst_INT32S)Amount * + ((GuiConst_INT32S)GuiLib_GetGreenRgbColor(RgbColor2) - ColorG)) / 1000); + ColorB = (GuiConst_INT32U)GuiLib_GetBlueRgbColor(RgbColor1); + ColorB = ColorB + (((GuiConst_INT32S)Amount * + ((GuiConst_INT32S)GuiLib_GetBlueRgbColor(RgbColor2) - ColorB)) / 1000); + return (ColorR | (ColorG << 8) | (ColorB << 16)); + } +} + +// ----------------------------------------------------------------------------- +GuiConst_INTCOLOR GuiLib_MiddlePixelColor( + GuiConst_INTCOLOR PixelColor1, + GuiConst_INTCOLOR PixelColor2, + GuiConst_INT16U Amount) +{ + return (GuiLib_RgbToPixelColor( + GuiLib_MiddleRgbColor(GuiLib_PixelToRgbColor(PixelColor1), + GuiLib_PixelToRgbColor(PixelColor2), + Amount))); +} + +// ----------------------------------------------------------------------------- +GuiConst_INT32U GuiLib_DesaturateRgbColor( + GuiConst_INT32U RgbColor, + GuiConst_INT16U Amount) +{ + GuiConst_INT32U GrayValue; + GuiConst_INT32U ColorDesat; + + GrayValue = (GuiConst_INT32U)GuiLib_RgbColorToGrayScale(RgbColor); + ColorDesat = GrayValue | (GrayValue << 8) | (GrayValue << 16); + return (GuiLib_MiddleRgbColor(RgbColor, ColorDesat, Amount)); +} + +// ----------------------------------------------------------------------------- +GuiConst_INTCOLOR GuiLib_DesaturatePixelColor( + GuiConst_INTCOLOR PixelColor, + GuiConst_INT16U Amount) +{ + return (GuiLib_RgbToPixelColor( + GuiLib_DesaturateRgbColor(GuiLib_PixelToRgbColor(PixelColor), Amount))); +} + +//------------------------------------------------------------------------------ +GuiConst_INT32U GuiLib_AccentuateRgbColor( + GuiConst_INT32U RgbColor, + GuiConst_INT16U Amount) +{ + if (Amount == 0) + return (RgbColor); + else if (GuiLib_RgbColorToGrayScale(RgbColor) <= 127) + return (GuiLib_BrightenRgbColor(RgbColor, Amount)); + else + return (GuiLib_DarkenRgbColor(RgbColor, Amount)); +} + +//------------------------------------------------------------------------------ +GuiConst_INTCOLOR GuiLib_AccentuatePixelColor( + GuiConst_INTCOLOR PixelColor, + GuiConst_INT16U Amount) +{ + return (GuiLib_RgbToPixelColor( + GuiLib_AccentuateRgbColor(GuiLib_PixelToRgbColor(PixelColor), Amount))); +} + +//------------------------------------------------------------------------------ +void Ellipse( + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INT16U Radius1, + GuiConst_INT16U Radius2, + GuiConst_INT32S BorderColor, + GuiConst_INT32S FillColor, + GuiConst_INT8U Q1, + GuiConst_INT8U Q2, + GuiConst_INT8U Q3, + GuiConst_INT8U Q4) +{ + GuiConst_INT16S PX, PY; + GuiConst_INT16S L1, L2, LP1, LP2, LX, LY; + GuiConst_INT16S PX2, PY2; + GuiConst_INTCOLOR BColor; + GuiConst_INT8U Filling, LFilling, First; + GuiConst_INT16S R1, R2; + GuiConst_INT32S R22; + GuiConst_INT8U Q12, Q34, Q14, Q23, Qfull; + + Filling = (FillColor != GuiLib_NO_COLOR); + if (BorderColor == GuiLib_NO_COLOR) + { + if (!Filling) + return; + else + BColor = (GuiConst_INTCOLOR)FillColor; + } + else + BColor = (GuiConst_INTCOLOR)BorderColor; + + Q12 = (Q1 || Q2); + Q34 = (Q3 || Q4); + Q14 = (Q1 || Q4); + Q23 = (Q2 || Q3); + Qfull = Q1 & Q2 & Q3 & Q4; + if (!(Q12 || Q34)) + return; + + if (Radius1 == 0) + { + if (Qfull) + GuiLib_VLine(X, Y - Radius2, Y + Radius2, BColor); + else if (Q12) + GuiLib_VLine(X, Y, Y + Radius2, BColor); + else + GuiLib_VLine(X, Y - Radius2, Y, BColor); + } + else if (Radius2 == 0) + { + if (Qfull) + GuiLib_HLine(X - Radius1, X + Radius1, Y, BColor); + else if (Q14) + GuiLib_HLine(X, X + Radius1, Y, BColor); + else + GuiLib_HLine(X - Radius1, X, Y, BColor); + } + else if (Radius1 == 1) + { + PY = Radius2 / 2; + if (Q23) + { + if (Q2 && Q3) + GuiLib_VLine(X - 1, Y - PY, Y + PY, BColor); + else if (Q2) + GuiLib_VLine(X - 1, Y, Y + PY, BColor); + else + GuiLib_VLine(X - 1, Y - PY, Y, BColor); + } + if (Q34) + GuiLib_VLine(X, Y - Radius2, Y - PY - 1, BColor); + if (Filling) + { + if (Q12 && Q34) + GuiLib_VLine(X, Y - PY, Y + PY, (GuiConst_INTCOLOR)FillColor); + else if (Q12) + GuiLib_VLine(X, Y, Y + PY, (GuiConst_INTCOLOR)FillColor); + else + GuiLib_VLine(X, Y - PY, Y, (GuiConst_INTCOLOR)FillColor); + } + if (Q12) + GuiLib_VLine(X, Y + PY + 1, Y + Radius2, BColor); + if (Q14) + { + if (Q1 && Q4) + GuiLib_VLine(X + 1, Y - PY, Y + PY, BColor); + else if (Q1) + GuiLib_VLine(X + 1, Y, Y + PY, BColor); + else + GuiLib_VLine(X + 1, Y - PY, Y, BColor); + } + } + else if (Radius2 == 1) + { + PX = Radius1 / 2; + if (Q34) + { + if (Q3 && Q4) + GuiLib_HLine(X - PX, X + PX, Y - 1, BColor); + else if (Q4) + GuiLib_HLine(X, X + PX, Y - 1, BColor); + else + GuiLib_HLine(X - PX, X, Y - 1, BColor); + } + if (Q23) + GuiLib_HLine(X - Radius1, X - PX - 1, Y, BColor); + if (Filling) + { + if (Q14 && Q23) + GuiLib_HLine(X - PX, X + PX, Y, (GuiConst_INTCOLOR)FillColor); + else if (Q14) + GuiLib_HLine(X, X + PX, Y, (GuiConst_INTCOLOR)FillColor); + else + GuiLib_HLine(X - PX, X, Y, (GuiConst_INTCOLOR)FillColor); + } + if (Q14) + GuiLib_HLine(X + PX + 1, X + Radius1, Y, BColor); + if (Q12) + { + if (Q1 && Q2) + GuiLib_HLine(X - PX, X + PX, Y + 1, BColor); + else if (Q1) + GuiLib_HLine(X, X + PX, Y + 1, BColor); + else + GuiLib_HLine(X - PX, X, Y + 1, BColor); + } + } + else + { + R1 = Radius1 << 3; + R2 = Radius2 << 3; + + if (Radius1 >= Radius2) + { + R22 = (GuiConst_INT32S)R2 * R2; + + PX = 0; + First = 1; + for (PY = R2 - 4; PY >= 4; PY -= 8) + { + PX2 = PX + 8; + PX = (GuiConst_INT16S)((R1 * GuiLib_Sqrt((0x00000400 - + ((((GuiConst_INT32S)PY * (PY + 3)) << 10) / R22)) << 8)) >> 9) + 1; + LY = (PY + 4) >> 3; + if (First) + { + L1 = X - (PX >> 3); + L2 = X + (PX >> 3); + if (Q12) + { + if (Q1 && Q2) + GuiLib_HLine(L1, L2, Y + LY, BColor); + else if (Q1) + GuiLib_HLine(X, L2, Y + LY, BColor); + else + GuiLib_HLine(L1, X, Y + LY, BColor); + } + if (Q34) + { + if (Q3 && Q4) + GuiLib_HLine(L1, L2, Y - LY, BColor); + else if (Q4) + GuiLib_HLine(X, L2, Y - LY, BColor); + else + GuiLib_HLine(L1, X, Y - LY, BColor); + } + First = 0; + } + else + { + LP1 = X - (PX2 >> 3); + LP2 = X + (PX2 >> 3); + L1 = X - (PX >> 3); + L2 = X + (PX >> 3); + if (LP1 < L1) + { + LP1 = L1; + LP2 = L2; + } + LFilling = Filling & (LP2 - LP1 >= 2); + + if (Q12) + { + if (Q2) + GuiLib_HLine(L1, LP1, Y + LY, BColor); + if (LFilling) + { + if (Q1 && Q2) + GuiLib_HLine(LP1 + 1, LP2 - 1, Y + LY, + (GuiConst_INTCOLOR)FillColor); + else if (Q1) + GuiLib_HLine(X, LP2 - 1, Y + LY, (GuiConst_INTCOLOR)FillColor); + else + GuiLib_HLine(LP1 + 1, X, Y + LY, (GuiConst_INTCOLOR)FillColor); + } + if (Q1) + GuiLib_HLine(LP2, L2, Y + LY, BColor); + } + if (Q34) + { + if (Q3) + GuiLib_HLine(L1, LP1, Y - LY, BColor); + if (LFilling) + { + if (Q3 && Q4) + GuiLib_HLine(LP1 + 1, LP2 - 1, Y - LY, + (GuiConst_INTCOLOR)FillColor); + else if (Q4) + GuiLib_HLine(X, LP2 - 1, Y - LY, (GuiConst_INTCOLOR)FillColor); + else + GuiLib_HLine(LP1 + 1, X, Y - LY, (GuiConst_INTCOLOR)FillColor); + } + if (Q4) + GuiLib_HLine(LP2, L2, Y - LY, BColor); + } + } + } + L1 = (PX + 8) >> 3; + if (L1 > Radius1) + L1 = Radius1; + + if (Q23) + GuiLib_HLine(X - Radius1, X - L1, Y, BColor); + if (Filling & (L1 >= 1)) + { + if (Q14 && Q23) + GuiLib_HLine(X - L1 + 1, X + L1 - 1, Y, (GuiConst_INTCOLOR)FillColor); + else if (Q14) + GuiLib_HLine(X, X + L1 - 1, Y, (GuiConst_INTCOLOR)FillColor); + else + GuiLib_HLine(X - L1 + 1, X, Y, (GuiConst_INTCOLOR)FillColor); + } + if (Q14) + GuiLib_HLine(X + L1, X + Radius1, Y, BColor); + } + else + { + R22 = (GuiConst_INT32S)R1 * R1; + + PY = 0; + First = 1; + for (PX = R1 - 4; PX >= 4; PX -= 8) + { + PY2 = PY + 8; + PY = (GuiConst_INT16S)((R2 * GuiLib_Sqrt((0x00000400 - + ((((GuiConst_INT32S)PX * (PX + 3)) << 10) / R22)) << 8)) >> 9) + 1; + LX = (PX + 4) >> 3; + if (First) + { + L1 = Y - (PY >> 3); + L2 = Y + (PY >> 3); + if (Q14) + { + if (Q1 && Q4) + GuiLib_VLine(X + LX, L1, L2, BColor); + else if (Q1) + GuiLib_VLine(X + LX, Y, L2, BColor); + else + GuiLib_VLine(X + LX, L1, Y, BColor); + } + if (Q23) + { + if (Q2 && Q3) + GuiLib_VLine(X - LX, L1, L2, BColor); + else if (Q2) + GuiLib_VLine(X - LX, Y, L2, BColor); + else + GuiLib_VLine(X - LX, L1, Y, BColor); + } + First = 0; + } + else + { + LP1 = Y - (PY2 >> 3); + LP2 = Y + (PY2 >> 3); + L1 = Y - (PY >> 3); + L2 = Y + (PY >> 3); + if (LP1 < L1) + { + LP1 = L1; + LP2 = L2; + } + LFilling = Filling & (LP2 - LP1 >= 2); + + if (Q14) + { + if (Q4) + GuiLib_VLine(X + LX, L1, LP1, BColor); + if (LFilling) + { + if (Q1 && Q4) + GuiLib_VLine(X + LX, LP1 + 1, LP2 - 1, + (GuiConst_INTCOLOR)FillColor); + else if (Q1) + GuiLib_VLine(X + LX, Y, LP2 - 1, (GuiConst_INTCOLOR)FillColor); + else + GuiLib_VLine(X + LX, LP1 + 1, Y, (GuiConst_INTCOLOR)FillColor); + } + if (Q1) + GuiLib_VLine(X + LX, LP2, L2, BColor); + } + if (Q23) + { + if (Q3) + GuiLib_VLine(X - LX, L1, LP1, BColor); + if (LFilling) + { + if (Q2 && Q3) + GuiLib_VLine(X - LX, LP1 + 1, LP2 - 1, + (GuiConst_INTCOLOR)FillColor); + else if (Q2) + GuiLib_VLine(X - LX, Y, LP2 - 1, (GuiConst_INTCOLOR)FillColor); + else + GuiLib_VLine(X - LX, LP1 + 1, Y, (GuiConst_INTCOLOR)FillColor); + } + if (Q2) + GuiLib_VLine(X - LX, LP2, L2, BColor); + } + } + } + L1 = (PY + 8) >> 3; + if (L1 > Radius2) + L1 = Radius2; + + if (Q34) + GuiLib_VLine(X, Y - Radius2, Y - L1, BColor); + if (Filling & (L1 >= 1)) + { + if (Q12 && Q34) + GuiLib_VLine(X, Y - L1 + 1, Y + L1 - 1, (GuiConst_INTCOLOR)FillColor); + else if (Q12) + GuiLib_VLine(X, Y, Y + L1 - 1, (GuiConst_INTCOLOR)FillColor); + else + GuiLib_VLine(X, Y - L1 + 1, Y, (GuiConst_INTCOLOR)FillColor); + } + if (Q12) + GuiLib_VLine(X, Y + L1, Y + Radius2, BColor); + } + } +} + +//------------------------------------------------------------------------------ +void Circle( + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INT16U Radius, + GuiConst_INTCOLOR Color, + GuiConst_INT8U S0, + GuiConst_INT8U S1, + GuiConst_INT8U S2, + GuiConst_INT8U S3, + GuiConst_INT8U S4, + GuiConst_INT8U S5, + GuiConst_INT8U S6, + GuiConst_INT8U S7, + GuiConst_INT8U IF) +{ + GuiConst_INT16S PX, PY, PX2; + GuiConst_INT16S L1, L2, LP1, LP2, LX, LY, LX2; + GuiConst_INT8U First; + GuiConst_INT16S R; + GuiConst_INT32S R2; + + if (!(S0 || S1 || S2 || S3 || S4 || S5 || S6 || S7)) + return; + if (Radius == 0) + return; + + if (Radius == 1) + { + if (S7 || S0) + GuiLib_Dot(X + 1, Y, Color); + if (S1 || S2) + GuiLib_Dot(X, Y + 1, Color); + if (S3 || S4) + GuiLib_Dot(X - 1, Y, Color); + if (S5 || S6) + GuiLib_Dot(X, Y - 1, Color); + } + else + { + R = Radius << 3; + R2 = (GuiConst_INT32S)R * R; + First = 1; + PX = 0; + + for (PY = R - 4; PY >= R / 2; PY -= 8) + { + PX2 = PX + 8; + PX = (GuiConst_INT16S)((R * GuiLib_Sqrt((0x00000400 - + ((((GuiConst_INT32S)PY * (PY + 3)) << 10) / R2)) << 8)) >> 9) + 1; + LX2 = (PX2 + 4) >> 3; + LX = (PX + 4) >> 3; + LY = (PY + 4) >> 3; + if (First) + { + if (S1 || S2) + { + if (S1) + L2 = X + LX; + else + L2 = X; + if (S2) + L1 = X - LX; + else + L1 = X; + GuiLib_HLine(L1, L2, Y + LY, Color); + if (IF) + GuiLib_HLine(L1, L2, Y + LY - 1, Color); + } + if (S5 || S6) + { + if (S5) + L1 = X - LX; + else + L1 = X; + if (S6) + L2 = X + LX; + else + L2 = X; + GuiLib_HLine(L1, L2, Y - LY, Color); + if (IF) + GuiLib_HLine(L1, L2, Y - LY +1, Color); + } + + if (S3 || S4) + { + if (S3) + L2 = Y + LX; + else + L2 = Y; + if (S4) + L1 = Y - LX; + else + L1 = Y; + GuiLib_VLine(X - LY, L1, L2, Color); + if (IF) + GuiLib_VLine(X - LY + 1, L1, L2, Color); + } + if (S7 || S0) + { + if (S7) + L1 = Y - LX; + else + L1 = Y; + if (S0) + L2 = Y + LX; + else + L2 = Y; + GuiLib_VLine(X + LY, L1, L2, Color); + if (IF) + GuiLib_VLine(X + LY - 1, L1, L2, Color); + } + + First = 0; + } + else if (LX < LY) + { + LP1 = X - LX2; + LP2 = X + LX2; + L1 = X - LX; + L2 = X + LX; + + if (S1) + { + GuiLib_HLine(LP2, L2, Y + LY, Color); + if (IF) + GuiLib_HLine(LP2, L2, Y + LY - 1, Color); + } + if (S2) + { + GuiLib_HLine(L1, LP1, Y + LY, Color); + if (IF) + GuiLib_HLine(L1, LP1, Y + LY - 1, Color); + } + + if (S5) + { + GuiLib_HLine(L1, LP1, Y - LY, Color); + if (IF) + GuiLib_HLine(L1, LP1, Y - LY + 1, Color); + } + if (S6) + { + GuiLib_HLine(LP2, L2, Y - LY, Color); + if (IF) + GuiLib_HLine(LP2, L2, Y - LY + 1, Color); + } + + LP1 = Y - LX2; + LP2 = Y + LX2; + L1 = Y - LX; + L2 = Y + LX; + + if (S7) + { + GuiLib_VLine(X + LY, L1, LP1, Color); + if (IF) + GuiLib_VLine(X + LY - 1, L1, LP1, Color); + } + if (S0) + { + GuiLib_VLine(X + LY, LP2, L2, Color); + if (IF) + GuiLib_VLine(X + LY - 1, LP2, L2, Color); + } + + if (S3) + { + GuiLib_VLine(X - LY, LP2, L2, Color); + if (IF) + GuiLib_VLine(X - LY + 1, LP2, L2, Color); + } + if (S4) + { + GuiLib_VLine(X - LY, L1, LP1, Color); + if (IF) + GuiLib_VLine(X - LY + 1, L1, LP1, Color); + } + } + else + { + if (S0) + { + GuiLib_Dot(X + LY, Y + LX2, Color); + if (IF) + GuiLib_Dot(X + LY - 1, Y + LX2, Color); + } + if (S1) + { + GuiLib_Dot(X + LX2, Y + LY, Color); + if (IF) + GuiLib_Dot(X + LX2, Y + LY - 1, Color); + } + if (S2) + { + GuiLib_Dot(X - LX2, Y + LY, Color); + if (IF) + GuiLib_Dot(X - LX2, Y + LY - 1, Color); + } + if (S3) + { + GuiLib_Dot(X - LY, Y + LX2, Color); + if (IF) + GuiLib_Dot(X - LY + 1, Y + LX2, Color); + } + if (S4) + { + GuiLib_Dot(X - LY, Y - LX2, Color); + if (IF) + GuiLib_Dot(X - LY + 1, Y - LX2, Color); + } + if (S5) + { + GuiLib_Dot(X - LX2, Y - LY, Color); + if (IF) + GuiLib_Dot(X - LX2, Y - LY + 1, Color); + } + if (S6) + { + GuiLib_Dot(X + LX2, Y - LY, Color); + if (IF) + GuiLib_Dot(X + LX2, Y - LY + 1, Color); + } + if (S7) + { + GuiLib_Dot(X + LY, Y - LX2, Color); + if (IF) + GuiLib_Dot(X + LY - 1, Y - LX2, Color); + } + + break; + } + } + + if (S7 || S0) + GuiLib_Dot(X + Radius, Y, Color); + if (S3 || S4) + GuiLib_Dot(X - Radius, Y, Color); + } +} + +//------------------------------------------------------------------------------ +void FilledCircle( + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INT16U Radius, + GuiConst_INTCOLOR Color) +{ + GuiConst_INT16S PX, PY, PX2; + GuiConst_INT16S LX, LY, LXY, LX2; + GuiConst_INT16S R; + GuiConst_INT32S R2; + + if (Radius == 0) + return; + + if (Radius == 1) + { + GuiLib_Dot(X, Y - 1, Color); + GuiLib_HLine(X - 1, X + 1, Y, Color); + GuiLib_Dot(X, Y + 1, Color); + } + else + { + R = Radius << 3; + R2 = (GuiConst_INT32S)R * R; + LXY = (707 * (GuiConst_INT32S)Radius) / 1000; + PX = 0; + LY = 0; + + for (PY = R - 4; PY >= R / 2; PY -= 8) + { + PX2 = PX + 8; + PX = (GuiConst_INT16S)((R * GuiLib_Sqrt((0x00000400 - + ((((GuiConst_INT32S)PY * (PY + 3)) << 10) / R2)) << 8)) >> 9) + 1; + LX2 = (PX2 + 4) >> 3; + LX = (PX + 4) >> 3; + LY = (PY + 4) >> 3; + + if (LX < LY) + { + GuiLib_HLine(X - LX, X + LX, Y + LY, Color); + GuiLib_HLine(X - LX, X + LX, Y - LY, Color); + + if (LX > LXY) + LX = LXY; + GuiLib_VLine(X - LY, Y - LX, Y + LX, Color); + GuiLib_VLine(X + LY, Y - LX, Y + LX, Color); + } + else + { + GuiLib_HLine(X - LX2, X + LX2, Y - LY, Color); + GuiLib_HLine(X - LX2, X + LX2, Y + LY, Color); + GuiLib_VLine(X - LY, Y - LX2, Y + LX2, Color); + GuiLib_VLine(X + LY, Y - LX2, Y + LX2, Color); + + break; + } + } + GuiLib_FillBox(X - LY + 1, Y - LY + 1, X + LY - 1, Y + LY - 1, Color); + } +} + +//------------------------------------------------------------------------------ +void GuiLib_Circle( + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INT16U Radius, + GuiConst_INT32S BorderColor, + GuiConst_INT32S FillColor) +{ + Ellipse(X, Y, Radius, Radius, BorderColor, FillColor, 1, 1, 1, 1); +} + +//------------------------------------------------------------------------------ +void GuiLib_Ellipse( + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INT16U Radius1, + GuiConst_INT16U Radius2, + GuiConst_INT32S BorderColor, + GuiConst_INT32S FillColor) +{ + Ellipse(X, Y, Radius1, Radius2, BorderColor, FillColor, 1, 1, 1, 1); +} + +//============================================================================== + +#ifdef GuiConst_CLIPPING_SUPPORT_ON +//------------------------------------------------------------------------------ +void GuiLib_ResetClipping(void) +{ + sgl.ClippingTotal = 0; + SetClipping( + 0, 0, GuiConst_DISPLAY_WIDTH_HW - 1, GuiConst_DISPLAY_HEIGHT_HW - 1); +} + +//------------------------------------------------------------------------------ +void GuiLib_SetClipping( + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2) +{ + sgl.ClippingTotal = ((X1 > X2) || (Y1 > Y2)); + + GuiLib_COORD_ADJUST(X1, Y1); + GuiLib_COORD_ADJUST(X2, Y2); + OrderCoord(&X1, &X2); + OrderCoord(&Y1, &Y2); + + SetClipping(X1, Y1, X2, Y2); +} +#endif + +//------------------------------------------------------------------------------ +void GuiLib_ResetDisplayRepaint(void) +{ + GuiConst_INT16S LineNo; + + if (!sgl.BaseLayerDrawing) + return; + + for (LineNo = 0; LineNo < GuiConst_BYTE_LINES; LineNo++) + { + GuiLib_DisplayRepaint[LineNo].ByteEnd = -1; + #ifdef GuiConst_VNC_REMOTE_SUPPORT_ON + GuiLib_VncRepaint[LineNo].ByteEnd = -1; + #endif + } +} + +//------------------------------------------------------------------------------ +void GuiLib_MarkDisplayBoxRepaint( + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2) +{ + if (!sgl.BaseLayerDrawing) + return; + + GuiLib_COORD_ADJUST(X1, Y1); + GuiLib_COORD_ADJUST(X2, Y2); + OrderCoord(&X1, &X2); + OrderCoord(&Y1, &Y2); +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect (&X1, &Y1, &X2, &Y2)) +#endif + MarkDisplayBoxRepaint(X1, Y1, X2, Y2); +} + +//------------------------------------------------------------------------------ +void GuiLib_ClearDisplay(void) +{ + ClearDisplay(); + MarkDisplayBoxRepaint( + 0, 0, GuiConst_DISPLAY_WIDTH_HW - 1, GuiConst_DISPLAY_HEIGHT_HW - 1); +} + +//------------------------------------------------------------------------------ +void GuiLib_Dot( + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INTCOLOR Color) +{ + GuiLib_COORD_ADJUST(X, Y); + GuiLib_COLOR_ADJUST(Color); + + MakeDot(X, Y, Color); +} + +//------------------------------------------------------------------------------ +GuiConst_INTCOLOR GuiLib_GetDot( + GuiConst_INT16S X, + GuiConst_INT16S Y) +{ + GuiLib_COORD_ADJUST(X, Y); + + return (ReadDot(X, Y)); +} + +//------------------------------------------------------------------------------ +void GuiLib_Line( + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2, + GuiConst_INTCOLOR Color) +{ + GuiConst_INT16S X, Y; + GuiConst_INT16S PX1, PY1, PX2, PY2; + GuiConst_INT16S RemCoord; + GuiConst_INT32S Slope; + GuiConst_INT16S Offset, NewOffset; + GuiConst_INT16U OffsetCnt; + GuiConst_INT16S OffsetDir; + + GuiLib_COORD_ADJUST(X1, Y1); + GuiLib_COORD_ADJUST(X2, Y2); + GuiLib_COLOR_ADJUST(Color); + + if (X1 == X2) + { + OrderCoord(&Y1, &Y2); +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect (&X1, &Y1, &X2, &Y2)) +#endif + { + VertLine(X1, Y1, Y2, Color); + MarkDisplayBoxRepaint(X1, Y1, X1, Y2); + } + } + else if (Y1 == Y2) + { + OrderCoord(&X1, &X2); +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect (&X1, &Y1, &X2, &Y2)) +#endif + { + HorzLine(X1, X2, Y1, Color); + MarkDisplayBoxRepaint(X1, Y1, X2, Y1); + } + } + else + { + Slope = labs ((10000 * (GuiConst_INT32S) (Y2 - Y1))) / + labs ((GuiConst_INT32S) (X2 - X1)); + + if (Slope <= 10000) + { + if (OrderCoord(&X1, &X2)) + SwapCoord(&Y1, &Y2); + + X = 0; + Offset = 0; + RemCoord = 0; + OffsetCnt = 0; + if (Y1 < Y2) + OffsetDir = 1; + else + OffsetDir = -1; + do + { + NewOffset = (((GuiConst_INT32S) X * Slope) + 5000) / 10000; + if (((X > 0) && (NewOffset != Offset)) || (X > X2 - X1)) + { + PX1 = X1 + RemCoord; + PY1 = Y1 + OffsetDir * Offset; + PX2 = PX1 + OffsetCnt - 1; + if (OffsetCnt == 1) + MakeDot(PX1, PY1, Color); + else +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect (&PX1, &PY1, &PX2, &PY1)) +#endif + { + HorzLine(PX1, PX2, PY1, Color); + MarkDisplayBoxRepaint(PX1, PY1, PX2, PY1); + } + OffsetCnt = 1; + RemCoord = X; + + if (X > X2 - X1) + return; + } + else + OffsetCnt++; + + Offset = NewOffset; + X++; + } + while (1); + } + else + { + if (OrderCoord(&Y1, &Y2)) + SwapCoord(&X1, &X2); + + Y = 0; + Offset = 0; + RemCoord = 0; + OffsetCnt = 0; + if (X1 < X2) + OffsetDir = 1; + else + OffsetDir = -1; + do + { + NewOffset = (((GuiConst_INT32S) Y * 10000) + (Slope / 2)) / Slope; + if (((Y > 0) && (NewOffset != Offset)) || (Y > Y2 - Y1)) + { + PX1 = X1 + OffsetDir * Offset; + PY1 = Y1 + RemCoord; + PY2 = PY1 + OffsetCnt - 1; + if (OffsetCnt == 1) + MakeDot(PX1, PY1, Color); + else +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect (&PX1, &PY1, &PX1, &PY2)) +#endif + { + VertLine(PX1, PY1, PY2, Color); + MarkDisplayBoxRepaint(PX1, PY1, PX1, PY2); + } + OffsetCnt = 1; + RemCoord = Y; + + if (Y > Y2 - Y1) + return; + } + else + OffsetCnt++; + + Offset = NewOffset; + Y++; + } + while (1); + } + } +} + +//------------------------------------------------------------------------------ +void GuiLib_LinePattern( + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2, + GuiConst_INT8U LinePattern, + GuiConst_INTCOLOR Color) +{ + GuiConst_INT16S X,Y; + GuiConst_INT32S Slope; + GuiConst_INT16S Offset; + GuiConst_INT8U MaskTemp; + GuiConst_INT8U MaskCtr = 0; + GuiConst_INT8U Vertical; + + GuiLib_COORD_ADJUST(X1, Y1); + GuiLib_COORD_ADJUST(X2, Y2); + GuiLib_COLOR_ADJUST(Color); + + Vertical = (X1 == X2); + if (Vertical) + Offset = 0; + else + Slope = labs ((10000 * (GuiConst_INT32S)(Y2 - Y1))) / + labs ((GuiConst_INT32S)(X2 - X1)); + + if (Vertical || (Slope > 10000)) + { + if (OrderCoord(&Y1, &Y2)) + SwapCoord(&X1, &X2); + + for (Y = 0; Y <= Y2 - Y1; Y++) + { + if (MaskCtr == 0 ) + { + MaskCtr = 8; + MaskTemp = LinePattern; + } + if (MaskTemp & 0x01) + { + if (!Vertical) + Offset = (((GuiConst_INT32S) Y * 10000) + (Slope / 2)) / Slope; + if (X1 < X2) + MakeDot(X1 + Offset, Y1 + Y, Color); + else + MakeDot(X1 - Offset, Y1 + Y, Color); + } + MaskTemp >>= 1; + MaskCtr--; + } + } + else + { + if (OrderCoord(&X1, &X2)) + SwapCoord(&Y1, &Y2); + + for (X = 0; X <= X2 - X1; X++) + { + if (MaskCtr == 0 ) + { + MaskCtr = 8; + MaskTemp = LinePattern; + } + + if (MaskTemp & 0x01) + { + Offset = (((GuiConst_INT32S) X * Slope) + 5000) / 10000; + if (Y1 < Y2) + MakeDot(X1 + X, Y1 + Offset, Color); + else + MakeDot(X1 + X, Y1 - Offset, Color); + } + MaskTemp >>= 1; + MaskCtr--; + } + } +} + +//------------------------------------------------------------------------------ +void GuiLib_HLine( + GuiConst_INT16S X1, + GuiConst_INT16S X2, + GuiConst_INT16S Y, + GuiConst_INTCOLOR Color) +{ + GuiLib_Line(X1, Y, X2, Y, Color); +} + +//------------------------------------------------------------------------------ +void GuiLib_VLine( + GuiConst_INT16S X, + GuiConst_INT16S Y1, + GuiConst_INT16S Y2, + GuiConst_INTCOLOR Color) +{ + GuiLib_Line(X, Y1, X, Y2, Color); +} + +//------------------------------------------------------------------------------ +void GuiLib_Box( + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2, + GuiConst_INTCOLOR Color) +{ + GuiConst_INT16S X1C; + GuiConst_INT16S Y1C; + GuiConst_INT16S X2C; + GuiConst_INT16S Y2C; + + GuiLib_COORD_ADJUST(X1, Y1); + GuiLib_COORD_ADJUST(X2, Y2); + GuiLib_COLOR_ADJUST(Color); + + OrderCoord(&X1, &X2); + OrderCoord(&Y1, &Y2); + + X1C = X1; + Y1C = Y1; + X2C = X2; + Y2C = Y2; +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect(&X1C, &Y1C, &X2C, &Y2C)) +#endif + { + MarkDisplayBoxRepaint(X1C, Y1C, X2C, Y2C); + X1C = X1; + Y1C = Y1; + X2C = X1; + Y2C = Y2; +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect(&X1C, &Y1C, &X1C, &Y2C)) +#endif + VertLine(X1C, Y1C, Y2C, Color); + X1C = X2; + Y1C = Y1; + X2C = X2; + Y2C = Y2; +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect(&X2C, &Y1C, &X2C, &Y2C)) +#endif + VertLine(X2C, Y1C, Y2C, Color); + if (X2 - X1 > 1) + { + X1C = X1 + 1; + Y1C = Y1; + X2C = X2 - 1; +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect(&X1C, &Y1C, &X2C, &Y1C)) +#endif + HorzLine(X1C, X2C, Y1C, Color); + X1C = X1 + 1; + Y1C = Y2; + X2C = X2 - 1; + Y2C = Y2; +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect(&X1C, &Y2C, &X2C, &Y2C)) +#endif + HorzLine(X1C, X2C, Y2C, Color); + } + } +} + +//------------------------------------------------------------------------------ +void GuiLib_FillBox( + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2, + GuiConst_INTCOLOR Color) +{ + GuiLib_COORD_ADJUST(X1, Y1); + GuiLib_COORD_ADJUST(X2, Y2); + GuiLib_COLOR_ADJUST(Color); + + OrderCoord(&X1, &X2); + OrderCoord(&Y1, &Y2); + +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect (&X1, &Y1, &X2, &Y2)) +#endif + { + MarkDisplayBoxRepaint(X1, Y1, X2, Y2); +#ifdef GuiConst_BYTE_HORIZONTAL + while (Y1 <= Y2) + { + HorzLine(X1, X2, Y1, Color); + Y1++; + } +#else + while (X1 <= X2) + { + VertLine(X1, Y1, Y2, Color); + X1++; + } +#endif + } +} + +//------------------------------------------------------------------------------ +void GuiLib_BorderBox( + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2, + GuiConst_INTCOLOR BorderColor, + GuiConst_INTCOLOR FillColor) +{ + GuiLib_Box(X1, Y1, X2, Y2, BorderColor); + OrderCoord(&X1, &X2); + OrderCoord(&Y1, &Y2); + if (((X2 - X1) >= 2) && ((Y2 - Y1) >= 2)) + GuiLib_FillBox(X1+1, Y1+1, X2-1, Y2-1, FillColor); +} + +#ifdef GuiConst_BITMAP_SUPPORT_ON +//------------------------------------------------------------------------------ +static void ReadBitmapSizes( + GuiConst_INT16U BitmapIndex) +{ +#ifndef GuiConst_REMOTE_BITMAP_DATA + GuiConst_INT8U PrefixRom * PixelDataPtr; +#endif + +#ifdef GuiConst_REMOTE_BITMAP_DATA + if (BitmapIndex != sgl.CurRemoteBitmap) + { + GuiLib_RemoteDataReadBlock( + (GuiConst_INT32U PrefixRom)GuiStruct_BitmapPtrList[BitmapIndex], + (GuiConst_INT32U PrefixRom)GuiStruct_BitmapPtrList[BitmapIndex + 1] - + (GuiConst_INT32U PrefixRom)GuiStruct_BitmapPtrList[BitmapIndex], + sgl.GuiLib_RemoteBitmapBuffer); + sgl.CurRemoteBitmap = BitmapIndex; + } + sgl.BitmapSizeX = (GuiConst_INT16S)sgl.GuiLib_RemoteBitmapBuffer[0] + + 256*(GuiConst_INT16S)sgl.GuiLib_RemoteBitmapBuffer[1]; + sgl.BitmapSizeY = (GuiConst_INT16S)sgl.GuiLib_RemoteBitmapBuffer[2] + + 256*(GuiConst_INT16S)sgl.GuiLib_RemoteBitmapBuffer[3]; +#else + PixelDataPtr = + (GuiConst_INT8U PrefixRom *)ReadWord(GuiStruct_BitmapPtrList[BitmapIndex]); + + sgl.BitmapSizeX = (GuiConst_INT16S)*PixelDataPtr; + PixelDataPtr++; + sgl.BitmapSizeX += 256*(GuiConst_INT16S)*PixelDataPtr; + PixelDataPtr++; + sgl.BitmapSizeY = (GuiConst_INT16S)*PixelDataPtr; + PixelDataPtr++; + sgl.BitmapSizeY += 256*(GuiConst_INT16S)*PixelDataPtr; + PixelDataPtr++; +#endif +} + +//------------------------------------------------------------------------------ +void GuiLib_ShowBitmap( + GuiConst_INT16U BitmapIndex, + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INT32S TranspColor) +{ +#ifdef GuiConst_REMOTE_BITMAP_DATA + if (BitmapIndex != sgl.CurRemoteBitmap) + { + GuiLib_RemoteDataReadBlock( + (GuiConst_INT32U PrefixRom)GuiStruct_BitmapPtrList[BitmapIndex], + (GuiConst_INT32U PrefixRom)GuiStruct_BitmapPtrList[BitmapIndex + 1] - + (GuiConst_INT32U PrefixRom)GuiStruct_BitmapPtrList[BitmapIndex], + sgl.GuiLib_RemoteBitmapBuffer); + sgl.CurRemoteBitmap = BitmapIndex; + } + ShowBitmapArea(&sgl.GuiLib_RemoteBitmapBuffer[0], + X, Y, 0, 0, 0, 0, TranspColor, GuiLib_FULL_BITMAP); +#else + ShowBitmapArea( + (GuiConst_INT8U PrefixRom *)ReadWord(GuiStruct_BitmapPtrList[BitmapIndex]), + X, Y, 0, 0, 0, 0, TranspColor, GuiLib_FULL_BITMAP); +#endif +} + +//------------------------------------------------------------------------------ +void GuiLib_ShowBitmapAt( + GuiConst_INT8U * BitmapPtr, + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INT32S TranspColor) +{ + ShowBitmapArea( + BitmapPtr, X, Y, 0, 0, 0, 0, TranspColor, GuiLib_FULL_BITMAP); +} + +//------------------------------------------------------------------------------ +void GuiLib_ShowBitmapArea( + GuiConst_INT16U BitmapIndex, + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INT16S AX1, + GuiConst_INT16S AY1, + GuiConst_INT16S AX2, + GuiConst_INT16S AY2, + GuiConst_INT32S TranspColor) +{ +#ifdef GuiConst_REMOTE_BITMAP_DATA + if (BitmapIndex != sgl.CurRemoteBitmap) + { + GuiLib_RemoteDataReadBlock( + (GuiConst_INT32U PrefixRom)GuiStruct_BitmapPtrList[BitmapIndex], + (GuiConst_INT32U PrefixRom)GuiStruct_BitmapPtrList[BitmapIndex + 1] - + (GuiConst_INT32U PrefixRom)GuiStruct_BitmapPtrList[BitmapIndex], + sgl.GuiLib_RemoteBitmapBuffer); + sgl.CurRemoteBitmap = BitmapIndex; + } + ShowBitmapArea(&sgl.GuiLib_RemoteBitmapBuffer[0], + X, Y, AX1, AY1, AX2, AY2, TranspColor, GuiLib_AREA_BITMAP); +#else + ShowBitmapArea( + (GuiConst_INT8U PrefixRom *)ReadWord(GuiStruct_BitmapPtrList[BitmapIndex]), + X, Y, AX1, AY1, AX2, AY2, TranspColor, GuiLib_AREA_BITMAP); +#endif +} + +//------------------------------------------------------------------------------ +void GuiLib_ShowBitmapAreaAt( + GuiConst_INT8U * BitmapPtr, + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INT16S AX1, + GuiConst_INT16S AY1, + GuiConst_INT16S AX2, + GuiConst_INT16S AY2, + GuiConst_INT32S TranspColor) +{ + ShowBitmapArea( + BitmapPtr, X, Y, AX1, AY1, AX2, AY2, TranspColor, GuiLib_AREA_BITMAP); +} +#endif +