CHDK_DE Vorschauversion  Trunk Rev. 6014
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
zebra.c-Dateireferenz
#include "camera_info.h"
#include "conf.h"
#include "keyboard.h"
#include "modes.h"
#include "viewport.h"
#include "properties.h"
#include "gui.h"
#include "gui_draw.h"
#include "gui_lang.h"
#include "gui_osd.h"
#include "gui_mbox.h"
#include "gui_batt.h"
#include "gui_space.h"
#include "histogram.h"
#include "zebra.h"
#include "gui_grid.h"
#include "module_def.h"
+ Include-Abhängigkeitsdiagramm für zebra.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define ZFIX_TOP   29
 
#define ZFIX_BOTTOM   30
 

Funktionen

unsigned char clip8 (signed short x)
 
static void gui_osd_zebra_free ()
 
static int gui_osd_zebra_init (int show)
 
static void draw_pixel_buffered (unsigned int offset, color cl)
 
int draw_guard_pixel ()
 
static void gui_osd_draw_zebra_osd ()
 
static void disp_zebra ()
 
static int draw_zebra_aspect_adjust (int mrec, unsigned int f, color *cls)
 
static unsigned char get_cur_buf (unsigned int idx)
 
static int draw_zebra_no_aspect_adjust (int mrec, unsigned int f, color *cls)
 
int gui_osd_draw_zebra (int show)
 
int _module_unloader ()
 
int _module_can_unload ()
 

Variablen

static unsigned char * img_buf
 
static unsigned char * scr_buf
 
static unsigned char * cur_buf_top
 
static unsigned char * cur_buf_bot
 
static unsigned char * buf = NULL
 
static int buffer_size
 
static int timer = 0
 
static color cl_under
 
static color cl_over
 
libzebra_sym _libzebra
 
ModuleInfo _module_info
 

Makro-Dokumentation

#define ZFIX_BOTTOM   30

Definiert in Zeile 103 der Datei zebra.c.

#define ZFIX_TOP   29

Definiert in Zeile 102 der Datei zebra.c.

Dokumentation der Funktionen

int _module_can_unload ( )

Definiert in Zeile 770 der Datei zebra.c.

771 {
772  return conf.zebra_draw == 0;
773 }
int _module_unloader ( )

Definiert in Zeile 764 der Datei zebra.c.

765 {
767  return 0;
768 }
unsigned char clip8 ( signed short  x)

Definiert in Zeile 115 der Datei zebra.c.

115 { if (x<0) x=0; else if (x>255) x=255; return x; }
static void disp_zebra ( )
static

Definiert in Zeile 225 der Datei zebra.c.

226 {
227  // draw CHDK osd and histogram to buf[] (if enabled in config)
229 
230  // copy buf[] to both display buffers
231  if (buf != scr_buf)
234 }
int draw_guard_pixel ( )

Definiert in Zeile 192 der Datei zebra.c.

192  {
193  unsigned char* buffer1 = vid_get_bitmap_fb()+camera_screen.buffer_size/2;
194  unsigned char* buffer2 = buffer1+camera_screen.buffer_size;
195  int has_disappeared=0;
196 
197  if(*buffer1!=COLOR_GREEN) has_disappeared=1;
198  if(*buffer2!=COLOR_GREEN) has_disappeared=2;
199  *buffer1 = *buffer2 = COLOR_GREEN;
200  return has_disappeared;
201 }
static void draw_pixel_buffered ( unsigned int  offset,
color  cl 
)
static

Definiert in Zeile 186 der Datei zebra.c.

187 {
188  buf[offset] = cl;
189 }
static int draw_zebra_aspect_adjust ( int  mrec,
unsigned int  f,
color cls 
)
static

Definiert in Zeile 241 der Datei zebra.c.

242 {
243  int v, s, x, y, over;
244  static int need_restore=0;
245  int viewport_height;
246  int viewport_width;
247  int viewport_image_offset; // for when viewport memory buffer is wider than viewport
248  int viewport_row_offset; // for when viewport memory buffer is wider than viewport
249  int viewport_xoffset; // used when image size != viewport size
250  int viewport_yoffset; // used when image size != viewport size
251  int zebra_drawn=0;
252 
253  viewport_height = vid_get_viewport_height();
254  viewport_width = vid_get_viewport_width();
255  viewport_image_offset = vid_get_viewport_image_offset();
256  viewport_row_offset = vid_get_viewport_row_offset();
257  viewport_xoffset = vid_get_viewport_display_xoffset();
258  viewport_yoffset = vid_get_viewport_display_yoffset();
259 
260  // if not in no-zebra phase of blink mode zebra, draw zebra to buf[]
261  if (f) {
262  if (viewport_yoffset > 0) { // clear top & bottom areas of buffer if image height if smaller than viewport
264  memset(buf+(viewport_yoffset+viewport_height)*camera_screen.buffer_width, COLOR_TRANSPARENT, viewport_yoffset*camera_screen.buffer_width);
265  }
266  int step_x, step_v, sy, sx;
267  over = 255-conf.zebra_over;
268  if (conf.zebra_multichannel) {step_x=2; step_v=6;} else {step_x=1; step_v=3;}
269  for (y=viewport_yoffset, v=viewport_image_offset; y<viewport_yoffset+viewport_height; ++y) {
271  sx = viewport_xoffset;
272  if (viewport_xoffset > 0) { // clear left & right areas of buffer if image width if smaller than viewport
273  memset(buf+sy, COLOR_TRANSPARENT, sx*2);
274  memset(buf+sy+(sx+viewport_width)*2, COLOR_TRANSPARENT, sx*2);
275  }
276  for (x=viewport_xoffset; x<viewport_xoffset+viewport_width; x+=step_x, sx+=step_x, v+=step_v) {
277  register int yy;
278  yy = img_buf[v+1];
279  s = sy + sx*2;
280 
281  if (conf.zebra_multichannel) {
282  register int uu, vv;
283  int sel;
284  uu = (signed char)img_buf[v];
285  vv = (signed char)img_buf[v+2];
286  sel=0;
288  if (clip8(((yy<<12) + vv*5743 + 2048)>>12)>over) sel = 4; // R
289  if (clip8(((yy<<12) - uu*1411 - vv*2925 + 2048)>>12)>over) sel |= 2; // G
290  if (clip8(((yy<<12) + uu*7258 + 2048)>>12)>over) sel |= 1; // B
291  }
292  buf[s] = buf[s+1] = cls[sel];
293  buf[s+2] = buf[s+3] = cls[sel];
294  }
295  else if (((conf.zebra_mode == ZEBRA_MODE_ZEBRA_1 || conf.zebra_mode == ZEBRA_MODE_ZEBRA_2) && (y-x-timer)&f))
296  buf[s] = buf[s+1] = COLOR_TRANSPARENT;
297  else
298  buf[s] = buf[s+1] = (yy>over)?cl_over:(yy<conf.zebra_under)?cl_under:COLOR_TRANSPARENT;
299 
300  if (buf[s] != COLOR_TRANSPARENT && !zebra_drawn)
301  zebra_drawn = 1;
302  }
303  // adjust for cases where buffer is wider than viewport (e.g. on G12)
304  v += viewport_row_offset;
305  }
306  if (!zebra_drawn) f=0;
307  }
308  // if blink mode is in no-zebra phase OR if there was no over/underexposed pixels to draw zebra on
309  if (!f) {
310  // if zebra was drawn during previous call of this function
311  if (need_restore) {
314  } else { // clear buf[] of zebra, only leave Canon OSD
315  if (!mrec) { // Not REC mode
316  // No Canon OSD restore, fill buf[] with transparent color:
318  }
319  disp_zebra();
320  }
321  need_restore=0;
322  }
324  // if zebra was drawn
325  } else {
326  disp_zebra();
327 
328  need_restore=1;
329  return 1;
330  }
331  return 0;
332 }
static int draw_zebra_no_aspect_adjust ( int  mrec,
unsigned int  f,
color cls 
)
static

Definiert in Zeile 350 der Datei zebra.c.

350  {
351  int v, s, x, y, over;
352  static int need_restore=0;
353  int viewport_height;
354  int zebra_drawn=0;
355 
356  unsigned bWide = 1; // if wide (16:9) or standard (4:3) aspect ratio (but 1 in cameras that only have 4:3)
357  unsigned aspOffset = 0; // offset to add to x-coord (or buffer address) when drawing zebra
358 
360  {
361  if (shooting_get_prop(camera_info.props.aspect_ratio) == 0) // standard requires x-shift to overlay drawing
362  {
363  bWide = 0;
364  //aspOffset = (camera_screen.width - (camera_screen.width * 12 / 16)) / 2; // = actual calculation, simplified below
365  aspOffset = camera_screen.width / 8; // half of the difference in width between equal height 16:9 and 4:3 screens, = black bar width
366  }
367  }
368 
369  viewport_height = vid_get_viewport_height();
370 
371  // if not in no-zebra phase of blink mode zebra, draw zebra to buf[]
372  if (f) {
373  int step_x, step_v;
374  over = 255-conf.zebra_over;
375  if (conf.zebra_multichannel) {step_x=2; step_v=6;} else {step_x=1; step_v=3;}
376  s = aspOffset;
377  for (y=1, v=0; y<=viewport_height; ++y) {
378  for (x=0; x<camera_screen.width; x+=step_x, s+=step_x, v+=step_v) {
379  register int yy, uu, vv;
380  int sel;
381 
382  if (!bWide && (x + aspOffset >= camera_screen.width - aspOffset)) continue; // do not draw "outside screen"
383 
384  yy = img_buf[v+1];
385  if (conf.zebra_multichannel) {
386  uu = (signed char)img_buf[v];
387  vv = (signed char)img_buf[v+2];
388  sel=0;
390  if (clip8(((yy<<12) + vv*5743 + 2048)>>12)>over) sel = 4; // R
391  if (clip8(((yy<<12) - uu*1411 - vv*2925 + 2048)>>12)>over) sel |= 2; // G
392  if (clip8(((yy<<12) + uu*7258 + 2048)>>12)>over) sel |= 1; // B
393  }
394  buf[s]=buf[s+1]=cls[sel];
395  }
397  else buf[s]=(yy>over)?cl_over:(yy<conf.zebra_under)?cl_under:COLOR_TRANSPARENT;
398  if (buf[s] != COLOR_TRANSPARENT && !zebra_drawn) zebra_drawn = 1;
399  if (mrec) {
400  // draw Canon OSD to buf[] if in REC mode
403  }
404  }
409  }
410  }
411  if (!zebra_drawn) f=0;
412  }
413  // if blink mode is in no-zebra phase OR if there was no over/underexposed pixels to draw zebra on
414  if (!f) {
415  // if zebra was drawn during previous call of this function
416  if (need_restore) {
419  } else { // clear buf[] of zebra, only leave Canon OSD
420  if (mrec) { // REC mode
421  // copy rescued Canon OSD to buf[] top/bottom parts and fill center with transparent color:
426  }
427  } else { // Not REC mode
428  // No Canon OSD restore, fill buf[] with transparent color:
430  }
431  disp_zebra();
432  }
433  need_restore=0;
434  }
436  // if zebra was drawn
437  } else {
438  disp_zebra();
439 
440  need_restore=1;
441  return 1;
442  }
443  return 0;
444 }
static unsigned char get_cur_buf ( unsigned int  idx)
static

Definiert in Zeile 336 der Datei zebra.c.

336  {
337  unsigned int a;
338 
340 
341  if (idx < (unsigned)camera_screen.buffer_width * ZFIX_TOP) return(cur_buf_top[idx]);
342  if (idx >= a && idx < (unsigned)camera_screen.buffer_size) return(cur_buf_bot[idx - a]);
343  return (COLOR_TRANSPARENT);
344 }
int gui_osd_draw_zebra ( int  show)

Definiert in Zeile 447 der Datei zebra.c.

448 {
449  unsigned int f;
450 
451  if (!gui_osd_zebra_init(show))
452  return 0;
453 
454  color cls[] = {
456  COLOR_BLUE,
457  COLOR_GREEN,
458  COLOR_CYAN,
459  COLOR_RED,
461  COLOR_YELLOW,
463  };
464 
466  if (!img_buf) return 0;
467 
468  if (timer==0)
469  {
471  timer = 1;
472  return 0;
473  }
474 
475  if (timer==1)
476  {
477  int ready;
478  static int n=0;
479  if (!camera_info.state.mode_rec) ready=1;
480  else get_property_case(camera_info.props.shooting, &ready, 4);
481  n=draw_guard_pixel(); // will be 0 in PLAY mode, should be 1 or 2 in REC mode.
482  if(!ready) return 0;
483  if (cur_buf_top)
484  {
485  // rescue Canon OSD from scr_buf to cur_buf_top and _bot:
486  if (n==1) {
489  }
490  else {
493  }
494  }
495  }
496  ++timer;
497 
498  switch (conf.zebra_mode)
499  {
500  case ZEBRA_MODE_ZEBRA_1: f = 4; break;
501  case ZEBRA_MODE_ZEBRA_2: f = 8; break;
502  case ZEBRA_MODE_SOLID: f = 1; break;
503  case ZEBRA_MODE_BLINKED_1: f = timer&1; break;
504  case ZEBRA_MODE_BLINKED_3: f = timer&4; break;
505  case ZEBRA_MODE_BLINKED_2:
506  default: f = timer&2; break;
507  }
508 
510  return draw_zebra_aspect_adjust(camera_info.state.mode_rec,f,cls); // For newer cameras with 720/960 pixel wide screen
511  else
512  return draw_zebra_no_aspect_adjust(camera_info.state.mode_rec,f,cls); // For older cameras with 360/480 pixel wide screen
513 }
static void gui_osd_draw_zebra_osd ( )
static

Definiert in Zeile 204 der Datei zebra.c.

204  {
205  switch (conf.zebra_draw_osd) {
206  case ZEBRA_DRAW_NONE:
207  break;
208  case ZEBRA_DRAW_OSD:
209  if (conf.show_osd) {
213  }
214  /* no break here */
215  case ZEBRA_DRAW_HISTO:
216  default:
220  break;
221  }
222 }
static void gui_osd_zebra_free ( )
static

Definiert in Zeile 120 der Datei zebra.c.

121 {
122  if (buf != scr_buf) free(buf);
123  buf = NULL;
124 
125  free(cur_buf_top);
126  cur_buf_top = NULL;
127 
128  free(cur_buf_bot);
129  cur_buf_bot = NULL;
130 }
static int gui_osd_zebra_init ( int  show)
static

Definiert in Zeile 133 der Datei zebra.c.

134 {
137 
138  if (show)
139  {
140  if (!buf)
141  {
142  timer = 0;
143  // Determine bitmap buffer size. If physical buffer is taller than displayed height then ignore bottom strip - (used to be ZEBRA_HMARGIN0).
146  if (camera_screen.zebra_nobuf == 0)
147  {
149  //gui_mbox_init(LANG_WARNING, (int)"No space to allocate zebra buffer: restart camera", MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
150  }
151  if (!buf)
152  {
153  buf = scr_buf; //without new buffer: directly into screen buffer: we got some flickering in OSD and histogram but it's usable
154  }
156  {
157  cur_buf_top = cur_buf_bot = 0;
158  }
159  else
160  {
163  // cleanup and disable zebra if any mallocs failed
164  if (!cur_buf_top || !cur_buf_bot)
168  }
169  // in variable aspect, the borders would never be cleared
172  }
173  }
174  else {
175  if (buf) // if zebra was previously on, restore
177 
179  }
180  return (buf != NULL);
181 }

Variablen-Dokumentation

libzebra_sym _libzebra
Initialisierung:

Definiert in Zeile 777 der Datei zebra.c.

ModuleInfo _module_info
Initialisierung:

Definiert in Zeile 786 der Datei zebra.c.

unsigned char* buf = NULL
static

Definiert in Zeile 109 der Datei zebra.c.

int buffer_size
static

Definiert in Zeile 110 der Datei zebra.c.

color cl_over
static

Definiert in Zeile 113 der Datei zebra.c.

color cl_under
static

Definiert in Zeile 113 der Datei zebra.c.

unsigned char * cur_buf_bot
static

Definiert in Zeile 108 der Datei zebra.c.

unsigned char* cur_buf_top
static

Definiert in Zeile 108 der Datei zebra.c.

unsigned char* img_buf
static

Definiert in Zeile 105 der Datei zebra.c.

unsigned char* scr_buf
static

Definiert in Zeile 107 der Datei zebra.c.

int timer = 0
static

Definiert in Zeile 112 der Datei zebra.c.