Home | History | Annotate | Download | only in gtk
      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