--- deliantra/server/socket/image.C 2008/12/26 10:44:17 1.57 +++ deliantra/server/socket/image.C 2008/12/27 01:25:00 1.58 @@ -40,25 +40,6 @@ #define MAX_IMAGE_SIZE 10000 /** - * Client tells us what type of faces it wants. Also sets - * the caching attribute. - * - */ -void -SetFaceMode (char *buf, int len, client *ns) -{ - int mask = (atoi (buf) & CF_FACE_CACHE), mode = (atoi (buf) & ~CF_FACE_CACHE); - - if (mode == CF_FACE_NONE) - ns->facecache = 1; - else if (mode != CF_FACE_PNG) - ns->send_packet_printf ("drawinfo %d %s", NDI_RED, "Warning - send unsupported face mode. Will use Png"); - - if (mask) - ns->facecache = 1; -} - -/** * client requested an image. send it rate-limited * before flushing. */ @@ -84,27 +65,17 @@ auto (pos, ns->ixface.end ()); - if (ns->fxix < 2) - { - // gcfclient does not support prioritising, older cfplus versions - // do not support interleaved transfers. - if (!ns->ixface.empty ()) - pos = ns->ixface.end () - 1; - } - else + // the by far most common case will be to insert + // near the end, so little looping. + while (pos != ns->ixface.begin ()) { - // the by far most common case will be to insert - // near the end, so little looping. - while (pos != ns->ixface.begin ()) - { - --pos; + --pos; - // sort within 2k bins, to slightly prefer smaller images - if (pri > pos->pri || (pri == pos->pri && (ix.ofs >> 11) <= (pos->ofs >> 11))) - { - ++pos; - break; - } + // sort within 2k bins, to slightly prefer smaller images + if (pri > pos->pri || (pri == pos->pri && (ix.ofs >> 11) <= (pos->ofs >> 11))) + { + ++pos; + break; } } @@ -118,43 +89,6 @@ } /** - * Tells client the picture it has to use - * to smooth a picture number given as argument. - */ -void -AskSmooth (char *buf, int len, client *ns) -{ - ns->send_face (atoi (buf), -100); - ns->flush_fx (); -} - -// how lame -static void print_facename (packet &sl, const facedata &d) -{ - for (int i = 0; i < CHKSUM_SIZE; ++i) - sl.printf ("%02x", d.chksum [i]); -} - -// gcfclient uses the server-provided checksum for comparison, but always -// writes a broken checksum to its cache file, so we have to provide -// gcfclient with the same broken (and useless) checksum just to have it -// cache the image despite its bugs. -static uint32 gcfclient_checksum (const facedata *d) -{ - uint32 csum = 0; - - for (std::string::const_iterator i = d->data.begin (); - i != d->data.end (); - ++i) - { - csum = rotate_right (csum); - csum += *(uint8 *)&*i; - } - - return csum; -} - -/** * Sends a face to a client if they are in pixmap mode * nothing gets sent in bitmap mode. * If nocache is true (nonzero), ignore the cache setting from the client - @@ -186,31 +120,7 @@ faces_sent[facenum] = true; - // if for some reason we let a client without face caching connect, - // we better support that decision here and implement it. - if (!facecache) - return send_image (facenum); - - if (fxix) - { - fxface.push_back (facenum); - return; - } - - const facedata *d = f->data (faceset); - - packet sl; - - if (force_face0) - sl << "face " << uint16 (facenum); - else if (image2) - sl << "face2 " << uint16 (facenum) << uint8 (0) << uint32 (force_bad_checksum ? gcfclient_checksum (d) : 0); - else - sl << "face1 " << uint16 (facenum) << uint32 (force_bad_checksum ? gcfclient_checksum (d) : 0); - - // how lame - print_facename (sl, *d); - send_packet (sl); + fxface.push_back (facenum); } void client::flush_fx () @@ -264,40 +174,6 @@ } } -void -client::send_image (faceidx facenum) -{ - // never send face 0. ever. it does not exist. - if (!facenum) - return; - - const facedata *d = face_data (facenum, faceset); - - faces_sent[facenum] = true; - - if (!d) - { - LOG (llevError, "client::send_image (%d) out of bounds??\n", facenum); - return; - } - - if (force_image_newmap) - force_newmap = true; - - packet sl; - - sl << (image2 ? "image2 " : "image ") - << uint32 (facenum); - - if (image2) - sl << uint8 (0); - - sl << uint32 (d->data.size ()) - << data (d->data.data (), d->data.size ()); - - send_packet (sl); -} - // send all faces of this object to the client // this uses more bandwidth initially, but makes // animations look much smoother, and every client @@ -421,7 +297,10 @@ << uint32 (0) // checksum << uint8 (ns->faceset); - print_facename (sl, *d); sl << uint8 (0); + for (int i = 0; i < CHKSUM_SIZE; ++i) + sl.printf ("%02x", d->chksum [i]); + + sl << uint8 (0); } /* It would make more sense to catch this pre-emptively in the code above.