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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/gtk/cairo_cached_surface.h" 6 7 #include <gtk/gtk.h> 8 9 #include "base/basictypes.h" 10 #include "base/logging.h" 11 12 CairoCachedSurface::CairoCachedSurface() : pixbuf_(NULL), surface_(NULL) { 13 } 14 15 CairoCachedSurface::~CairoCachedSurface() { 16 if (surface_) 17 cairo_surface_destroy(surface_); 18 19 if (pixbuf_) 20 g_object_unref(pixbuf_); 21 } 22 23 int CairoCachedSurface::Width() const { 24 return pixbuf_ ? gdk_pixbuf_get_width(pixbuf_) : -1; 25 } 26 27 int CairoCachedSurface::Height() const { 28 return pixbuf_ ? gdk_pixbuf_get_height(pixbuf_) : -1; 29 } 30 31 void CairoCachedSurface::UsePixbuf(GdkPixbuf* pixbuf) { 32 if (surface_) { 33 cairo_surface_destroy(surface_); 34 surface_ = NULL; 35 } 36 37 if (pixbuf) 38 g_object_ref(pixbuf); 39 40 if (pixbuf_) 41 g_object_unref(pixbuf_); 42 43 pixbuf_ = pixbuf; 44 } 45 46 void CairoCachedSurface::SetSource(cairo_t* cr, int x, int y) { 47 DCHECK(pixbuf_); 48 DCHECK(cr); 49 50 if (!surface_) { 51 // First time here since last UsePixbuf call. Generate the surface. 52 cairo_surface_t* target = cairo_get_target(cr); 53 surface_ = cairo_surface_create_similar( 54 target, 55 CAIRO_CONTENT_COLOR_ALPHA, 56 gdk_pixbuf_get_width(pixbuf_), 57 gdk_pixbuf_get_height(pixbuf_)); 58 59 DCHECK(surface_); 60 #if !defined(NDEBUG) 61 int surface_type = cairo_surface_get_type(surface_); 62 DCHECK(surface_type == CAIRO_SURFACE_TYPE_XLIB || 63 surface_type == CAIRO_SURFACE_TYPE_XCB || 64 surface_type == CAIRO_SURFACE_TYPE_IMAGE); 65 #endif 66 67 cairo_t* copy_cr = cairo_create(surface_); 68 gdk_cairo_set_source_pixbuf(copy_cr, pixbuf_, 0, 0); 69 cairo_paint(copy_cr); 70 cairo_destroy(copy_cr); 71 } 72 73 cairo_set_source_surface(cr, surface_, x, y); 74 } 75