1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| //Fonction à la fois plus rapide (vitesse X 1,5) et qui optimise le stockage du bitmap (plus de bits "gaspillés" si la largeur n'est pas multiple de 8)
//Mais ne fonctionne pas pour bitmap "transparent"
void PDQ_ILI9341::drawFastBitmap(coord_t x, coord_t y, uint8_t *bitmap, coord_t w, coord_t h, color_t color, color_t bg, uint8_t angleFM) {
coord_t i, j, tmp;
unsigned int numPix;
bool mirror;
mirror = angleFM > 3;
if (mirror) {
angleFM-=4;
}
mirror^=(angleFM>1);
if (angleFM==1 || angleFM==3) {
tmp = h;
h = w;
w = tmp;
}
spi_begin();
setAddrWindow_(x, y, x + w - 1, _height);
for (j = 0; j < h; j++) {
for (i = 0; i < w; i++) {
if (mirror) {
tmp = w - i - 1;
}else{
tmp = i;
}
switch (angleFM) {
case 0:
numPix = tmp + j * w;
break;
case 1:
numPix = h - j - 1 + tmp * h;
break;
case 2:
numPix = tmp + (h - j - 1) * w;
break;
default:
numPix = j + tmp * h;
break;
}
if (bitmap[numPix >> 3] & (0b10000000 >> (numPix & 0b111))) spiWrite16(color); else spiWrite16(bg); // Dommage on ne peut pas "sauter" un pixel donc impossible de faire un bitmap transparent
}
}
spi_end();
} |