2009-10-20 Chris Toshok <toshok@ximian.com>
[moon.git] / src / bitmapsource.cpp
blob893ddbb61162d36b0dcdea8df2db868c5b5b4ccb
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3 * bitmapsource.cpp
5 * Contact:
6 * Moonlight List (moonlight-list@lists.ximian.com)
8 * Copyright 2007-2008 Novell, Inc. (http://www.novell.com)
10 * See the LICENSE file included with the distribution for details.
14 #include <config.h>
16 #include <stdio.h>
18 #include "application.h"
19 #include "bitmapsource.h"
20 #include "runtime.h"
22 BitmapSource::BitmapSource ()
24 SetObjectType (Type::BITMAPSOURCE);
25 image_surface = NULL;
26 native_surface = NULL;
27 data = NULL;
28 own_data = true;
31 BitmapSource::~BitmapSource ()
33 if (image_surface)
34 cairo_surface_destroy (image_surface);
35 if (native_surface)
36 cairo_surface_destroy (native_surface);
38 if (data && own_data)
39 g_free (data);
42 gpointer
43 BitmapSource::GetBitmapData ()
45 return data;
48 void
49 BitmapSource::SetBitmapData (gpointer data, bool own_data)
51 if (this->data && this->own_data)
52 g_free (this->data);
53 this->own_data = own_data;
54 this->data = data;
57 void
58 BitmapSource::Invalidate ()
60 if (GetPixelWidth () == 0 || GetPixelHeight () == 0)
61 return;
63 if (native_surface) {
64 cairo_surface_destroy (native_surface);
65 native_surface = NULL;
67 if (image_surface)
68 cairo_surface_destroy (image_surface);
70 image_surface = cairo_image_surface_create_for_data ((unsigned char *) GetBitmapData (), GetPixelFormat () == PixelFormatBgr32 ? CAIRO_FORMAT_RGB24 : CAIRO_FORMAT_ARGB32, GetPixelWidth (), GetPixelHeight (), GetPixelWidth ()*4);
72 Emit (BitmapSource::PixelDataChangedEvent);
75 cairo_surface_t *
76 BitmapSource::GetSurface (cairo_t *cr)
78 if (image_surface == NULL)
79 return NULL;
81 if (native_surface)
82 return native_surface;
84 if (cr == NULL)
85 return image_surface;
87 native_surface = cairo_surface_create_similar (cairo_get_group_target (cr),
88 cairo_surface_get_content (image_surface),
89 GetPixelWidth (), GetPixelHeight ());
91 cairo_t *context = cairo_create (native_surface);
93 cairo_set_source_surface (context, image_surface, 0, 0);
94 cairo_pattern_set_filter (cairo_get_source (context), CAIRO_FILTER_FAST);
96 cairo_paint (context);
97 cairo_destroy (context);
99 return native_surface;