OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file defines utility functions for X11 (Linux only). This code has been | 5 // This file defines utility functions for X11 (Linux only). This code has been |
6 // ported from XCB since we can't use XCB on Ubuntu while its 32-bit support | 6 // ported from XCB since we can't use XCB on Ubuntu while its 32-bit support |
7 // remains woefully incomplete. | 7 // remains woefully incomplete. |
8 | 8 |
9 #include "ui/base/x/x11_util.h" | 9 #include "ui/base/x/x11_util.h" |
10 | 10 |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 NOTREACHED(); | 577 NOTREACHED(); |
578 } | 578 } |
579 | 579 |
580 XID CreatePictureFromSkiaPixmap(Display* display, XID pixmap) { | 580 XID CreatePictureFromSkiaPixmap(Display* display, XID pixmap) { |
581 XID picture = XRenderCreatePicture( | 581 XID picture = XRenderCreatePicture( |
582 display, pixmap, GetRenderARGB32Format(display), 0, NULL); | 582 display, pixmap, GetRenderARGB32Format(display), 0, NULL); |
583 | 583 |
584 return picture; | 584 return picture; |
585 } | 585 } |
586 | 586 |
587 void PutARGBImage(Display* display, void* visual, int depth, XID pixmap, | 587 void PutARGBImage(Display* display, |
588 void* pixmap_gc, const uint8* data, int width, int height) { | 588 void* visual, int depth, |
| 589 XID pixmap, void* pixmap_gc, |
| 590 const uint8* data, |
| 591 int width, int height) { |
| 592 PutARGBImage(display, |
| 593 visual, depth, |
| 594 pixmap, pixmap_gc, |
| 595 data, width, height, |
| 596 0, 0, // src_x, src_y |
| 597 0, 0, // dst_x, dst_y |
| 598 width, height); |
| 599 } |
| 600 |
| 601 void PutARGBImage(Display* display, |
| 602 void* visual, int depth, |
| 603 XID pixmap, void* pixmap_gc, |
| 604 const uint8* data, |
| 605 int data_width, int data_height, |
| 606 int src_x, int src_y, |
| 607 int dst_x, int dst_y, |
| 608 int copy_width, int copy_height) { |
589 // TODO(scherkus): potential performance impact... consider passing in as a | 609 // TODO(scherkus): potential performance impact... consider passing in as a |
590 // parameter. | 610 // parameter. |
591 int pixmap_bpp = BitsPerPixelForPixmapDepth(display, depth); | 611 int pixmap_bpp = BitsPerPixelForPixmapDepth(display, depth); |
592 | 612 |
593 XImage image; | 613 XImage image; |
594 memset(&image, 0, sizeof(image)); | 614 memset(&image, 0, sizeof(image)); |
595 | 615 |
596 image.width = width; | 616 image.width = data_width; |
597 image.height = height; | 617 image.height = data_height; |
598 image.format = ZPixmap; | 618 image.format = ZPixmap; |
599 image.byte_order = LSBFirst; | 619 image.byte_order = LSBFirst; |
600 image.bitmap_unit = 8; | 620 image.bitmap_unit = 8; |
601 image.bitmap_bit_order = LSBFirst; | 621 image.bitmap_bit_order = LSBFirst; |
602 image.depth = depth; | 622 image.depth = depth; |
603 image.bits_per_pixel = pixmap_bpp; | 623 image.bits_per_pixel = pixmap_bpp; |
604 image.bytes_per_line = width * pixmap_bpp / 8; | 624 image.bytes_per_line = data_width * pixmap_bpp / 8; |
605 | 625 |
606 if (pixmap_bpp == 32) { | 626 if (pixmap_bpp == 32) { |
607 image.red_mask = 0xff0000; | 627 image.red_mask = 0xff0000; |
608 image.green_mask = 0xff00; | 628 image.green_mask = 0xff00; |
609 image.blue_mask = 0xff; | 629 image.blue_mask = 0xff; |
610 | 630 |
611 // If the X server depth is already 32-bits and the color masks match, | 631 // If the X server depth is already 32-bits and the color masks match, |
612 // then our job is easy. | 632 // then our job is easy. |
613 Visual* vis = static_cast<Visual*>(visual); | 633 Visual* vis = static_cast<Visual*>(visual); |
614 if (image.red_mask == vis->red_mask && | 634 if (image.red_mask == vis->red_mask && |
615 image.green_mask == vis->green_mask && | 635 image.green_mask == vis->green_mask && |
616 image.blue_mask == vis->blue_mask) { | 636 image.blue_mask == vis->blue_mask) { |
617 image.data = const_cast<char*>(reinterpret_cast<const char*>(data)); | 637 image.data = const_cast<char*>(reinterpret_cast<const char*>(data)); |
618 XPutImage(display, pixmap, static_cast<GC>(pixmap_gc), &image, | 638 XPutImage(display, pixmap, static_cast<GC>(pixmap_gc), &image, |
619 0, 0 /* source x, y */, 0, 0 /* dest x, y */, | 639 src_x, src_y, dst_x, dst_y, |
620 width, height); | 640 copy_width, copy_height); |
621 } else { | 641 } else { |
622 // Otherwise, we need to shuffle the colors around. Assume red and blue | 642 // Otherwise, we need to shuffle the colors around. Assume red and blue |
623 // need to be swapped. | 643 // need to be swapped. |
624 // | 644 // |
625 // It's possible to use some fancy SSE tricks here, but since this is the | 645 // It's possible to use some fancy SSE tricks here, but since this is the |
626 // slow path anyway, we do it slowly. | 646 // slow path anyway, we do it slowly. |
627 | 647 |
628 uint8_t* bitmap32 = static_cast<uint8_t*>(malloc(4 * width * height)); | 648 uint8_t* bitmap32 = |
| 649 static_cast<uint8_t*>(malloc(4 * data_width * data_height)); |
629 if (!bitmap32) | 650 if (!bitmap32) |
630 return; | 651 return; |
631 uint8_t* const orig_bitmap32 = bitmap32; | 652 uint8_t* const orig_bitmap32 = bitmap32; |
632 const uint32_t* bitmap_in = reinterpret_cast<const uint32_t*>(data); | 653 const uint32_t* bitmap_in = reinterpret_cast<const uint32_t*>(data); |
633 for (int y = 0; y < height; ++y) { | 654 for (int y = 0; y < data_height; ++y) { |
634 for (int x = 0; x < width; ++x) { | 655 for (int x = 0; x < data_width; ++x) { |
635 const uint32_t pixel = *(bitmap_in++); | 656 const uint32_t pixel = *(bitmap_in++); |
636 bitmap32[0] = (pixel >> 16) & 0xff; // Red | 657 bitmap32[0] = (pixel >> 16) & 0xff; // Red |
637 bitmap32[1] = (pixel >> 8) & 0xff; // Green | 658 bitmap32[1] = (pixel >> 8) & 0xff; // Green |
638 bitmap32[2] = pixel & 0xff; // Blue | 659 bitmap32[2] = pixel & 0xff; // Blue |
639 bitmap32[3] = (pixel >> 24) & 0xff; // Alpha | 660 bitmap32[3] = (pixel >> 24) & 0xff; // Alpha |
640 bitmap32 += 4; | 661 bitmap32 += 4; |
641 } | 662 } |
642 } | 663 } |
643 image.data = reinterpret_cast<char*>(orig_bitmap32); | 664 image.data = reinterpret_cast<char*>(orig_bitmap32); |
644 XPutImage(display, pixmap, static_cast<GC>(pixmap_gc), &image, | 665 XPutImage(display, pixmap, static_cast<GC>(pixmap_gc), &image, |
645 0, 0 /* source x, y */, 0, 0 /* dest x, y */, | 666 src_x, src_y, dst_x, dst_y, |
646 width, height); | 667 copy_width, copy_height); |
647 free(orig_bitmap32); | 668 free(orig_bitmap32); |
648 } | 669 } |
649 } else if (pixmap_bpp == 16) { | 670 } else if (pixmap_bpp == 16) { |
650 // Some folks have VNC setups which still use 16-bit visuals and VNC | 671 // Some folks have VNC setups which still use 16-bit visuals and VNC |
651 // doesn't include Xrender. | 672 // doesn't include Xrender. |
652 | 673 |
653 uint16_t* bitmap16 = static_cast<uint16_t*>(malloc(2 * width * height)); | 674 uint16_t* bitmap16 = |
| 675 static_cast<uint16_t*>(malloc(2 * data_width * data_height)); |
654 if (!bitmap16) | 676 if (!bitmap16) |
655 return; | 677 return; |
656 uint16_t* const orig_bitmap16 = bitmap16; | 678 uint16_t* const orig_bitmap16 = bitmap16; |
657 const uint32_t* bitmap_in = reinterpret_cast<const uint32_t*>(data); | 679 const uint32_t* bitmap_in = reinterpret_cast<const uint32_t*>(data); |
658 for (int y = 0; y < height; ++y) { | 680 for (int y = 0; y < data_height; ++y) { |
659 for (int x = 0; x < width; ++x) { | 681 for (int x = 0; x < data_width; ++x) { |
660 const uint32_t pixel = *(bitmap_in++); | 682 const uint32_t pixel = *(bitmap_in++); |
661 uint16_t out_pixel = ((pixel >> 8) & 0xf800) | | 683 uint16_t out_pixel = ((pixel >> 8) & 0xf800) | |
662 ((pixel >> 5) & 0x07e0) | | 684 ((pixel >> 5) & 0x07e0) | |
663 ((pixel >> 3) & 0x001f); | 685 ((pixel >> 3) & 0x001f); |
664 *(bitmap16++) = out_pixel; | 686 *(bitmap16++) = out_pixel; |
665 } | 687 } |
666 } | 688 } |
667 | 689 |
668 image.data = reinterpret_cast<char*>(orig_bitmap16); | 690 image.data = reinterpret_cast<char*>(orig_bitmap16); |
669 image.red_mask = 0xf800; | 691 image.red_mask = 0xf800; |
670 image.green_mask = 0x07e0; | 692 image.green_mask = 0x07e0; |
671 image.blue_mask = 0x001f; | 693 image.blue_mask = 0x001f; |
672 | 694 |
673 XPutImage(display, pixmap, static_cast<GC>(pixmap_gc), &image, | 695 XPutImage(display, pixmap, static_cast<GC>(pixmap_gc), &image, |
674 0, 0 /* source x, y */, 0, 0 /* dest x, y */, | 696 src_x, src_y, dst_x, dst_y, |
675 width, height); | 697 copy_width, copy_height); |
676 free(orig_bitmap16); | 698 free(orig_bitmap16); |
677 } else { | 699 } else { |
678 LOG(FATAL) << "Sorry, we don't support your visual depth without " | 700 LOG(FATAL) << "Sorry, we don't support your visual depth without " |
679 "Xrender support (depth:" << depth | 701 "Xrender support (depth:" << depth |
680 << " bpp:" << pixmap_bpp << ")"; | 702 << " bpp:" << pixmap_bpp << ")"; |
681 } | 703 } |
682 } | 704 } |
683 | 705 |
684 void FreePicture(Display* display, XID picture) { | 706 void FreePicture(Display* display, XID picture) { |
685 XRenderFreePicture(display, picture); | 707 XRenderFreePicture(display, picture); |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
934 << "request_code " << static_cast<int>(error_event.request_code) << ", " | 956 << "request_code " << static_cast<int>(error_event.request_code) << ", " |
935 << "minor_code " << static_cast<int>(error_event.minor_code) | 957 << "minor_code " << static_cast<int>(error_event.minor_code) |
936 << " (" << request_str << ")"; | 958 << " (" << request_str << ")"; |
937 } | 959 } |
938 | 960 |
939 // ---------------------------------------------------------------------------- | 961 // ---------------------------------------------------------------------------- |
940 // End of x11_util_internal.h | 962 // End of x11_util_internal.h |
941 | 963 |
942 | 964 |
943 } // namespace ui | 965 } // namespace ui |
OLD | NEW |