Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(320)

Side by Side Diff: lib/gfx/gfx.c

Issue 1777783003: [display] Refactor to avoid implicit framebuffer allocation. (Closed) Base URL: https://github.com/littlekernel/lk.git@master
Patch Set: update other targets Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2008-2010, 2015 Travis Geiselbrecht 2 * Copyright (c) 2008-2010, 2015 Travis Geiselbrecht
3 * 3 *
4 * Permission is hereby granted, free of charge, to any person obtaining 4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files 5 * a copy of this software and associated documentation files
6 * (the "Software"), to deal in the Software without restriction, 6 * (the "Software"), to deal in the Software without restriction,
7 * including without limitation the rights to use, copy, modify, merge, 7 * including without limitation the rights to use, copy, modify, merge,
8 * publish, distribute, sublicense, and/or sell copies of the Software, 8 * publish, distribute, sublicense, and/or sell copies of the Software,
9 * and to permit persons to whom the Software is furnished to do so, 9 * and to permit persons to whom the Software is furnished to do so,
10 * subject to the following conditions: 10 * subject to the following conditions:
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 surface->free_on_destroy = true; 650 surface->free_on_destroy = true;
651 } 651 }
652 surface->ptr = ptr; 652 surface->ptr = ptr;
653 653
654 return surface; 654 return surface;
655 } 655 }
656 656
657 /** 657 /**
658 * @brief Create a new graphics surface object from a display 658 * @brief Create a new graphics surface object from a display
659 */ 659 */
660 gfx_surface *gfx_create_surface_from_display(struct display_info *info) 660 gfx_surface *gfx_create_surface_from_display(struct display_framebuffer *fb)
gkalsi 2016/03/09 21:13:37 DEBUG_ASSERT(fb);
cdotstout 2016/03/09 22:48:00 Done.
661 { 661 {
662 gfx_surface *surface; 662 gfx_surface *surface;
663 gfx_format format; 663 gfx_format format;
664 switch (info->format) { 664 switch (fb->image.format) {
665 case DISPLAY_FORMAT_RGB_565: 665 case IMAGE_FORMAT_RGB_565:
666 format = GFX_FORMAT_RGB_565; 666 format = GFX_FORMAT_RGB_565;
667 break; 667 break;
668 case DISPLAY_FORMAT_RGB_332: 668 case IMAGE_FORMAT_RGB_332:
669 format = GFX_FORMAT_RGB_332; 669 format = GFX_FORMAT_RGB_332;
670 break; 670 break;
671 case DISPLAY_FORMAT_RGB_2220: 671 case IMAGE_FORMAT_RGB_2220:
672 format = GFX_FORMAT_RGB_2220; 672 format = GFX_FORMAT_RGB_2220;
673 break; 673 break;
674 case DISPLAY_FORMAT_ARGB_8888: 674 case IMAGE_FORMAT_ARGB_8888:
675 format = GFX_FORMAT_ARGB_8888; 675 format = GFX_FORMAT_ARGB_8888;
676 break; 676 break;
677 case DISPLAY_FORMAT_RGB_x888: 677 case IMAGE_FORMAT_RGB_x888:
678 format = GFX_FORMAT_RGB_x888; 678 format = GFX_FORMAT_RGB_x888;
679 break; 679 break;
680 case DISPLAY_FORMAT_MONO_8: 680 case IMAGE_FORMAT_MONO_8:
681 format = GFX_FORMAT_MONO; 681 format = GFX_FORMAT_MONO;
682 break; 682 break;
683 default: 683 default:
684 dprintf(INFO, "invalid graphics format)"); 684 dprintf(INFO, "invalid graphics format)");
685 DEBUG_ASSERT(0); 685 DEBUG_ASSERT(0);
686 return NULL; 686 return NULL;
687 } 687 }
688 688
689 surface = gfx_create_surface(info->framebuffer, info->width, info->height, i nfo->stride, format); 689 surface = gfx_create_surface(fb->image.pixels, fb->image.width, fb->image.he ight, fb->image.rowbytes, format);
690 690
691 surface->flush = info->flush; 691 surface->flush = fb->flush;
692 692
693 return surface; 693 return surface;
694 } 694 }
695 695
696 /** 696 /**
697 * @brief Destroy a graphics surface and free all resources allocated to it. 697 * @brief Destroy a graphics surface and free all resources allocated to it.
698 * 698 *
699 * @param surface Surface to destroy. This pointer is no longer valid after 699 * @param surface Surface to destroy. This pointer is no longer valid after
700 * this call. 700 * this call.
701 */ 701 */
702 void gfx_surface_destroy(struct gfx_surface *surface) 702 void gfx_surface_destroy(struct gfx_surface *surface)
703 { 703 {
704 if (surface->free_on_destroy) 704 if (surface->free_on_destroy)
705 free(surface->ptr); 705 free(surface->ptr);
706 free(surface); 706 free(surface);
707 } 707 }
708 708
709 /** 709 /**
710 * @brief Write a test pattern to the default display. 710 * @brief Write a test pattern to the default display.
711 */ 711 */
712 void gfx_draw_pattern(void) 712 void gfx_draw_pattern(void)
713 { 713 {
714 struct display_info info; 714 struct display_framebuffer fb;
715 if (display_get_info(&info) < 0) 715 if (display_get_framebuffer(&fb) < 0)
716 return; 716 return;
717 717
718 gfx_surface *surface = gfx_create_surface_from_display(&info); 718 gfx_surface *surface = gfx_create_surface_from_display(&fb);
719 719
720 uint x, y; 720 uint x, y;
721 for (y = 0; y < surface->height; y++) { 721 for (y = 0; y < surface->height; y++) {
722 for (x = 0; x < surface->width; x++) { 722 for (x = 0; x < surface->width; x++) {
723 uint scaledx; 723 uint scaledx;
724 uint scaledy; 724 uint scaledy;
725 725
726 scaledx = x * 256 / surface->width; 726 scaledx = x * 256 / surface->width;
727 scaledy = y * 256 / surface->height; 727 scaledy = y * 256 / surface->height;
728 728
729 gfx_putpixel(surface, x, y, (0xff << 24) | (scaledx * scaledy) << 16 | (scaledx >> 1) << 8 | scaledy >> 1); 729 gfx_putpixel(surface, x, y, (0xff << 24) | (scaledx * scaledy) << 16 | (scaledx >> 1) << 8 | scaledy >> 1);
730 } 730 }
731 } 731 }
732 732
733 gfx_flush(surface); 733 gfx_flush(surface);
734 734
735 gfx_surface_destroy(surface); 735 gfx_surface_destroy(surface);
736 } 736 }
737 737
738 /** 738 /**
739 * @brief Fill default display with white 739 * @brief Fill default display with white
740 */ 740 */
741 void gfx_draw_pattern_white(void) 741 void gfx_draw_pattern_white(void)
742 { 742 {
743 struct display_info info; 743 struct display_framebuffer fb;
744 if (display_get_info(&info) < 0) 744 if (display_get_framebuffer(&fb) < 0)
745 return; 745 return;
746 746
747 gfx_surface *surface = gfx_create_surface_from_display(&info); 747 gfx_surface *surface = gfx_create_surface_from_display(&fb);
748 748
749 uint x, y; 749 uint x, y;
750 for (y = 0; y < surface->height; y++) { 750 for (y = 0; y < surface->height; y++) {
751 for (x = 0; x < surface->width; x++) { 751 for (x = 0; x < surface->width; x++) {
752 gfx_putpixel(surface, x, y, 0xFFFFFFFF); 752 gfx_putpixel(surface, x, y, 0xFFFFFFFF);
753 } 753 }
754 } 754 }
755 755
756 gfx_flush(surface); 756 gfx_flush(surface);
757 757
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 if (argc < 2) { 802 if (argc < 2) {
803 printf("not enough arguments:\n"); 803 printf("not enough arguments:\n");
804 printf("%s display_info : output information bout the current display\n" , argv[0].str); 804 printf("%s display_info : output information bout the current display\n" , argv[0].str);
805 printf("%s rgb_bars : Fill frame buffer with rgb bars\n", argv[0].str) ; 805 printf("%s rgb_bars : Fill frame buffer with rgb bars\n", argv[0].str) ;
806 printf("%s test_pattern : Fill frame with test pattern\n", argv[0].str); 806 printf("%s test_pattern : Fill frame with test pattern\n", argv[0].str);
807 printf("%s fill r g b : Fill frame buffer with RGB888 value and force update\n", argv[0].str); 807 printf("%s fill r g b : Fill frame buffer with RGB888 value and force update\n", argv[0].str);
808 808
809 return -1; 809 return -1;
810 } 810 }
811 811
812 struct display_info info; 812 struct display_framebuffer fb;
813 if (display_get_info(&info) < 0) { 813 if (display_get_framebuffer(&fb) < 0) {
814 printf("no display to draw on!\n"); 814 printf("no display to draw on!\n");
815 return -1; 815 return -1;
816 } 816 }
817 817
818 gfx_surface *surface = gfx_create_surface_from_display(&info); 818 gfx_surface *surface = gfx_create_surface_from_display(&fb);
819 819
820 if (!strcmp(argv[1].str, "display_info")) { 820 if (!strcmp(argv[1].str, "display_info")) {
821 printf("display:\n"); 821 printf("display:\n");
822 printf("\tframebuffer %p\n", info.framebuffer); 822 printf("\tframebuffer %p\n", fb.image.pixels);
823 printf("\twidth %u height %u stride %u\n", info.width, info.height, info .stride); 823 printf("\twidth %u height %u stride %u\n", fb.image.width, fb.image.heig ht, fb.image.rowbytes);
824 printf("\tformat %u\n", info.format); 824 printf("\tformat %u\n", fb.image.format);
825 } else if (!strcmp(argv[1].str, "rgb_bars")) { 825 } else if (!strcmp(argv[1].str, "rgb_bars")) {
826 gfx_draw_rgb_bars(surface); 826 gfx_draw_rgb_bars(surface);
827 } else if (!strcmp(argv[1].str, "test_pattern")) { 827 } else if (!strcmp(argv[1].str, "test_pattern")) {
828 gfx_draw_pattern(); 828 gfx_draw_pattern();
829 } else if (!strcmp(argv[1].str, "fill")) { 829 } else if (!strcmp(argv[1].str, "fill")) {
830 uint x, y; 830 uint x, y;
831 831
832 for (y = 0; y < surface->height; y++) { 832 for (y = 0; y < surface->height; y++) {
833 for (x = 0; x < surface->width; x++) { 833 for (x = 0; x < surface->width; x++) {
834 /* write pixel to frame buffer */ 834 /* write pixel to frame buffer */
835 gfx_putpixel(surface, x, y, (0xff << 24) | (argv[2].i << 16) | ( argv[3].i << 8) | argv[4].i); 835 gfx_putpixel(surface, x, y, (0xff << 24) | (argv[2].i << 16) | ( argv[3].i << 8) | argv[4].i);
836 } 836 }
837 } 837 }
838 } 838 }
839 839
840 gfx_flush(surface); 840 gfx_flush(surface);
841 841
842 gfx_surface_destroy(surface); 842 gfx_surface_destroy(surface);
843 843
844 return 0; 844 return 0;
845 } 845 }
846 846
847 #endif 847 #endif
848 #endif 848 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698