From fc2f5b2cd655f1391f2abda1b39e37cdec98a951 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Fri, 17 Oct 2003 15:35:43 +0000 Subject: Initial revision --- lib/gdi/gpixmap.cpp | 295 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 lib/gdi/gpixmap.cpp (limited to 'lib/gdi/gpixmap.cpp') diff --git a/lib/gdi/gpixmap.cpp b/lib/gdi/gpixmap.cpp new file mode 100644 index 00000000..c089051d --- /dev/null +++ b/lib/gdi/gpixmap.cpp @@ -0,0 +1,295 @@ +#include + +gLookup::gLookup() +{ + size=0; + lookup=0; +} + +gLookup::gLookup(int size, const gPalette &pal, const gRGB &start, const gRGB &end) +{ + size=0; + lookup=0; + build(size, pal, start, end); +} + +void gLookup::build(int _size, const gPalette &pal, const gRGB &start, const gRGB &end) +{ + if (lookup) + { + delete lookup; + lookup=0; + size=0; + } + size=_size; + if (!size) + return; + lookup=new gColor[size]; + + for (int i=0; i= 0) goto AFTERNEGX; dX=-dX; // ndet und beheben kann. das liegt nicht zuletzt an den komment +fbXincr=-1; AFTERNEGX: fbYincr=stride; if ( (dY=By // aren. und ausserdem, je kuerzer der code, desto weniger k +-Ay) >= 0) goto AFTERNEGY; fbYincr=-stride; dY=-dY;AFTERNEGY: // ann daran falsch sein. erwaehnte ich schon, da +fbXYincr = fbXincr+fbYincr; if (dY > dX) goto YisIndependent; dPr = dY+ // s dieser tolle code wahnsinnig schnell +dY; P = -dX; dPru = P+P; dY = dX>>1; XLOOP: *AfbAddr=color; *BfbAddr=color; if ((P+=dPr) > 0) // ist? bye, tmbinc +goto RightAndUp; AfbAddr+=fbXincr; BfbAddr-=fbXincr; if ((dY=dY-1) > 0) goto XLOOP; *AfbAddr=color; if ((dX & 1) +== 0) return; *BfbAddr=color; return; RightAndUp: AfbAddr+=fbXYincr; BfbAddr-=fbXYincr; P+=dPru; if ((dY=dY-1) > +0) goto XLOOP; *AfbAddr=color; if ((dX & 1) == 0) return; *BfbAddr=color; return; YisIndependent: dPr = dX+dX; P += -dY; dPru = P+P; dX = dY>>1; YLOOP: *AfbAddr=color; *BfbAddr=color; if ((P+=dPr) > 0) goto RightAndUp2; AfbAddr ++=fbYincr; BfbAddr-=fbYincr; if ((dX=dX-1) > 0) goto YLOOP; *AfbAddr=color; if ((dY & 1) == 0) return; *BfbAddr= +color;return; RightAndUp2: AfbAddr+=fbXYincr; BfbAddr-=fbXYincr; P+=dPru; if ((dX=dX-1) > 0) goto YLOOP; *AfbAddr +=color; if((dY & 1) == 0) return; *BfbAddr=color; return; // nun ist der tolle code leider zu ende. tut mir leid. +} + +gColor gPalette::findColor(const gRGB &rgb) const +{ + int difference=1<<30, best_choice=0; + for (int t=0; t=difference) + continue; + td=(signed)(rgb.g-data[t].g); td*=td; td*=(255-data[t].a); + ttd+=td; + if (ttd>=difference) + continue; + td=(signed)(rgb.b-data[t].b); td*=td; td*=(255-data[t].a); + ttd+=td; + if (ttd>=difference) + continue; + td=(signed)(rgb.a-data[t].a); td*=td; td*=255; + ttd+=td; + if (ttd>=difference) + continue; + difference=ttd; + best_choice=t; + } + return best_choice; +} + +gPixmap::gPixmap() +{ +} + +gPixmap::~gPixmap() +{ +} + +gImage::gImage(eSize size, int _bpp) +{ + x=size.width(); + y=size.height(); + bpp=_bpp; + switch (bpp) + { + case 8: + bypp=1; + break; + case 15: + case 16: + bypp=2; + break; + case 24: // never use 24bit mode + case 32: + bypp=4; + break; + default: + bypp=(bpp+7)/8; + } + stride=x*bypp; + if (bpp==8) + { + clut.colors=256; + clut.data=new gRGB[clut.colors]; + } else + { + clut.colors=0; + clut.data=0; + } + data=new char[x*y*bypp]; +} + +gImage::~gImage() +{ + delete[] clut.data; + delete[] (char*)data; +} -- cgit v1.2.3