* skeleton of X11 skins
[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.1 2003/04/28 14:32:57 asmax Exp $
6  *
7  * Authors: Cyril Deguet     <asmax@videolan.org>
8  *          Emmanuel Puig    <karibu@via.ecp.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111,
23  * USA.
24  *****************************************************************************/
25
26 #ifdef X11_SKINS
27
28 //--- X11 -------------------------------------------------------------------
29 #include <X11/Xlib.h>
30 #include <X11/Xutil.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
46 //---------------------------------------------------------------------------
47 //   X11Bitmap
48 //---------------------------------------------------------------------------
49 X11Bitmap::X11Bitmap( intf_thread_t *p_intf, string FileName, int AColor )
50     : Bitmap( p_intf, FileName, AColor )
51 {
52     // Find the display
53     display = p_intf->p_sys->display;
54     Window root = DefaultRootWindow( display );
55
56     AlphaColor = AColor;
57
58     // Load the bitmap image
59     int hotspotX, hotspotY;
60     int rc = XReadBitmapFile( display, root, FileName.c_str(),
61                               (unsigned int*)&Width, (unsigned int*)&Height, 
62                               &Bmp, &hotspotX, &hotspotY );
63     if( rc != BitmapSuccess )
64     {
65         if( FileName != "" )
66             msg_Warn( p_intf, "Couldn't load bitmap: %s", FileName.c_str() );
67         Width = 0;
68         Height = 0;
69     }
70 /*    else
71     {    
72         Width = gdk_pixbuf_get_width( Bmp );
73         Height = gdk_pixbuf_get_height( Bmp );
74
75         if( AColor != 0 )
76         {
77             // Change black pixels to another color to avoid transparency
78             int rowstride = gdk_pixbuf_get_rowstride( Bmp );
79             guchar *pixel = gdk_pixbuf_get_pixels( Bmp ); 
80             int pix_size = ( gdk_pixbuf_get_has_alpha( Bmp ) ? 4 : 3 );
81             
82             for( int y = 0; y < Height; y++ )
83             {
84                 for( int x = 0; x < Width; x++ )
85                 {   
86                     guint32 r = pixel[0];
87                     guint32 g = pixel[1]<<8;
88                     guint32 b = pixel[2]<<16;
89                     if( r+g+b == 0 )
90                     {
91                         pixel[2] = 10; // slight blue
92                     }
93                     pixel += pix_size;
94                 }
95             }
96         }
97
98         Bmp = gdk_pixbuf_add_alpha( Bmp, TRUE, AColor & 0xff, (AColor>>8) & 0xff, 
99                 (AColor>>16) & 0xff );
100     }*/
101 }
102 //---------------------------------------------------------------------------
103 X11Bitmap::X11Bitmap( intf_thread_t *p_intf, Graphics *from, int x, int y,
104     int w, int h, int AColor ) : Bitmap( p_intf, from, x, y, w, h, AColor )
105 {
106 /*    Width  = w;
107     Height = h;
108     AlphaColor = AColor;
109     HBITMAP HBmp;
110     HDC fromDC = ( (X11Graphics *)from )->GetImageHandle();
111
112     // Create image
113     bmpDC = CreateCompatibleDC( fromDC );
114     HBmp  = CreateCompatibleBitmap( fromDC, Width, Height );
115     SelectObject( bmpDC, HBmp );
116     DeleteObject( HBmp );
117     BitBlt( bmpDC, 0, 0, Width, Height, fromDC, x, y, SRCCOPY );*/
118 }
119 //---------------------------------------------------------------------------
120 X11Bitmap::X11Bitmap( intf_thread_t *p_intf, Bitmap *c )
121     : Bitmap( p_intf, c )
122 {
123 /*    HBITMAP HBuf;
124
125     // Copy attibutes
126     c->GetSize( Width, Height );
127     AlphaColor = c->GetAlphaColor();
128
129     // Copy bmpDC
130     bmpDC = CreateCompatibleDC( NULL );
131     HBuf  = CreateCompatibleBitmap( bmpDC, Width, Height );
132     SelectObject( bmpDC, HBuf );
133
134     BitBlt( bmpDC, 0, 0, Width, Height, ( (X11Bitmap *)c )->GetBmpDC(),
135             0, 0, SRCCOPY );
136     DeleteObject( HBuf );*/
137 }
138 //---------------------------------------------------------------------------
139 X11Bitmap::~X11Bitmap()
140 {
141     XFreePixmap( display, Bmp );
142 }
143 //---------------------------------------------------------------------------
144 void X11Bitmap::DrawBitmap( int x, int y, int w, int h, int xRef, int yRef,
145                               Graphics *dest )
146 {
147     if( Bmp )
148     {
149 /*        GdkDrawable *destImg = ( (X11Graphics *)dest )->GetImage();
150         GdkGC *destGC = ( (X11Graphics *)dest )->GetGC();
151
152         gdk_pixbuf_render_to_drawable( Bmp, destImg, destGC, x, y, xRef, yRef, 
153                 w, h, GDK_RGB_DITHER_NORMAL, 0, 0);*/
154     }
155 }
156 //---------------------------------------------------------------------------
157 bool X11Bitmap::Hit( int x, int y)
158 {
159 //    unsigned int c = (unsigned int)GetBmpPixel( x, y );
160
161 /*    if( c == -1 || c == AlphaColor )
162         return false;
163     else
164         return true;*/
165 }
166 //---------------------------------------------------------------------------
167 int X11Bitmap::GetBmpPixel( int x, int y )
168 {
169     if( !Bmp || x < 0 || x >= Width || y < 0 || y >= Height )
170         return -1;
171
172 /*    guchar *pixels;
173     int rowstride, offset;
174     gboolean has_alpha;
175
176     rowstride = gdk_pixbuf_get_rowstride( Bmp );
177     pixels    = gdk_pixbuf_get_pixels( Bmp ); 
178     has_alpha = gdk_pixbuf_get_has_alpha( Bmp );
179
180     offset = y * rowstride + ( x * (has_alpha ? 4 : 3) );
181
182     int r = pixels [offset];
183     int g = pixels [offset + 1] << 8;
184     int b = pixels [offset + 2] << 16;
185
186     return r + g + b;*/
187 }
188 //---------------------------------------------------------------------------
189 void X11Bitmap::SetBmpPixel( int x, int y, int color )
190 {
191 //    SetPixelV( bmpDC, x, y, color );
192 }
193 //---------------------------------------------------------------------------
194
195 #endif