@@ -204,7 +204,10 @@ void Graphics::copyStretchSpriteToScreen(
204204 int scr_w,
205205 int scr_h,
206206 bool flip_x,
207- bool flip_y)
207+ bool flip_y,
208+ // skipStretchPx is currently only used for drawing stripey mode text,
209+ // so it is only used when drawing in non-flipped mode
210+ bool skipStretchPx)
208211{
209212 if (scr_w == 0 || scr_h == 0 )
210213 return ;
@@ -287,18 +290,31 @@ void Graphics::copyStretchSpriteToScreen(
287290 dy = -dy;
288291 }
289292
293+ int prevSprX = -1 ;
294+ int prevSprY = -1 ;
295+
290296 // ugly duplication but see if inlining helps
291297 if (hwState.colorBitmask == 0xff ){
292298 for (int y = 0 ; y < scr_h; y++) {
293- uint8_t * spr = spritebuffer + (((spr_y + y * dy) >> 16 ) & 0x7f ) * 64 ;
299+ int sprY = ((spr_y + y * dy) >> 16 );
300+ uint8_t * spr = spritebuffer + (sprY & 0x7f ) * 64 ;
301+
302+ if (skipStretchPx && prevSprY == sprY){
303+ continue ;
304+ }
305+ prevSprY = sprY;
294306
295307 if (!flip_x) {
296308 for (int x = 0 ; x < scr_w; x++) {
297- int pixIndex = (spr_x + x * dx);
298- int combinedPixIdx = ((pixIndex / 2 ) >> 16 ) & 0x7f ;
299- uint8_t bothPix = spr[combinedPixIdx];
309+ int shiftedPixIndex = (spr_x + x * dx) >> 16 ;
310+ if (skipStretchPx && prevSprX == shiftedPixIndex){
311+ continue ;
312+ }
313+ prevSprX = shiftedPixIndex;
314+ int preShiftedCombinedPixIndex = (shiftedPixIndex / 2 ) & 0x7f ;
315+ uint8_t bothPix = spr[preShiftedCombinedPixIndex];
300316
301- uint8_t c = (pixIndex >> 16 ) % 2 == 0
317+ uint8_t c = shiftedPixIndex % 2 == 0
302318 ? bothPix & 0x0f // just first 4 bits
303319 : bothPix >> 4 ; // just last 4 bits
304320
@@ -1247,61 +1263,49 @@ fix32 Graphics::fillp(fix32 pat) {
12471263 return z8::fix32::frombits (prev);
12481264}
12491265
1250- int Graphics::print (std::string str) {
1251- int result = this ->print (str, _memory->drawState .text_x , _memory->drawState .text_y );
1252-
1253- return result;
1254- }
1255-
1256- int Graphics::print (std::string str, int x, int y) {
1257- return this ->print (str, x, y, _memory->drawState .color );
1258- }
12591266
1260- // based on tac08 impl
1261- int Graphics::print (std::string str, int x, int y, uint8_t c) {
1262- color (c);
1267+ int Graphics::drawCharacter (uint8_t ch, int x, int y, uint8_t printMode) {
1268+ int extraCharWidth = 0 ;
1269+ if ((printMode & PRINT_MODE_ON ) == PRINT_MODE_ON ){
1270+ int scrW = 4 ;
1271+ int scrH = 5 ;
1272+ bool evenPxOnly = false ;
12631273
1264- _memory->drawState .text_x = x;
1265- _memory->drawState .text_y = y;
1274+ if ((printMode & PRINT_MODE_WIDE ) == PRINT_MODE_WIDE ) {
1275+ scrW *= 2 ;
1276+ }
1277+ if ((printMode & PRINT_MODE_TALL ) == PRINT_MODE_TALL ) {
1278+ scrH *= 2 ;
1279+ }
1280+ if ((printMode & PRINT_MODE_STRIPEY ) == PRINT_MODE_STRIPEY ) {
1281+ // draw every other pixel-- also kinda broken on pico 8 0.2.4
1282+ evenPxOnly = true ;
1283+ }
1284+ // TODO: other print modes
12661285
1267- uint8_t effectiveC = getDrawPalMappedColor (c);
1286+ if (ch >= 0x10 && ch < 0x80 ) {
1287+ int index = ch - 0x10 ;
1288+ copyStretchSpriteToScreen (fontSpriteData, (index % 16 ) * 8 , (index / 16 ) * 8 , 4 , 5 , x, y, scrW, scrH, false , false , evenPxOnly);
1289+ } else if (ch >= 0x80 ) {
1290+ int index = ch - 0x80 ;
1291+ extraCharWidth = 4 ;
1292+ copyStretchSpriteToScreen (fontSpriteData, (index % 16 ) * 8 , (index / 16 ) * 8 + 56 , 8 , 5 , x, y, (scrW + extraCharWidth), scrH, false , false , evenPxOnly);
1293+
1294+ }
12681295
1269- // font sprite sheet has text as color 7, with 0 as transparent. We need to override
1270- // these values and restore them after
1271- uint8_t prevDrawPal[16 ];
1272- for (uint8_t i = 0 ; i < 16 ; i++) {
1273- prevDrawPal[i] = _memory->drawState .drawPaletteMap [i];
1274- _memory->drawState .drawPaletteMap [i] = i;
12751296 }
1276-
1277- _memory->drawState .drawPaletteMap [7 ] = effectiveC;
1278- _memory->drawState .drawPaletteMap [0 ] = 16 ; // transparent
1279-
1280-
1281- for (size_t n = 0 ; n < str.length (); n++) {
1282- uint8_t ch = str[n];
1297+ else {
12831298 if (ch >= 0x10 && ch < 0x80 ) {
12841299 int index = ch - 0x10 ;
12851300 copySpriteToScreen (fontSpriteData, x, y, (index % 16 ) * 8 , (index / 16 ) * 8 , 4 , 5 , false , false );
1286- x += 4 ;
12871301 } else if (ch >= 0x80 ) {
12881302 int index = ch - 0x80 ;
12891303 copySpriteToScreen (fontSpriteData, x, y, (index % 16 ) * 8 , (index / 16 ) * 8 + 56 , 8 , 5 , false , false );
1290- x += 8 ;
1291- } else if (ch == ' \n ' ) {
1292- x = _memory->drawState .text_x ;
1293- y += 6 ;
1304+ extraCharWidth = 4 ;
12941305 }
12951306 }
12961307
1297- for (int i = 0 ; i < 16 ; i++) {
1298- _memory->drawState .drawPaletteMap [i] = prevDrawPal[i];
1299- }
1300-
1301- // todo: auto scrolling
1302- _memory->drawState .text_y += 6 ;
1303-
1304- return x;
1308+ return extraCharWidth;
13051309}
13061310
13071311void Graphics::spr (
@@ -1332,7 +1336,7 @@ void Graphics::sspr(
13321336 bool flip_x = false ,
13331337 bool flip_y = false )
13341338{
1335- copyStretchSpriteToScreen (GetP8SpriteSheetBuffer (), sx, sy, sw, sh, dx, dy, dw, dh, flip_x, flip_y);
1339+ copyStretchSpriteToScreen (GetP8SpriteSheetBuffer (), sx, sy, sw, sh, dx, dy, dw, dh, flip_x, flip_y, false );
13361340}
13371341
13381342bool Graphics::fget (uint8_t n, uint8_t f){
0 commit comments