annotate gui/win32/widgetrender.c @ 33534:22c3241467b3

Remove function Normalize(). This function changed ARGB data as if it had been RGB24 data (not quite correctly) converted to ARGB with all colors transparent. Instead now, set the alpha channel for RGB24 data and leave ARGB data untouched. For X11, the alpha channel is disregarded, so both approaches are equal, but the new one is more intelligible as we get correct ARGB PNG data. For legacy reasons, all kind of fuchsia/magenta must be treated as transparent, because some skins are using at least both full opaque and full transparent fuchsia/magenta for transparency.
author ib
date Thu, 16 Jun 2011 11:19:15 +0000
parents 548499b3f354
children c5a19bbeac2b
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 *
26457
9ba6d4487292 Use standard GPL header.
diego
parents: 26372
diff changeset
19 * You should have received a copy of the GNU General Public License along
9ba6d4487292 Use standard GPL header.
diego
parents: 26372
diff changeset
20 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
9ba6d4487292 Use standard GPL header.
diego
parents: 26372
diff changeset
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23079
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
26372
76413880bfad Update include paths to account for build system changes.
diego
parents: 23091
diff changeset
28 #include "gui/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 #define MAX_LABELSIZE 250
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
32
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
33 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
34 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
35 int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
36 int bpp = bitsperpixel / 8;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
37 int offset = (dst->width * bpp * y) + (x * bpp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
38 int soffset = (src->width * bpp * sy) + (sx * bpp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
39
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
40 for(i=0; i<sh; i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
41 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
42 int c;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
43 for(c=0; c < (sw * bpp); c += bpp)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
44 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
45 if(bpp == 2)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
46 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
47 if(!transparent || (((src->data + soffset + (i * src->width * bpp) + c)[0] != 0x1f)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
48 && ((src->data + soffset + (i * src->width * bpp) + c)[1] != 0x7c)))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
49 memcpy(dst->data + offset + c, src->data + soffset + (i * src->width * bpp) + c, bpp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
50 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
51 else if(bpp > 2)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
52 {
33534
22c3241467b3 Remove function Normalize().
ib
parents: 32067
diff changeset
53 if(!transparent || !IS_TRANSPARENT(*((unsigned int *) (src->data + soffset + (i * src->width * bpp) + c))))
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
54 memcpy(dst->data + offset + c, src->data + soffset + (i * src->width * bpp) + c, bpp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
55 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
56 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
57 offset += (dst->width * bpp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
58 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
59 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
60
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
61 static image *find_background(skin_t *skin, widget *item)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
62 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
63 unsigned int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
64 for (i=0; i < skin->windowcount; i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
65 if(skin->windows[i]->type == item->window)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
66 return skin->windows[i]->base->bitmap[0];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
67 return NULL;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
68 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
69
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
70 /******************************************************************/
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
71 /* FONT related functions */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
72 /******************************************************************/
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
73
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
74 /* returns the pos of s2 inside s1 or -1 if s1 doesn't contain s2 */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
75 static int strpos(char *s1, const char* s2)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
76 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
77 unsigned int i, x;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
78 for (i=0; i < strlen(s1); i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
79 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
80 if(s1[i] == s2[0])
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
81 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
82 if(strlen(s1 + i) >= strlen(s2))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
83 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
84 for (x=0; x <strlen(s2); x++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
85 if(s1[i + x] != s2[x]) break;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
86 if(x == strlen(s2)) return i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
87 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
88 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
89 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
90 return -1;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
91 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
92
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
93 /* replaces all occurences of what in dest with format */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
94 static void stringreplace(char *dest, const char *what, const char *format, ... )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
95 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
96 char tmp[MAX_LABELSIZE];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
97 int offset=0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
98 va_list va;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
99 va_start(va, format);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
100 vsnprintf(tmp, MAX_LABELSIZE, format, va);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
101 va_end(va);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
102 /* no search string == replace the entire string */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
103 if(!what)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
104 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
105 memcpy(dest, tmp, strlen(tmp));
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
106 dest[strlen(tmp)] = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
107 return;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
108 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
109 while((offset = strpos(dest, what)) != -1)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
110 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
111 memmove(dest + offset + strlen(tmp), dest + offset + strlen(what), strlen(dest + offset + strlen(what)) + 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
112 memcpy(dest + offset, tmp, strlen(tmp));
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
113 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
114 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
115
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
116 /* replaces the chars with special meaning with the associated data from the player info struct */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
117 static char *generatetextfromlabel(widget *item)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
118 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
119 char *text = malloc(MAX_LABELSIZE);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
120 char tmp[MAX_LABELSIZE];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
121 unsigned int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
122 if(!item)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
123 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
124 free(text);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
125 return NULL;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
126 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
127 strcpy(text, item->label);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
128 if(item->type == tySlabel) return text;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
129 stringreplace(text, "$1", "%.2i:%.2i:%.2i", guiIntfStruct.TimeSec / 3600,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
130 (guiIntfStruct.TimeSec / 60) % 60, guiIntfStruct.TimeSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
131 stringreplace(text, "$2", "%.4i:%.2i", guiIntfStruct.TimeSec / 60, guiIntfStruct.TimeSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
132 stringreplace(text, "$3", "%.2i", guiIntfStruct.TimeSec / 3600);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
133 stringreplace(text, "$4", "%.2i", (guiIntfStruct.TimeSec / 60) % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
134 stringreplace(text, "$5", "%.2i", guiIntfStruct.TimeSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
135 stringreplace(text, "$6", "%.2i:%.2i:%.2i", guiIntfStruct.LengthInSec / 3600,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
136 (guiIntfStruct.LengthInSec / 60) % 60, guiIntfStruct.LengthInSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
137 stringreplace(text, "$7", "%.4i:%.2i", guiIntfStruct.LengthInSec / 60, guiIntfStruct.LengthInSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
138 stringreplace(text, "$8", "%i:%.2i:%.2i", guiIntfStruct.TimeSec / 3600,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
139 (guiIntfStruct.TimeSec / 60) % 60, guiIntfStruct.TimeSec % 60);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
140 stringreplace(text, "$v", "%3.2f", guiIntfStruct.Volume);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
141 stringreplace(text, "$V", "%3.1f", guiIntfStruct.Volume);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
142 stringreplace(text, "$b", "%3.2f", guiIntfStruct.Balance);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
143 stringreplace(text, "$B", "%3.1f", guiIntfStruct.Balance);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
144 stringreplace(text, "$t", "%.2i", guiIntfStruct.Track);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
145 stringreplace(text, "$o", "%s", guiIntfStruct.Filename);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
146 stringreplace(text, "$x", "%i", guiIntfStruct.MovieWidth);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
147 stringreplace(text, "$y", "%i", guiIntfStruct.MovieHeight);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
148 stringreplace(text, "$C", "%s", guiIntfStruct.sh_video ? codecname : "");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
149 stringreplace(text, "$$", "$");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
150
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
151 if(!strcmp(text, "$p") || !strcmp(text, "$s") || !strcmp(text, "$e"))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
152 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
153 if(guiIntfStruct.Playing == 0) stringreplace(text, NULL, "s");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
154 else if(guiIntfStruct.Playing == 1) stringreplace(text, NULL, "p");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
155 else if(guiIntfStruct.Playing == 2) stringreplace(text, NULL, "e");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
156 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
157
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
158 if(guiIntfStruct.AudioType == 0) stringreplace(text, "$a", "n");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
159 else if(guiIntfStruct.AudioType == 1) stringreplace(text, "$a", "m");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
160 else stringreplace(text, "$a", "t");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
161
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
162 if(guiIntfStruct.StreamType == 0)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
163 stringreplace(text, "$T", "f");
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 26457
diff changeset
164 #ifdef CONFIG_DVDREAD
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
165 else if(guiIntfStruct.StreamType == STREAMTYPE_DVD || guiIntfStruct.StreamType == STREAMTYPE_DVDNAV)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
166 stringreplace(text, "$T", "d");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
167 #endif
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
168 else stringreplace(text, "$T", "u");
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
169
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
170 if(guiIntfStruct.Filename)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
171 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
172 for (i=0; i<strlen(guiIntfStruct.Filename); i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
173 tmp[i] = tolower(guiIntfStruct.Filename[i]);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
174 stringreplace(text, "$f", tmp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
175
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
176 for (i=0; i<strlen(guiIntfStruct.Filename); i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
177 tmp[i] = toupper(guiIntfStruct.Filename[i]);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
178 stringreplace(text, "$F", tmp);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
179 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
180
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
181 return text;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
182 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
183
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
184 /* cuts text to buflen scrolling from right to left */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
185 static void scrolltext(char *text, unsigned int buflen, float *value)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
186 {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 27341
diff changeset
187 char *buffer = malloc(buflen + 1);
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
188 unsigned int x,i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
189 if(*value < buflen) x = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
190 else x = *value - buflen;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
191 memset(buffer, ' ', buflen);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
192 for (i = (*value>=buflen) ? 0 : buflen - *value; i<buflen; i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
193 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
194 if(x < strlen(text))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
195 buffer[i] = text[x];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
196 x++;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
197 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
198 buffer[buflen] = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
199 *value += 1.0f;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
200 if(*value >= strlen(text) + buflen) *value = 0.0f;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
201 strcpy(text, buffer);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
202 free(buffer);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
203 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
204
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
205 /* updates all dlabels and slabels */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
206 void renderinfobox(skin_t *skin, window_priv_t *priv)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
207 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
208 unsigned int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
209 if (!priv) return;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
210
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
211 /* repaint the area behind the text*/
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
212 /* we have to do this for all labels here, because they may overlap in buggy skins ;( */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
213
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
214 for (i=0; i<skin->widgetcount; i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
215 if((skin->widgets[i]->type == tyDlabel) || (skin->widgets[i]->type == tySlabel))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
216 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
217 if(skin->widgets[i]->window == priv->type)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
218 render(skin->desktopbpp,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
219 &priv->img,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
220 find_background(skin, skin->widgets[i]),
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
221 skin->widgets[i]->x,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
222 skin->widgets[i]->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
223 skin->widgets[i]->x,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
224 skin->widgets[i]->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
225 skin->widgets[i]->length,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
226 skin->widgets[i]->font->chars[0]->height,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
227 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
228 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
229
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
230 /* load all slabels and dlabels */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
231 for (i=0; i<skin->widgetcount; i++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
232 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
233 widget *item = skin->widgets[i];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
234 if(item->window != priv->type) continue;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
235 if((i == skin->widgetcount) || (item->type == tyDlabel) || (item->type == tySlabel))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
236 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
237 char *text = generatetextfromlabel(item);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
238 unsigned int current, c;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
239 int offset = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
240 unsigned int textlen;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
241 if(!text) continue;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
242 textlen = strlen(text);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
243
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
244 /* render(win, win->background, gui->skin->widgets[i]->x, gui->skin->widgets[i]->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
245 gui->skin->widgets[i]->x, gui->skin->widgets[i]->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
246 gui->skin->widgets[i]->length, gui->skin->widgets[i]->font->chars[0]->height,1); */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
247
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
248 /* calculate text size */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
249 for (current=0; current<textlen; current++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
250 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
251 for (c=0; c<item->font->charcount; c++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
252 if(item->font->chars[c]->c == text[current])
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
253 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
254 offset += item->font->chars[c]->width;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
255 break;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
256 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
257 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
258
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
259 /* labels can be scrolled if they are to big */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
260 if((item->type == tyDlabel) && (item->length < offset))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
261 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
262 int tomuch = (offset - item->length) / (offset /textlen);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
263 scrolltext(text, textlen - tomuch - 1, &skin->widgets[i]->value);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
264 textlen = strlen(text);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
265 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
266
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
267 /* align the text */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
268 if(item->align == 1)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
269 offset = (item->length-offset) / 2;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
270 else if(item->align == 2)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
271 offset = item->length-offset;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
272 else
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
273 offset = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
274
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
275 if(offset < 0) offset = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
276
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
277 /* render the text */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
278 for (current=0; current<textlen; current++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
279 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
280 for (c=0; c<item->font->charcount; c++)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
281 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
282 char_t *cchar = item->font->chars[c];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
283 if(cchar->c == *(text + current))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
284 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
285 render(skin->desktopbpp,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
286 &priv->img,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
287 item->font->image,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
288 item->x + offset,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
289 item->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
290 cchar->x,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
291 cchar->y,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
292 (cchar->width + offset > item->length) ? item->length - offset : cchar->width,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
293 cchar->height,
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
294 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
295 offset += cchar->width;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
296 break;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
297 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
298 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
299 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
300 free(text);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
301 }
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 /* WIDGET related functions */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
307 /******************************************************************/
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
308
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
309 void renderwidget(skin_t *skin, image *dest, widget *item, int state)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
310 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
311 image *img = NULL;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
312 int height;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
313 int y;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
314
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
315 if(!dest) return;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
316 if((item->type == tyButton) || (item->type == tyHpotmeter) || (item->type == tyPotmeter))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
317 img = item->bitmap[0];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
318
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
319 if(!img) return;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
320
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
321 y = item->y;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
322 if(item->type == tyPotmeter)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
323 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
324 height = img->height / item->phases;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
325 y = height * (int)(item->value * item->phases / 100);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
326 if(y > img->height-height)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
327 y = img->height - height;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
328 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
329 else
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
330 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
331 height = img->height / 3;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
332 y = state * height;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
333 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
334
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
335 /* redraw background */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
336 if(item->type == tyButton)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
337 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
338
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
339 if((item->type == tyHpotmeter) || (item->type == tyPotmeter))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
340 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
341 /* repaint the area behind the slider */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
342 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
343 item->x = item->value * (item->wwidth-item->width) / 100 + item->wx;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
344 if((item->x + item->width) > (item->wx + item->wwidth))
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
345 item->x = item->wx + item->wwidth - item->width;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
346 if(item->x < item->wx)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
347 item->x = item->wx;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
348 /* workaround for blue */
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
349 if(item->type == tyHpotmeter)
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
350 height = (item->height < img->height / 3) ? item->height : img->height / 3;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
351 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
352 render(skin->desktopbpp, dest, img, item->x, item->y, 0, y, img->width, height, 1);
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
353 }