annotate gui/win32/widgetrender.c @ 24403:d31512f03462

Implementation of tv:// driver autodetection. If user did not specify driver directly, all available drivers will be probed (in order: v4l2,v4l1,bsdbt848,dummy). In most cases first probed driver will be successfully autodetected and used. Autodetection will be disabled if user specified driver directly (in command line or config).
author voroshil
date Mon, 10 Sep 2007 17:09:35 +0000
parents 52488bb09d90
children 76413880bfad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
1 /*
23079
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
2 * MPlayer GUI for Win32
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
3 * Copyright (C) 2003 Sascha Sommer <saschasommer@freenet.de>
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
4 * Copyright (C) 2006 Erik Augustson <erik_27can@yahoo.com>
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
5 * Copyright (C) 2006 Gianluigi Tiesi <sherpya@netfarm.it>
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
6 *
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
7 * This file is part of MPlayer.
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
8 *
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
9 * MPlayer is free software; you can redistribute it and/or modify
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
10 * it under the terms of the GNU General Public License as published by
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
12 * (at your option) any later version.
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
13 *
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
14 * MPlayer is distributed in the hope that it will be useful,
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
17 * GNU General Public License for more details.
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
18 *
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
19 * You should have received a copy of the GNU General Public License
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
20 * along with MPlayer; if not, write to the Free Software
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
8e9b11648f40 Use proper GPL header.
diego
parents: 23078
diff changeset
22 */
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
23
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
24 #include <stdio.h>
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
25 #include <ctype.h>
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
26 #include <windows.h>
23091
52488bb09d90 Consistently use quotes instead of angled brackets in #include
diego
parents: 23079
diff changeset
27
52488bb09d90 Consistently use quotes instead of angled brackets in #include
diego
parents: 23079
diff changeset
28 #include "interface.h"
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
29 #include "gui.h"
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
30
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
31 extern char *codecname;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
32 #define MAX_LABELSIZE 250
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
33
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
34 static void render(int bitsperpixel, image *dst, image *src, int x, int y, int sx, int sy, int sw, int sh, int transparent)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
35 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
36 int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
37 int bpp = bitsperpixel / 8;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
38 int offset = (dst->width * bpp * y) + (x * bpp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
39 int soffset = (src->width * bpp * sy) + (sx * bpp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
40
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
41 for(i=0; i<sh; i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
42 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
43 int c;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
44 for(c=0; c < (sw * bpp); c += bpp)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
45 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
46 if(bpp == 2)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
47 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
48 if(!transparent || (((src->data + soffset + (i * src->width * bpp) + c)[0] != 0x1f)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
49 && ((src->data + soffset + (i * src->width * bpp) + c)[1] != 0x7c)))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
50 memcpy(dst->data + offset + c, src->data + soffset + (i * src->width * bpp) + c, bpp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
51 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
52 else if(bpp > 2)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
53 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
54 if(!transparent || *((unsigned int *) (src->data + soffset + (i * src->width * bpp) + c)) != 0x00ff00ff)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
55 memcpy(dst->data + offset + c, src->data + soffset + (i * src->width * bpp) + c, bpp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
56 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
57 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
58 offset += (dst->width * bpp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
59 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
60 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
61
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
62 static image *find_background(skin_t *skin, widget *item)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
63 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
64 unsigned int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
65 for (i=0; i < skin->windowcount; i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
66 if(skin->windows[i]->type == item->window)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
67 return skin->windows[i]->base->bitmap[0];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
68 return NULL;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
69 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
70
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
71 /******************************************************************/
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
72 /* FONT related functions */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
73 /******************************************************************/
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
74
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
75 /* returns the pos of s2 inside s1 or -1 if s1 doesn't contain s2 */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
76 static int strpos(char *s1, const char* s2)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
77 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
78 unsigned int i, x;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
79 for (i=0; i < strlen(s1); i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
80 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
81 if(s1[i] == s2[0])
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
82 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
83 if(strlen(s1 + i) >= strlen(s2))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
84 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
85 for (x=0; x <strlen(s2); x++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
86 if(s1[i + x] != s2[x]) break;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
87 if(x == strlen(s2)) return i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
88 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
89 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
90 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
91 return -1;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
92 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
93
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
94 /* replaces all occurences of what in dest with format */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
95 static void stringreplace(char *dest, const char *what, const char *format, ... )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
96 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
97 char tmp[MAX_LABELSIZE];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
98 int offset=0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
99 va_list va;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
100 va_start(va, format);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
101 vsnprintf(tmp, MAX_LABELSIZE, format, va);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
102 va_end(va);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
103 /* no search string == replace the entire string */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
104 if(!what)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
105 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
106 memcpy(dest, tmp, strlen(tmp));
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
107 dest[strlen(tmp)] = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
108 return;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
109 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
110 while((offset = strpos(dest, what)) != -1)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
111 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
112 memmove(dest + offset + strlen(tmp), dest + offset + strlen(what), strlen(dest + offset + strlen(what)) + 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
113 memcpy(dest + offset, tmp, strlen(tmp));
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
114 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
115 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
116
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
117 /* replaces the chars with special meaning with the associated data from the player info struct */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
118 static char *generatetextfromlabel(widget *item)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
119 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
120 char *text = malloc(MAX_LABELSIZE);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
121 char tmp[MAX_LABELSIZE];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
122 unsigned int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
123 if(!item)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
124 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
125 free(text);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
126 return NULL;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
127 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
128 strcpy(text, item->label);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
129 if(item->type == tySlabel) return text;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
130 stringreplace(text, "$1", "%.2i:%.2i:%.2i", guiIntfStruct.TimeSec / 3600,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
131 (guiIntfStruct.TimeSec / 60) % 60, guiIntfStruct.TimeSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
132 stringreplace(text, "$2", "%.4i:%.2i", guiIntfStruct.TimeSec / 60, guiIntfStruct.TimeSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
133 stringreplace(text, "$3", "%.2i", guiIntfStruct.TimeSec / 3600);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
134 stringreplace(text, "$4", "%.2i", (guiIntfStruct.TimeSec / 60) % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
135 stringreplace(text, "$5", "%.2i", guiIntfStruct.TimeSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
136 stringreplace(text, "$6", "%.2i:%.2i:%.2i", guiIntfStruct.LengthInSec / 3600,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
137 (guiIntfStruct.LengthInSec / 60) % 60, guiIntfStruct.LengthInSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
138 stringreplace(text, "$7", "%.4i:%.2i", guiIntfStruct.LengthInSec / 60, guiIntfStruct.LengthInSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
139 stringreplace(text, "$8", "%i:%.2i:%.2i", guiIntfStruct.TimeSec / 3600,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
140 (guiIntfStruct.TimeSec / 60) % 60, guiIntfStruct.TimeSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
141 stringreplace(text, "$v", "%3.2f", guiIntfStruct.Volume);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
142 stringreplace(text, "$V", "%3.1f", guiIntfStruct.Volume);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
143 stringreplace(text, "$b", "%3.2f", guiIntfStruct.Balance);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
144 stringreplace(text, "$B", "%3.1f", guiIntfStruct.Balance);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
145 stringreplace(text, "$t", "%.2i", guiIntfStruct.Track);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
146 stringreplace(text, "$o", "%s", guiIntfStruct.Filename);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
147 stringreplace(text, "$x", "%i", guiIntfStruct.MovieWidth);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
148 stringreplace(text, "$y", "%i", guiIntfStruct.MovieHeight);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
149 stringreplace(text, "$C", "%s", guiIntfStruct.sh_video ? codecname : "");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
150 stringreplace(text, "$$", "$");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
151
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
152 if(!strcmp(text, "$p") || !strcmp(text, "$s") || !strcmp(text, "$e"))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
153 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
154 if(guiIntfStruct.Playing == 0) stringreplace(text, NULL, "s");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
155 else if(guiIntfStruct.Playing == 1) stringreplace(text, NULL, "p");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
156 else if(guiIntfStruct.Playing == 2) stringreplace(text, NULL, "e");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
157 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
158
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
159 if(guiIntfStruct.AudioType == 0) stringreplace(text, "$a", "n");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
160 else if(guiIntfStruct.AudioType == 1) stringreplace(text, "$a", "m");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
161 else stringreplace(text, "$a", "t");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
162
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
163 if(guiIntfStruct.StreamType == 0)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
164 stringreplace(text, "$T", "f");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
165 #ifdef USE_DVDREAD
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
166 else if(guiIntfStruct.StreamType == STREAMTYPE_DVD || guiIntfStruct.StreamType == STREAMTYPE_DVDNAV)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
167 stringreplace(text, "$T", "d");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
168 #endif
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
169 else stringreplace(text, "$T", "u");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
170
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
171 if(guiIntfStruct.Filename)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
172 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
173 for (i=0; i<strlen(guiIntfStruct.Filename); i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
174 tmp[i] = tolower(guiIntfStruct.Filename[i]);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
175 stringreplace(text, "$f", tmp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
176
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
177 for (i=0; i<strlen(guiIntfStruct.Filename); i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
178 tmp[i] = toupper(guiIntfStruct.Filename[i]);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
179 stringreplace(text, "$F", tmp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
180 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
181
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
182 return text;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
183 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
184
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
185 /* cuts text to buflen scrolling from right to left */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
186 static void scrolltext(char *text, unsigned int buflen, float *value)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
187 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
188 char *buffer = (char *) malloc(buflen + 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
189 unsigned int x,i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
190 if(*value < buflen) x = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
191 else x = *value - buflen;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
192 memset(buffer, ' ', buflen);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
193 for (i = (*value>=buflen) ? 0 : buflen - *value; i<buflen; i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
194 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
195 if(x < strlen(text))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
196 buffer[i] = text[x];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
197 x++;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
198 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
199 buffer[buflen] = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
200 *value += 1.0f;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
201 if(*value >= strlen(text) + buflen) *value = 0.0f;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
202 strcpy(text, buffer);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
203 free(buffer);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
204 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
205
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
206 /* updates all dlabels and slabels */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
207 void renderinfobox(skin_t *skin, window_priv_t *priv)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
208 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
209 unsigned int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
210 if (!priv) return;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
211
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
212 /* repaint the area behind the text*/
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
213 /* we have to do this for all labels here, because they may overlap in buggy skins ;( */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
214
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
215 for (i=0; i<skin->widgetcount; i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
216 if((skin->widgets[i]->type == tyDlabel) || (skin->widgets[i]->type == tySlabel))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
217 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
218 if(skin->widgets[i]->window == priv->type)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
219 render(skin->desktopbpp,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
220 &priv->img,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
221 find_background(skin, skin->widgets[i]),
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
222 skin->widgets[i]->x,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
223 skin->widgets[i]->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
224 skin->widgets[i]->x,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
225 skin->widgets[i]->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
226 skin->widgets[i]->length,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
227 skin->widgets[i]->font->chars[0]->height,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
228 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
229 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
230
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
231 /* load all slabels and dlabels */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
232 for (i=0; i<skin->widgetcount; i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
233 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
234 widget *item = skin->widgets[i];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
235 if(item->window != priv->type) continue;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
236 if((i == skin->widgetcount) || (item->type == tyDlabel) || (item->type == tySlabel))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
237 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
238 char *text = generatetextfromlabel(item);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
239 unsigned int current, c;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
240 int offset = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
241 unsigned int textlen;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
242 if(!text) continue;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
243 textlen = strlen(text);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
244
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
245 /* render(win, win->background, gui->skin->widgets[i]->x, gui->skin->widgets[i]->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
246 gui->skin->widgets[i]->x, gui->skin->widgets[i]->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
247 gui->skin->widgets[i]->length, gui->skin->widgets[i]->font->chars[0]->height,1); */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
248
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
249 /* calculate text size */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
250 for (current=0; current<textlen; current++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
251 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
252 for (c=0; c<item->font->charcount; c++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
253 if(item->font->chars[c]->c == text[current])
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
254 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
255 offset += item->font->chars[c]->width;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
256 break;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
257 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
258 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
259
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
260 /* labels can be scrolled if they are to big */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
261 if((item->type == tyDlabel) && (item->length < offset))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
262 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
263 int tomuch = (offset - item->length) / (offset /textlen);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
264 scrolltext(text, textlen - tomuch - 1, &skin->widgets[i]->value);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
265 textlen = strlen(text);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
266 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
267
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
268 /* align the text */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
269 if(item->align == 1)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
270 offset = (item->length-offset) / 2;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
271 else if(item->align == 2)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
272 offset = item->length-offset;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
273 else
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
274 offset = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
275
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
276 if(offset < 0) offset = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
277
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
278 /* render the text */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
279 for (current=0; current<textlen; current++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
280 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
281 for (c=0; c<item->font->charcount; c++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
282 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
283 char_t *cchar = item->font->chars[c];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
284 if(cchar->c == *(text + current))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
285 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
286 render(skin->desktopbpp,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
287 &priv->img,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
288 item->font->image,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
289 item->x + offset,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
290 item->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
291 cchar->x,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
292 cchar->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
293 (cchar->width + offset > item->length) ? item->length - offset : cchar->width,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
294 cchar->height,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
295 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
296 offset += cchar->width;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
297 break;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
298 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
299 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
300 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
301 free(text);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
302 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
303 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
304 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
305
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
306 /******************************************************************/
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
307 /* WIDGET related functions */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
308 /******************************************************************/
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
309
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
310 void renderwidget(skin_t *skin, image *dest, widget *item, int state)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
311 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
312 image *img = NULL;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
313 int height;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
314 int y;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
315
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
316 if(!dest) return;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
317 if((item->type == tyButton) || (item->type == tyHpotmeter) || (item->type == tyPotmeter))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
318 img = item->bitmap[0];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
319
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
320 if(!img) return;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
321
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
322 y = item->y;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
323 if(item->type == tyPotmeter)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
324 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
325 height = img->height / item->phases;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
326 y = height * (int)(item->value * item->phases / 100);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
327 if(y > img->height-height)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
328 y = img->height - height;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
329 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
330 else
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
331 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
332 height = img->height / 3;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
333 y = state * height;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
334 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
335
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
336 /* redraw background */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
337 if(item->type == tyButton)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
338 render(skin->desktopbpp, dest, find_background(skin,item), item->x, item->y, item->x, item->y, img->width, height, 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
339
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
340 if((item->type == tyHpotmeter) || (item->type == tyPotmeter))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
341 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
342 /* repaint the area behind the slider */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
343 render(skin->desktopbpp, dest, find_background(skin, item), item->wx, item->wy, item->wx, item->wy, item->wwidth, item->height, 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
344 item->x = item->value * (item->wwidth-item->width) / 100 + item->wx;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
345 if((item->x + item->width) > (item->wx + item->wwidth))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
346 item->x = item->wx + item->wwidth - item->width;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
347 if(item->x < item->wx)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
348 item->x = item->wx;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
349 /* workaround for blue */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
350 if(item->type == tyHpotmeter)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
351 height = (item->height < img->height / 3) ? item->height : img->height / 3;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
352 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
353 render(skin->desktopbpp, dest, img, item->x, item->y, 0, y, img->width, height, 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
354 }