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

Side by Side Diff: content/browser/renderer_host/backing_store_gtk.cc

Issue 11031055: Introduce PlatformBitmap, which is a minimal helper class that wraps an SkBitmap (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 2 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "content/browser/renderer_host/backing_store_gtk.h" 5 #include "content/browser/renderer_host/backing_store_gtk.h"
6 6
7 #include <cairo-xlib.h> 7 #include <cairo-xlib.h>
8 #include <gtk/gtk.h> 8 #include <gtk/gtk.h>
9 #include <stdlib.h> 9 #include <stdlib.h>
10 #include <sys/ipc.h> 10 #include <sys/ipc.h>
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 } 492 }
493 493
494 if (*scheduled_completion_callback == false) { 494 if (*scheduled_completion_callback == false) {
495 // If we didn't schedule a callback, we need to delete our resources now. 495 // If we didn't schedule a callback, we need to delete our resources now.
496 XRenderFreePicture(display_, picture); 496 XRenderFreePicture(display_, picture);
497 XFreePixmap(display_, pixmap); 497 XFreePixmap(display_, pixmap);
498 } 498 }
499 } 499 }
500 500
501 bool BackingStoreGtk::CopyFromBackingStore(const gfx::Rect& rect, 501 bool BackingStoreGtk::CopyFromBackingStore(const gfx::Rect& rect,
502 skia::PlatformCanvas* output) { 502 skia::PlatformBitmap* output) {
503 base::TimeTicks begin_time = base::TimeTicks::Now(); 503 base::TimeTicks begin_time = base::TimeTicks::Now();
504 504
505 if (visual_depth_ < 24) { 505 if (visual_depth_ < 24) {
506 // CopyFromBackingStore() copies pixels out of the XImage 506 // CopyFromBackingStore() copies pixels out of the XImage
507 // in a way that assumes that each component (red, green, 507 // in a way that assumes that each component (red, green,
508 // blue) is a byte. This doesn't work on visuals which 508 // blue) is a byte. This doesn't work on visuals which
509 // encode a pixel color with less than a byte per color. 509 // encode a pixel color with less than a byte per color.
510 return false; 510 return false;
511 } 511 }
512 512
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 LOG(WARNING) << "Not using X shared memory."; 564 LOG(WARNING) << "Not using X shared memory.";
565 // Non-shared memory case just copy the image from the server. 565 // Non-shared memory case just copy the image from the server.
566 image = XGetImage(display_, pixmap_, 566 image = XGetImage(display_, pixmap_,
567 rect.x(), rect.y(), width, height, 567 rect.x(), rect.y(), width, height,
568 AllPlanes, ZPixmap); 568 AllPlanes, ZPixmap);
569 } 569 }
570 570
571 // TODO(jhawkins): Need to convert the image data if the image bits per pixel 571 // TODO(jhawkins): Need to convert the image data if the image bits per pixel
572 // is not 32. 572 // is not 32.
573 // Note that this also initializes the output bitmap as opaque. 573 // Note that this also initializes the output bitmap as opaque.
574 if (!output->initialize(width, height, true) || 574 if (!output->Allocate(width, height, true) ||
575 image->bits_per_pixel != 32) { 575 image->bits_per_pixel != 32) {
576 if (shared_memory_support_ != ui::SHARED_MEMORY_NONE) 576 if (shared_memory_support_ != ui::SHARED_MEMORY_NONE)
577 DestroySharedImage(display_, image, &shminfo); 577 DestroySharedImage(display_, image, &shminfo);
578 else 578 else
579 XDestroyImage(image); 579 XDestroyImage(image);
580 return false; 580 return false;
581 } 581 }
582 582
583 // The X image might have a different row stride, so iterate through 583 // The X image might have a different row stride, so iterate through
584 // it and copy each row out, only up to the pixels we're actually 584 // it and copy each row out, only up to the pixels we're actually
585 // using. This code assumes a visual mode where a pixel is 585 // using. This code assumes a visual mode where a pixel is
586 // represented using a 32-bit unsigned int, with a byte per component. 586 // represented using a 32-bit unsigned int, with a byte per component.
587 SkBitmap bitmap = skia::GetTopDevice(*output)->accessBitmap(true); 587 const SkBitmap& bitmap = output->GetBitmap();
588 SkAutoLockPixels alp(bitmap); 588 SkAutoLockPixels alp(bitmap);
589 589
590 for (int y = 0; y < height; y++) { 590 for (int y = 0; y < height; y++) {
591 const uint32* src_row = reinterpret_cast<uint32*>( 591 const uint32* src_row = reinterpret_cast<uint32*>(
592 &image->data[image->bytes_per_line * y]); 592 &image->data[image->bytes_per_line * y]);
593 uint32* dest_row = bitmap.getAddr32(0, y); 593 uint32* dest_row = bitmap.getAddr32(0, y);
594 for (int x = 0; x < width; ++x, ++dest_row) { 594 for (int x = 0; x < width; ++x, ++dest_row) {
595 // Force alpha to be 0xff, because otherwise it causes rendering problems. 595 // Force alpha to be 0xff, because otherwise it causes rendering problems.
596 *dest_row = src_row[x] | 0xff000000; 596 *dest_row = src_row[x] | 0xff000000;
597 } 597 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 681
682 cairo_identity_matrix(cr); 682 cairo_identity_matrix(cr);
683 683
684 cairo_rectangle(cr, rect.x(), rect.y(), rect.width(), rect.height()); 684 cairo_rectangle(cr, rect.x(), rect.y(), rect.width(), rect.height());
685 cairo_fill(cr); 685 cairo_fill(cr);
686 cairo_destroy(cr); 686 cairo_destroy(cr);
687 } 687 }
688 #endif 688 #endif
689 689
690 } // namespace content 690 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/backing_store_gtk.h ('k') | content/browser/renderer_host/backing_store_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698