bool load(const ColorRanges *srcRanges, RacIn<IO> &rac) { SimpleSymbolCoder<FLIFBitChanceMeta, RacIn<IO>, 24> coder(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacIn<IO>, 24> coderY(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacIn<IO>, 24> coderI(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacIn<IO>, 24> coderQ(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacIn<IO>, 24> coderA(rac); long unsigned size = coder.read_int(1, MAX_PALETTE_SIZE); // printf("Loading %lu colors: ", size); prevPlanes pp(2); ColorVal min, max; for (unsigned int p=0; p<size; p++) { ColorVal A=coderA.read_int(srcRanges->min(3),srcRanges->max(3)); if (A == 0) { Palette_vector.push_back(Color(0,0,0,0)); continue; } srcRanges->minmax(0,pp,min,max); ColorVal Y=coderY.read_int(min,max); pp[0]=Y; srcRanges->minmax(1,pp,min,max); ColorVal I=coderI.read_int(min,max); pp[1]=I; srcRanges->minmax(2,pp,min,max); ColorVal Q=coderQ.read_int(min,max); Color c(A,Y,I,Q); Palette_vector.push_back(c); // printf("YIQ(%i,%i,%i)\t", std::get<0>(c), std::get<1>(c), std::get<2>(c)); } // printf("\nLoaded palette of size: %lu\n",Palette_vector.size()); v_printf(5,"[%lu]",Palette_vector.size()); return true; }
void save(const ColorRanges *srcRanges, RacOut<IO> &rac) const { SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 24> coder(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 24> coderY(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 24> coderI(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 24> coderQ(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 24> coderA(rac); coder.write_int(1, MAX_PALETTE_SIZE, Palette_vector.size()); // printf("Saving %lu colors: ", Palette_vector.size()); prevPlanes pp(2); ColorVal min, max; for (Color c : Palette_vector) { ColorVal A=std::get<0>(c); coderA.write_int(srcRanges->min(3),srcRanges->max(3), A); if (std::get<0>(c) == 0) continue; srcRanges->minmax(0,pp,min,max); ColorVal Y=std::get<1>(c); coderY.write_int(min,max,Y); pp[0]=Y; srcRanges->minmax(1,pp,min,max); ColorVal I=std::get<2>(c); coderI.write_int(min, max, I); pp[1]=I; srcRanges->minmax(2,pp,min,max); coderQ.write_int(min, max, std::get<3>(c)); // printf("YIQ(%i,%i,%i)\t", std::get<0>(c), std::get<1>(c), std::get<2>(c)); } // printf("\nSaved palette of size: %lu\n",Palette_vector.size()); v_printf(5,"[%lu]",Palette_vector.size()); }
void save(const ColorRanges *srcRanges, RacOut<IO> &rac) const { SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 24> coder(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 24> coderY(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 24> coderI(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 24> coderQ(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 24> coderA(rac); coder.write_int(1, MAX_PALETTE_SIZE, Palette_vector.size()); prevPlanes pp(2); int sorted=1; coder.write_int(0, 1, sorted); if (sorted) { Color min(srcRanges->min(3), srcRanges->min(0), srcRanges->min(1), srcRanges->min(2)); Color max(srcRanges->max(3), srcRanges->max(0), srcRanges->max(1), srcRanges->max(2)); Color prev(-1,-1,-1,-1); for (Color c : Palette_vector) { ColorVal A=std::get<0>(c); coderA.write_int(std::get<0>(min), std::get<0>(max), A); if (alpha_zero_special && std::get<0>(c) == 0) continue; ColorVal Y=std::get<1>(c); coderY.write_int((std::get<0>(prev) == A ? std::get<1>(prev) : std::get<1>(min)), std::get<1>(max), Y); pp[0]=Y; srcRanges->minmax(1,pp,std::get<2>(min), std::get<2>(max)); ColorVal I=std::get<2>(c); coderI.write_int(std::get<2>(min), std::get<2>(max), I); pp[1]=I; srcRanges->minmax(2,pp,std::get<3>(min), std::get<3>(max)); coderQ.write_int(std::get<3>(min), std::get<3>(max), std::get<3>(c)); std::get<0>(min) = std::get<0>(c); prev = c; } } else { ColorVal min, max; for (Color c : Palette_vector) { ColorVal A=std::get<0>(c); coderA.write_int(srcRanges->min(3),srcRanges->max(3), A); if (alpha_zero_special && std::get<0>(c) == 0) continue; srcRanges->minmax(0,pp,min,max); ColorVal Y=std::get<1>(c); coderY.write_int(min,max,Y); pp[0]=Y; srcRanges->minmax(1,pp,min,max); ColorVal I=std::get<2>(c); coderI.write_int(min, max, I); pp[1]=I; srcRanges->minmax(2,pp,min,max); coderQ.write_int(min, max, std::get<3>(c)); // printf("YIQ(%i,%i,%i)\t", std::get<0>(c), std::get<1>(c), std::get<2>(c)); } } // printf("\nSaved palette of size: %lu\n",Palette_vector.size()); v_printf(5,"[%lu]",Palette_vector.size()); }
void save(const ColorRanges *srcRanges, RacOut<IO> &rac) const override { SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 18> coder(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 18> coderY(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 18> coderI(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacOut<IO>, 18> coderQ(rac); coder.write_int2(1, MAX_PALETTE_SIZE, Palette_vector.size()); // printf("Saving %lu colors: ", Palette_vector.size()); prevPlanes pp(2); int sorted=(ordered_palette? 1 : 0); coder.write_int2(0, 1, sorted); if (sorted) { Color min(srcRanges->min(0), srcRanges->min(1), srcRanges->min(2)); Color max(srcRanges->max(0), srcRanges->max(1), srcRanges->max(2)); Color prev(-1,-1,-1); for (Color c : Palette_vector) { ColorVal Y=std::get<0>(c); coderY.write_int2(std::get<0>(min), std::get<0>(max), Y); pp[0]=Y; srcRanges->minmax(1,pp,std::get<1>(min), std::get<1>(max)); ColorVal I=std::get<1>(c); coderI.write_int2((std::get<0>(prev) == Y ? std::get<1>(prev): std::get<1>(min)), std::get<1>(max), I); pp[1]=I; srcRanges->minmax(2,pp,std::get<2>(min), std::get<2>(max)); coderQ.write_int2(std::get<2>(min), std::get<2>(max), std::get<2>(c)); std::get<0>(min) = std::get<0>(c); prev = c; } } else { ColorVal min, max; for (Color c : Palette_vector) { ColorVal Y=std::get<0>(c); srcRanges->minmax(0,pp,min,max); coderY.write_int2(min,max,Y); pp[0]=Y; srcRanges->minmax(1,pp,min,max); ColorVal I=std::get<1>(c); coderI.write_int2(min, max, I); pp[1]=I; srcRanges->minmax(2,pp,min,max); coderQ.write_int2(min, max, std::get<2>(c)); // printf("YIQ(%i,%i,%i)\t", std::get<0>(c), std::get<1>(c), std::get<2>(c)); } } // printf("\nSaved palette of size: %lu\n",Palette_vector.size()); v_printf(5,"[%lu]",Palette_vector.size()); if (!ordered_palette) v_printf(5,"Unsorted"); }
bool load(const ColorRanges *srcRanges, RacIn<IO> &rac) { SimpleSymbolCoder<FLIFBitChanceMeta, RacIn<IO>, 24> coder(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacIn<IO>, 24> coderY(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacIn<IO>, 24> coderI(rac); SimpleSymbolCoder<FLIFBitChanceMeta, RacIn<IO>, 24> coderQ(rac); long unsigned size = coder.read_int(1, MAX_PALETTE_SIZE); // printf("Loading %lu colors: ", size); prevPlanes pp(2); int sorted = coder.read_int(0,1); if (sorted) { Color min(srcRanges->min(0), srcRanges->min(1), srcRanges->min(2)); Color max(srcRanges->max(0), srcRanges->max(1), srcRanges->max(2)); Color prev(-1,-1,-1); for (unsigned int p=0; p<size; p++) { ColorVal Y=coderY.read_int(std::get<0>(min), std::get<0>(max)); pp[0]=Y; srcRanges->minmax(1,pp,std::get<1>(min), std::get<1>(max)); ColorVal I=coderI.read_int((std::get<0>(prev) == Y ? std::get<1>(prev): std::get<1>(min)), std::get<1>(max)); pp[1]=I; srcRanges->minmax(2,pp,std::get<2>(min), std::get<2>(max)); ColorVal Q=coderQ.read_int(std::get<2>(min), std::get<2>(max)); Color c(Y,I,Q); Palette_vector.push_back(c); std::get<0>(min) = std::get<0>(c); prev = c; } } else { ColorVal min, max; for (unsigned int p=0; p<size; p++) { srcRanges->minmax(0,pp,min,max); ColorVal Y=coderY.read_int(min,max); pp[0]=Y; srcRanges->minmax(1,pp,min,max); ColorVal I=coderI.read_int(min,max); pp[1]=I; srcRanges->minmax(2,pp,min,max); ColorVal Q=coderQ.read_int(min,max); Color c(Y,I,Q); Palette_vector.push_back(c); // printf("YIQ(%i,%i,%i)\t", std::get<0>(c), std::get<1>(c), std::get<2>(c)); } } // printf("\nLoaded palette of size: %lu\n",Palette_vector.size()); v_printf(5,"[%lu]",Palette_vector.size()); return true; }