#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; }