31e34c0fd6ac15641ccd22588e87fdae13deeaaa
[vlc.git] / modules / gui / skins / x11 / x11_bitmap.cpp
1 /*****************************************************************************
2  * x11_bitmap.cpp: X11 implementation of the Bitmap class
3  *****************************************************************************
4  * Copyright (C) 2003 VideoLAN
5  * $Id: x11_bitmap.cpp,v 1.9 2003/06/01 22:11:24 asmax Exp $
6  *
7  * Authors: Cyril Deguet     <asmax@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111,
22  * USA.
23  *****************************************************************************/
24
25 #ifdef X11_SKINS
26
27 //--- X11 -------------------------------------------------------------------
28 #include <X11/Xlib.h>
29 #include <X11/Xutil.h>
30 #include <Imlib2.h>
31
32 //--- VLC -------------------------------------------------------------------
33 #include <vlc/intf.h>
34
35 //--- SKIN ------------------------------------------------------------------
36 #include "../os_api.h"
37 #include "../src/graphics.h"
38 #include "x11_graphics.h"
39 #include "../src/bitmap.h"
40 #include "x11_bitmap.h"
41 #include "../src/theme.h"
42 #include "../os_theme.h"
43 #include "../src/skin_common.h"
44
45 #include <stdio.h>
46
47 // macros to read little endian numbers
48 #define U16( p ) ( ((uint8_t*)(p))[0] | ((uint8_t*)(p))[1] << 8 )
49 #define U32( p ) ( U16( p ) | ((uint8_t*)(p))[2] << 16 | ((uint8_t*)(p))[3] << 24 )
50
51 //---------------------------------------------------------------------------
52 //   X11Bitmap
53 //---------------------------------------------------------------------------
54 X11Bitmap::X11Bitmap( intf_thread_t *_p_intf, string FileName, int AColor )
55     : Bitmap( p_intf, FileName, AColor )
56 {
57     p_intf = _p_intf;
58     
59     // Find the display
60     display = p_intf->p_sys->display;
61     int screen = DefaultScreen( display );
62     int depth = DefaultDepth( display, screen );
63     Screen *screenptr = DefaultScreenOfDisplay( display );
64     Visual *visual = DefaultVisualOfScreen( screenptr );
65     Img = NULL;
66     Width = 0;
67     Height = 0;
68
69     if( FileName == "" )
70     {
71         return;
72     }
73  
74     AlphaColor = (AColor & 0xff) << 16 | (AColor & 0xff00) | 
75                  (AColor & 0xff0000) >> 16;
76      
77     XLOCK;
78     imlib_context_set_display( display );
79     imlib_context_set_visual( visual );
80     imlib_context_set_colormap( DefaultColormap( display, screen ) );
81     imlib_context_set_dither( 1 );
82     imlib_context_set_blend( 1 );
83
84     Img = imlib_load_image_immediately( FileName.c_str() );
85     imlib_context_set_image( Img );
86     Width = imlib_image_get_width();
87     Height = imlib_image_get_height();
88  
89     // Add an alpha layer
90     DATA32 *data = imlib_image_get_data();
91     DATA32 *ptr = data;
92     for( int j = 0; j < Height; j++)
93     {
94         for( int i = 0; i < Width; i++)
95         {
96             if( AlphaColor != 0 && *ptr == 0xff000000 )
97             {
98                 // Avoid transparency for black pixels
99                 *ptr = 0xff00000c;
100             }
101             else if( (*ptr & 0xffffff) == AlphaColor )
102             {
103                 *ptr &= 0x00ffffff;
104             }
105             ptr++;
106         }
107     }
108     imlib_image_set_has_alpha( 1 );
109     imlib_image_set_irrelevant_alpha( 0 );
110     imlib_image_put_back_data( data );
111     XUNLOCK;
112 }
113 //---------------------------------------------------------------------------
114 X11Bitmap::X11Bitmap( intf_thread_t *_p_intf, Graphics *from, int x, int y,
115     int w, int h, int AColor ) : Bitmap( p_intf, from, x, y, w, h, AColor )
116 {
117     p_intf = _p_intf;
118 /*    Width  = w;
119     Height = h;
120     AlphaColor = AColor;
121     HBITMAP HBmp;
122     HDC fromDC = ( (X11Graphics *)from )->GetImageHandle();
123
124     // Create image
125     bmpDC = CreateCompatibleDC( fromDC );
126     HBmp  = CreateCompatibleBitmap( fromDC, Width, Height );
127     SelectObject( bmpDC, HBmp );
128     DeleteObject( HBmp );
129     BitBlt( bmpDC, 0, 0, Width, Height, fromDC, x, y, SRCCOPY );*/
130 }
131 //---------------------------------------------------------------------------
132 X11Bitmap::X11Bitmap( intf_thread_t *_p_intf, Bitmap *c )
133     : Bitmap( p_intf, c )
134 {
135     p_intf = _p_intf;
136 /*    HBITMAP HBuf;
137
138     // Copy attibutes
139     c->GetSize( Width, Height );
140     AlphaColor = c->GetAlphaColor();
141
142     // Copy bmpDC
143     bmpDC = CreateCompatibleDC( NULL );
144     HBuf  = CreateCompatibleBitmap( bmpDC, Width, Height );
145     SelectObject( bmpDC, HBuf );
146
147     BitBlt( bmpDC, 0, 0, Width, Height, ( (X11Bitmap *)c )->GetBmpDC(),
148             0, 0, SRCCOPY );
149     DeleteObject( HBuf );*/
150 }
151 //---------------------------------------------------------------------------
152 X11Bitmap::~X11Bitmap()
153 {
154     if( Img )
155     {
156         XLOCK;
157         imlib_context_set_image( Img );
158         imlib_free_image();
159         XUNLOCK;
160     }
161 }
162 //---------------------------------------------------------------------------
163 void X11Bitmap::DrawBitmap( int x, int y, int w, int h, int xRef, int yRef,
164                               Graphics *dest )
165 {
166     if( Img )
167     {
168         XLOCK;
169         Drawable destImg = ( (X11Graphics *)dest )->GetImage();
170         imlib_context_set_image( Img );
171         imlib_context_set_drawable( destImg );
172         imlib_render_image_part_on_drawable_at_size( x, y, w, h, xRef, yRef, w, h );
173         XUNLOCK;
174     }
175 }
176 //---------------------------------------------------------------------------
177 bool X11Bitmap::Hit( int x, int y)
178 {
179     unsigned int c = (unsigned int)GetBmpPixel( x, y );
180
181     if( c == -1 || c == AlphaColor )
182         return false;
183     else
184         return true;
185 }
186 //---------------------------------------------------------------------------
187 int X11Bitmap::GetBmpPixel( int x, int y )
188 {
189     if( !Img || x < 0 || x >= Width || y < 0 || y >= Height )
190         return -1;
191
192     return 42;
193 /*    guchar *pixels;
194     int rowstride, offset;
195     gboolean has_alpha;
196
197     rowstride = gdk_pixbuf_get_rowstride( Bmp );
198     pixels    = gdk_pixbuf_get_pixels( Bmp ); 
199     has_alpha = gdk_pixbuf_get_has_alpha( Bmp );
200
201     offset = y * rowstride + ( x * (has_alpha ? 4 : 3) );
202
203     int r = pixels [offset];
204     int g = pixels [offset + 1] << 8;
205     int b = pixels [offset + 2] << 16;
206
207     return r + g + b;*/
208 }
209 //---------------------------------------------------------------------------
210 void X11Bitmap::SetBmpPixel( int x, int y, int color )
211 {
212 //    SetPixelV( bmpDC, x, y, color );
213 }
214 //---------------------------------------------------------------------------
215
216 #endif