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