147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// Copyright (c) 2011 The Chromium Authors. All rights reserved. 247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// Use of this source code is governed by a BSD-style license that can be 347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// found in the LICENSE file. 447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "chrome/browser/ui/gtk/cairo_cached_surface.h" 647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include <gtk/gtk.h> 847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "base/basictypes.h" 1047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "base/logging.h" 1147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 1247877050e7ea02c3514497aba54eef1d4cee8452Chris LattnerCairoCachedSurface::CairoCachedSurface() : pixbuf_(NULL), surface_(NULL) { 1347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner} 1447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 1547877050e7ea02c3514497aba54eef1d4cee8452Chris LattnerCairoCachedSurface::~CairoCachedSurface() { 1647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (surface_) 1747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner cairo_surface_destroy(surface_); 1847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 1947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (pixbuf_) 2047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner g_object_unref(pixbuf_); 2147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner} 2247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 2347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerint CairoCachedSurface::Width() const { 2447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner return pixbuf_ ? gdk_pixbuf_get_width(pixbuf_) : -1; 2547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner} 2647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 2747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerint CairoCachedSurface::Height() const { 2847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner return pixbuf_ ? gdk_pixbuf_get_height(pixbuf_) : -1; 2947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner} 3047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 3147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnervoid CairoCachedSurface::UsePixbuf(GdkPixbuf* pixbuf) { 3247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (surface_) { 3347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner cairo_surface_destroy(surface_); 3447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner surface_ = NULL; 3547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner } 362a0013f59fb3b23010c0509fab8bf509eb30fb36Duraid Madina 3747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (pixbuf) 3847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner g_object_ref(pixbuf); 3947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 4047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (pixbuf_) 4147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner g_object_unref(pixbuf_); 4247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 4347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner pixbuf_ = pixbuf; 4447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner} 4547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 4647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnervoid CairoCachedSurface::SetSource(cairo_t* cr, int x, int y) { 4747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner DCHECK(pixbuf_); 4847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner DCHECK(cr); 4947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 5047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (!surface_) { 5147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // First time here since last UsePixbuf call. Generate the surface. 5247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner cairo_surface_t* target = cairo_get_target(cr); 5347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner surface_ = cairo_surface_create_similar( 5447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner target, 5547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner CAIRO_CONTENT_COLOR_ALPHA, 5647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner gdk_pixbuf_get_width(pixbuf_), 5747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner gdk_pixbuf_get_height(pixbuf_)); 5847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 5947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner DCHECK(surface_); 6047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#if !defined(NDEBUG) 6147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner int surface_type = cairo_surface_get_type(surface_); 6247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner DCHECK(surface_type == CAIRO_SURFACE_TYPE_XLIB || 6347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner surface_type == CAIRO_SURFACE_TYPE_XCB || 6447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner surface_type == CAIRO_SURFACE_TYPE_IMAGE); 6547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#endif 664a84ad7a2bfd1795357776164e3bf80a2600d924Chris Lattner 6762d07d6acef9f5fd807b98a509d164bd3d6f0187Jim Laskey cairo_t* copy_cr = cairo_create(surface_); 6862d07d6acef9f5fd807b98a509d164bd3d6f0187Jim Laskey gdk_cairo_set_source_pixbuf(copy_cr, pixbuf_, 0, 0); 699d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey cairo_paint(copy_cr); 709d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey cairo_destroy(copy_cr); 719d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey } 724a84ad7a2bfd1795357776164e3bf80a2600d924Chris Lattner 7347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner cairo_set_source_surface(cr, surface_, x, y); 7447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner} 7547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner