kitty: set MIXED when appropriate on rebuild #1440

This commit is contained in:
nick black 2021-04-26 02:19:42 -04:00 committed by Nick Black
parent 1d9ae4082f
commit d435d6e083

View File

@ -201,8 +201,10 @@ kitty_null(char* triplet, int skip, int max, int pleft, uint8_t* auxvec){
// and restore a maximum of |max| pixels after that. returns the number of // and restore a maximum of |max| pixels after that. returns the number of
// pixels restored. |max| must be positive. |skip| must be non-negative, and // pixels restored. |max| must be positive. |skip| must be non-negative, and
// less than 3. |pleft| is the number of pixels available in the chunk. // less than 3. |pleft| is the number of pixels available in the chunk.
// |state| is set to MIXED if we find transparent pixels.
static inline int static inline int
kitty_restore(char* triplet, int skip, int max, int pleft, const uint8_t* auxvec){ kitty_restore(char* triplet, int skip, int max, int pleft,
const uint8_t* auxvec, sprixcell_e* state){
//fprintf(stderr, "SKIP/MAX/PLEFT %d/%d/%d\n", skip, max, pleft); //fprintf(stderr, "SKIP/MAX/PLEFT %d/%d/%d\n", skip, max, pleft);
if(pleft > 3){ if(pleft > 3){
pleft = 3; pleft = 3;
@ -212,29 +214,47 @@ kitty_restore(char* triplet, int skip, int max, int pleft, const uint8_t* auxvec
} }
if(skip == 0){ if(skip == 0){
int a = auxvec[0]; int a = auxvec[0];
if(a == 0){
*state = SPRIXCELL_MIXED_KITTY;
}
triplet[0x4] = b64subs[(a & 0xfc) >> 2]; triplet[0x4] = b64subs[(a & 0xfc) >> 2];
triplet[0x5] = b64subs[((a & 0x3) << 4) | (b64idx(triplet[0x5]) & 0xf)]; triplet[0x5] = b64subs[((a & 0x3) << 4) | (b64idx(triplet[0x5]) & 0xf)];
if(max > 1){ if(max > 1){
a = auxvec[1]; a = auxvec[1];
if(a == 0){
*state = SPRIXCELL_MIXED_KITTY;
}
triplet[0x9] = b64subs[(b64idx(triplet[0x9]) & 0x30) | ((a & 0xf0) >> 4)]; triplet[0x9] = b64subs[(b64idx(triplet[0x9]) & 0x30) | ((a & 0xf0) >> 4)];
triplet[0xA] = b64subs[((a & 0xf) << 2) | (b64idx(triplet[0xA]) & 0x3)]; triplet[0xA] = b64subs[((a & 0xf) << 2) | (b64idx(triplet[0xA]) & 0x3)];
} }
if(max == 3){ if(max == 3){
a = auxvec[2]; a = auxvec[2];
if(a == 0){
*state = SPRIXCELL_MIXED_KITTY;
}
triplet[0xE] = b64subs[((a & 0xc0) >> 6) | (b64idx(triplet[0xE]) & 0x3c)]; triplet[0xE] = b64subs[((a & 0xc0) >> 6) | (b64idx(triplet[0xE]) & 0x3c)];
triplet[0xF] = b64subs[(a & 0x3f)]; triplet[0xF] = b64subs[(a & 0x3f)];
} }
}else if(skip == 1){ }else if(skip == 1){
int a = auxvec[0]; int a = auxvec[0];
if(a == 0){
*state = SPRIXCELL_MIXED_KITTY;
}
triplet[0x9] = b64subs[(b64idx(triplet[0x9]) & 0x30) | ((a & 0xf0) >> 4)]; triplet[0x9] = b64subs[(b64idx(triplet[0x9]) & 0x30) | ((a & 0xf0) >> 4)];
triplet[0xA] = b64subs[((a & 0xf) << 2) | (b64idx(triplet[0xA]) & 0x3)]; triplet[0xA] = b64subs[((a & 0xf) << 2) | (b64idx(triplet[0xA]) & 0x3)];
if(max == 2){ if(max == 2){
a = auxvec[1]; a = auxvec[1];
if(a == 0){
*state = SPRIXCELL_MIXED_KITTY;
}
triplet[0xE] = b64subs[((a & 0xc0) >> 6) | (b64idx(triplet[0xE]) & 0x3c)]; triplet[0xE] = b64subs[((a & 0xc0) >> 6) | (b64idx(triplet[0xE]) & 0x3c)];
triplet[0xF] = b64subs[(a & 0x3f)]; triplet[0xF] = b64subs[(a & 0x3f)];
} }
}else{ // skip == 2 }else{ // skip == 2
int a = auxvec[0]; int a = auxvec[0];
if(a == 0){
*state = SPRIXCELL_MIXED_KITTY;
}
triplet[0xE] = b64subs[((a & 0xc0) >> 6) | (b64idx(triplet[0xE]) & 0x3c)]; triplet[0xE] = b64subs[((a & 0xc0) >> 6) | (b64idx(triplet[0xE]) & 0x3c)];
triplet[0xF] = b64subs[(a & 0x3f)]; triplet[0xF] = b64subs[(a & 0x3f)];
} }
@ -289,7 +309,8 @@ int kitty_rebuild(sprixel* s, int ycell, int xcell){
// pixels remaining in the target row, and the pixels left in the chunk. // pixels remaining in the target row, and the pixels left in the chunk.
//fprintf(stderr, "inchunk: %d total: %d triples: %d\n", inchunk, totalpixels, triples); //fprintf(stderr, "inchunk: %d total: %d triples: %d\n", inchunk, totalpixels, triples);
int chomped = kitty_restore(c + tripbytes, tripskip, thisrow, int chomped = kitty_restore(c + tripbytes, tripskip, thisrow,
inchunk - triples * 3, auxvec + auxvecidx); inchunk - triples * 3, auxvec + auxvecidx,
&state);
assert(chomped >= 0); assert(chomped >= 0);
auxvecidx += chomped; auxvecidx += chomped;
thisrow -= chomped; thisrow -= chomped;
@ -298,7 +319,6 @@ int kitty_rebuild(sprixel* s, int ycell, int xcell){
//fprintf(stderr, "CLEARED ROW, TARGY: %d\n", targy - 1); //fprintf(stderr, "CLEARED ROW, TARGY: %d\n", targy - 1);
if(--targy == 0){ if(--targy == 0){
free(auxvec); free(auxvec);
// FIXME needs be MIXED_KITTY if we got transparent pixels
s->n->tam[s->dimx * ycell + xcell].state = state; s->n->tam[s->dimx * ycell + xcell].state = state;
s->n->tam[s->dimx * ycell + xcell].auxvector = NULL; s->n->tam[s->dimx * ycell + xcell].auxvector = NULL;
return 0; return 0;