1. Си / Говнокод #23572

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <linux/fb.h>
    #include <stropts.h>
    #include <sys/mman.h>
    #include <unistd.h>
    
    typedef unsigned char     uint8_t;
    typedef unsigned short    uint16_t;
    typedef unsigned int      uint32_t;
    typedef unsigned long int uint64_t;
    
    inline uint32_t pixel_color(uint8_t r, uint8_t g, uint8_t b, struct fb_var_screeninfo *vinfo)
    {
    	return (r<<vinfo->red.offset) | (g<<vinfo->green.offset) | (b<<vinfo->blue.offset);
    }
    
    int main()
    {
    	int fb_fd = open("/dev/fb0", O_RDWR);
    	if(fb_fd == -1) {
    		perror("open");
    		return 1;
    	}
    	struct fb_fix_screeninfo finfo;
    	struct fb_var_screeninfo vinfo;
    	//Get variable screen information
    	if(ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
    		perror("ioctl");
    		return 1;
    	}
    	//Get fixed screen information
    	if(ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) == -1) {
    		perror("ioctl");
    		return 1;
    	}
    
    	vinfo.grayscale=0;
    	vinfo.bits_per_pixel=32;
    	if(ioctl(fb_fd, FBIOPUT_VSCREENINFO, &vinfo) == -1) {
    		perror("ioctl");
    		return 1;
    	}
    	if(ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
    		perror("ioctl");
    		return 1;
    	}
    	if(vinfo.grayscale != 0) {
    		printf("Error set grayscale!\n");
    		return 1;
    	}
    	if(vinfo.bits_per_pixel != 32) {
    		printf("Error set bits_per_pixel!\n");
    		return 1;
    	}
    	long screensize = vinfo.yres_virtual * finfo.line_length;
    	uint8_t *fbp = mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, (off_t)0);
    	if(fbp == MAP_FAILED) {
    		perror("mmap");
    		return 1;
    	}
    	uint32_t pixel = pixel_color(46, 255, 46, &vinfo);
    	//Убедитесь, что вы правильно установили x, y и пиксель
    
    	long line = 0;
    	while(1)
    	{
    		if(line > vinfo.xres) break;
    		long location;
    		for (long x = 0; x < line; x++)
    			for (long y=0; y<vinfo.yres; y++)
    			{
    				location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + (y+vinfo.yoffset) * finfo.line_length;
    				*((uint32_t*)(fbp + location)) = pixel;
    			}
    		line++;
    		usleep(100000);
    	}
    
    	return 0;
    }

    угадайте до запуска по какой оси прога будет рисовать и понос пролетит мимо вас!

    Запостил: fuckercoder, 09 Декабря 2017

    Комментарии (3) RSS

    Добавить комментарий