MCPcopy Create free account
hub / github.com/alecazam/kram / encode_ise

Function encode_ise

libkram/astc-encoder/astcenc_integer_sequence.cpp:499–655  ·  view source on GitHub ↗

See header for documentation. */

Source from the content-addressed store, hash-verified

497
498/* See header for documentation. */
499void encode_ise(
500 quant_method quant_level,
501 unsigned int character_count,
502 const uint8_t* input_data,
503 uint8_t* output_data,
504 unsigned int bit_offset
505) {
506 promise(character_count > 0);
507
508 unsigned int bits = btq_counts[quant_level].bits;
509 unsigned int trits = btq_counts[quant_level].trits;
510 unsigned int quints = btq_counts[quant_level].quints;
511 unsigned int mask = (1 << bits) - 1;
512
513 // Write out trits and bits
514 if (trits)
515 {
516 unsigned int i = 0;
517 unsigned int full_trit_blocks = character_count / 5;
518
519 for (unsigned int j = 0; j < full_trit_blocks; j++)
520 {
521 unsigned int i4 = input_data[i + 4] >> bits;
522 unsigned int i3 = input_data[i + 3] >> bits;
523 unsigned int i2 = input_data[i + 2] >> bits;
524 unsigned int i1 = input_data[i + 1] >> bits;
525 unsigned int i0 = input_data[i + 0] >> bits;
526
527 uint8_t T = integer_of_trits[i4][i3][i2][i1][i0];
528
529 // The max size of a trit bit count is 6, so we can always safely
530 // pack a single MX value with the following 1 or 2 T bits.
531 uint8_t pack;
532
533 // Element 0 + T0 + T1
534 pack = (input_data[i++] & mask) | (((T >> 0) & 0x3) << bits);
535 write_bits(pack, bits + 2, bit_offset, output_data);
536 bit_offset += bits + 2;
537
538 // Element 1 + T2 + T3
539 pack = (input_data[i++] & mask) | (((T >> 2) & 0x3) << bits);
540 write_bits(pack, bits + 2, bit_offset, output_data);
541 bit_offset += bits + 2;
542
543 // Element 2 + T4
544 pack = (input_data[i++] & mask) | (((T >> 4) & 0x1) << bits);
545 write_bits(pack, bits + 1, bit_offset, output_data);
546 bit_offset += bits + 1;
547
548 // Element 3 + T5 + T6
549 pack = (input_data[i++] & mask) | (((T >> 5) & 0x3) << bits);
550 write_bits(pack, bits + 2, bit_offset, output_data);
551 bit_offset += bits + 2;
552
553 // Element 4 + T7
554 pack = (input_data[i++] & mask) | (((T >> 7) & 0x1) << bits);
555 write_bits(pack, bits + 1, bit_offset, output_data);
556 bit_offset += bits + 1;

Callers 1

symbolic_to_physicalFunction · 0.85

Calls 1

write_bitsFunction · 0.70

Tested by

no test coverage detected