function do_qss_image()
{
    var sp = {};
    var total_qubits = 2 * res_aa_bits + num_counter_bits
                       + accum_bits;

    // Ustaw rejestry kwantowe
    qc.reset(total_qubits);
    sp.qx = qint.new(res_aa_bits, 'qx');
    sp.qy = qint.new(res_aa_bits, 'qy');
    sp.counter = qint.new(num_counter_bits, 'counter');
    sp.qacc = qint.new(accum_bits, 'scratch');
    sp.qacc.write(0);

    // Dla każdego kafla w obrazie, uruchom funkcję qss_tile()
    for (var sp.ty = 0; sp.ty < res_tiles; ++sp.ty) {
    for (var sp.tx = 0; sp.tx < res_tiles; ++sp.tx)
        qss_tile(sp);
    }
}
function qss_tile(sp)
{

    // Przygotuj płótno
    sp.qx.write(0);
    sp.qy.write(0);
    sp.counter.write(0);
    sp.qx.hadamard();
    sp.qy.hadamard();
    sp.counter.hadamard();

    // Wielokrotnie uruchom shader pikseli
    for (var cbit = 0; cbit < num_counter_bits; ++cbit) {
    var iters = 1 << cbit;
    var qxy_bits = sp.qx.bits().or(sp.qy.bits());
    var condition = sp.counter.bits(iters);
    var mask_with_condition = qxy_bits.or(condition);
    for (var i = 0; i < iters; ++i) {
        shader_quantum(sp.qx, sp.qy, sp.tx, sp.ty, sp.qacc,
                      condition, sp.qcolor);
        grover_iteration(qxy_bits, mask_with_condition);
     }
    }
    invQFT(sp.counter);

    // Odczytaj i zinterpretuj wyniki
    sp.readVal = sp.counter.read();
    sp.hits = qss_count_to_hits[sp.readVal];
    sp.color = sp.hits / (res_aa * res_aa);
    return sp.color;
}
