Advertisement
Guest User

Untitled

a guest
Jul 13th, 2023
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.54 KB | None | 0 0
  1. #include <sysdefs.h>
  2. #include <dev/framebuffer.h>
  3.  
  4. CURSOR_INFO cInfo;
  5. FRAMEBUFFER* dFb;
  6. PSF1_FONT* dFont;
  7. uint32_t numRowsUsed = 0;
  8.  
  9. void scrollFramebuffer(uint32_t rows) {
  10.      uint32_t totalRows = dFb->height / DEFAULT_FONT_SIZE;
  11.  
  12.     if (rows >= numRowsUsed) {
  13.         rows = numRowsUsed; // Scroll all used rows
  14.     }
  15.  
  16.     uint32_t* dest = (uint32_t*)dFb->baseAddress;
  17.     uint32_t* src = (uint32_t*)dFb->baseAddress + (rows * dFb->width);
  18.     uint32_t pixelSize = (totalRows - rows) * dFb->width;
  19.     uint32_t byteSize = pixelSize * sizeof(uint32_t);
  20.     memmove(dest, src, byteSize);
  21.  
  22.     // Clear the newly visible portion at the bottom
  23.     uint32_t* clearStart = (uint32_t*)dFb->baseAddress + pixelSize;
  24.     uint32_t clearBytes = rows * dFb->width * sizeof(uint32_t);
  25.     memset(clearStart, 0, clearBytes);
  26.  
  27.     numRowsUsed -= rows;
  28. }
  29.  
  30. INTERNAL void FrameBufferPutCharInternal(FRAMEBUFFER* fb, PSF1_FONT* font, char chr, uint xOff, uint yOff, HEXCLR clr) {
  31.       uint* pixPtr = (uint*)fb->baseAddress;
  32.       char* fontPtr = (char*)font->charBuffer + (chr * font->header->size);
  33.  
  34.       for (int64_t y = yOff; y < yOff + DEFAULT_FONT_SIZE;y++ ) {
  35.  
  36.  
  37.          for (int64_t x = xOff; x < xOff + (DEFAULT_FONT_SIZE / 2); x++) {
  38.  
  39.  
  40.              if (x >= 0 && x < fb->width && y >= 0 && y < fb->height) {
  41.  
  42.  
  43.  
  44.                 if ((*fontPtr & (0b10000000 >> (x - xOff))) > 0) {
  45.                        *(uint*)(pixPtr + x + (y * fb->scanLinePixels)) = clr;
  46.                 }
  47.             }
  48.         }
  49.     fontPtr++;
  50.   }
  51.  
  52. }
  53. bool IsFramebufferBinded() {
  54.   if (dFb == NULL || dFont == NULL) {
  55.     //for now return -1. In future return. NK_FB_EBIND when we introduce error handling
  56.     return false;
  57.   }
  58.   return true;
  59. }
  60.  
  61.  
  62.  
  63. CURSOR_INFO GetCursorInfo() {
  64.   return cInfo;
  65.  
  66. }
  67. bool SetDefaultFramebuffer(FRAMEBUFFER* fb) {
  68.   if (fb == NULL) {
  69.     return false;
  70.   }
  71.   dFb = fb;
  72.   return true;
  73. }
  74.  
  75. bool SetDefaulFont(PSF1_FONT* font) {
  76.   if (font == NULL) {
  77.     return false;
  78.   }
  79.   dFont = font;
  80.   return true;
  81. }
  82. HEXCLR RGB2Hex(ushort r, ushort g, ushort b)
  83. {  
  84.     return ((r & 0xff) << 16) + ((g & 0xff) << 8) + (b & 0xff);
  85. }
  86.  
  87. void FrameBufferPutString(const char* str) {
  88.   FrameBufferPutClrString(str, 0xFFFFFF);
  89. }
  90.  
  91.  
  92. void FrameBufferPutClrString(const char* str, HEXCLR iclr) {
  93.   if (!IsFramebufferBinded()) {
  94.     return;
  95.   }
  96.  
  97.  
  98.   char* chr = (char*)str;
  99.   while (*chr != 0) {
  100.    
  101.         FrameBufferPutChar(*chr, iclr);
  102.         cInfo.x += (DEFAULT_FONT_SIZE / 2);
  103.        
  104.    
  105.  
  106.    
  107.     chr++;
  108.   }
  109. }
  110. void FrameBufferPutChar(char c, HEXCLR clr) {
  111.     if (!IsFramebufferBinded()) {
  112.         return;
  113.     }
  114.  
  115.     switch (c) {
  116.          case '\n':
  117.             cInfo.x = 0;
  118.             cInfo.y += DEFAULT_FONT_SIZE;
  119.             numRowsUsed++;
  120.             if (numRowsUsed > dFb->height / DEFAULT_FONT_SIZE) {
  121.             scrollFramebuffer(1);
  122.             numRowsUsed--;
  123.         }
  124.             break;
  125.         case '\t':
  126.             cInfo.x += TABSPACE;
  127.             break;
  128.         case '\b':
  129.             if (cInfo.x > 0) {
  130.                 cInfo.x -= (DEFAULT_FONT_SIZE / 2);
  131.                 FrameBufferPutCharInternal(dFb, dFont, ' ', cInfo.x, cInfo.y, clr);
  132.             } else if (cInfo.y >= DEFAULT_FONT_SIZE) {
  133.                 cInfo.x = (dFb->width - (DEFAULT_FONT_SIZE / 2));
  134.                 cInfo.y -= DEFAULT_FONT_SIZE;
  135.                 FrameBufferPutCharInternal(dFb, dFont, ' ', cInfo.x, cInfo.y, clr);
  136.             }
  137.             break;
  138.         default:
  139.             if (cInfo.x >= dFb->width) {
  140.                 cInfo.x = 0;
  141.                 cInfo.y += DEFAULT_FONT_SIZE;
  142.             }
  143.  
  144.             if (cInfo.y + DEFAULT_FONT_SIZE >= dFb->height) {
  145.                 uint32_t numScrollRows = (cInfo.y + DEFAULT_FONT_SIZE - dFb->height + 1) / DEFAULT_FONT_SIZE;
  146.                 scrollFramebuffer(numScrollRows);
  147.                
  148.                 cInfo.y -= numScrollRows * DEFAULT_FONT_SIZE;
  149.             }
  150.  
  151.             FrameBufferPutCharInternal(dFb, dFont, c, cInfo.x, cInfo.y, clr);
  152.             cInfo.x += (DEFAULT_FONT_SIZE / 2);
  153.             break;
  154.     }
  155. }
  156.  
  157.  
  158. void FrameBufferClearScreen() {
  159.   uint* pixPtr = (uint*)dFb->baseAddress;
  160.                
  161.   for (int64_t x = 0; x < dFb->width; ++x) {
  162.     for (int64_t y = 0; y < dFb->height; ++y) {
  163.      //  FrameBufferPutCharInternal(dFb, dFont, 'g', x, y, FB_CLR_BLACK);
  164.      *(uint*)(pixPtr + x + (y * dFb->scanLinePixels)) = 0;
  165.     }
  166.   }
  167.   cInfo.x = 0;
  168.   cInfo.y = 0;
  169.    
  170.  // *(uint*)(pixPtr + x + (y * fb->scanLinePixels)) = clr;
  171.                
  172. }
  173.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement