← index #2572PR #3252
Related · medium · value 1.078
QUERY · ISSUE

extmod/modframebuf.c framebuf1_text() does not clear pixels

openby peterhinchopened 2016-10-29updated 2016-11-11

This section of the code looks wrong:

                    if (vline_data & 1) { // only draw if pixel set
                        if (0 <= y && y < self->height) { // clip y
                            uint byte_pos = x0 + self->stride * ((uint)y >> 3);
                            if (col == 0) {
                                // clear pixel
                                self->buf[byte_pos] &= ~(1 << (y & 7));
                            } else {
                                // set pixel
                                self->buf[byte_pos] |= 1 << (y & 7);
                            }
                        }

If the pixel is not set, it should surely clear down the pixel in the framebuf as we don't know its prior contents. Further, if we happen to be drawing with col==0 to a part of the framebuf which is already zero, then nothing will be drawn, because in that circumstance the code never sets a pixel.

I hope I'm right on this observation from reviewing the code: I haven't had the opportunity to try it since my SSD1306 was DOA.

CANDIDATE · PULL REQUEST

extmod/framebuf: Replace *sb_*pixel functions with a single generic one

closedby deshipuopened 2017-08-03updated 2019-03-02

Use a single pixel function with parameters for different number of bits
per pixel, bit order and pixel organization. Allows adding more modes
without writing much extra code.

Note: we specify both bpp (bits per pixel) and log_ppb (log2 of pixels
per byte), because calculating one from the other would be expensive.

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied