Commit f102b577 authored by Rafaël Carré's avatar Rafaël Carré

Same for lxdialog and xvmc

parent d6008a8b
...@@ -30,7 +30,7 @@ static int list_width, check_x, item_x, checkflag; ...@@ -30,7 +30,7 @@ static int list_width, check_x, item_x, checkflag;
*/ */
static void static void
print_item (WINDOW * win, const char *item, int status, print_item (WINDOW * win, const char *item, int status,
int choice, int selected) int choice, int selected)
{ {
int i; int i;
...@@ -38,22 +38,22 @@ print_item (WINDOW * win, const char *item, int status, ...@@ -38,22 +38,22 @@ print_item (WINDOW * win, const char *item, int status,
wattrset (win, menubox_attr); wattrset (win, menubox_attr);
wmove (win, choice, 0); wmove (win, choice, 0);
for (i = 0; i < list_width; i++) for (i = 0; i < list_width; i++)
waddch (win, ' '); waddch (win, ' ');
wmove (win, choice, check_x); wmove (win, choice, check_x);
wattrset (win, selected ? check_selected_attr : check_attr); wattrset (win, selected ? check_selected_attr : check_attr);
if (checkflag == FLAG_CHECK) if (checkflag == FLAG_CHECK)
wprintw (win, "[%c]", status ? 'X' : ' '); wprintw (win, "[%c]", status ? 'X' : ' ');
else else
wprintw (win, "(%c)", status ? 'X' : ' '); wprintw (win, "(%c)", status ? 'X' : ' ');
wattrset (win, selected ? tag_selected_attr : tag_attr); wattrset (win, selected ? tag_selected_attr : tag_attr);
mvwaddch(win, choice, item_x, item[0]); mvwaddch(win, choice, item_x, item[0]);
wattrset (win, selected ? item_selected_attr : item_attr); wattrset (win, selected ? item_selected_attr : item_attr);
waddstr (win, (char *)item+1); waddstr (win, (char *)item+1);
if (selected) { if (selected) {
wmove (win, choice, check_x+1); wmove (win, choice, check_x+1);
wrefresh (win); wrefresh (win);
} }
} }
...@@ -62,37 +62,37 @@ print_item (WINDOW * win, const char *item, int status, ...@@ -62,37 +62,37 @@ print_item (WINDOW * win, const char *item, int status,
*/ */
static void static void
print_arrows (WINDOW * win, int choice, int item_no, int scroll, print_arrows (WINDOW * win, int choice, int item_no, int scroll,
int y, int x, int height) int y, int x, int height)
{ {
wmove(win, y, x); wmove(win, y, x);
if (scroll > 0) { if (scroll > 0) {
wattrset (win, uarrow_attr); wattrset (win, uarrow_attr);
waddch (win, ACS_UARROW); waddch (win, ACS_UARROW);
waddstr (win, "(-)"); waddstr (win, "(-)");
} }
else { else {
wattrset (win, menubox_attr); wattrset (win, menubox_attr);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
} }
y = y + height + 1; y = y + height + 1;
wmove(win, y, x); wmove(win, y, x);
if ((height < item_no) && (scroll + choice < item_no - 1)) { if ((height < item_no) && (scroll + choice < item_no - 1)) {
wattrset (win, darrow_attr); wattrset (win, darrow_attr);
waddch (win, ACS_DARROW); waddch (win, ACS_DARROW);
waddstr (win, "(+)"); waddstr (win, "(+)");
} }
else { else {
wattrset (win, menubox_border_attr); wattrset (win, menubox_border_attr);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
} }
} }
...@@ -118,8 +118,8 @@ print_buttons( WINDOW *dialog, int height, int width, int selected) ...@@ -118,8 +118,8 @@ print_buttons( WINDOW *dialog, int height, int width, int selected)
*/ */
int int
dialog_checklist (const char *title, const char *prompt, int height, int width, dialog_checklist (const char *title, const char *prompt, int height, int width,
int list_height, int item_no, const char * const * items, int flag) int list_height, int item_no, const char * const * items, int flag)
{ {
int i, x, y, box_x, box_y; int i, x, y, box_x, box_y;
int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status; int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
...@@ -129,16 +129,16 @@ dialog_checklist (const char *title, const char *prompt, int height, int width, ...@@ -129,16 +129,16 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
/* Allocate space for storing item on/off status */ /* Allocate space for storing item on/off status */
if ((status = malloc (sizeof (int) * item_no)) == NULL) { if ((status = malloc (sizeof (int) * item_no)) == NULL) {
endwin (); endwin ();
fprintf (stderr, fprintf (stderr,
"\nCan't allocate memory in dialog_checklist().\n"); "\nCan't allocate memory in dialog_checklist().\n");
exit (-1); exit (-1);
} }
/* Initializes status */ /* Initializes status */
for (i = 0; i < item_no; i++) { for (i = 0; i < item_no; i++) {
status[i] = !strcasecmp (items[i * 3 + 2], "on"); status[i] = !strcasecmp (items[i * 3 + 2], "on");
if (!choice && status[i]) if (!choice && status[i])
choice = i; choice = i;
} }
...@@ -157,23 +157,23 @@ dialog_checklist (const char *title, const char *prompt, int height, int width, ...@@ -157,23 +157,23 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
wattrset (dialog, border_attr); wattrset (dialog, border_attr);
mvwaddch (dialog, height-3, 0, ACS_LTEE); mvwaddch (dialog, height-3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch (dialog, ACS_HLINE); waddch (dialog, ACS_HLINE);
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
waddch (dialog, ACS_RTEE); waddch (dialog, ACS_RTEE);
if (title != NULL && strlen(title) >= width-2 ) { if (title != NULL && strlen(title) >= width-2 ) {
/* truncate long title -- mec */ /* truncate long title -- mec */
char * title2 = malloc(width-2+1); char * title2 = malloc(width-2+1);
memcpy( title2, title, width-2 ); memcpy( title2, title, width-2 );
title2[width-2] = '\0'; title2[width-2] = '\0';
title = title2; title = title2;
} }
if (title != NULL) { if (title != NULL) {
wattrset (dialog, title_attr); wattrset (dialog, title_attr);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
waddstr (dialog, (char *)title); waddstr (dialog, (char *)title);
waddch (dialog, ' '); waddch (dialog, ' ');
} }
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
...@@ -190,29 +190,29 @@ dialog_checklist (const char *title, const char *prompt, int height, int width, ...@@ -190,29 +190,29 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
/* draw a box around the list items */ /* draw a box around the list items */
draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2, draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2,
menubox_border_attr, menubox_attr); menubox_border_attr, menubox_attr);
/* Find length of longest item in order to center checklist */ /* Find length of longest item in order to center checklist */
check_x = 0; check_x = 0;
for (i = 0; i < item_no; i++) for (i = 0; i < item_no; i++)
check_x = MAX (check_x, + strlen (items[i * 3 + 1]) + 4); check_x = MAX (check_x, + strlen (items[i * 3 + 1]) + 4);
check_x = (list_width - check_x) / 2; check_x = (list_width - check_x) / 2;
item_x = check_x + 4; item_x = check_x + 4;
if (choice >= list_height) { if (choice >= list_height) {
scroll = choice - list_height + 1; scroll = choice - list_height + 1;
choice -= scroll; choice -= scroll;
} }
/* Print the list */ /* Print the list */
for (i = 0; i < max_choice; i++) { for (i = 0; i < max_choice; i++) {
print_item (list, items[(scroll+i) * 3 + 1], print_item (list, items[(scroll+i) * 3 + 1],
status[i+scroll], i, i == choice); status[i+scroll], i, i == choice);
} }
print_arrows(dialog, choice, item_no, scroll, print_arrows(dialog, choice, item_no, scroll,
box_y, box_x + check_x + 5, list_height); box_y, box_x + check_x + 5, list_height);
print_buttons(dialog, height, width, 0); print_buttons(dialog, height, width, 0);
...@@ -221,149 +221,149 @@ dialog_checklist (const char *title, const char *prompt, int height, int width, ...@@ -221,149 +221,149 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
doupdate (); doupdate ();
while (key != ESC) { while (key != ESC) {
key = wgetch (dialog); key = wgetch (dialog);
for (i = 0; i < max_choice; i++) for (i = 0; i < max_choice; i++)
if (toupper(key) == toupper(items[(scroll+i)*3+1][0])) if (toupper(key) == toupper(items[(scroll+i)*3+1][0]))
break; break;
if ( i < max_choice || key == KEY_UP || key == KEY_DOWN || if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
key == '+' || key == '-' ) { key == '+' || key == '-' ) {
if (key == KEY_UP || key == '-') { if (key == KEY_UP || key == '-') {
if (!choice) { if (!choice) {
if (!scroll) if (!scroll)
continue; continue;
/* Scroll list down */ /* Scroll list down */
if (list_height > 1) { if (list_height > 1) {
/* De-highlight current first item */ /* De-highlight current first item */
print_item (list, items[scroll * 3 + 1], print_item (list, items[scroll * 3 + 1],
status[scroll], 0, FALSE); status[scroll], 0, FALSE);
scrollok (list, TRUE); scrollok (list, TRUE);
wscrl (list, -1); wscrl (list, -1);
scrollok (list, FALSE); scrollok (list, FALSE);
}
scroll--;
print_item (list, items[scroll * 3 + 1],
status[scroll], 0, TRUE);
wnoutrefresh (list);
print_arrows(dialog, choice, item_no, scroll,
box_y, box_x + check_x + 5, list_height);
wrefresh (dialog);
continue; /* wait for another key press */
} else
i = choice - 1;
} else if (key == KEY_DOWN || key == '+') {
if (choice == max_choice - 1) {
if (scroll + choice >= item_no - 1)
continue;
/* Scroll list up */
if (list_height > 1) {
/* De-highlight current last item before scrolling up */
print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
status[scroll + max_choice - 1],
max_choice - 1, FALSE);
scrollok (list, TRUE);
scroll (list);
scrollok (list, FALSE);
}
scroll++;
print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
status[scroll + max_choice - 1],
max_choice - 1, TRUE);
wnoutrefresh (list);
print_arrows(dialog, choice, item_no, scroll,
box_y, box_x + check_x + 5, list_height);
wrefresh (dialog);
continue; /* wait for another key press */
} else
i = choice + 1;
}
if (i != choice) {
/* De-highlight current item */
print_item (list, items[(scroll + choice) * 3 + 1],
status[scroll + choice], choice, FALSE);
/* Highlight new item */
choice = i;
print_item (list, items[(scroll + choice) * 3 + 1],
status[scroll + choice], choice, TRUE);
wnoutrefresh (list);
wrefresh (dialog);
}
continue; /* wait for another key press */
}
switch (key) {
case 'H':
case 'h':
case '?':
delwin (dialog);
free (status);
return 1;
case TAB:
case KEY_LEFT:
case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 1 : (button > 1 ? 0 : button);
print_buttons(dialog, height, width, button);
wrefresh (dialog);
break;
case 'S':
case 's':
case ' ':
case '\n':
if (!button) {
if (flag == FLAG_CHECK) {
status[scroll + choice] = !status[scroll + choice];
wmove (list, choice, check_x);
wattrset (list, check_selected_attr);
wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' ');
} else {
if (!status[scroll + choice]) {
for (i = 0; i < item_no; i++)
status[i] = 0;
status[scroll + choice] = 1;
for (i = 0; i < max_choice; i++)
print_item (list, items[(scroll + i) * 3 + 1],
status[scroll + i], i, i == choice);
}
}
wnoutrefresh (list);
wrefresh (dialog);
for (i = 0; i < item_no; i++) {
if (status[i]) {
if (flag == FLAG_CHECK) {
fprintf (stderr, "\"%s\" ", items[i * 3]);
} else {
fprintf (stderr, "%s", items[i * 3]);
}
}
}
} }
scroll--; delwin (dialog);
print_item (list, items[scroll * 3 + 1], free (status);
status[scroll], 0, TRUE); return button;
wnoutrefresh (list); case 'X':
case 'x':
print_arrows(dialog, choice, item_no, scroll, key = ESC;
box_y, box_x + check_x + 5, list_height); case ESC:
break;
wrefresh (dialog); }
continue; /* wait for another key press */ /* Now, update everything... */
} else doupdate ();
i = choice - 1;
} else if (key == KEY_DOWN || key == '+') {
if (choice == max_choice - 1) {
if (scroll + choice >= item_no - 1)
continue;
/* Scroll list up */
if (list_height > 1) {
/* De-highlight current last item before scrolling up */
print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
status[scroll + max_choice - 1],
max_choice - 1, FALSE);
scrollok (list, TRUE);
scroll (list);
scrollok (list, FALSE);
}
scroll++;
print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
status[scroll + max_choice - 1],
max_choice - 1, TRUE);
wnoutrefresh (list);
print_arrows(dialog, choice, item_no, scroll,
box_y, box_x + check_x + 5, list_height);
wrefresh (dialog);
continue; /* wait for another key press */
} else
i = choice + 1;
}
if (i != choice) {
/* De-highlight current item */
print_item (list, items[(scroll + choice) * 3 + 1],
status[scroll + choice], choice, FALSE);
/* Highlight new item */
choice = i;
print_item (list, items[(scroll + choice) * 3 + 1],
status[scroll + choice], choice, TRUE);
wnoutrefresh (list);
wrefresh (dialog);
}
continue; /* wait for another key press */
} }
switch (key) {
case 'H':
case 'h':
case '?':
delwin (dialog);
free (status);
return 1;
case TAB:
case KEY_LEFT:
case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 1 : (button > 1 ? 0 : button);
print_buttons(dialog, height, width, button);
wrefresh (dialog);
break;
case 'S':
case 's':
case ' ':
case '\n':
if (!button) {
if (flag == FLAG_CHECK) {
status[scroll + choice] = !status[scroll + choice];
wmove (list, choice, check_x);
wattrset (list, check_selected_attr);
wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' ');
} else {
if (!status[scroll + choice]) {
for (i = 0; i < item_no; i++)
status[i] = 0;
status[scroll + choice] = 1;
for (i = 0; i < max_choice; i++)
print_item (list, items[(scroll + i) * 3 + 1],
status[scroll + i], i, i == choice);
}
}
wnoutrefresh (list);
wrefresh (dialog);
for (i = 0; i < item_no; i++) {
if (status[i]) {
if (flag == FLAG_CHECK) {
fprintf (stderr, "\"%s\" ", items[i * 3]);
} else {
fprintf (stderr, "%s", items[i * 3]);
}
}
}
}
delwin (dialog);
free (status);
return button;
case 'X':
case 'x':
key = ESC;
case ESC:
break;
}
/* Now, update everything... */
doupdate ();
}
delwin (dialog); delwin (dialog);
free (status); free (status);
return -1; /* ESC pressed */ return -1; /* ESC pressed */
} }
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
#define ACS_DARROW 'v' #define ACS_DARROW 'v'
#endif #endif
/* /*
* Attribute names * Attribute names
*/ */
#define screen_attr attributes[0] #define screen_attr attributes[0]
...@@ -146,23 +146,23 @@ void color_setup (void); ...@@ -146,23 +146,23 @@ void color_setup (void);
void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x); void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x);
void print_button (WINDOW * win, const char *label, int y, int x, int selected); void print_button (WINDOW * win, const char *label, int y, int x, int selected);
void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box, void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box,
chtype border); chtype border);
void draw_shadow (WINDOW * win, int y, int x, int height, int width); void draw_shadow (WINDOW * win, int y, int x, int height, int width);
int first_alpha (const char *string, const char *exempt); int first_alpha (const char *string, const char *exempt);
int dialog_yesno (const char *title, const char *prompt, int height, int width); int dialog_yesno (const char *title, const char *prompt, int height, int width);
int dialog_msgbox (const char *title, const char *prompt, int height, int dialog_msgbox (const char *title, const char *prompt, int height,
int width, int pause); int width, int pause);
int dialog_textbox (const char *title, const char *file, int height, int width); int dialog_textbox (const char *title, const char *file, int height, int width);
int dialog_menu (const char *title, const char *prompt, int height, int width, int dialog_menu (const char *title, const char *prompt, int height, int width,
int menu_height, const char *choice, int item_no, int menu_height, const char *choice, int item_no,
const char * const * items); const char * const * items);
int dialog_checklist (const char *title, const char *prompt, int height, int dialog_checklist (const char *title, const char *prompt, int height,
int width, int list_height, int item_no, int width, int list_height, int item_no,
const char * const * items, int flag); const char * const * items, int flag);
extern unsigned char dialog_input_result[]; extern unsigned char dialog_input_result[];
int dialog_inputbox (const char *title, const char *prompt, int height, int dialog_inputbox (const char *title, const char *prompt, int height,
int width, const char *init); int width, const char *init);
/* /*
* This is the base for fictitious keys, which activate * This is the base for fictitious keys, which activate
......
...@@ -44,7 +44,7 @@ print_buttons(WINDOW *dialog, int height, int width, int selected) ...@@ -44,7 +44,7 @@ print_buttons(WINDOW *dialog, int height, int width, int selected)
*/ */
int int
dialog_inputbox (const char *title, const char *prompt, int height, int width, dialog_inputbox (const char *title, const char *prompt, int height, int width,
const char *init) const char *init)
{ {
int i, x, y, box_y, box_x, box_width; int i, x, y, box_y, box_x, box_width;
int input_x = 0, scroll = 0, key = 0, button = -1; int input_x = 0, scroll = 0, key = 0, button = -1;
...@@ -65,23 +65,23 @@ dialog_inputbox (const char *title, const char *prompt, int height, int width, ...@@ -65,23 +65,23 @@ dialog_inputbox (const char *title, const char *prompt, int height, int width,
wattrset (dialog, border_attr); wattrset (dialog, border_attr);
mvwaddch (dialog, height-3, 0, ACS_LTEE); mvwaddch (dialog, height-3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch (dialog, ACS_HLINE); waddch (dialog, ACS_HLINE);
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
waddch (dialog, ACS_RTEE); waddch (dialog, ACS_RTEE);
if (title != NULL && strlen(title) >= width-2 ) { if (title != NULL && strlen(title) >= width-2 ) {
/* truncate long title -- mec */ /* truncate long title -- mec */
char * title2 = malloc(width-2+1); char * title2 = malloc(width-2+1);
memcpy( title2, title, width-2 ); memcpy( title2, title, width-2 );
title2[width-2] = '\0'; title2[width-2] = '\0';
title = title2; title = title2;
} }
if (title != NULL) { if (title != NULL) {
wattrset (dialog, title_attr); wattrset (dialog, title_attr);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
waddstr (dialog, (char *)title); waddstr (dialog, (char *)title);
waddch (dialog, ' '); waddch (dialog, ' ');
} }
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
...@@ -93,7 +93,7 @@ dialog_inputbox (const char *title, const char *prompt, int height, int width, ...@@ -93,7 +93,7 @@ dialog_inputbox (const char *title, const char *prompt, int height, int width,
box_y = y + 2; box_y = y + 2;
box_x = (width - box_width) / 2; box_x = (width - box_width) / 2;
draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2, draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2,
border_attr, dialog_attr); border_attr, dialog_attr);
print_buttons(dialog, height, width, 0); print_buttons(dialog, height, width, 0);
...@@ -102,139 +102,139 @@ dialog_inputbox (const char *title, const char *prompt, int height, int width, ...@@ -102,139 +102,139 @@ dialog_inputbox (const char *title, const char *prompt, int height, int width,
wattrset (dialog, inputbox_attr); wattrset (dialog, inputbox_attr);
if (!init) if (!init)
instr[0] = '\0'; instr[0] = '\0';
else else
strcpy (instr, init); strcpy (instr, init);
input_x = strlen (instr); input_x = strlen (instr);
if (input_x >= box_width) { if (input_x >= box_width) {
scroll = input_x - box_width + 1; scroll = input_x - box_width + 1;
input_x = box_width - 1; input_x = box_width - 1;
for (i = 0; i < box_width - 1; i++) for (i = 0; i < box_width - 1; i++)
waddch (dialog, instr[scroll + i]); waddch (dialog, instr[scroll + i]);
} else } else
waddstr (dialog, instr); waddstr (dialog, instr);
wmove (dialog, box_y, box_x + input_x); wmove (dialog, box_y, box_x + input_x);
wrefresh (dialog); wrefresh (dialog);
while (key != ESC) { while (key != ESC) {
key = wgetch (dialog); key = wgetch (dialog);
if (button == -1) { /* Input box selected */ if (button == -1) { /* Input box selected */
switch (key) { switch (key) {
case TAB: case TAB:
case KEY_UP: case KEY_UP:
case KEY_DOWN: case KEY_DOWN:
break; break;
case KEY_LEFT: case KEY_LEFT:
continue; continue;
case KEY_RIGHT: case KEY_RIGHT:
continue; continue;
case KEY_BACKSPACE: case KEY_BACKSPACE:
case 127: case 127:
if (input_x || scroll) { if (input_x || scroll) {
wattrset (dialog, inputbox_attr); wattrset (dialog, inputbox_attr);
if (!input_x) { if (!input_x) {
scroll = scroll < box_width - 1 ? scroll = scroll < box_width - 1 ?
0 : scroll - (box_width - 1); 0 : scroll - (box_width - 1);
wmove (dialog, box_y, box_x); wmove (dialog, box_y, box_x);
for (i = 0; i < box_width; i++) for (i = 0; i < box_width; i++)
waddch (dialog, instr[scroll + input_x + i] ? waddch (dialog, instr[scroll + input_x + i] ?
instr[scroll + input_x + i] : ' '); instr[scroll + input_x + i] : ' ');
input_x = strlen (instr) - scroll; input_x = strlen (instr) - scroll;
} else } else
input_x--; input_x--;
instr[scroll + input_x] = '\0'; instr[scroll + input_x] = '\0';
mvwaddch (dialog, box_y, input_x + box_x, ' '); mvwaddch (dialog, box_y, input_x + box_x, ' ');
wmove (dialog, box_y, input_x + box_x); wmove (dialog, box_y, input_x + box_x);
wrefresh (dialog); wrefresh (dialog);
} }
continue; continue;
default: default:
if (key < 0x100 && isprint (key)) { if (key < 0x100 && isprint (key)) {
if (scroll + input_x < MAX_LEN) { if (scroll + input_x < MAX_LEN) {
wattrset (dialog, inputbox_attr); wattrset (dialog, inputbox_attr);
instr[scroll + input_x] = key; instr[scroll + input_x] = key;
instr[scroll + input_x + 1] = '\0'; instr[scroll + input_x + 1] = '\0';
if (input_x == box_width - 1) { if (input_x == box_width - 1) {
scroll++; scroll++;
wmove (dialog, box_y, box_x); wmove (dialog, box_y, box_x);
for (i = 0; i < box_width - 1; i++) for (i = 0; i < box_width - 1; i++)
waddch (dialog, instr[scroll + i]); waddch (dialog, instr[scroll + i]);
} else { } else {
wmove (dialog, box_y, input_x++ + box_x); wmove (dialog, box_y, input_x++ + box_x);
waddch (dialog, key); waddch (dialog, key);
} }
wrefresh (dialog); wrefresh (dialog);
} else } else
flash (); /* Alarm user about overflow */ flash (); /* Alarm user about overflow */
continue; continue;
} }
} }
} }
switch (key) { switch (key) {
case 'O': case 'O':
case 'o': case 'o':
delwin (dialog); delwin (dialog);
return 0; return 0;
case 'H': case 'H':
case 'h': case 'h':
delwin (dialog); delwin (dialog);
return 1; return 1;
case KEY_UP: case KEY_UP:
case KEY_LEFT: case KEY_LEFT:
switch (button) { switch (button) {
case -1: case -1:
button = 1; /* Indicates "Cancel" button is selected */ button = 1; /* Indicates "Cancel" button is selected */
print_buttons(dialog, height, width, 1); print_buttons(dialog, height, width, 1);
break; break;
case 0: case 0:
button = -1; /* Indicates input box is selected */ button = -1; /* Indicates input box is selected */
print_buttons(dialog, height, width, 0); print_buttons(dialog, height, width, 0);
wmove (dialog, box_y, box_x + input_x); wmove (dialog, box_y, box_x + input_x);
wrefresh (dialog); wrefresh (dialog);
break; break;
case 1: case 1:
button = 0; /* Indicates "OK" button is selected */ button = 0; /* Indicates "OK" button is selected */
print_buttons(dialog, height, width, 0); print_buttons(dialog, height, width, 0);
break; break;
} }
break; break;
case TAB: case TAB:
case KEY_DOWN: case KEY_DOWN:
case KEY_RIGHT: case KEY_RIGHT:
switch (button) { switch (button) {
case -1: case -1:
button = 0; /* Indicates "OK" button is selected */ button = 0; /* Indicates "OK" button is selected */
print_buttons(dialog, height, width, 0); print_buttons(dialog, height, width, 0);
break; break;
case 0: case 0:
button = 1; /* Indicates "Cancel" button is selected */ button = 1; /* Indicates "Cancel" button is selected */
print_buttons(dialog, height, width, 1); print_buttons(dialog, height, width, 1);
break; break;
case 1: case 1:
button = -1; /* Indicates input box is selected */ button = -1; /* Indicates input box is selected */
print_buttons(dialog, height, width, 0); print_buttons(dialog, height, width, 0);
wmove (dialog, box_y, box_x + input_x); wmove (dialog, box_y, box_x + input_x);
wrefresh (dialog); wrefresh (dialog);
break; break;
} }
break; break;
case ' ': case ' ':
case '\n': case '\n':
delwin (dialog); delwin (dialog);
return (button == -1 ? 0 : button); return (button == -1 ? 0 : button);
case 'X': case 'X':
case 'x': case 'x':
key = ESC; key = ESC;
case ESC: case ESC:
break; break;
} }
} }
delwin (dialog); delwin (dialog);
return -1; /* ESC pressed */ return -1; /* ESC pressed */
} }
...@@ -67,19 +67,19 @@ main (int argc, const char * const * argv) ...@@ -67,19 +67,19 @@ main (int argc, const char * const * argv)
trace(TRACE_CALLS|TRACE_UPDATE); trace(TRACE_CALLS|TRACE_UPDATE);
#endif #endif
if (argc < 2) { if (argc < 2) {
Usage (argv[0]); Usage (argv[0]);
exit (-1); exit (-1);
} }
while (offset < argc - 1 && !end_common_opts) { /* Common options */ while (offset < argc - 1 && !end_common_opts) { /* Common options */
if (!strcmp (argv[offset + 1], "--title")) { if (!strcmp (argv[offset + 1], "--title")) {
if (argc - offset < 3 || title != NULL) { if (argc - offset < 3 || title != NULL) {
Usage (argv[0]); Usage (argv[0]);
exit (-1); exit (-1);
} else { } else {
title = argv[offset + 2]; title = argv[offset + 2];
offset += 2; offset += 2;
} }
} else if (!strcmp (argv[offset + 1], "--backtitle")) { } else if (!strcmp (argv[offset + 1], "--backtitle")) {
if (backtitle != NULL) { if (backtitle != NULL) {
Usage (argv[0]); Usage (argv[0]);
...@@ -88,48 +88,48 @@ main (int argc, const char * const * argv) ...@@ -88,48 +88,48 @@ main (int argc, const char * const * argv)
backtitle = argv[offset + 2]; backtitle = argv[offset + 2];
offset += 2; offset += 2;
} }
} else if (!strcmp (argv[offset + 1], "--clear")) { } else if (!strcmp (argv[offset + 1], "--clear")) {
if (clear_screen) { /* Hey, "--clear" can't appear twice! */ if (clear_screen) { /* Hey, "--clear" can't appear twice! */
Usage (argv[0]); Usage (argv[0]);
exit (-1); exit (-1);
} else if (argc == 2) { /* we only want to clear the screen */ } else if (argc == 2) { /* we only want to clear the screen */
init_dialog (); init_dialog ();
refresh (); /* init_dialog() will clear the screen for us */ refresh (); /* init_dialog() will clear the screen for us */
end_dialog (); end_dialog ();
return 0; return 0;
} else { } else {
clear_screen = 1; clear_screen = 1;
offset++; offset++;
} }
} else /* no more common options */ } else /* no more common options */
end_common_opts = 1; end_common_opts = 1;
} }
if (argc - 1 == offset) { /* no more options */ if (argc - 1 == offset) { /* no more options */
Usage (argv[0]); Usage (argv[0]);
exit (-1); exit (-1);
} }
/* use a table to look for the requested mode, to avoid code duplication */ /* use a table to look for the requested mode, to avoid code duplication */
for (modePtr = modes; modePtr->name; modePtr++) /* look for the mode */ for (modePtr = modes; modePtr->name; modePtr++) /* look for the mode */
if (!strcmp (argv[offset + 1], modePtr->name)) if (!strcmp (argv[offset + 1], modePtr->name))
break; break;
if (!modePtr->name) if (!modePtr->name)
Usage (argv[0]); Usage (argv[0]);
if (argc - offset < modePtr->argmin) if (argc - offset < modePtr->argmin)
Usage (argv[0]); Usage (argv[0]);
if (modePtr->argmax && argc - offset > modePtr->argmax) if (modePtr->argmax && argc - offset > modePtr->argmax)
Usage (argv[0]); Usage (argv[0]);
init_dialog (); init_dialog ();
retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset); retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset);
if (clear_screen) { /* clear screen before exit */ if (clear_screen) { /* clear screen before exit */
attr_clear (stdscr, LINES, COLS, screen_attr); attr_clear (stdscr, LINES, COLS, screen_attr);
refresh (); refresh ();
} }
end_dialog(); end_dialog();
...@@ -173,21 +173,21 @@ int ...@@ -173,21 +173,21 @@ int
j_menu (const char *t, int ac, const char * const * av) j_menu (const char *t, int ac, const char * const * av)
{ {
return dialog_menu (t, av[2], atoi (av[3]), atoi (av[4]), return dialog_menu (t, av[2], atoi (av[3]), atoi (av[4]),
atoi (av[5]), av[6], (ac - 6) / 2, av + 7); atoi (av[5]), av[6], (ac - 6) / 2, av + 7);
} }
int int
j_checklist (const char *t, int ac, const char * const * av) j_checklist (const char *t, int ac, const char * const * av)
{ {
return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]), return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]),
atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_CHECK); atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_CHECK);
} }
int int
j_radiolist (const char *t, int ac, const char * const * av) j_radiolist (const char *t, int ac, const char * const * av)
{ {
return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]), return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]),
atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_RADIO); atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_RADIO);
} }
int int
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
* *
* *) A bugfix for the Page-Down problem * *) A bugfix for the Page-Down problem
* *
* *) Formerly when I used Page Down and Page Up, the cursor would be set * *) Formerly when I used Page Down and Page Up, the cursor would be set
* to the first position in the menu box. Now lxdialog is a bit * to the first position in the menu box. Now lxdialog is a bit
* smarter and works more like other menu systems (just have a look at * smarter and works more like other menu systems (just have a look at
* it). * it).
...@@ -80,7 +80,7 @@ print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey ...@@ -80,7 +80,7 @@ print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey
{ {
int i; int i;
for (i = 0; i < menu_width; i++) for (i = 0; i < menu_width; i++)
waddch (win, ' '); waddch (win, ' ');
} }
#else #else
wclrtoeol(win); wclrtoeol(win);
...@@ -88,12 +88,12 @@ print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey ...@@ -88,12 +88,12 @@ print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey
wattrset (win, selected ? item_selected_attr : item_attr); wattrset (win, selected ? item_selected_attr : item_attr);
mvwaddstr (win, choice, item_x, menu_item); mvwaddstr (win, choice, item_x, menu_item);
if (hotkey) { if (hotkey) {
wattrset (win, selected ? tag_key_selected_attr : tag_key_attr); wattrset (win, selected ? tag_key_selected_attr : tag_key_attr);
mvwaddch(win, choice, item_x+j, menu_item[j]); mvwaddch(win, choice, item_x+j, menu_item[j]);
} }
if (selected) { if (selected) {
wmove (win, choice, item_x+1); wmove (win, choice, item_x+1);
wrefresh (win); wrefresh (win);
} }
} }
...@@ -102,7 +102,7 @@ print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey ...@@ -102,7 +102,7 @@ print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey
*/ */
static void static void
print_arrows (WINDOW * win, int item_no, int scroll, print_arrows (WINDOW * win, int item_no, int scroll,
int y, int x, int height) int y, int x, int height)
{ {
int cur_y, cur_x; int cur_y, cur_x;
...@@ -111,32 +111,32 @@ print_arrows (WINDOW * win, int item_no, int scroll, ...@@ -111,32 +111,32 @@ print_arrows (WINDOW * win, int item_no, int scroll,
wmove(win, y, x); wmove(win, y, x);
if (scroll > 0) { if (scroll > 0) {
wattrset (win, uarrow_attr); wattrset (win, uarrow_attr);
waddch (win, ACS_UARROW); waddch (win, ACS_UARROW);
waddstr (win, "(-)"); waddstr (win, "(-)");
} }
else { else {
wattrset (win, menubox_attr); wattrset (win, menubox_attr);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
} }
y = y + height + 1; y = y + height + 1;
wmove(win, y, x); wmove(win, y, x);
if ((height < item_no) && (scroll + height < item_no)) { if ((height < item_no) && (scroll + height < item_no)) {
wattrset (win, darrow_attr); wattrset (win, darrow_attr);
waddch (win, ACS_DARROW); waddch (win, ACS_DARROW);
waddstr (win, "(+)"); waddstr (win, "(+)");
} }
else { else {
wattrset (win, menubox_border_attr); wattrset (win, menubox_border_attr);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch (win, ACS_HLINE);
} }
wmove(win, cur_y, cur_x); wmove(win, cur_y, cur_x);
...@@ -164,8 +164,8 @@ print_buttons (WINDOW *win, int height, int width, int selected) ...@@ -164,8 +164,8 @@ print_buttons (WINDOW *win, int height, int width, int selected)
*/ */
int int
dialog_menu (const char *title, const char *prompt, int height, int width, dialog_menu (const char *title, const char *prompt, int height, int width,
int menu_height, const char *current, int item_no, int menu_height, const char *current, int item_no,
const char * const * items) const char * const * items)
{ {
int i, j, x, y, box_x, box_y; int i, j, x, y, box_x, box_y;
...@@ -188,24 +188,24 @@ dialog_menu (const char *title, const char *prompt, int height, int width, ...@@ -188,24 +188,24 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
wattrset (dialog, border_attr); wattrset (dialog, border_attr);
mvwaddch (dialog, height - 3, 0, ACS_LTEE); mvwaddch (dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch (dialog, ACS_HLINE); waddch (dialog, ACS_HLINE);
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
wbkgdset (dialog, dialog_attr & A_COLOR); wbkgdset (dialog, dialog_attr & A_COLOR);
waddch (dialog, ACS_RTEE); waddch (dialog, ACS_RTEE);
if (title != NULL && strlen(title) >= width-2 ) { if (title != NULL && strlen(title) >= width-2 ) {
/* truncate long title -- mec */ /* truncate long title -- mec */
char * title2 = malloc(width-2+1); char * title2 = malloc(width-2+1);
memcpy( title2, title, width-2 ); memcpy( title2, title, width-2 );
title2[width-2] = '\0'; title2[width-2] = '\0';
title = title2; title = title2;
} }
if (title != NULL) { if (title != NULL) {
wattrset (dialog, title_attr); wattrset (dialog, title_attr);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
waddstr (dialog, (char *)title); waddstr (dialog, (char *)title);
waddch (dialog, ' '); waddch (dialog, ' ');
} }
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
...@@ -217,85 +217,85 @@ dialog_menu (const char *title, const char *prompt, int height, int width, ...@@ -217,85 +217,85 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
/* create new window for the menu */ /* create new window for the menu */
menu = subwin (dialog, menu_height, menu_width, menu = subwin (dialog, menu_height, menu_width,
y + box_y + 1, x + box_x + 1); y + box_y + 1, x + box_x + 1);
keypad (menu, TRUE); keypad (menu, TRUE);
/* draw a box around the menu items */ /* draw a box around the menu items */
draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2, draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2,
menubox_border_attr, menubox_attr); menubox_border_attr, menubox_attr);
/* /*
* Find length of longest item in order to center menu. * Find length of longest item in order to center menu.
* Set 'choice' to default item. * Set 'choice' to default item.
*/ */
item_x = 0; item_x = 0;
for (i = 0; i < item_no; i++) { for (i = 0; i < item_no; i++) {
item_x = MAX (item_x, MIN(menu_width, strlen (items[i * 2 + 1]) + 2)); item_x = MAX (item_x, MIN(menu_width, strlen (items[i * 2 + 1]) + 2));
if (strcmp(current, items[i*2]) == 0) choice = i; if (strcmp(current, items[i*2]) == 0) choice = i;
} }
item_x = (menu_width - item_x) / 2; item_x = (menu_width - item_x) / 2;
/* get the scroll info from the temp file */ /* get the scroll info from the temp file */
if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) { if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) {
if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) && if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) &&
(scroll+max_choice > choice) && (scroll >= 0) && (scroll+max_choice > choice) && (scroll >= 0) &&
(scroll+max_choice <= item_no) ) { (scroll+max_choice <= item_no) ) {
first_item = scroll; first_item = scroll;
choice = choice - scroll; choice = choice - scroll;
fclose(f); fclose(f);
} else { } else {
scroll=0; scroll=0;
remove("lxdialog.scrltmp"); remove("lxdialog.scrltmp");
fclose(f); fclose(f);
f=NULL; f=NULL;
} }
} }
if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) { if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) {
if (choice >= item_no-max_choice/2) if (choice >= item_no-max_choice/2)
scroll = first_item = item_no-max_choice; scroll = first_item = item_no-max_choice;
else else
scroll = first_item = choice - max_choice/2; scroll = first_item = choice - max_choice/2;
choice = choice - scroll; choice = choice - scroll;
} }
/* Print the menu */ /* Print the menu */
for (i=0; i < max_choice; i++) { for (i=0; i < max_choice; i++) {
print_item (menu, items[(first_item + i) * 2 + 1], i, i == choice, print_item (menu, items[(first_item + i) * 2 + 1], i, i == choice,
(items[(first_item + i)*2][0] != ':')); (items[(first_item + i)*2][0] != ':'));
} }
wnoutrefresh (menu); wnoutrefresh (menu);
print_arrows(dialog, item_no, scroll, print_arrows(dialog, item_no, scroll,
box_y, box_x+item_x+1, menu_height); box_y, box_x+item_x+1, menu_height);
print_buttons (dialog, height, width, 0); print_buttons (dialog, height, width, 0);
wmove (menu, choice, item_x+1); wmove (menu, choice, item_x+1);
wrefresh (menu); wrefresh (menu);
while (key != ESC) { while (key != ESC) {
key = wgetch(menu); key = wgetch(menu);
if (key < 256 && isalpha(key)) key = tolower(key); if (key < 256 && isalpha(key)) key = tolower(key);
if (strchr("ynm", key)) if (strchr("ynm", key))
i = max_choice; i = max_choice;
else { else {
for (i = choice+1; i < max_choice; i++) { for (i = choice+1; i < max_choice; i++) {
j = first_alpha(items[(scroll+i)*2+1], "YyNnMm"); j = first_alpha(items[(scroll+i)*2+1], "YyNnMm");
if (key == tolower(items[(scroll+i)*2+1][j])) if (key == tolower(items[(scroll+i)*2+1][j]))
break; break;
} }
if (i == max_choice) if (i == max_choice)
for (i = 0; i < max_choice; i++) { for (i = 0; i < max_choice; i++) {
j = first_alpha(items[(scroll+i)*2+1], "YyNnMm"); j = first_alpha(items[(scroll+i)*2+1], "YyNnMm");
if (key == tolower(items[(scroll+i)*2+1][j])) if (key == tolower(items[(scroll+i)*2+1][j]))
break; break;
} }
} }
if (i < max_choice || if (i < max_choice ||
key == KEY_UP || key == KEY_DOWN || key == KEY_UP || key == KEY_DOWN ||
key == '-' || key == '+' || key == '-' || key == '+' ||
key == KEY_PPAGE || key == KEY_NPAGE) { key == KEY_PPAGE || key == KEY_NPAGE) {
...@@ -303,9 +303,9 @@ dialog_menu (const char *title, const char *prompt, int height, int width, ...@@ -303,9 +303,9 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
print_item (menu, items[(scroll+choice)*2+1], choice, FALSE, print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
(items[(scroll+choice)*2][0] != ':')); (items[(scroll+choice)*2][0] != ':'));
if (key == KEY_UP || key == '-') { if (key == KEY_UP || key == '-') {
if (choice < 2 && scroll) { if (choice < 2 && scroll) {
/* Scroll menu down */ /* Scroll menu down */
scrollok (menu, TRUE); scrollok (menu, TRUE);
wscrl (menu, -1); wscrl (menu, -1);
scrollok (menu, FALSE); scrollok (menu, FALSE);
...@@ -314,19 +314,19 @@ dialog_menu (const char *title, const char *prompt, int height, int width, ...@@ -314,19 +314,19 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
print_item (menu, items[scroll * 2 + 1], 0, FALSE, print_item (menu, items[scroll * 2 + 1], 0, FALSE,
(items[scroll*2][0] != ':')); (items[scroll*2][0] != ':'));
} else } else
choice = MAX(choice - 1, 0); choice = MAX(choice - 1, 0);
} else if (key == KEY_DOWN || key == '+') { } else if (key == KEY_DOWN || key == '+') {
print_item (menu, items[(scroll+choice)*2+1], choice, FALSE, print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
(items[(scroll+choice)*2][0] != ':')); (items[(scroll+choice)*2][0] != ':'));
if ((choice > max_choice-3) && if ((choice > max_choice-3) &&
(scroll + max_choice < item_no) (scroll + max_choice < item_no)
) { ) {
/* Scroll menu up */ /* Scroll menu up */
scrollok (menu, TRUE); scrollok (menu, TRUE);
scroll (menu); scroll (menu);
scrollok (menu, FALSE); scrollok (menu, FALSE);
...@@ -338,14 +338,14 @@ dialog_menu (const char *title, const char *prompt, int height, int width, ...@@ -338,14 +338,14 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
} else } else
choice = MIN(choice+1, max_choice-1); choice = MIN(choice+1, max_choice-1);
} else if (key == KEY_PPAGE) { } else if (key == KEY_PPAGE) {
scrollok (menu, TRUE); scrollok (menu, TRUE);
for (i=0; (i < max_choice); i++) { for (i=0; (i < max_choice); i++) {
if (scroll > 0) { if (scroll > 0) {
wscrl (menu, -1); wscrl (menu, -1);
scroll--; scroll--;
print_item (menu, items[scroll * 2 + 1], 0, FALSE, print_item (menu, items[scroll * 2 + 1], 0, FALSE,
(items[scroll*2][0] != ':')); (items[scroll*2][0] != ':'));
} else { } else {
if (choice > 0) if (choice > 0)
choice--; choice--;
...@@ -356,17 +356,17 @@ dialog_menu (const char *title, const char *prompt, int height, int width, ...@@ -356,17 +356,17 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
} else if (key == KEY_NPAGE) { } else if (key == KEY_NPAGE) {
for (i=0; (i < max_choice); i++) { for (i=0; (i < max_choice); i++) {
if (scroll+max_choice < item_no) { if (scroll+max_choice < item_no) {
scrollok (menu, TRUE); scrollok (menu, TRUE);
scroll(menu); scroll(menu);
scrollok (menu, FALSE); scrollok (menu, FALSE);
scroll++; scroll++;
print_item (menu, items[(scroll+max_choice-1)*2+1], print_item (menu, items[(scroll+max_choice-1)*2+1],
max_choice-1, FALSE, max_choice-1, FALSE,
(items[(scroll+max_choice-1)*2][0] != ':')); (items[(scroll+max_choice-1)*2][0] != ':'));
} else { } else {
if (choice+1 < max_choice) if (choice+1 < max_choice)
choice++; choice++;
} }
} }
} else } else
...@@ -381,30 +381,30 @@ dialog_menu (const char *title, const char *prompt, int height, int width, ...@@ -381,30 +381,30 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
wnoutrefresh (dialog); wnoutrefresh (dialog);
wrefresh (menu); wrefresh (menu);
continue; /* wait for another key press */ continue; /* wait for another key press */
} }
switch (key) { switch (key) {
case KEY_LEFT: case KEY_LEFT:
case TAB: case TAB:
case KEY_RIGHT: case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0) button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 2 : (button > 2 ? 0 : button); ? 2 : (button > 2 ? 0 : button);
print_buttons(dialog, height, width, button); print_buttons(dialog, height, width, button);
wrefresh (menu); wrefresh (menu);
break; break;
case ' ': case ' ':
case 's': case 's':
case 'y': case 'y':
case 'n': case 'n':
case 'm': case 'm':
/* save scroll info */ /* save scroll info */
if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) { if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
fprintf(f,"%d\n",scroll); fprintf(f,"%d\n",scroll);
fclose(f); fclose(f);
} }
delwin (dialog); delwin (dialog);
fprintf(stderr, "%s\n", items[(scroll + choice) * 2]); fprintf(stderr, "%s\n", items[(scroll + choice) * 2]);
switch (key) { switch (key) {
case 's': return 3; case 's': return 3;
...@@ -413,31 +413,31 @@ dialog_menu (const char *title, const char *prompt, int height, int width, ...@@ -413,31 +413,31 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
case 'm': return 5; case 'm': return 5;
case ' ': return 6; case ' ': return 6;
} }
return 0; return 0;
case 'h': case 'h':
case '?': case '?':
button = 2; button = 2;
case '\n': case '\n':
delwin (dialog); delwin (dialog);
if (button == 2) if (button == 2)
fprintf(stderr, "%s \"%s\"\n", fprintf(stderr, "%s \"%s\"\n",
items[(scroll + choice) * 2], items[(scroll + choice) * 2],
items[(scroll + choice) * 2 + 1] + items[(scroll + choice) * 2 + 1] +
first_alpha(items[(scroll + choice) * 2 + 1],"")); first_alpha(items[(scroll + choice) * 2 + 1],""));
else else
fprintf(stderr, "%s\n", items[(scroll + choice) * 2]); fprintf(stderr, "%s\n", items[(scroll + choice) * 2]);
remove("lxdialog.scrltmp"); remove("lxdialog.scrltmp");
return button; return button;
case 'e': case 'e':
case 'x': case 'x':
key = ESC; key = ESC;
case ESC: case ESC:
break; break;
} }
} }
delwin (dialog); delwin (dialog);
remove("lxdialog.scrltmp"); remove("lxdialog.scrltmp");
return -1; /* ESC pressed */ return -1; /* ESC pressed */
} }
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
*/ */
int int
dialog_msgbox (const char *title, const char *prompt, int height, int width, dialog_msgbox (const char *title, const char *prompt, int height, int width,
int pause) int pause)
{ {
int i, x, y, key = 0; int i, x, y, key = 0;
WINDOW *dialog; WINDOW *dialog;
...@@ -44,40 +44,40 @@ dialog_msgbox (const char *title, const char *prompt, int height, int width, ...@@ -44,40 +44,40 @@ dialog_msgbox (const char *title, const char *prompt, int height, int width,
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
if (title != NULL && strlen(title) >= width-2 ) { if (title != NULL && strlen(title) >= width-2 ) {
/* truncate long title -- mec */ /* truncate long title -- mec */
char * title2 = malloc(width-2+1); char * title2 = malloc(width-2+1);
memcpy( title2, title, width-2 ); memcpy( title2, title, width-2 );
title2[width-2] = '\0'; title2[width-2] = '\0';
title = title2; title = title2;
} }
if (title != NULL) { if (title != NULL) {
wattrset (dialog, title_attr); wattrset (dialog, title_attr);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
waddstr (dialog, (char *)title); waddstr (dialog, (char *)title);
waddch (dialog, ' '); waddch (dialog, ' ');
} }
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
print_autowrap (dialog, prompt, width - 2, 1, 2); print_autowrap (dialog, prompt, width - 2, 1, 2);
if (pause) { if (pause) {
wattrset (dialog, border_attr); wattrset (dialog, border_attr);
mvwaddch (dialog, height - 3, 0, ACS_LTEE); mvwaddch (dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch (dialog, ACS_HLINE); waddch (dialog, ACS_HLINE);
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
waddch (dialog, ACS_RTEE); waddch (dialog, ACS_RTEE);
print_button (dialog, " Ok ", print_button (dialog, " Ok ",
height - 2, width / 2 - 4, TRUE); height - 2, width / 2 - 4, TRUE);
wrefresh (dialog); wrefresh (dialog);
while (key != ESC && key != '\n' && key != ' ' && while (key != ESC && key != '\n' && key != ' ' &&
key != 'O' && key != 'o' && key != 'X' && key != 'x') key != 'O' && key != 'o' && key != 'X' && key != 'x')
key = wgetch (dialog); key = wgetch (dialog);
} else { } else {
key = '\n'; key = '\n';
wrefresh (dialog); wrefresh (dialog);
} }
delwin (dialog); delwin (dialog);
......
...@@ -42,41 +42,41 @@ dialog_textbox (const char *title, const char *file, int height, int width) ...@@ -42,41 +42,41 @@ dialog_textbox (const char *title, const char *file, int height, int width)
char search_term[MAX_LEN + 1]; char search_term[MAX_LEN + 1];
WINDOW *dialog, *text; WINDOW *dialog, *text;
search_term[0] = '\0'; /* no search term entered yet */ search_term[0] = '\0'; /* no search term entered yet */
/* Open input file for reading */ /* Open input file for reading */
if ((fd = open (file, O_RDONLY)) == -1) { if ((fd = open (file, O_RDONLY)) == -1) {
endwin (); endwin ();
fprintf (stderr, fprintf (stderr,
"\nCan't open input file in dialog_textbox().\n"); "\nCan't open input file in dialog_textbox().\n");
exit (-1); exit (-1);
} }
/* Get file size. Actually, 'file_size' is the real file size - 1, /* Get file size. Actually, 'file_size' is the real file size - 1,
since it's only the last byte offset from the beginning */ since it's only the last byte offset from the beginning */
if ((file_size = lseek (fd, 0, SEEK_END)) == -1) { if ((file_size = lseek (fd, 0, SEEK_END)) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError getting file size in dialog_textbox().\n"); fprintf (stderr, "\nError getting file size in dialog_textbox().\n");
exit (-1); exit (-1);
} }
/* Restore file pointer to beginning of file after getting file size */ /* Restore file pointer to beginning of file after getting file size */
if (lseek (fd, 0, SEEK_SET) == -1) { if (lseek (fd, 0, SEEK_SET) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n"); fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n");
exit (-1); exit (-1);
} }
/* Allocate space for read buffer */ /* Allocate space for read buffer */
if ((buf = malloc (BUF_SIZE + 1)) == NULL) { if ((buf = malloc (BUF_SIZE + 1)) == NULL) {
endwin (); endwin ();
fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n"); fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n");
exit (-1); exit (-1);
} }
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError reading file in dialog_textbox().\n"); fprintf (stderr, "\nError reading file in dialog_textbox().\n");
exit (-1); exit (-1);
} }
buf[bytes_read] = '\0'; /* mark end of valid data */ buf[bytes_read] = '\0'; /* mark end of valid data */
page = buf; /* page is pointer to start of page to be displayed */ page = buf; /* page is pointer to start of page to be displayed */
/* center dialog box on screen */ /* center dialog box on screen */
x = (COLS - width) / 2; x = (COLS - width) / 2;
...@@ -101,223 +101,223 @@ dialog_textbox (const char *title, const char *file, int height, int width) ...@@ -101,223 +101,223 @@ dialog_textbox (const char *title, const char *file, int height, int width)
wattrset (dialog, border_attr); wattrset (dialog, border_attr);
mvwaddch (dialog, height-3, 0, ACS_LTEE); mvwaddch (dialog, height-3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch (dialog, ACS_HLINE); waddch (dialog, ACS_HLINE);
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
wbkgdset (dialog, dialog_attr & A_COLOR); wbkgdset (dialog, dialog_attr & A_COLOR);
waddch (dialog, ACS_RTEE); waddch (dialog, ACS_RTEE);
if (title != NULL && strlen(title) >= width-2 ) { if (title != NULL && strlen(title) >= width-2 ) {
/* truncate long title -- mec */ /* truncate long title -- mec */
char * title2 = malloc(width-2+1); char * title2 = malloc(width-2+1);
memcpy( title2, title, width-2 ); memcpy( title2, title, width-2 );
title2[width-2] = '\0'; title2[width-2] = '\0';
title = title2; title = title2;
} }
if (title != NULL) { if (title != NULL) {
wattrset (dialog, title_attr); wattrset (dialog, title_attr);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
waddstr (dialog, (char *)title); waddstr (dialog, (char *)title);
waddch (dialog, ' '); waddch (dialog, ' ');
} }
print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE); print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
wnoutrefresh (dialog); wnoutrefresh (dialog);
getyx (dialog, cur_y, cur_x); /* Save cursor position */ getyx (dialog, cur_y, cur_x); /* Save cursor position */
/* Print first page of text */ /* Print first page of text */
attr_clear (text, height - 4, width - 2, dialog_attr); attr_clear (text, height - 4, width - 2, dialog_attr);
print_page (text, height - 4, width - 2); print_page (text, height - 4, width - 2);
print_position (dialog, height, width); print_position (dialog, height, width);
wmove (dialog, cur_y, cur_x); /* Restore cursor position */ wmove (dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh (dialog); wrefresh (dialog);
while ((key != ESC) && (key != '\n')) { while ((key != ESC) && (key != '\n')) {
key = wgetch (dialog); key = wgetch (dialog);
switch (key) { switch (key) {
case 'E': /* Exit */ case 'E': /* Exit */
case 'e': case 'e':
case 'X': case 'X':
case 'x': case 'x':
delwin (dialog); delwin (dialog);
free (buf); free (buf);
close (fd); close (fd);
return 0; return 0;
case 'g': /* First page */ case 'g': /* First page */
case KEY_HOME: case KEY_HOME:
if (!begin_reached) { if (!begin_reached) {
begin_reached = 1; begin_reached = 1;
/* First page not in buffer? */ /* First page not in buffer? */
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
endwin (); endwin ();
fprintf (stderr, fprintf (stderr,
"\nError moving file pointer in dialog_textbox().\n"); "\nError moving file pointer in dialog_textbox().\n");
exit (-1); exit (-1);
} }
if (fpos > bytes_read) { /* Yes, we have to read it in */ if (fpos > bytes_read) { /* Yes, we have to read it in */
if (lseek (fd, 0, SEEK_SET) == -1) { if (lseek (fd, 0, SEEK_SET) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError moving file pointer in " fprintf (stderr, "\nError moving file pointer in "
"dialog_textbox().\n"); "dialog_textbox().\n");
exit (-1); exit (-1);
} }
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
endwin (); endwin ();
fprintf (stderr, fprintf (stderr,
"\nError reading file in dialog_textbox().\n"); "\nError reading file in dialog_textbox().\n");
exit (-1); exit (-1);
} }
buf[bytes_read] = '\0'; buf[bytes_read] = '\0';
} }
page = buf; page = buf;
print_page (text, height - 4, width - 2); print_page (text, height - 4, width - 2);
print_position (dialog, height, width); print_position (dialog, height, width);
wmove (dialog, cur_y, cur_x); /* Restore cursor position */ wmove (dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh (dialog); wrefresh (dialog);
} }
break; break;
case 'G': /* Last page */ case 'G': /* Last page */
case KEY_END: case KEY_END:
end_reached = 1; end_reached = 1;
/* Last page not in buffer? */ /* Last page not in buffer? */
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
endwin (); endwin ();
fprintf (stderr, fprintf (stderr,
"\nError moving file pointer in dialog_textbox().\n"); "\nError moving file pointer in dialog_textbox().\n");
exit (-1); exit (-1);
} }
if (fpos < file_size) { /* Yes, we have to read it in */ if (fpos < file_size) { /* Yes, we have to read it in */
if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) { if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) {
endwin (); endwin ();
fprintf (stderr, fprintf (stderr,
"\nError moving file pointer in dialog_textbox().\n"); "\nError moving file pointer in dialog_textbox().\n");
exit (-1); exit (-1);
} }
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
endwin (); endwin ();
fprintf (stderr, fprintf (stderr,
"\nError reading file in dialog_textbox().\n"); "\nError reading file in dialog_textbox().\n");
exit (-1); exit (-1);
} }
buf[bytes_read] = '\0'; buf[bytes_read] = '\0';
} }
page = buf + bytes_read; page = buf + bytes_read;
back_lines (height - 4); back_lines (height - 4);
print_page (text, height - 4, width - 2); print_page (text, height - 4, width - 2);
print_position (dialog, height, width); print_position (dialog, height, width);
wmove (dialog, cur_y, cur_x); /* Restore cursor position */ wmove (dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh (dialog); wrefresh (dialog);
break; break;
case 'K': /* Previous line */ case 'K': /* Previous line */
case 'k': case 'k':
case KEY_UP: case KEY_UP:
if (!begin_reached) { if (!begin_reached) {
back_lines (page_length + 1); back_lines (page_length + 1);
/* We don't call print_page() here but use scrolling to ensure /* We don't call print_page() here but use scrolling to ensure
faster screen update. However, 'end_reached' and faster screen update. However, 'end_reached' and
'page_length' should still be updated, and 'page' should 'page_length' should still be updated, and 'page' should
point to start of next page. This is done by calling point to start of next page. This is done by calling
get_line() in the following 'for' loop. */ get_line() in the following 'for' loop. */
scrollok (text, TRUE); scrollok (text, TRUE);
wscrl (text, -1); /* Scroll text region down one line */ wscrl (text, -1); /* Scroll text region down one line */
scrollok (text, FALSE); scrollok (text, FALSE);
page_length = 0; page_length = 0;
passed_end = 0; passed_end = 0;
for (i = 0; i < height - 4; i++) { for (i = 0; i < height - 4; i++) {
if (!i) { if (!i) {
/* print first line of page */ /* print first line of page */
print_line (text, 0, width - 2); print_line (text, 0, width - 2);
wnoutrefresh (text); wnoutrefresh (text);
} else } else
/* Called to update 'end_reached' and 'page' */ /* Called to update 'end_reached' and 'page' */
get_line (); get_line ();
if (!passed_end) if (!passed_end)
page_length++; page_length++;
if (end_reached && !passed_end) if (end_reached && !passed_end)
passed_end = 1; passed_end = 1;
} }
print_position (dialog, height, width); print_position (dialog, height, width);
wmove (dialog, cur_y, cur_x); /* Restore cursor position */ wmove (dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh (dialog); wrefresh (dialog);
} }
break; break;
case 'B': /* Previous page */ case 'B': /* Previous page */
case 'b': case 'b':
case KEY_PPAGE: case KEY_PPAGE:
if (begin_reached) if (begin_reached)
break; break;
back_lines (page_length + height - 4); back_lines (page_length + height - 4);
print_page (text, height - 4, width - 2); print_page (text, height - 4, width - 2);
print_position (dialog, height, width); print_position (dialog, height, width);
wmove (dialog, cur_y, cur_x); wmove (dialog, cur_y, cur_x);
wrefresh (dialog); wrefresh (dialog);
break; break;
case 'J': /* Next line */ case 'J': /* Next line */
case 'j': case 'j':
case KEY_DOWN: case KEY_DOWN:
if (!end_reached) { if (!end_reached) {
begin_reached = 0; begin_reached = 0;
scrollok (text, TRUE); scrollok (text, TRUE);
scroll (text); /* Scroll text region up one line */ scroll (text); /* Scroll text region up one line */
scrollok (text, FALSE); scrollok (text, FALSE);
print_line (text, height - 5, width - 2); print_line (text, height - 5, width - 2);
wnoutrefresh (text); wnoutrefresh (text);
print_position (dialog, height, width); print_position (dialog, height, width);
wmove (dialog, cur_y, cur_x); /* Restore cursor position */ wmove (dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh (dialog); wrefresh (dialog);
} }
break; break;
case KEY_NPAGE: /* Next page */ case KEY_NPAGE: /* Next page */
case ' ': case ' ':
if (end_reached) if (end_reached)
break; break;
begin_reached = 0; begin_reached = 0;
print_page (text, height - 4, width - 2); print_page (text, height - 4, width - 2);
print_position (dialog, height, width); print_position (dialog, height, width);
wmove (dialog, cur_y, cur_x); wmove (dialog, cur_y, cur_x);
wrefresh (dialog); wrefresh (dialog);
break; break;
case '0': /* Beginning of line */ case '0': /* Beginning of line */
case 'H': /* Scroll left */ case 'H': /* Scroll left */
case 'h': case 'h':
case KEY_LEFT: case KEY_LEFT:
if (hscroll <= 0) if (hscroll <= 0)
break; break;
if (key == '0') if (key == '0')
hscroll = 0; hscroll = 0;
else else
hscroll--; hscroll--;
/* Reprint current page to scroll horizontally */ /* Reprint current page to scroll horizontally */
back_lines (page_length); back_lines (page_length);
print_page (text, height - 4, width - 2); print_page (text, height - 4, width - 2);
wmove (dialog, cur_y, cur_x); wmove (dialog, cur_y, cur_x);
wrefresh (dialog); wrefresh (dialog);
break; break;
case 'L': /* Scroll right */ case 'L': /* Scroll right */
case 'l': case 'l':
case KEY_RIGHT: case KEY_RIGHT:
if (hscroll >= MAX_LEN) if (hscroll >= MAX_LEN)
break; break;
hscroll++; hscroll++;
/* Reprint current page to scroll horizontally */ /* Reprint current page to scroll horizontally */
back_lines (page_length); back_lines (page_length);
print_page (text, height - 4, width - 2); print_page (text, height - 4, width - 2);
wmove (dialog, cur_y, cur_x); wmove (dialog, cur_y, cur_x);
wrefresh (dialog); wrefresh (dialog);
break; break;
case ESC: case ESC:
break; break;
} }
} }
delwin (dialog); delwin (dialog);
free (buf); free (buf);
close (fd); close (fd);
return -1; /* ESC pressed */ return -1; /* ESC pressed */
} }
/* /*
...@@ -335,102 +335,102 @@ back_lines (int n) ...@@ -335,102 +335,102 @@ back_lines (int n)
The code inside 'if' basically does a '--page' to move one The code inside 'if' basically does a '--page' to move one
character backward so as to skip '\n' of the previous line */ character backward so as to skip '\n' of the previous line */
if (!end_reached) { if (!end_reached) {
/* Either beginning of buffer or beginning of file reached? */ /* Either beginning of buffer or beginning of file reached? */
if (page == buf) { if (page == buf) {
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError moving file pointer in " fprintf (stderr, "\nError moving file pointer in "
"back_lines().\n"); "back_lines().\n");
exit (-1); exit (-1);
} }
if (fpos > bytes_read) { /* Not beginning of file yet */ if (fpos > bytes_read) { /* Not beginning of file yet */
/* We've reached beginning of buffer, but not beginning of /* We've reached beginning of buffer, but not beginning of
file yet, so read previous part of file into buffer. file yet, so read previous part of file into buffer.
Note that we only move backward for BUF_SIZE/2 bytes, Note that we only move backward for BUF_SIZE/2 bytes,
but not BUF_SIZE bytes to avoid re-reading again in but not BUF_SIZE bytes to avoid re-reading again in
print_page() later */ print_page() later */
/* Really possible to move backward BUF_SIZE/2 bytes? */ /* Really possible to move backward BUF_SIZE/2 bytes? */
if (fpos < BUF_SIZE / 2 + bytes_read) { if (fpos < BUF_SIZE / 2 + bytes_read) {
/* No, move less then */ /* No, move less then */
if (lseek (fd, 0, SEEK_SET) == -1) { if (lseek (fd, 0, SEEK_SET) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError moving file pointer in " fprintf (stderr, "\nError moving file pointer in "
"back_lines().\n"); "back_lines().\n");
exit (-1); exit (-1);
} }
page = buf + fpos - bytes_read; page = buf + fpos - bytes_read;
} else { /* Move backward BUF_SIZE/2 bytes */ } else { /* Move backward BUF_SIZE/2 bytes */
if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR) if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR)
== -1) { == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError moving file pointer " fprintf (stderr, "\nError moving file pointer "
"in back_lines().\n"); "in back_lines().\n");
exit (-1); exit (-1);
} }
page = buf + BUF_SIZE / 2; page = buf + BUF_SIZE / 2;
} }
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError reading file in back_lines().\n"); fprintf (stderr, "\nError reading file in back_lines().\n");
exit (-1); exit (-1);
} }
buf[bytes_read] = '\0'; buf[bytes_read] = '\0';
} else { /* Beginning of file reached */ } else { /* Beginning of file reached */
begin_reached = 1; begin_reached = 1;
return; return;
} }
} }
if (*(--page) != '\n') { /* '--page' here */ if (*(--page) != '\n') { /* '--page' here */
/* Something's wrong... */ /* Something's wrong... */
endwin (); endwin ();
fprintf (stderr, "\nInternal error in back_lines().\n"); fprintf (stderr, "\nInternal error in back_lines().\n");
exit (-1); exit (-1);
} }
} }
/* Go back 'n' lines */ /* Go back 'n' lines */
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
do { do {
if (page == buf) { if (page == buf) {
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
endwin (); endwin ();
fprintf (stderr, fprintf (stderr,
"\nError moving file pointer in back_lines().\n"); "\nError moving file pointer in back_lines().\n");
exit (-1); exit (-1);
} }
if (fpos > bytes_read) { if (fpos > bytes_read) {
/* Really possible to move backward BUF_SIZE/2 bytes? */ /* Really possible to move backward BUF_SIZE/2 bytes? */
if (fpos < BUF_SIZE / 2 + bytes_read) { if (fpos < BUF_SIZE / 2 + bytes_read) {
/* No, move less then */ /* No, move less then */
if (lseek (fd, 0, SEEK_SET) == -1) { if (lseek (fd, 0, SEEK_SET) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError moving file pointer " fprintf (stderr, "\nError moving file pointer "
"in back_lines().\n"); "in back_lines().\n");
exit (-1); exit (-1);
} }
page = buf + fpos - bytes_read; page = buf + fpos - bytes_read;
} else { /* Move backward BUF_SIZE/2 bytes */ } else { /* Move backward BUF_SIZE/2 bytes */
if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), if (lseek (fd, -(BUF_SIZE / 2 + bytes_read),
SEEK_CUR) == -1) { SEEK_CUR) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError moving file pointer" fprintf (stderr, "\nError moving file pointer"
" in back_lines().\n"); " in back_lines().\n");
exit (-1); exit (-1);
} }
page = buf + BUF_SIZE / 2; page = buf + BUF_SIZE / 2;
} }
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError reading file in " fprintf (stderr, "\nError reading file in "
"back_lines().\n"); "back_lines().\n");
exit (-1); exit (-1);
} }
buf[bytes_read] = '\0'; buf[bytes_read] = '\0';
} else { /* Beginning of file reached */ } else { /* Beginning of file reached */
begin_reached = 1; begin_reached = 1;
return; return;
} }
} }
} while (*(--page) != '\n'); } while (*(--page) != '\n');
page++; page++;
} }
...@@ -444,11 +444,11 @@ print_page (WINDOW * win, int height, int width) ...@@ -444,11 +444,11 @@ print_page (WINDOW * win, int height, int width)
page_length = 0; page_length = 0;
for (i = 0; i < height; i++) { for (i = 0; i < height; i++) {
print_line (win, i, width); print_line (win, i, width);
if (!passed_end) if (!passed_end)
page_length++; page_length++;
if (end_reached && !passed_end) if (end_reached && !passed_end)
passed_end = 1; passed_end = 1;
} }
wnoutrefresh (win); wnoutrefresh (win);
} }
...@@ -463,8 +463,8 @@ print_line (WINDOW * win, int row, int width) ...@@ -463,8 +463,8 @@ print_line (WINDOW * win, int row, int width)
char *line; char *line;
line = get_line (); line = get_line ();
line += MIN (strlen (line), hscroll); /* Scroll horizontally */ line += MIN (strlen (line), hscroll); /* Scroll horizontally */
wmove (win, row, 0); /* move cursor to correct line */ wmove (win, row, 0); /* move cursor to correct line */
waddch (win, ' '); waddch (win, ' ');
waddnstr (win, line, MIN (strlen (line), width - 2)); waddnstr (win, line, MIN (strlen (line), width - 2));
...@@ -474,7 +474,7 @@ print_line (WINDOW * win, int row, int width) ...@@ -474,7 +474,7 @@ print_line (WINDOW * win, int row, int width)
{ {
int i; int i;
for (i = 0; i < width - x; i++) for (i = 0; i < width - x; i++)
waddch (win, ' '); waddch (win, ' ');
} }
#else #else
wclrtoeol(win); wclrtoeol(win);
...@@ -494,42 +494,42 @@ get_line (void) ...@@ -494,42 +494,42 @@ get_line (void)
end_reached = 0; end_reached = 0;
while (*page != '\n') { while (*page != '\n') {
if (*page == '\0') { if (*page == '\0') {
/* Either end of file or end of buffer reached */ /* Either end of file or end of buffer reached */
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError moving file pointer in " fprintf (stderr, "\nError moving file pointer in "
"get_line().\n"); "get_line().\n");
exit (-1); exit (-1);
} }
if (fpos < file_size) { /* Not end of file yet */ if (fpos < file_size) { /* Not end of file yet */
/* We've reached end of buffer, but not end of file yet, /* We've reached end of buffer, but not end of file yet,
so read next part of file into buffer */ so read next part of file into buffer */
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError reading file in get_line().\n"); fprintf (stderr, "\nError reading file in get_line().\n");
exit (-1); exit (-1);
} }
buf[bytes_read] = '\0'; buf[bytes_read] = '\0';
page = buf; page = buf;
} else { } else {
if (!end_reached) if (!end_reached)
end_reached = 1; end_reached = 1;
break; break;
} }
} else if (i < MAX_LEN) } else if (i < MAX_LEN)
line[i++] = *(page++); line[i++] = *(page++);
else { else {
/* Truncate lines longer than MAX_LEN characters */ /* Truncate lines longer than MAX_LEN characters */
if (i == MAX_LEN) if (i == MAX_LEN)
line[i++] = '\0'; line[i++] = '\0';
page++; page++;
} }
} }
if (i <= MAX_LEN) if (i <= MAX_LEN)
line[i] = '\0'; line[i] = '\0';
if (!end_reached) if (!end_reached)
page++; /* move pass '\n' */ page++; /* move pass '\n' */
return line; return line;
} }
...@@ -543,14 +543,14 @@ print_position (WINDOW * win, int height, int width) ...@@ -543,14 +543,14 @@ print_position (WINDOW * win, int height, int width)
int fpos, percent; int fpos, percent;
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
endwin (); endwin ();
fprintf (stderr, "\nError moving file pointer in print_position().\n"); fprintf (stderr, "\nError moving file pointer in print_position().\n");
exit (-1); exit (-1);
} }
wattrset (win, position_indicator_attr); wattrset (win, position_indicator_attr);
wbkgdset (win, position_indicator_attr & A_COLOR); wbkgdset (win, position_indicator_attr & A_COLOR);
percent = !file_size ? percent = !file_size ?
100 : ((fpos - bytes_read + page - buf) * 100) / file_size; 100 : ((fpos - bytes_read + page - buf) * 100) / file_size;
wmove (win, height - 3, width - 9); wmove (win, height - 3, width - 9);
wprintw (win, "(%3d%%)", percent); wprintw (win, "(%3d%%)", percent);
} }
...@@ -29,40 +29,40 @@ const char *backtitle = NULL; ...@@ -29,40 +29,40 @@ const char *backtitle = NULL;
const char *dialog_result; const char *dialog_result;
/* /*
* Attribute values, default is for mono display * Attribute values, default is for mono display
*/ */
chtype attributes[] = chtype attributes[] =
{ {
A_NORMAL, /* screen_attr */ A_NORMAL, /* screen_attr */
A_NORMAL, /* shadow_attr */ A_NORMAL, /* shadow_attr */
A_NORMAL, /* dialog_attr */ A_NORMAL, /* dialog_attr */
A_BOLD, /* title_attr */ A_BOLD, /* title_attr */
A_NORMAL, /* border_attr */ A_NORMAL, /* border_attr */
A_REVERSE, /* button_active_attr */ A_REVERSE, /* button_active_attr */
A_DIM, /* button_inactive_attr */ A_DIM, /* button_inactive_attr */
A_REVERSE, /* button_key_active_attr */ A_REVERSE, /* button_key_active_attr */
A_BOLD, /* button_key_inactive_attr */ A_BOLD, /* button_key_inactive_attr */
A_REVERSE, /* button_label_active_attr */ A_REVERSE, /* button_label_active_attr */
A_NORMAL, /* button_label_inactive_attr */ A_NORMAL, /* button_label_inactive_attr */
A_NORMAL, /* inputbox_attr */ A_NORMAL, /* inputbox_attr */
A_NORMAL, /* inputbox_border_attr */ A_NORMAL, /* inputbox_border_attr */
A_NORMAL, /* searchbox_attr */ A_NORMAL, /* searchbox_attr */
A_BOLD, /* searchbox_title_attr */ A_BOLD, /* searchbox_title_attr */
A_NORMAL, /* searchbox_border_attr */ A_NORMAL, /* searchbox_border_attr */
A_BOLD, /* position_indicator_attr */ A_BOLD, /* position_indicator_attr */
A_NORMAL, /* menubox_attr */ A_NORMAL, /* menubox_attr */
A_NORMAL, /* menubox_border_attr */ A_NORMAL, /* menubox_border_attr */
A_NORMAL, /* item_attr */ A_NORMAL, /* item_attr */
A_REVERSE, /* item_selected_attr */ A_REVERSE, /* item_selected_attr */
A_BOLD, /* tag_attr */ A_BOLD, /* tag_attr */
A_REVERSE, /* tag_selected_attr */ A_REVERSE, /* tag_selected_attr */
A_BOLD, /* tag_key_attr */ A_BOLD, /* tag_key_attr */
A_REVERSE, /* tag_key_selected_attr */ A_REVERSE, /* tag_key_selected_attr */
A_BOLD, /* check_attr */ A_BOLD, /* check_attr */
A_REVERSE, /* check_selected_attr */ A_REVERSE, /* check_selected_attr */
A_BOLD, /* uarrow_attr */ A_BOLD, /* uarrow_attr */
A_BOLD /* darrow_attr */ A_BOLD /* darrow_attr */
}; };
...@@ -103,7 +103,7 @@ int color_table[][3] = ...@@ -103,7 +103,7 @@ int color_table[][3] =
{CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL}, {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
{UARROW_FG, UARROW_BG, UARROW_HL}, {UARROW_FG, UARROW_BG, UARROW_HL},
{DARROW_FG, DARROW_BG, DARROW_HL}, {DARROW_FG, DARROW_BG, DARROW_HL},
}; /* color_table */ }; /* color_table */
/* /*
* Set window to attribute 'attr' * Set window to attribute 'attr'
...@@ -115,9 +115,9 @@ attr_clear (WINDOW * win, int height, int width, chtype attr) ...@@ -115,9 +115,9 @@ attr_clear (WINDOW * win, int height, int width, chtype attr)
wattrset (win, attr); wattrset (win, attr);
for (i = 0; i < height; i++) { for (i = 0; i < height; i++) {
wmove (win, i, 0); wmove (win, i, 0);
for (j = 0; j < width; j++) for (j = 0; j < width; j++)
waddch (win, ' '); waddch (win, ' ');
} }
touchwin (win); touchwin (win);
} }
...@@ -144,14 +144,14 @@ void dialog_clear (void) ...@@ -144,14 +144,14 @@ void dialog_clear (void)
void void
init_dialog (void) init_dialog (void)
{ {
initscr (); /* Init curses */ initscr (); /* Init curses */
keypad (stdscr, TRUE); keypad (stdscr, TRUE);
cbreak (); cbreak ();
noecho (); noecho ();
if (use_colors) /* Set up colors */ if (use_colors) /* Set up colors */
color_setup (); color_setup ();
dialog_clear (); dialog_clear ();
...@@ -165,16 +165,16 @@ color_setup (void) ...@@ -165,16 +165,16 @@ color_setup (void)
{ {
int i; int i;
if (has_colors ()) { /* Terminal supports color? */ if (has_colors ()) { /* Terminal supports color? */
start_color (); start_color ();
/* Initialize color pairs */ /* Initialize color pairs */
for (i = 0; i < ATTRIBUTE_COUNT; i++) for (i = 0; i < ATTRIBUTE_COUNT; i++)
init_pair (i + 1, color_table[i][0], color_table[i][1]); init_pair (i + 1, color_table[i][0], color_table[i][1]);
/* Setup color attributes */ /* Setup color attributes */
for (i = 0; i < ATTRIBUTE_COUNT; i++) for (i = 0; i < ATTRIBUTE_COUNT; i++)
attributes[i] = C_ATTR (color_table[i][2], i + 1); attributes[i] = C_ATTR (color_table[i][2], i + 1);
} }
} }
...@@ -204,50 +204,50 @@ print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x) ...@@ -204,50 +204,50 @@ print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
strcpy (tempstr, prompt); strcpy (tempstr, prompt);
prompt_len = strlen(tempstr); prompt_len = strlen(tempstr);
/* /*
* Remove newlines * Remove newlines
*/ */
for(i=0; i<prompt_len; i++) { for(i=0; i<prompt_len; i++) {
if(tempstr[i] == '\n') tempstr[i] = ' '; if(tempstr[i] == '\n') tempstr[i] = ' ';
} }
if (prompt_len <= width - x * 2) { /* If prompt is short */ if (prompt_len <= width - x * 2) { /* If prompt is short */
wmove (win, y, (width - prompt_len) / 2); wmove (win, y, (width - prompt_len) / 2);
waddstr (win, tempstr); waddstr (win, tempstr);
} else { } else {
cur_x = x; cur_x = x;
cur_y = y; cur_y = y;
newl = 1; newl = 1;
word = tempstr; word = tempstr;
while (word && *word) { while (word && *word) {
sp = index(word, ' '); sp = index(word, ' ');
if (sp) if (sp)
*sp++ = 0; *sp++ = 0;
/* Wrap to next line if either the word does not fit, /* Wrap to next line if either the word does not fit,
or it is the first word of a new sentence, and it is or it is the first word of a new sentence, and it is
short, and the next word does not fit. */ short, and the next word does not fit. */
room = width - cur_x; room = width - cur_x;
wlen = strlen(word); wlen = strlen(word);
if (wlen > room || if (wlen > room ||
(newl && wlen < 4 && sp && wlen+1+strlen(sp) > room (newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
&& (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) { && (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
cur_y++; cur_y++;
cur_x = x; cur_x = x;
} }
wmove (win, cur_y, cur_x); wmove (win, cur_y, cur_x);
waddstr (win, word); waddstr (win, word);
getyx (win, cur_y, cur_x); getyx (win, cur_y, cur_x);
cur_x++; cur_x++;
if (sp && *sp == ' ') { if (sp && *sp == ' ') {
cur_x++; /* double space */ cur_x++; /* double space */
while (*++sp == ' '); while (*++sp == ' ');
newl = 1; newl = 1;
} else } else
newl = 0; newl = 0;
word = sp; word = sp;
} }
} }
} }
...@@ -265,14 +265,14 @@ print_button (WINDOW * win, const char *label, int y, int x, int selected) ...@@ -265,14 +265,14 @@ print_button (WINDOW * win, const char *label, int y, int x, int selected)
temp = strspn (label, " "); temp = strspn (label, " ");
label += temp; label += temp;
wattrset (win, selected ? button_label_active_attr wattrset (win, selected ? button_label_active_attr
: button_label_inactive_attr); : button_label_inactive_attr);
for (i = 0; i < temp; i++) for (i = 0; i < temp; i++)
waddch (win, ' '); waddch (win, ' ');
wattrset (win, selected ? button_key_active_attr wattrset (win, selected ? button_key_active_attr
: button_key_inactive_attr); : button_key_inactive_attr);
waddch (win, label[0]); waddch (win, label[0]);
wattrset (win, selected ? button_label_active_attr wattrset (win, selected ? button_label_active_attr
: button_label_inactive_attr); : button_label_inactive_attr);
waddstr (win, (char *)label + 1); waddstr (win, (char *)label + 1);
wattrset (win, selected ? button_active_attr : button_inactive_attr); wattrset (win, selected ? button_active_attr : button_inactive_attr);
waddstr (win, ">"); waddstr (win, ">");
...@@ -284,32 +284,32 @@ print_button (WINDOW * win, const char *label, int y, int x, int selected) ...@@ -284,32 +284,32 @@ print_button (WINDOW * win, const char *label, int y, int x, int selected)
*/ */
void void
draw_box (WINDOW * win, int y, int x, int height, int width, draw_box (WINDOW * win, int y, int x, int height, int width,
chtype box, chtype border) chtype box, chtype border)
{ {
int i, j; int i, j;
wattrset (win, 0); wattrset (win, 0);
for (i = 0; i < height; i++) { for (i = 0; i < height; i++) {
wmove (win, y + i, x); wmove (win, y + i, x);
for (j = 0; j < width; j++) for (j = 0; j < width; j++)
if (!i && !j) if (!i && !j)
waddch (win, border | ACS_ULCORNER); waddch (win, border | ACS_ULCORNER);
else if (i == height - 1 && !j) else if (i == height - 1 && !j)
waddch (win, border | ACS_LLCORNER); waddch (win, border | ACS_LLCORNER);
else if (!i && j == width - 1) else if (!i && j == width - 1)
waddch (win, box | ACS_URCORNER); waddch (win, box | ACS_URCORNER);
else if (i == height - 1 && j == width - 1) else if (i == height - 1 && j == width - 1)
waddch (win, box | ACS_LRCORNER); waddch (win, box | ACS_LRCORNER);
else if (!i) else if (!i)
waddch (win, border | ACS_HLINE); waddch (win, border | ACS_HLINE);
else if (i == height - 1) else if (i == height - 1)
waddch (win, box | ACS_HLINE); waddch (win, box | ACS_HLINE);
else if (!j) else if (!j)
waddch (win, border | ACS_VLINE); waddch (win, border | ACS_VLINE);
else if (j == width - 1) else if (j == width - 1)
waddch (win, box | ACS_VLINE); waddch (win, box | ACS_VLINE);
else else
waddch (win, box | ' '); waddch (win, box | ' ');
} }
} }
...@@ -322,17 +322,17 @@ draw_shadow (WINDOW * win, int y, int x, int height, int width) ...@@ -322,17 +322,17 @@ draw_shadow (WINDOW * win, int y, int x, int height, int width)
{ {
int i; int i;
if (has_colors ()) { /* Whether terminal supports color? */ if (has_colors ()) { /* Whether terminal supports color? */
wattrset (win, shadow_attr); wattrset (win, shadow_attr);
wmove (win, y + height, x + 2); wmove (win, y + height, x + 2);
for (i = 0; i < width; i++) for (i = 0; i < width; i++)
waddch (win, winch (win) & A_CHARTEXT); waddch (win, winch (win) & A_CHARTEXT);
for (i = y + 1; i < y + height + 1; i++) { for (i = y + 1; i < y + height + 1; i++) {
wmove (win, i, x + width); wmove (win, i, x + width);
waddch (win, winch (win) & A_CHARTEXT); waddch (win, winch (win) & A_CHARTEXT);
waddch (win, winch (win) & A_CHARTEXT); waddch (win, winch (win) & A_CHARTEXT);
} }
wnoutrefresh (win); wnoutrefresh (win);
} }
} }
...@@ -342,18 +342,18 @@ draw_shadow (WINDOW * win, int y, int x, int height, int width) ...@@ -342,18 +342,18 @@ draw_shadow (WINDOW * win, int y, int x, int height, int width)
int int
first_alpha(const char *string, const char *exempt) first_alpha(const char *string, const char *exempt)
{ {
int i, in_paren=0, c; int i, in_paren=0, c;
for (i = 0; i < strlen(string); i++) { for (i = 0; i < strlen(string); i++) {
c = tolower(string[i]); c = tolower(string[i]);
if (strchr("<[(", c)) ++in_paren; if (strchr("<[(", c)) ++in_paren;
if (strchr(">])", c)) --in_paren; if (strchr(">])", c)) --in_paren;
if ((! in_paren) && isalpha(c) && if ((! in_paren) && isalpha(c) &&
strchr(exempt, c) == 0) strchr(exempt, c) == 0)
return i; return i;
} }
return 0; return 0;
} }
...@@ -59,23 +59,23 @@ dialog_yesno (const char *title, const char *prompt, int height, int width) ...@@ -59,23 +59,23 @@ dialog_yesno (const char *title, const char *prompt, int height, int width)
wattrset (dialog, border_attr); wattrset (dialog, border_attr);
mvwaddch (dialog, height-3, 0, ACS_LTEE); mvwaddch (dialog, height-3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch (dialog, ACS_HLINE); waddch (dialog, ACS_HLINE);
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
waddch (dialog, ACS_RTEE); waddch (dialog, ACS_RTEE);
if (title != NULL && strlen(title) >= width-2 ) { if (title != NULL && strlen(title) >= width-2 ) {
/* truncate long title -- mec */ /* truncate long title -- mec */
char * title2 = malloc(width-2+1); char * title2 = malloc(width-2+1);
memcpy( title2, title, width-2 ); memcpy( title2, title, width-2 );
title2[width-2] = '\0'; title2[width-2] = '\0';
title = title2; title = title2;
} }
if (title != NULL) { if (title != NULL) {
wattrset (dialog, title_attr); wattrset (dialog, title_attr);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
waddstr (dialog, (char *)title); waddstr (dialog, (char *)title);
waddch (dialog, ' '); waddch (dialog, ' ');
} }
wattrset (dialog, dialog_attr); wattrset (dialog, dialog_attr);
...@@ -84,35 +84,35 @@ dialog_yesno (const char *title, const char *prompt, int height, int width) ...@@ -84,35 +84,35 @@ dialog_yesno (const char *title, const char *prompt, int height, int width)
print_buttons(dialog, height, width, 0); print_buttons(dialog, height, width, 0);
while (key != ESC) { while (key != ESC) {
key = wgetch (dialog); key = wgetch (dialog);
switch (key) { switch (key) {
case 'Y': case 'Y':
case 'y': case 'y':
delwin (dialog); delwin (dialog);
return 0; return 0;
case 'N': case 'N':
case 'n': case 'n':
delwin (dialog); delwin (dialog);
return 1; return 1;
case TAB: case TAB:
case KEY_LEFT: case KEY_LEFT:
case KEY_RIGHT: case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0) button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 1 : (button > 1 ? 0 : button); ? 1 : (button > 1 ? 0 : button);
print_buttons(dialog, height, width, button); print_buttons(dialog, height, width, button);
wrefresh (dialog); wrefresh (dialog);
break; break;
case ' ': case ' ':
case '\n': case '\n':
delwin (dialog); delwin (dialog);
return button; return button;
case ESC: case ESC:
break; break;
} }
} }
delwin (dialog); delwin (dialog);
return -1; /* ESC pressed */ return -1; /* ESC pressed */
} }
...@@ -81,15 +81,15 @@ static inline uint32_t arch_accel( void ) ...@@ -81,15 +81,15 @@ static inline uint32_t arch_accel( void )
AMD = (ebx == 0x68747541) && (ecx == 0x444d4163) && (edx == 0x69746e65); AMD = (ebx == 0x68747541) && (ecx == 0x444d4163) && (edx == 0x69746e65);
cpuid (0x00000001, eax, ebx, ecx, edx); cpuid (0x00000001, eax, ebx, ecx, edx);
if (! (edx & 0x00800000)) /* no MMX */ if (! (edx & 0x00800000)) /* no MMX */
return 0; return 0;
caps = MPEG2_ACCEL_X86_MMX; caps = MPEG2_ACCEL_X86_MMX;
if (edx & 0x02000000) /* SSE - identical to AMD MMX extensions */ if (edx & 0x02000000) /* SSE - identical to AMD MMX extensions */
caps = MPEG2_ACCEL_X86_MMX | MPEG2_ACCEL_X86_MMXEXT; caps = MPEG2_ACCEL_X86_MMX | MPEG2_ACCEL_X86_MMXEXT;
cpuid (0x80000000, eax, ebx, ecx, edx); cpuid (0x80000000, eax, ebx, ecx, edx);
if (eax < 0x80000001) /* no extended capabilities */ if (eax < 0x80000001) /* no extended capabilities */
return caps; return caps;
cpuid (0x80000001, eax, ebx, ecx, edx); cpuid (0x80000001, eax, ebx, ecx, edx);
...@@ -97,7 +97,7 @@ static inline uint32_t arch_accel( void ) ...@@ -97,7 +97,7 @@ static inline uint32_t arch_accel( void )
if (edx & 0x80000000) if (edx & 0x80000000)
caps |= MPEG2_ACCEL_X86_3DNOW; caps |= MPEG2_ACCEL_X86_3DNOW;
if (AMD && (edx & 0x00400000)) /* AMD MMX extensions */ if (AMD && (edx & 0x00400000)) /* AMD MMX extensions */
caps |= MPEG2_ACCEL_X86_MMXEXT; caps |= MPEG2_ACCEL_X86_MMXEXT;
return caps; return caps;
......
...@@ -99,7 +99,7 @@ static inline int copy_chunk( mpeg2dec_t * mpeg2dec, int bytes ) ...@@ -99,7 +99,7 @@ static inline int copy_chunk( mpeg2dec_t * mpeg2dec, int bytes )
mpeg2dec->shift = 0xffffff00; mpeg2dec->shift = 0xffffff00;
mpeg2dec->chunk_size = chunk_ptr - mpeg2dec->chunk_start - 3; mpeg2dec->chunk_size = chunk_ptr - mpeg2dec->chunk_start - 3;
mpeg2dec->chunk_ptr = chunk_ptr + 1; mpeg2dec->chunk_ptr = chunk_ptr + 1;
copied = current - mpeg2dec->buf_start; copied = current - mpeg2dec->buf_start;
mpeg2dec->buf_start = current; mpeg2dec->buf_start = current;
return copied; return copied;
......
...@@ -108,7 +108,7 @@ void mpeg2_header_state_init( mpeg2dec_t *mpeg2dec ) ...@@ -108,7 +108,7 @@ void mpeg2_header_state_init( mpeg2dec_t *mpeg2dec )
} }
mpeg2dec->decoder.coding_type = I_TYPE; mpeg2dec->decoder.coding_type = I_TYPE;
mpeg2dec->decoder.convert = NULL; mpeg2dec->decoder.convert = NULL;
mpeg2dec->decoder.convert_id = NULL; mpeg2dec->decoder.convert_id = NULL;
mpeg2dec->decoder.load_intra_quantizer_matrix = 1; mpeg2dec->decoder.load_intra_quantizer_matrix = 1;
mpeg2dec->decoder.load_non_intra_quantizer_matrix = 1; mpeg2dec->decoder.load_non_intra_quantizer_matrix = 1;
mpeg2dec->picture = mpeg2dec->pictures; mpeg2dec->picture = mpeg2dec->pictures;
...@@ -249,11 +249,11 @@ static int sequence_ext( mpeg2dec_t * mpeg2dec ) ...@@ -249,11 +249,11 @@ static int sequence_ext( mpeg2dec_t * mpeg2dec )
switch( buffer[1] & 6 ) switch( buffer[1] & 6 )
{ {
case 0: /* invalid */ case 0: /* invalid */
return 1; return 1;
case 2: /* 4:2:0 */ case 2: /* 4:2:0 */
sequence->chroma_height >>= 1; sequence->chroma_height >>= 1;
case 4: /* 4:2:2 */ case 4: /* 4:2:2 */
sequence->chroma_width >>= 1; sequence->chroma_width >>= 1;
} }
...@@ -337,13 +337,13 @@ static inline void finalize_sequence( mpeg2_sequence_t * sequence ) ...@@ -337,13 +337,13 @@ static inline void finalize_sequence( mpeg2_sequence_t * sequence )
sequence->pixel_width = sequence->pixel_height = 1; sequence->pixel_width = sequence->pixel_height = 1;
return; return;
case 3: /* 720x576 16:9 */ case 3: /* 720x576 16:9 */
sequence->pixel_width = 64; sequence->pixel_height = 45; sequence->pixel_width = 64; sequence->pixel_height = 45;
return; return;
case 6: /* 720x480 16:9 */ case 6: /* 720x480 16:9 */
sequence->pixel_width = 32; sequence->pixel_height = 27; sequence->pixel_width = 32; sequence->pixel_height = 27;
return; return;
case 12: /* 720*480 4:3 */ case 12: /* 720*480 4:3 */
sequence->pixel_width = 8; sequence->pixel_height = 9; sequence->pixel_width = 8; sequence->pixel_height = 9;
return; return;
default: default:
height = 88 * sequence->pixel_width + 1171; height = 88 * sequence->pixel_width + 1171;
...@@ -577,7 +577,7 @@ int mpeg2_header_picture( mpeg2dec_t * mpeg2dec ) ...@@ -577,7 +577,7 @@ int mpeg2_header_picture( mpeg2dec_t * mpeg2dec )
decoder->concealment_motion_vectors = 0; decoder->concealment_motion_vectors = 0;
decoder->scan = mpeg2_scan_norm; decoder->scan = mpeg2_scan_norm;
decoder->picture_structure = FRAME_PICTURE; decoder->picture_structure = FRAME_PICTURE;
mpeg2dec->copy_matrix = 0; mpeg2dec->copy_matrix = 0;
return 0; return 0;
} }
...@@ -814,7 +814,7 @@ void mpeg2_header_picture_finalize( mpeg2dec_t * mpeg2dec, uint32_t accels ) ...@@ -814,7 +814,7 @@ void mpeg2_header_picture_finalize( mpeg2dec_t * mpeg2dec, uint32_t accels )
else else
{ {
/* decoder->second_field = 1; */ /* decoder->second_field = 1; */
mpeg2dec->picture++; /* second field picture */ mpeg2dec->picture++; /* second field picture */
*(mpeg2dec->picture) = mpeg2dec->new_picture; *(mpeg2dec->picture) = mpeg2dec->new_picture;
mpeg2dec->info.current_picture_2nd = mpeg2dec->picture; mpeg2dec->info.current_picture_2nd = mpeg2dec->picture;
if (low_delay || decoder->coding_type == B_TYPE) if (low_delay || decoder->coding_type == B_TYPE)
......
...@@ -50,53 +50,53 @@ void mpeg2_mc_init (uint32_t accel) ...@@ -50,53 +50,53 @@ void mpeg2_mc_init (uint32_t accel)
#define predict_x(i) (avg2 (ref[i], ref[i+1])) #define predict_x(i) (avg2 (ref[i], ref[i+1]))
#define predict_y(i) (avg2 (ref[i], (ref+stride)[i])) #define predict_y(i) (avg2 (ref[i], (ref+stride)[i]))
#define predict_xy(i) (avg4 (ref[i], ref[i+1], \ #define predict_xy(i) (avg4 (ref[i], ref[i+1], \
(ref+stride)[i], (ref+stride)[i+1])) (ref+stride)[i], (ref+stride)[i+1]))
#define put(predictor,i) dest[i] = predictor (i) #define put(predictor,i) dest[i] = predictor (i)
#define avg(predictor,i) dest[i] = avg2 (predictor (i), dest[i]) #define avg(predictor,i) dest[i] = avg2 (predictor (i), dest[i])
/* mc function template */ /* mc function template */
#define MC_FUNC(op,xy) \ #define MC_FUNC(op,xy) \
static void MC_##op##_##xy##_16_c (uint8_t * dest, const uint8_t * ref, \ static void MC_##op##_##xy##_16_c (uint8_t * dest, const uint8_t * ref, \
const int stride, int height) \ const int stride, int height) \
{ \ { \
do { \ do { \
op (predict_##xy, 0); \ op (predict_##xy, 0); \
op (predict_##xy, 1); \ op (predict_##xy, 1); \
op (predict_##xy, 2); \ op (predict_##xy, 2); \
op (predict_##xy, 3); \ op (predict_##xy, 3); \
op (predict_##xy, 4); \ op (predict_##xy, 4); \
op (predict_##xy, 5); \ op (predict_##xy, 5); \
op (predict_##xy, 6); \ op (predict_##xy, 6); \
op (predict_##xy, 7); \ op (predict_##xy, 7); \
op (predict_##xy, 8); \ op (predict_##xy, 8); \
op (predict_##xy, 9); \ op (predict_##xy, 9); \
op (predict_##xy, 10); \ op (predict_##xy, 10); \
op (predict_##xy, 11); \ op (predict_##xy, 11); \
op (predict_##xy, 12); \ op (predict_##xy, 12); \
op (predict_##xy, 13); \ op (predict_##xy, 13); \
op (predict_##xy, 14); \ op (predict_##xy, 14); \
op (predict_##xy, 15); \ op (predict_##xy, 15); \
ref += stride; \ ref += stride; \
dest += stride; \ dest += stride; \
} while (--height); \ } while (--height); \
} \ } \
static void MC_##op##_##xy##_8_c (uint8_t * dest, const uint8_t * ref, \ static void MC_##op##_##xy##_8_c (uint8_t * dest, const uint8_t * ref, \
const int stride, int height) \ const int stride, int height) \
{ \ { \
do { \ do { \
op (predict_##xy, 0); \ op (predict_##xy, 0); \
op (predict_##xy, 1); \ op (predict_##xy, 1); \
op (predict_##xy, 2); \ op (predict_##xy, 2); \
op (predict_##xy, 3); \ op (predict_##xy, 3); \
op (predict_##xy, 4); \ op (predict_##xy, 4); \
op (predict_##xy, 5); \ op (predict_##xy, 5); \
op (predict_##xy, 6); \ op (predict_##xy, 6); \
op (predict_##xy, 7); \ op (predict_##xy, 7); \
ref += stride; \ ref += stride; \
dest += stride; \ dest += stride; \
} while (--height); \ } while (--height); \
} }
/* definitions of the actual mc functions */ /* definitions of the actual mc functions */
......
...@@ -67,175 +67,175 @@ static inline void mmx_zero_reg () ...@@ -67,175 +67,175 @@ static inline void mmx_zero_reg ()
} }
static inline void mmx_average_2_U8 (uint8_t * dest, const uint8_t * src1, static inline void mmx_average_2_U8 (uint8_t * dest, const uint8_t * src1,
const uint8_t * src2) const uint8_t * src2)
{ {
/* *dest = (*src1 + *src2 + 1)/ 2; */ /* *dest = (*src1 + *src2 + 1)/ 2; */
movq_m2r (*src1, mm1); /* load 8 src1 bytes */ movq_m2r (*src1, mm1); /* load 8 src1 bytes */
movq_r2r (mm1, mm2); /* copy 8 src1 bytes */ movq_r2r (mm1, mm2); /* copy 8 src1 bytes */
movq_m2r (*src2, mm3); /* load 8 src2 bytes */ movq_m2r (*src2, mm3); /* load 8 src2 bytes */
movq_r2r (mm3, mm4); /* copy 8 src2 bytes */ movq_r2r (mm3, mm4); /* copy 8 src2 bytes */
pxor_r2r (mm1, mm3); /* xor src1 and src2 */ pxor_r2r (mm1, mm3); /* xor src1 and src2 */
pand_m2r (mask1, mm3); /* mask lower bits */ pand_m2r (mask1, mm3); /* mask lower bits */
psrlq_i2r (1, mm3); /* /2 */ psrlq_i2r (1, mm3); /* /2 */
por_r2r (mm2, mm4); /* or src1 and src2 */ por_r2r (mm2, mm4); /* or src1 and src2 */
psubb_r2r (mm3, mm4); /* subtract subresults */ psubb_r2r (mm3, mm4); /* subtract subresults */
movq_r2m (mm4, *dest); /* store result in dest */ movq_r2m (mm4, *dest); /* store result in dest */
} }
static inline void mmx_interp_average_2_U8 (uint8_t * dest, static inline void mmx_interp_average_2_U8 (uint8_t * dest,
const uint8_t * src1, const uint8_t * src1,
const uint8_t * src2) const uint8_t * src2)
{ {
/* *dest = (*dest + (*src1 + *src2 + 1)/ 2 + 1)/ 2; */ /* *dest = (*dest + (*src1 + *src2 + 1)/ 2 + 1)/ 2; */
movq_m2r (*dest, mm1); /* load 8 dest bytes */ movq_m2r (*dest, mm1); /* load 8 dest bytes */
movq_r2r (mm1, mm2); /* copy 8 dest bytes */ movq_r2r (mm1, mm2); /* copy 8 dest bytes */
movq_m2r (*src1, mm3); /* load 8 src1 bytes */ movq_m2r (*src1, mm3); /* load 8 src1 bytes */
movq_r2r (mm3, mm4); /* copy 8 src1 bytes */ movq_r2r (mm3, mm4); /* copy 8 src1 bytes */
movq_m2r (*src2, mm5); /* load 8 src2 bytes */ movq_m2r (*src2, mm5); /* load 8 src2 bytes */
movq_r2r (mm5, mm6); /* copy 8 src2 bytes */ movq_r2r (mm5, mm6); /* copy 8 src2 bytes */
pxor_r2r (mm3, mm5); /* xor src1 and src2 */ pxor_r2r (mm3, mm5); /* xor src1 and src2 */
pand_m2r (mask1, mm5); /* mask lower bits */ pand_m2r (mask1, mm5); /* mask lower bits */
psrlq_i2r (1, mm5); /* /2 */ psrlq_i2r (1, mm5); /* /2 */
por_r2r (mm4, mm6); /* or src1 and src2 */ por_r2r (mm4, mm6); /* or src1 and src2 */
psubb_r2r (mm5, mm6); /* subtract subresults */ psubb_r2r (mm5, mm6); /* subtract subresults */
movq_r2r (mm6, mm5); /* copy subresult */ movq_r2r (mm6, mm5); /* copy subresult */
pxor_r2r (mm1, mm5); /* xor srcavg and dest */ pxor_r2r (mm1, mm5); /* xor srcavg and dest */
pand_m2r (mask1, mm5); /* mask lower bits */ pand_m2r (mask1, mm5); /* mask lower bits */
psrlq_i2r (1, mm5); /* /2 */ psrlq_i2r (1, mm5); /* /2 */
por_r2r (mm2, mm6); /* or srcavg and dest */ por_r2r (mm2, mm6); /* or srcavg and dest */
psubb_r2r (mm5, mm6); /* subtract subresults */ psubb_r2r (mm5, mm6); /* subtract subresults */
movq_r2m (mm6, *dest); /* store result in dest */ movq_r2m (mm6, *dest); /* store result in dest */
} }
static inline void mmx_average_4_U8 (uint8_t * dest, const uint8_t * src1, static inline void mmx_average_4_U8 (uint8_t * dest, const uint8_t * src1,
const uint8_t * src2, const uint8_t * src2,
const uint8_t * src3, const uint8_t * src3,
const uint8_t * src4) const uint8_t * src4)
{ {
/* *dest = (*src1 + *src2 + *src3 + *src4 + 2)/ 4; */ /* *dest = (*src1 + *src2 + *src3 + *src4 + 2)/ 4; */
movq_m2r (*src1, mm1); /* load 8 src1 bytes */ movq_m2r (*src1, mm1); /* load 8 src1 bytes */
movq_r2r (mm1, mm2); /* copy 8 src1 bytes */ movq_r2r (mm1, mm2); /* copy 8 src1 bytes */
punpcklbw_r2r (mm0, mm1); /* unpack low src1 bytes */ punpcklbw_r2r (mm0, mm1); /* unpack low src1 bytes */
punpckhbw_r2r (mm0, mm2); /* unpack high src1 bytes */ punpckhbw_r2r (mm0, mm2); /* unpack high src1 bytes */
movq_m2r (*src2, mm3); /* load 8 src2 bytes */ movq_m2r (*src2, mm3); /* load 8 src2 bytes */
movq_r2r (mm3, mm4); /* copy 8 src2 bytes */ movq_r2r (mm3, mm4); /* copy 8 src2 bytes */
punpcklbw_r2r (mm0, mm3); /* unpack low src2 bytes */ punpcklbw_r2r (mm0, mm3); /* unpack low src2 bytes */
punpckhbw_r2r (mm0, mm4); /* unpack high src2 bytes */ punpckhbw_r2r (mm0, mm4); /* unpack high src2 bytes */
paddw_r2r (mm3, mm1); /* add lows */ paddw_r2r (mm3, mm1); /* add lows */
paddw_r2r (mm4, mm2); /* add highs */ paddw_r2r (mm4, mm2); /* add highs */
/* now have partials in mm1 and mm2 */ /* now have partials in mm1 and mm2 */
movq_m2r (*src3, mm3); /* load 8 src3 bytes */ movq_m2r (*src3, mm3); /* load 8 src3 bytes */
movq_r2r (mm3, mm4); /* copy 8 src3 bytes */ movq_r2r (mm3, mm4); /* copy 8 src3 bytes */
punpcklbw_r2r (mm0, mm3); /* unpack low src3 bytes */ punpcklbw_r2r (mm0, mm3); /* unpack low src3 bytes */
punpckhbw_r2r (mm0, mm4); /* unpack high src3 bytes */ punpckhbw_r2r (mm0, mm4); /* unpack high src3 bytes */
paddw_r2r (mm3, mm1); /* add lows */ paddw_r2r (mm3, mm1); /* add lows */
paddw_r2r (mm4, mm2); /* add highs */ paddw_r2r (mm4, mm2); /* add highs */
movq_m2r (*src4, mm5); /* load 8 src4 bytes */ movq_m2r (*src4, mm5); /* load 8 src4 bytes */
movq_r2r (mm5, mm6); /* copy 8 src4 bytes */ movq_r2r (mm5, mm6); /* copy 8 src4 bytes */
punpcklbw_r2r (mm0, mm5); /* unpack low src4 bytes */ punpcklbw_r2r (mm0, mm5); /* unpack low src4 bytes */
punpckhbw_r2r (mm0, mm6); /* unpack high src4 bytes */ punpckhbw_r2r (mm0, mm6); /* unpack high src4 bytes */
paddw_r2r (mm5, mm1); /* add lows */ paddw_r2r (mm5, mm1); /* add lows */
paddw_r2r (mm6, mm2); /* add highs */ paddw_r2r (mm6, mm2); /* add highs */
/* now have subtotal in mm1 and mm2 */ /* now have subtotal in mm1 and mm2 */
paddw_m2r (round4, mm1); paddw_m2r (round4, mm1);
psraw_i2r (2, mm1); /* /4 */ psraw_i2r (2, mm1); /* /4 */
paddw_m2r (round4, mm2); paddw_m2r (round4, mm2);
psraw_i2r (2, mm2); /* /4 */ psraw_i2r (2, mm2); /* /4 */
packuswb_r2r (mm2, mm1); /* pack (w/ saturation) */ packuswb_r2r (mm2, mm1); /* pack (w/ saturation) */
movq_r2m (mm1, *dest); /* store result in dest */ movq_r2m (mm1, *dest); /* store result in dest */
} }
static inline void mmx_interp_average_4_U8 (uint8_t * dest, static inline void mmx_interp_average_4_U8 (uint8_t * dest,
const uint8_t * src1, const uint8_t * src1,
const uint8_t * src2, const uint8_t * src2,
const uint8_t * src3, const uint8_t * src3,
const uint8_t * src4) const uint8_t * src4)
{ {
/* *dest = (*dest + (*src1 + *src2 + *src3 + *src4 + 2)/ 4 + 1)/ 2; */ /* *dest = (*dest + (*src1 + *src2 + *src3 + *src4 + 2)/ 4 + 1)/ 2; */
movq_m2r (*src1, mm1); /* load 8 src1 bytes */ movq_m2r (*src1, mm1); /* load 8 src1 bytes */
movq_r2r (mm1, mm2); /* copy 8 src1 bytes */ movq_r2r (mm1, mm2); /* copy 8 src1 bytes */
punpcklbw_r2r (mm0, mm1); /* unpack low src1 bytes */ punpcklbw_r2r (mm0, mm1); /* unpack low src1 bytes */
punpckhbw_r2r (mm0, mm2); /* unpack high src1 bytes */ punpckhbw_r2r (mm0, mm2); /* unpack high src1 bytes */
movq_m2r (*src2, mm3); /* load 8 src2 bytes */ movq_m2r (*src2, mm3); /* load 8 src2 bytes */
movq_r2r (mm3, mm4); /* copy 8 src2 bytes */ movq_r2r (mm3, mm4); /* copy 8 src2 bytes */
punpcklbw_r2r (mm0, mm3); /* unpack low src2 bytes */ punpcklbw_r2r (mm0, mm3); /* unpack low src2 bytes */
punpckhbw_r2r (mm0, mm4); /* unpack high src2 bytes */ punpckhbw_r2r (mm0, mm4); /* unpack high src2 bytes */
paddw_r2r (mm3, mm1); /* add lows */ paddw_r2r (mm3, mm1); /* add lows */
paddw_r2r (mm4, mm2); /* add highs */ paddw_r2r (mm4, mm2); /* add highs */
/* now have partials in mm1 and mm2 */ /* now have partials in mm1 and mm2 */
movq_m2r (*src3, mm3); /* load 8 src3 bytes */ movq_m2r (*src3, mm3); /* load 8 src3 bytes */
movq_r2r (mm3, mm4); /* copy 8 src3 bytes */ movq_r2r (mm3, mm4); /* copy 8 src3 bytes */
punpcklbw_r2r (mm0, mm3); /* unpack low src3 bytes */ punpcklbw_r2r (mm0, mm3); /* unpack low src3 bytes */
punpckhbw_r2r (mm0, mm4); /* unpack high src3 bytes */ punpckhbw_r2r (mm0, mm4); /* unpack high src3 bytes */
paddw_r2r (mm3, mm1); /* add lows */ paddw_r2r (mm3, mm1); /* add lows */
paddw_r2r (mm4, mm2); /* add highs */ paddw_r2r (mm4, mm2); /* add highs */
movq_m2r (*src4, mm5); /* load 8 src4 bytes */ movq_m2r (*src4, mm5); /* load 8 src4 bytes */
movq_r2r (mm5, mm6); /* copy 8 src4 bytes */ movq_r2r (mm5, mm6); /* copy 8 src4 bytes */
punpcklbw_r2r (mm0, mm5); /* unpack low src4 bytes */ punpcklbw_r2r (mm0, mm5); /* unpack low src4 bytes */
punpckhbw_r2r (mm0, mm6); /* unpack high src4 bytes */ punpckhbw_r2r (mm0, mm6); /* unpack high src4 bytes */
paddw_r2r (mm5, mm1); /* add lows */ paddw_r2r (mm5, mm1); /* add lows */
paddw_r2r (mm6, mm2); /* add highs */ paddw_r2r (mm6, mm2); /* add highs */
paddw_m2r (round4, mm1); paddw_m2r (round4, mm1);
psraw_i2r (2, mm1); /* /4 */ psraw_i2r (2, mm1); /* /4 */
paddw_m2r (round4, mm2); paddw_m2r (round4, mm2);
psraw_i2r (2, mm2); /* /4 */ psraw_i2r (2, mm2); /* /4 */
/* now have subtotal/4 in mm1 and mm2 */ /* now have subtotal/4 in mm1 and mm2 */
movq_m2r (*dest, mm3); /* load 8 dest bytes */ movq_m2r (*dest, mm3); /* load 8 dest bytes */
movq_r2r (mm3, mm4); /* copy 8 dest bytes */ movq_r2r (mm3, mm4); /* copy 8 dest bytes */
packuswb_r2r (mm2, mm1); /* pack (w/ saturation) */ packuswb_r2r (mm2, mm1); /* pack (w/ saturation) */
movq_r2r (mm1,mm2); /* copy subresult */ movq_r2r (mm1,mm2); /* copy subresult */
pxor_r2r (mm1, mm3); /* xor srcavg and dest */ pxor_r2r (mm1, mm3); /* xor srcavg and dest */
pand_m2r (mask1, mm3); /* mask lower bits */ pand_m2r (mask1, mm3); /* mask lower bits */
psrlq_i2r (1, mm3); /* /2 */ psrlq_i2r (1, mm3); /* /2 */
por_r2r (mm2, mm4); /* or srcavg and dest */ por_r2r (mm2, mm4); /* or srcavg and dest */
psubb_r2r (mm3, mm4); /* subtract subresults */ psubb_r2r (mm3, mm4); /* subtract subresults */
movq_r2m (mm4, *dest); /* store result in dest */ movq_r2m (mm4, *dest); /* store result in dest */
} }
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
static inline void MC_avg_mmx (const int width, int height, uint8_t * dest, static inline void MC_avg_mmx (const int width, int height, uint8_t * dest,
const uint8_t * ref, const int stride) const uint8_t * ref, const int stride)
{ {
mmx_zero_reg (); mmx_zero_reg ();
...@@ -252,13 +252,13 @@ static inline void MC_avg_mmx (const int width, int height, uint8_t * dest, ...@@ -252,13 +252,13 @@ static inline void MC_avg_mmx (const int width, int height, uint8_t * dest,
} }
static void MC_avg_o_16_mmx (uint8_t * dest, const uint8_t * ref, static void MC_avg_o_16_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg_mmx (16, height, dest, ref, stride); MC_avg_mmx (16, height, dest, ref, stride);
} }
static void MC_avg_o_8_mmx (uint8_t * dest, const uint8_t * ref, static void MC_avg_o_8_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg_mmx (8, height, dest, ref, stride); MC_avg_mmx (8, height, dest, ref, stride);
} }
...@@ -266,19 +266,19 @@ static void MC_avg_o_8_mmx (uint8_t * dest, const uint8_t * ref, ...@@ -266,19 +266,19 @@ static void MC_avg_o_8_mmx (uint8_t * dest, const uint8_t * ref,
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
static inline void MC_put_mmx (const int width, int height, uint8_t * dest, static inline void MC_put_mmx (const int width, int height, uint8_t * dest,
const uint8_t * ref, const int stride) const uint8_t * ref, const int stride)
{ {
mmx_zero_reg (); mmx_zero_reg ();
do do
{ {
movq_m2r (* ref, mm1); /* load 8 ref bytes */ movq_m2r (* ref, mm1); /* load 8 ref bytes */
movq_r2m (mm1,* dest); /* store 8 bytes at curr */ movq_r2m (mm1,* dest); /* store 8 bytes at curr */
if( width == 16 ) if( width == 16 )
{ {
movq_m2r (* (ref+8), mm1); /* load 8 ref bytes */ movq_m2r (* (ref+8), mm1); /* load 8 ref bytes */
movq_r2m (mm1,* (dest+8)); /* store 8 bytes at curr */ movq_r2m (mm1,* (dest+8)); /* store 8 bytes at curr */
} }
dest += stride; dest += stride;
ref += stride; ref += stride;
...@@ -286,13 +286,13 @@ static inline void MC_put_mmx (const int width, int height, uint8_t * dest, ...@@ -286,13 +286,13 @@ static inline void MC_put_mmx (const int width, int height, uint8_t * dest,
} }
static void MC_put_o_16_mmx (uint8_t * dest, const uint8_t * ref, static void MC_put_o_16_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put_mmx (16, height, dest, ref, stride); MC_put_mmx (16, height, dest, ref, stride);
} }
static void MC_put_o_8_mmx (uint8_t * dest, const uint8_t * ref, static void MC_put_o_8_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put_mmx (8, height, dest, ref, stride); MC_put_mmx (8, height, dest, ref, stride);
} }
...@@ -301,7 +301,7 @@ static void MC_put_o_8_mmx (uint8_t * dest, const uint8_t * ref, ...@@ -301,7 +301,7 @@ static void MC_put_o_8_mmx (uint8_t * dest, const uint8_t * ref,
/* Half pixel interpolation in the x direction */ /* Half pixel interpolation in the x direction */
static inline void MC_avg_x_mmx (const int width, int height, uint8_t * dest, static inline void MC_avg_x_mmx (const int width, int height, uint8_t * dest,
const uint8_t * ref, const int stride) const uint8_t * ref, const int stride)
{ {
mmx_zero_reg (); mmx_zero_reg ();
...@@ -318,13 +318,13 @@ static inline void MC_avg_x_mmx (const int width, int height, uint8_t * dest, ...@@ -318,13 +318,13 @@ static inline void MC_avg_x_mmx (const int width, int height, uint8_t * dest,
} }
static void MC_avg_x_16_mmx (uint8_t * dest, const uint8_t * ref, static void MC_avg_x_16_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg_x_mmx (16, height, dest, ref, stride); MC_avg_x_mmx (16, height, dest, ref, stride);
} }
static void MC_avg_x_8_mmx (uint8_t * dest, const uint8_t * ref, static void MC_avg_x_8_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg_x_mmx (8, height, dest, ref, stride); MC_avg_x_mmx (8, height, dest, ref, stride);
} }
...@@ -332,7 +332,7 @@ static void MC_avg_x_8_mmx (uint8_t * dest, const uint8_t * ref, ...@@ -332,7 +332,7 @@ static void MC_avg_x_8_mmx (uint8_t * dest, const uint8_t * ref,
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
static inline void MC_put_x_mmx (const int width, int height, uint8_t * dest, static inline void MC_put_x_mmx (const int width, int height, uint8_t * dest,
const uint8_t * ref, const int stride) const uint8_t * ref, const int stride)
{ {
mmx_zero_reg (); mmx_zero_reg ();
...@@ -349,13 +349,13 @@ static inline void MC_put_x_mmx (const int width, int height, uint8_t * dest, ...@@ -349,13 +349,13 @@ static inline void MC_put_x_mmx (const int width, int height, uint8_t * dest,
} }
static void MC_put_x_16_mmx (uint8_t * dest, const uint8_t * ref, static void MC_put_x_16_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put_x_mmx (16, height, dest, ref, stride); MC_put_x_mmx (16, height, dest, ref, stride);
} }
static void MC_put_x_8_mmx (uint8_t * dest, const uint8_t * ref, static void MC_put_x_8_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put_x_mmx (8, height, dest, ref, stride); MC_put_x_mmx (8, height, dest, ref, stride);
} }
...@@ -363,7 +363,7 @@ static void MC_put_x_8_mmx (uint8_t * dest, const uint8_t * ref, ...@@ -363,7 +363,7 @@ static void MC_put_x_8_mmx (uint8_t * dest, const uint8_t * ref,
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
static inline void MC_avg_xy_mmx (const int width, int height, uint8_t * dest, static inline void MC_avg_xy_mmx (const int width, int height, uint8_t * dest,
const uint8_t * ref, const int stride) const uint8_t * ref, const int stride)
{ {
const uint8_t * ref_next = ref + stride; const uint8_t * ref_next = ref + stride;
...@@ -384,13 +384,13 @@ static inline void MC_avg_xy_mmx (const int width, int height, uint8_t * dest, ...@@ -384,13 +384,13 @@ static inline void MC_avg_xy_mmx (const int width, int height, uint8_t * dest,
} }
static void MC_avg_xy_16_mmx (uint8_t * dest, const uint8_t * ref, static void MC_avg_xy_16_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg_xy_mmx (16, height, dest, ref, stride); MC_avg_xy_mmx (16, height, dest, ref, stride);
} }
static void MC_avg_xy_8_mmx (uint8_t * dest, const uint8_t * ref, static void MC_avg_xy_8_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg_xy_mmx (8, height, dest, ref, stride); MC_avg_xy_mmx (8, height, dest, ref, stride);
} }
...@@ -398,7 +398,7 @@ static void MC_avg_xy_8_mmx (uint8_t * dest, const uint8_t * ref, ...@@ -398,7 +398,7 @@ static void MC_avg_xy_8_mmx (uint8_t * dest, const uint8_t * ref,
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
static inline void MC_put_xy_mmx (const int width, int height, uint8_t * dest, static inline void MC_put_xy_mmx (const int width, int height, uint8_t * dest,
const uint8_t * ref, const int stride) const uint8_t * ref, const int stride)
{ {
const uint8_t * ref_next = ref + stride; const uint8_t * ref_next = ref + stride;
...@@ -418,13 +418,13 @@ static inline void MC_put_xy_mmx (const int width, int height, uint8_t * dest, ...@@ -418,13 +418,13 @@ static inline void MC_put_xy_mmx (const int width, int height, uint8_t * dest,
} }
static void MC_put_xy_16_mmx (uint8_t * dest, const uint8_t * ref, static void MC_put_xy_16_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put_xy_mmx (16, height, dest, ref, stride); MC_put_xy_mmx (16, height, dest, ref, stride);
} }
static void MC_put_xy_8_mmx (uint8_t * dest, const uint8_t * ref, static void MC_put_xy_8_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put_xy_mmx (8, height, dest, ref, stride); MC_put_xy_mmx (8, height, dest, ref, stride);
} }
...@@ -432,7 +432,7 @@ static void MC_put_xy_8_mmx (uint8_t * dest, const uint8_t * ref, ...@@ -432,7 +432,7 @@ static void MC_put_xy_8_mmx (uint8_t * dest, const uint8_t * ref,
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
static inline void MC_avg_y_mmx (const int width, int height, uint8_t * dest, static inline void MC_avg_y_mmx (const int width, int height, uint8_t * dest,
const uint8_t * ref, const int stride) const uint8_t * ref, const int stride)
{ {
const uint8_t * ref_next = ref + stride; const uint8_t * ref_next = ref + stride;
...@@ -452,13 +452,13 @@ static inline void MC_avg_y_mmx (const int width, int height, uint8_t * dest, ...@@ -452,13 +452,13 @@ static inline void MC_avg_y_mmx (const int width, int height, uint8_t * dest,
} }
static void MC_avg_y_16_mmx (uint8_t * dest, const uint8_t * ref, static void MC_avg_y_16_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg_y_mmx (16, height, dest, ref, stride); MC_avg_y_mmx (16, height, dest, ref, stride);
} }
static void MC_avg_y_8_mmx (uint8_t * dest, const uint8_t * ref, static void MC_avg_y_8_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg_y_mmx (8, height, dest, ref, stride); MC_avg_y_mmx (8, height, dest, ref, stride);
} }
...@@ -466,7 +466,7 @@ static void MC_avg_y_8_mmx (uint8_t * dest, const uint8_t * ref, ...@@ -466,7 +466,7 @@ static void MC_avg_y_8_mmx (uint8_t * dest, const uint8_t * ref,
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
static inline void MC_put_y_mmx (const int width, int height, uint8_t * dest, static inline void MC_put_y_mmx (const int width, int height, uint8_t * dest,
const uint8_t * ref, const int stride) const uint8_t * ref, const int stride)
{ {
const uint8_t * ref_next = ref + stride; const uint8_t * ref_next = ref + stride;
...@@ -486,13 +486,13 @@ static inline void MC_put_y_mmx (const int width, int height, uint8_t * dest, ...@@ -486,13 +486,13 @@ static inline void MC_put_y_mmx (const int width, int height, uint8_t * dest,
} }
static void MC_put_y_16_mmx (uint8_t * dest, const uint8_t * ref, static void MC_put_y_16_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put_y_mmx (16, height, dest, ref, stride); MC_put_y_mmx (16, height, dest, ref, stride);
} }
static void MC_put_y_8_mmx (uint8_t * dest, const uint8_t * ref, static void MC_put_y_8_mmx (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put_y_mmx (8, height, dest, ref, stride); MC_put_y_mmx (8, height, dest, ref, stride);
} }
...@@ -502,20 +502,20 @@ MPEG2_MC_EXTERN (mmx) ...@@ -502,20 +502,20 @@ MPEG2_MC_EXTERN (mmx)
/* CPU_MMXEXT/CPU_3DNOW adaptation layer */ /* CPU_MMXEXT/CPU_3DNOW adaptation layer */
#define pavg_r2r(src,dest) \ #define pavg_r2r(src,dest) \
do { \ do { \
if (cpu == CPU_MMXEXT) \ if (cpu == CPU_MMXEXT) \
pavgb_r2r (src, dest); \ pavgb_r2r (src, dest); \
else \ else \
pavgusb_r2r (src, dest); \ pavgusb_r2r (src, dest); \
} while (0) } while (0)
#define pavg_m2r(src,dest) \ #define pavg_m2r(src,dest) \
do { \ do { \
if (cpu == CPU_MMXEXT) \ if (cpu == CPU_MMXEXT) \
pavgb_m2r (src, dest); \ pavgb_m2r (src, dest); \
else \ else \
pavgusb_m2r (src, dest); \ pavgusb_m2r (src, dest); \
} while (0) } while (0)
...@@ -523,7 +523,7 @@ do { \ ...@@ -523,7 +523,7 @@ do { \
static inline void MC_put1_8 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_put1_8 (int height, uint8_t * dest, const uint8_t * ref,
const int stride) const int stride)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -534,7 +534,7 @@ static inline void MC_put1_8 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -534,7 +534,7 @@ static inline void MC_put1_8 (int height, uint8_t * dest, const uint8_t * ref,
} }
static inline void MC_put1_16 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_put1_16 (int height, uint8_t * dest, const uint8_t * ref,
const int stride) const int stride)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -547,7 +547,7 @@ static inline void MC_put1_16 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -547,7 +547,7 @@ static inline void MC_put1_16 (int height, uint8_t * dest, const uint8_t * ref,
} }
static inline void MC_avg1_8 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_avg1_8 (int height, uint8_t * dest, const uint8_t * ref,
const int stride, const int cpu) const int stride, const int cpu)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -559,7 +559,7 @@ static inline void MC_avg1_8 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -559,7 +559,7 @@ static inline void MC_avg1_8 (int height, uint8_t * dest, const uint8_t * ref,
} }
static inline void MC_avg1_16 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_avg1_16 (int height, uint8_t * dest, const uint8_t * ref,
const int stride, const int cpu) const int stride, const int cpu)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -574,8 +574,8 @@ static inline void MC_avg1_16 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -574,8 +574,8 @@ static inline void MC_avg1_16 (int height, uint8_t * dest, const uint8_t * ref,
} }
static inline void MC_put2_8 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_put2_8 (int height, uint8_t * dest, const uint8_t * ref,
const int stride, const int offset, const int stride, const int offset,
const int cpu) const int cpu)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -587,8 +587,8 @@ static inline void MC_put2_8 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -587,8 +587,8 @@ static inline void MC_put2_8 (int height, uint8_t * dest, const uint8_t * ref,
} }
static inline void MC_put2_16 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_put2_16 (int height, uint8_t * dest, const uint8_t * ref,
const int stride, const int offset, const int stride, const int offset,
const int cpu) const int cpu)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -603,8 +603,8 @@ static inline void MC_put2_16 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -603,8 +603,8 @@ static inline void MC_put2_16 (int height, uint8_t * dest, const uint8_t * ref,
} }
static inline void MC_avg2_8 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_avg2_8 (int height, uint8_t * dest, const uint8_t * ref,
const int stride, const int offset, const int stride, const int offset,
const int cpu) const int cpu)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -617,8 +617,8 @@ static inline void MC_avg2_8 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -617,8 +617,8 @@ static inline void MC_avg2_8 (int height, uint8_t * dest, const uint8_t * ref,
} }
static inline void MC_avg2_16 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_avg2_16 (int height, uint8_t * dest, const uint8_t * ref,
const int stride, const int offset, const int stride, const int offset,
const int cpu) const int cpu)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -637,7 +637,7 @@ static inline void MC_avg2_16 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -637,7 +637,7 @@ static inline void MC_avg2_16 (int height, uint8_t * dest, const uint8_t * ref,
static mmx_t mask_one = {0x0101010101010101LL}; static mmx_t mask_one = {0x0101010101010101LL};
static inline void MC_put4_8 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_put4_8 (int height, uint8_t * dest, const uint8_t * ref,
const int stride, const int cpu) const int stride, const int cpu)
{ {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
movq_m2r (*(ref+1), mm1); movq_m2r (*(ref+1), mm1);
...@@ -670,13 +670,13 @@ static inline void MC_put4_8 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -670,13 +670,13 @@ static inline void MC_put4_8 (int height, uint8_t * dest, const uint8_t * ref,
movq_r2m (mm0, *dest); movq_r2m (mm0, *dest);
dest += stride; dest += stride;
movq_r2r (mm6, mm7); /* unroll ! */ movq_r2r (mm6, mm7); /* unroll ! */
movq_r2r (mm2, mm0); /* unroll ! */ movq_r2r (mm2, mm0); /* unroll ! */
} while (--height); } while (--height);
} }
static inline void MC_put4_16 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_put4_16 (int height, uint8_t * dest, const uint8_t * ref,
const int stride, const int cpu) const int stride, const int cpu)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -722,7 +722,7 @@ static inline void MC_put4_16 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -722,7 +722,7 @@ static inline void MC_put4_16 (int height, uint8_t * dest, const uint8_t * ref,
} }
static inline void MC_avg4_8 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_avg4_8 (int height, uint8_t * dest, const uint8_t * ref,
const int stride, const int cpu) const int stride, const int cpu)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -751,7 +751,7 @@ static inline void MC_avg4_8 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -751,7 +751,7 @@ static inline void MC_avg4_8 (int height, uint8_t * dest, const uint8_t * ref,
} }
static inline void MC_avg4_16 (int height, uint8_t * dest, const uint8_t * ref, static inline void MC_avg4_16 (int height, uint8_t * dest, const uint8_t * ref,
const int stride, const int cpu) const int stride, const int cpu)
{ {
do { do {
movq_m2r (*ref, mm0); movq_m2r (*ref, mm0);
...@@ -801,97 +801,97 @@ static inline void MC_avg4_16 (int height, uint8_t * dest, const uint8_t * ref, ...@@ -801,97 +801,97 @@ static inline void MC_avg4_16 (int height, uint8_t * dest, const uint8_t * ref,
} }
static void MC_avg_o_16_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_avg_o_16_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg1_16 (height, dest, ref, stride, CPU_MMXEXT); MC_avg1_16 (height, dest, ref, stride, CPU_MMXEXT);
} }
static void MC_avg_o_8_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_avg_o_8_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg1_8 (height, dest, ref, stride, CPU_MMXEXT); MC_avg1_8 (height, dest, ref, stride, CPU_MMXEXT);
} }
static void MC_put_o_16_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_put_o_16_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put1_16 (height, dest, ref, stride); MC_put1_16 (height, dest, ref, stride);
} }
static void MC_put_o_8_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_put_o_8_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put1_8 (height, dest, ref, stride); MC_put1_8 (height, dest, ref, stride);
} }
static void MC_avg_x_16_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_avg_x_16_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg2_16 (height, dest, ref, stride, 1, CPU_MMXEXT); MC_avg2_16 (height, dest, ref, stride, 1, CPU_MMXEXT);
} }
static void MC_avg_x_8_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_avg_x_8_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg2_8 (height, dest, ref, stride, 1, CPU_MMXEXT); MC_avg2_8 (height, dest, ref, stride, 1, CPU_MMXEXT);
} }
static void MC_put_x_16_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_put_x_16_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put2_16 (height, dest, ref, stride, 1, CPU_MMXEXT); MC_put2_16 (height, dest, ref, stride, 1, CPU_MMXEXT);
} }
static void MC_put_x_8_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_put_x_8_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put2_8 (height, dest, ref, stride, 1, CPU_MMXEXT); MC_put2_8 (height, dest, ref, stride, 1, CPU_MMXEXT);
} }
static void MC_avg_y_16_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_avg_y_16_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg2_16 (height, dest, ref, stride, stride, CPU_MMXEXT); MC_avg2_16 (height, dest, ref, stride, stride, CPU_MMXEXT);
} }
static void MC_avg_y_8_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_avg_y_8_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg2_8 (height, dest, ref, stride, stride, CPU_MMXEXT); MC_avg2_8 (height, dest, ref, stride, stride, CPU_MMXEXT);
} }
static void MC_put_y_16_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_put_y_16_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put2_16 (height, dest, ref, stride, stride, CPU_MMXEXT); MC_put2_16 (height, dest, ref, stride, stride, CPU_MMXEXT);
} }
static void MC_put_y_8_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_put_y_8_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put2_8 (height, dest, ref, stride, stride, CPU_MMXEXT); MC_put2_8 (height, dest, ref, stride, stride, CPU_MMXEXT);
} }
static void MC_avg_xy_16_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_avg_xy_16_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg4_16 (height, dest, ref, stride, CPU_MMXEXT); MC_avg4_16 (height, dest, ref, stride, CPU_MMXEXT);
} }
static void MC_avg_xy_8_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_avg_xy_8_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg4_8 (height, dest, ref, stride, CPU_MMXEXT); MC_avg4_8 (height, dest, ref, stride, CPU_MMXEXT);
} }
static void MC_put_xy_16_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_put_xy_16_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put4_16 (height, dest, ref, stride, CPU_MMXEXT); MC_put4_16 (height, dest, ref, stride, CPU_MMXEXT);
} }
static void MC_put_xy_8_mmxext (uint8_t * dest, const uint8_t * ref, static void MC_put_xy_8_mmxext (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put4_8 (height, dest, ref, stride, CPU_MMXEXT); MC_put4_8 (height, dest, ref, stride, CPU_MMXEXT);
} }
...@@ -899,97 +899,97 @@ static void MC_put_xy_8_mmxext (uint8_t * dest, const uint8_t * ref, ...@@ -899,97 +899,97 @@ static void MC_put_xy_8_mmxext (uint8_t * dest, const uint8_t * ref,
MPEG2_MC_EXTERN (mmxext) MPEG2_MC_EXTERN (mmxext)
static void MC_avg_o_16_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_avg_o_16_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg1_16 (height, dest, ref, stride, CPU_3DNOW); MC_avg1_16 (height, dest, ref, stride, CPU_3DNOW);
} }
static void MC_avg_o_8_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_avg_o_8_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg1_8 (height, dest, ref, stride, CPU_3DNOW); MC_avg1_8 (height, dest, ref, stride, CPU_3DNOW);
} }
static void MC_put_o_16_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_put_o_16_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put1_16 (height, dest, ref, stride); MC_put1_16 (height, dest, ref, stride);
} }
static void MC_put_o_8_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_put_o_8_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put1_8 (height, dest, ref, stride); MC_put1_8 (height, dest, ref, stride);
} }
static void MC_avg_x_16_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_avg_x_16_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg2_16 (height, dest, ref, stride, 1, CPU_3DNOW); MC_avg2_16 (height, dest, ref, stride, 1, CPU_3DNOW);
} }
static void MC_avg_x_8_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_avg_x_8_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg2_8 (height, dest, ref, stride, 1, CPU_3DNOW); MC_avg2_8 (height, dest, ref, stride, 1, CPU_3DNOW);
} }
static void MC_put_x_16_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_put_x_16_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put2_16 (height, dest, ref, stride, 1, CPU_3DNOW); MC_put2_16 (height, dest, ref, stride, 1, CPU_3DNOW);
} }
static void MC_put_x_8_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_put_x_8_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put2_8 (height, dest, ref, stride, 1, CPU_3DNOW); MC_put2_8 (height, dest, ref, stride, 1, CPU_3DNOW);
} }
static void MC_avg_y_16_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_avg_y_16_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg2_16 (height, dest, ref, stride, stride, CPU_3DNOW); MC_avg2_16 (height, dest, ref, stride, stride, CPU_3DNOW);
} }
static void MC_avg_y_8_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_avg_y_8_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg2_8 (height, dest, ref, stride, stride, CPU_3DNOW); MC_avg2_8 (height, dest, ref, stride, stride, CPU_3DNOW);
} }
static void MC_put_y_16_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_put_y_16_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put2_16 (height, dest, ref, stride, stride, CPU_3DNOW); MC_put2_16 (height, dest, ref, stride, stride, CPU_3DNOW);
} }
static void MC_put_y_8_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_put_y_8_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put2_8 (height, dest, ref, stride, stride, CPU_3DNOW); MC_put2_8 (height, dest, ref, stride, stride, CPU_3DNOW);
} }
static void MC_avg_xy_16_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_avg_xy_16_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg4_16 (height, dest, ref, stride, CPU_3DNOW); MC_avg4_16 (height, dest, ref, stride, CPU_3DNOW);
} }
static void MC_avg_xy_8_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_avg_xy_8_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_avg4_8 (height, dest, ref, stride, CPU_3DNOW); MC_avg4_8 (height, dest, ref, stride, CPU_3DNOW);
} }
static void MC_put_xy_16_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_put_xy_16_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put4_16 (height, dest, ref, stride, CPU_3DNOW); MC_put4_16 (height, dest, ref, stride, CPU_3DNOW);
} }
static void MC_put_xy_8_3dnow (uint8_t * dest, const uint8_t * ref, static void MC_put_xy_8_3dnow (uint8_t * dest, const uint8_t * ref,
int stride, int height) int stride, int height)
{ {
MC_put4_8 (height, dest, ref, stride, CPU_3DNOW); MC_put4_8 (height, dest, ref, stride, CPU_3DNOW);
} }
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#define MPEG2_H #define MPEG2_H
#define MPEG2_VERSION(a,b,c) (((a)<<16)|((b)<<8)|(c)) #define MPEG2_VERSION(a,b,c) (((a)<<16)|((b)<<8)|(c))
#define MPEG2_RELEASE MPEG2_VERSION (0, 4, 0) /* 0.4.0 */ #define MPEG2_RELEASE MPEG2_VERSION (0, 4, 0) /* 0.4.0 */
#define SEQ_FLAG_MPEG2 1 #define SEQ_FLAG_MPEG2 1
#define SEQ_FLAG_CONSTRAINED_PARAMETERS 2 #define SEQ_FLAG_CONSTRAINED_PARAMETERS 2
...@@ -154,9 +154,9 @@ typedef enum ...@@ -154,9 +154,9 @@ typedef enum
} mpeg2_convert_stage_t; } mpeg2_convert_stage_t;
typedef int mpeg2_convert_t (int stage, void * id, typedef int mpeg2_convert_t (int stage, void * id,
const mpeg2_sequence_t * sequence, int stride, const mpeg2_sequence_t * sequence, int stride,
uint32_t accel, void * arg, uint32_t accel, void * arg,
mpeg2_convert_init_t * result); mpeg2_convert_init_t * result);
int mpeg2_convert (mpeg2dec_t * mpeg2dec, mpeg2_convert_t convert, void * arg); int mpeg2_convert (mpeg2dec_t * mpeg2dec, mpeg2_convert_t convert, void * arg);
int mpeg2_stride (mpeg2dec_t * mpeg2dec, int stride); int mpeg2_stride (mpeg2dec_t * mpeg2dec, int stride);
void mpeg2_set_buf (mpeg2dec_t * mpeg2dec, uint8_t * buf[3], void * id); void mpeg2_set_buf (mpeg2dec_t * mpeg2dec, uint8_t * buf[3], void * id);
...@@ -188,7 +188,7 @@ void mpeg2_slice_region (mpeg2dec_t * mpeg2dec, int start, int end); ...@@ -188,7 +188,7 @@ void mpeg2_slice_region (mpeg2dec_t * mpeg2dec, int start, int end);
void mpeg2_tag_picture (mpeg2dec_t * mpeg2dec, uint32_t tag, uint32_t tag2); void mpeg2_tag_picture (mpeg2dec_t * mpeg2dec, uint32_t tag, uint32_t tag2);
void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3], void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3],
uint8_t * forward_fbuf[3], uint8_t * backward_fbuf[3]); uint8_t * forward_fbuf[3], uint8_t * backward_fbuf[3]);
typedef enum typedef enum
{ {
...@@ -202,6 +202,6 @@ typedef enum ...@@ -202,6 +202,6 @@ typedef enum
void * mpeg2_malloc (unsigned size, mpeg2_alloc_t reason); void * mpeg2_malloc (unsigned size, mpeg2_alloc_t reason);
void mpeg2_free (void * buf); void mpeg2_free (void * buf);
void mpeg2_malloc_hooks (void * malloc (unsigned, mpeg2_alloc_t), void mpeg2_malloc_hooks (void * malloc (unsigned, mpeg2_alloc_t),
int free (void *)); int free (void *));
#endif /* MPEG2_H */ #endif /* MPEG2_H */
...@@ -66,9 +66,9 @@ struct mpeg2_decoder_s ...@@ -66,9 +66,9 @@ struct mpeg2_decoder_s
/* next inside a slice, and is never used outside of mpeg2_slice() */ /* next inside a slice, and is never used outside of mpeg2_slice() */
/* bit parsing stuff */ /* bit parsing stuff */
uint32_t bitstream_buf; /* current 32 bit working set */ uint32_t bitstream_buf; /* current 32 bit working set */
int bitstream_bits; /* used bits in working set */ int bitstream_bits; /* used bits in working set */
const uint8_t * bitstream_ptr; /* buffer with stream data */ const uint8_t * bitstream_ptr; /* buffer with stream data */
uint8_t * dest[3]; uint8_t * dest[3];
...@@ -203,7 +203,7 @@ struct mpeg2dec_s ...@@ -203,7 +203,7 @@ struct mpeg2dec_s
mpeg2_picture_t new_picture; mpeg2_picture_t new_picture;
mpeg2_picture_t pictures[4]; mpeg2_picture_t pictures[4];
mpeg2_picture_t * picture; mpeg2_picture_t * picture;
/*const*/ mpeg2_fbuf_t * fbuf[3]; /* 0: current fbuf, 1-2: prediction fbufs */ /*const*/ mpeg2_fbuf_t * fbuf[3]; /* 0: current fbuf, 1-2: prediction fbufs */
fbuf_alloc_t fbuf_alloc[3]; fbuf_alloc_t fbuf_alloc[3];
int custom_fbuf; int custom_fbuf;
...@@ -281,7 +281,7 @@ typedef struct { ...@@ -281,7 +281,7 @@ typedef struct {
mpeg2_mc_fct * avg [8]; mpeg2_mc_fct * avg [8];
} mpeg2_mc_t; } mpeg2_mc_t;
#define MPEG2_MC_EXTERN(x) mpeg2_mc_t mpeg2_mc_##x = { \ #define MPEG2_MC_EXTERN(x) mpeg2_mc_t mpeg2_mc_##x = { \
{MC_put_o_16_##x, MC_put_x_16_##x, MC_put_y_16_##x, MC_put_xy_16_##x, \ {MC_put_o_16_##x, MC_put_x_16_##x, MC_put_y_16_##x, MC_put_xy_16_##x, \
MC_put_o_8_##x, MC_put_x_8_##x, MC_put_y_8_##x, MC_put_xy_8_##x}, \ MC_put_o_8_##x, MC_put_x_8_##x, MC_put_y_8_##x, MC_put_xy_8_##x}, \
{MC_avg_o_16_##x, MC_avg_x_16_##x, MC_avg_y_16_##x, MC_avg_xy_16_##x, \ {MC_avg_o_16_##x, MC_avg_x_16_##x, MC_avg_y_16_##x, MC_avg_xy_16_##x, \
......
...@@ -37,7 +37,7 @@ extern void (* mpeg2_cpu_state_restore) (cpu_state_t * state); ...@@ -37,7 +37,7 @@ extern void (* mpeg2_cpu_state_restore) (cpu_state_t * state);
#include "vlc.h" #include "vlc.h"
static inline int get_motion_delta( mpeg2_decoder_t * const decoder, static inline int get_motion_delta( mpeg2_decoder_t * const decoder,
const int f_code ) const int f_code )
{ {
#define bit_buf (decoder->bitstream_buf) #define bit_buf (decoder->bitstream_buf)
#define bits (decoder->bitstream_bits) #define bits (decoder->bitstream_bits)
...@@ -112,292 +112,292 @@ static inline int get_dmv (mpeg2_decoder_t * const decoder) ...@@ -112,292 +112,292 @@ static inline int get_dmv (mpeg2_decoder_t * const decoder)
#undef bit_ptr #undef bit_ptr
} }
#define MOTION_420(table,ref,motion_x,motion_y,size,y) \ #define MOTION_420(table,ref,motion_x,motion_y,size,y) \
pos_x = 2 * decoder->offset + motion_x; \ pos_x = 2 * decoder->offset + motion_x; \
pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \ pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \
if (unlikely (pos_x > decoder->limit_x)) { \ if (unlikely (pos_x > decoder->limit_x)) { \
pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
motion_x = pos_x - 2 * decoder->offset; \ motion_x = pos_x - 2 * decoder->offset; \
} \ } \
if (unlikely (pos_y > decoder->limit_y_ ## size)) { \ if (unlikely (pos_y > decoder->limit_y_ ## size)) { \
pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \ pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \
motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \ motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \
} \ } \
xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \ table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \
ref[0] + (pos_x >> 1) + (pos_y >> 1) * decoder->stride, \ ref[0] + (pos_x >> 1) + (pos_y >> 1) * decoder->stride, \
decoder->stride, size); \ decoder->stride, size); \
motion_x /= 2; motion_y /= 2; \ motion_x /= 2; motion_y /= 2; \
xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \ xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \
offset = (((decoder->offset + motion_x) >> 1) + \ offset = (((decoder->offset + motion_x) >> 1) + \
((((decoder->v_offset + motion_y) >> 1) + y/2) * \ ((((decoder->v_offset + motion_y) >> 1) + y/2) * \
decoder->uv_stride)); \ decoder->uv_stride)); \
table[4+xy_half] (decoder->dest[1] + y/2 * decoder->uv_stride + \ table[4+xy_half] (decoder->dest[1] + y/2 * decoder->uv_stride + \
(decoder->offset >> 1), ref[1] + offset, \ (decoder->offset >> 1), ref[1] + offset, \
decoder->uv_stride, size/2); \ decoder->uv_stride, size/2); \
table[4+xy_half] (decoder->dest[2] + y/2 * decoder->uv_stride + \ table[4+xy_half] (decoder->dest[2] + y/2 * decoder->uv_stride + \
(decoder->offset >> 1), ref[2] + offset, \ (decoder->offset >> 1), ref[2] + offset, \
decoder->uv_stride, size/2) decoder->uv_stride, size/2)
#define MOTION_FIELD_420(table,ref,motion_x,motion_y,dest_field,op,src_field) \ #define MOTION_FIELD_420(table,ref,motion_x,motion_y,dest_field,op,src_field) \
pos_x = 2 * decoder->offset + motion_x; \ pos_x = 2 * decoder->offset + motion_x; \
pos_y = decoder->v_offset + motion_y; \ pos_y = decoder->v_offset + motion_y; \
if (unlikely (pos_x > decoder->limit_x)) { \ if (unlikely (pos_x > decoder->limit_x)) { \
pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
motion_x = pos_x - 2 * decoder->offset; \ motion_x = pos_x - 2 * decoder->offset; \
} \ } \
if (unlikely (pos_y > decoder->limit_y)) { \ if (unlikely (pos_y > decoder->limit_y)) { \
pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
motion_y = pos_y - decoder->v_offset; \ motion_y = pos_y - decoder->v_offset; \
} \ } \
xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \ table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \
decoder->offset, \ decoder->offset, \
(ref[0] + (pos_x >> 1) + \ (ref[0] + (pos_x >> 1) + \
((pos_y op) + src_field) * decoder->stride), \ ((pos_y op) + src_field) * decoder->stride), \
2 * decoder->stride, 8); \ 2 * decoder->stride, 8); \
motion_x /= 2; motion_y /= 2; \ motion_x /= 2; motion_y /= 2; \
xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \ xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \
offset = (((decoder->offset + motion_x) >> 1) + \ offset = (((decoder->offset + motion_x) >> 1) + \
(((decoder->v_offset >> 1) + (motion_y op) + src_field) * \ (((decoder->v_offset >> 1) + (motion_y op) + src_field) * \
decoder->uv_stride)); \ decoder->uv_stride)); \
table[4+xy_half] (decoder->dest[1] + dest_field * decoder->uv_stride + \ table[4+xy_half] (decoder->dest[1] + dest_field * decoder->uv_stride + \
(decoder->offset >> 1), ref[1] + offset, \ (decoder->offset >> 1), ref[1] + offset, \
2 * decoder->uv_stride, 4); \ 2 * decoder->uv_stride, 4); \
table[4+xy_half] (decoder->dest[2] + dest_field * decoder->uv_stride + \ table[4+xy_half] (decoder->dest[2] + dest_field * decoder->uv_stride + \
(decoder->offset >> 1), ref[2] + offset, \ (decoder->offset >> 1), ref[2] + offset, \
2 * decoder->uv_stride, 4) 2 * decoder->uv_stride, 4)
#define MOTION_DMV_420(table,ref,motion_x,motion_y) \ #define MOTION_DMV_420(table,ref,motion_x,motion_y) \
pos_x = 2 * decoder->offset + motion_x; \ pos_x = 2 * decoder->offset + motion_x; \
pos_y = decoder->v_offset + motion_y; \ pos_y = decoder->v_offset + motion_y; \
if (unlikely (pos_x > decoder->limit_x)) { \ if (unlikely (pos_x > decoder->limit_x)) { \
pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
motion_x = pos_x - 2 * decoder->offset; \ motion_x = pos_x - 2 * decoder->offset; \
} \ } \
if (unlikely (pos_y > decoder->limit_y)) { \ if (unlikely (pos_y > decoder->limit_y)) { \
pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
motion_y = pos_y - decoder->v_offset; \ motion_y = pos_y - decoder->v_offset; \
} \ } \
xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \ offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \
table[xy_half] (decoder->dest[0] + decoder->offset, \ table[xy_half] (decoder->dest[0] + decoder->offset, \
ref[0] + offset, 2 * decoder->stride, 8); \ ref[0] + offset, 2 * decoder->stride, 8); \
table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \ table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \
ref[0] + decoder->stride + offset, \ ref[0] + decoder->stride + offset, \
2 * decoder->stride, 8); \ 2 * decoder->stride, 8); \
motion_x /= 2; motion_y /= 2; \ motion_x /= 2; motion_y /= 2; \
xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \ xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \
offset = (((decoder->offset + motion_x) >> 1) + \ offset = (((decoder->offset + motion_x) >> 1) + \
(((decoder->v_offset >> 1) + (motion_y & ~1)) * \ (((decoder->v_offset >> 1) + (motion_y & ~1)) * \
decoder->uv_stride)); \ decoder->uv_stride)); \
table[4+xy_half] (decoder->dest[1] + (decoder->offset >> 1), \ table[4+xy_half] (decoder->dest[1] + (decoder->offset >> 1), \
ref[1] + offset, 2 * decoder->uv_stride, 4); \ ref[1] + offset, 2 * decoder->uv_stride, 4); \
table[4+xy_half] (decoder->dest[1] + decoder->uv_stride + \ table[4+xy_half] (decoder->dest[1] + decoder->uv_stride + \
(decoder->offset >> 1), \ (decoder->offset >> 1), \
ref[1] + decoder->uv_stride + offset, \ ref[1] + decoder->uv_stride + offset, \
2 * decoder->uv_stride, 4); \ 2 * decoder->uv_stride, 4); \
table[4+xy_half] (decoder->dest[2] + (decoder->offset >> 1), \ table[4+xy_half] (decoder->dest[2] + (decoder->offset >> 1), \
ref[2] + offset, 2 * decoder->uv_stride, 4); \ ref[2] + offset, 2 * decoder->uv_stride, 4); \
table[4+xy_half] (decoder->dest[2] + decoder->uv_stride + \ table[4+xy_half] (decoder->dest[2] + decoder->uv_stride + \
(decoder->offset >> 1), \ (decoder->offset >> 1), \
ref[2] + decoder->uv_stride + offset, \ ref[2] + decoder->uv_stride + offset, \
2 * decoder->uv_stride, 4) 2 * decoder->uv_stride, 4)
#define MOTION_ZERO_420(table,ref) \ #define MOTION_ZERO_420(table,ref) \
table[0] (decoder->dest[0] + decoder->offset, \ table[0] (decoder->dest[0] + decoder->offset, \
(ref[0] + decoder->offset + \ (ref[0] + decoder->offset + \
decoder->v_offset * decoder->stride), decoder->stride, 16); \ decoder->v_offset * decoder->stride), decoder->stride, 16); \
offset = ((decoder->offset >> 1) + \ offset = ((decoder->offset >> 1) + \
(decoder->v_offset >> 1) * decoder->uv_stride); \ (decoder->v_offset >> 1) * decoder->uv_stride); \
table[4] (decoder->dest[1] + (decoder->offset >> 1), \ table[4] (decoder->dest[1] + (decoder->offset >> 1), \
ref[1] + offset, decoder->uv_stride, 8); \ ref[1] + offset, decoder->uv_stride, 8); \
table[4] (decoder->dest[2] + (decoder->offset >> 1), \ table[4] (decoder->dest[2] + (decoder->offset >> 1), \
ref[2] + offset, decoder->uv_stride, 8) ref[2] + offset, decoder->uv_stride, 8)
#define MOTION_422(table,ref,motion_x,motion_y,size,y) \ #define MOTION_422(table,ref,motion_x,motion_y,size,y) \
pos_x = 2 * decoder->offset + motion_x; \ pos_x = 2 * decoder->offset + motion_x; \
pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \ pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \
if (unlikely (pos_x > decoder->limit_x)) { \ if (unlikely (pos_x > decoder->limit_x)) { \
pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
motion_x = pos_x - 2 * decoder->offset; \ motion_x = pos_x - 2 * decoder->offset; \
} \ } \
if (unlikely (pos_y > decoder->limit_y_ ## size)) { \ if (unlikely (pos_y > decoder->limit_y_ ## size)) { \
pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \ pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \
motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \ motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \
} \ } \
xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
offset = (pos_x >> 1) + (pos_y >> 1) * decoder->stride; \ offset = (pos_x >> 1) + (pos_y >> 1) * decoder->stride; \
table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \ table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \
ref[0] + offset, decoder->stride, size); \ ref[0] + offset, decoder->stride, size); \
offset = (offset + (motion_x & (motion_x < 0))) >> 1; \ offset = (offset + (motion_x & (motion_x < 0))) >> 1; \
motion_x /= 2; \ motion_x /= 2; \
xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \ xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \
table[4+xy_half] (decoder->dest[1] + y * decoder->uv_stride + \ table[4+xy_half] (decoder->dest[1] + y * decoder->uv_stride + \
(decoder->offset >> 1), ref[1] + offset, \ (decoder->offset >> 1), ref[1] + offset, \
decoder->uv_stride, size); \ decoder->uv_stride, size); \
table[4+xy_half] (decoder->dest[2] + y * decoder->uv_stride + \ table[4+xy_half] (decoder->dest[2] + y * decoder->uv_stride + \
(decoder->offset >> 1), ref[2] + offset, \ (decoder->offset >> 1), ref[2] + offset, \
decoder->uv_stride, size) decoder->uv_stride, size)
#define MOTION_FIELD_422(table,ref,motion_x,motion_y,dest_field,op,src_field) \ #define MOTION_FIELD_422(table,ref,motion_x,motion_y,dest_field,op,src_field) \
pos_x = 2 * decoder->offset + motion_x; \ pos_x = 2 * decoder->offset + motion_x; \
pos_y = decoder->v_offset + motion_y; \ pos_y = decoder->v_offset + motion_y; \
if (unlikely (pos_x > decoder->limit_x)) { \ if (unlikely (pos_x > decoder->limit_x)) { \
pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
motion_x = pos_x - 2 * decoder->offset; \ motion_x = pos_x - 2 * decoder->offset; \
} \ } \
if (unlikely (pos_y > decoder->limit_y)) { \ if (unlikely (pos_y > decoder->limit_y)) { \
pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
motion_y = pos_y - decoder->v_offset; \ motion_y = pos_y - decoder->v_offset; \
} \ } \
xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
offset = (pos_x >> 1) + ((pos_y op) + src_field) * decoder->stride; \ offset = (pos_x >> 1) + ((pos_y op) + src_field) * decoder->stride; \
table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \ table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \
decoder->offset, ref[0] + offset, \ decoder->offset, ref[0] + offset, \
2 * decoder->stride, 8); \ 2 * decoder->stride, 8); \
offset = (offset + (motion_x & (motion_x < 0))) >> 1; \ offset = (offset + (motion_x & (motion_x < 0))) >> 1; \
motion_x /= 2; \ motion_x /= 2; \
xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \ xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \
table[4+xy_half] (decoder->dest[1] + dest_field * decoder->uv_stride + \ table[4+xy_half] (decoder->dest[1] + dest_field * decoder->uv_stride + \
(decoder->offset >> 1), ref[1] + offset, \ (decoder->offset >> 1), ref[1] + offset, \
2 * decoder->uv_stride, 8); \ 2 * decoder->uv_stride, 8); \
table[4+xy_half] (decoder->dest[2] + dest_field * decoder->uv_stride + \ table[4+xy_half] (decoder->dest[2] + dest_field * decoder->uv_stride + \
(decoder->offset >> 1), ref[2] + offset, \ (decoder->offset >> 1), ref[2] + offset, \
2 * decoder->uv_stride, 8) 2 * decoder->uv_stride, 8)
#define MOTION_DMV_422(table,ref,motion_x,motion_y) \ #define MOTION_DMV_422(table,ref,motion_x,motion_y) \
pos_x = 2 * decoder->offset + motion_x; \ pos_x = 2 * decoder->offset + motion_x; \
pos_y = decoder->v_offset + motion_y; \ pos_y = decoder->v_offset + motion_y; \
if (unlikely (pos_x > decoder->limit_x)) { \ if (unlikely (pos_x > decoder->limit_x)) { \
pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
motion_x = pos_x - 2 * decoder->offset; \ motion_x = pos_x - 2 * decoder->offset; \
} \ } \
if (unlikely (pos_y > decoder->limit_y)) { \ if (unlikely (pos_y > decoder->limit_y)) { \
pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
motion_y = pos_y - decoder->v_offset; \ motion_y = pos_y - decoder->v_offset; \
} \ } \
xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \ offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \
table[xy_half] (decoder->dest[0] + decoder->offset, \ table[xy_half] (decoder->dest[0] + decoder->offset, \
ref[0] + offset, 2 * decoder->stride, 8); \ ref[0] + offset, 2 * decoder->stride, 8); \
table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \ table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \
ref[0] + decoder->stride + offset, \ ref[0] + decoder->stride + offset, \
2 * decoder->stride, 8); \ 2 * decoder->stride, 8); \
offset = (offset + (motion_x & (motion_x < 0))) >> 1; \ offset = (offset + (motion_x & (motion_x < 0))) >> 1; \
motion_x /= 2; \ motion_x /= 2; \
xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \ xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \
table[4+xy_half] (decoder->dest[1] + (decoder->offset >> 1), \ table[4+xy_half] (decoder->dest[1] + (decoder->offset >> 1), \
ref[1] + offset, 2 * decoder->uv_stride, 8); \ ref[1] + offset, 2 * decoder->uv_stride, 8); \
table[4+xy_half] (decoder->dest[1] + decoder->uv_stride + \ table[4+xy_half] (decoder->dest[1] + decoder->uv_stride + \
(decoder->offset >> 1), \ (decoder->offset >> 1), \
ref[1] + decoder->uv_stride + offset, \ ref[1] + decoder->uv_stride + offset, \
2 * decoder->uv_stride, 8); \ 2 * decoder->uv_stride, 8); \
table[4+xy_half] (decoder->dest[2] + (decoder->offset >> 1), \ table[4+xy_half] (decoder->dest[2] + (decoder->offset >> 1), \
ref[2] + offset, 2 * decoder->uv_stride, 8); \ ref[2] + offset, 2 * decoder->uv_stride, 8); \
table[4+xy_half] (decoder->dest[2] + decoder->uv_stride + \ table[4+xy_half] (decoder->dest[2] + decoder->uv_stride + \
(decoder->offset >> 1), \ (decoder->offset >> 1), \
ref[2] + decoder->uv_stride + offset, \ ref[2] + decoder->uv_stride + offset, \
2 * decoder->uv_stride, 8) 2 * decoder->uv_stride, 8)
#define MOTION_ZERO_422(table,ref) \ #define MOTION_ZERO_422(table,ref) \
offset = decoder->offset + decoder->v_offset * decoder->stride; \ offset = decoder->offset + decoder->v_offset * decoder->stride; \
table[0] (decoder->dest[0] + decoder->offset, \ table[0] (decoder->dest[0] + decoder->offset, \
ref[0] + offset, decoder->stride, 16); \ ref[0] + offset, decoder->stride, 16); \
offset >>= 1; \ offset >>= 1; \
table[4] (decoder->dest[1] + (decoder->offset >> 1), \ table[4] (decoder->dest[1] + (decoder->offset >> 1), \
ref[1] + offset, decoder->uv_stride, 16); \ ref[1] + offset, decoder->uv_stride, 16); \
table[4] (decoder->dest[2] + (decoder->offset >> 1), \ table[4] (decoder->dest[2] + (decoder->offset >> 1), \
ref[2] + offset, decoder->uv_stride, 16) ref[2] + offset, decoder->uv_stride, 16)
#define MOTION_444(table,ref,motion_x,motion_y,size,y) \ #define MOTION_444(table,ref,motion_x,motion_y,size,y) \
pos_x = 2 * decoder->offset + motion_x; \ pos_x = 2 * decoder->offset + motion_x; \
pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \ pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \
if (unlikely (pos_x > decoder->limit_x)) { \ if (unlikely (pos_x > decoder->limit_x)) { \
pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
motion_x = pos_x - 2 * decoder->offset; \ motion_x = pos_x - 2 * decoder->offset; \
} \ } \
if (unlikely (pos_y > decoder->limit_y_ ## size)) { \ if (unlikely (pos_y > decoder->limit_y_ ## size)) { \
pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \ pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \
motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \ motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \
} \ } \
xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
offset = (pos_x >> 1) + (pos_y >> 1) * decoder->stride; \ offset = (pos_x >> 1) + (pos_y >> 1) * decoder->stride; \
table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \ table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \
ref[0] + offset, decoder->stride, size); \ ref[0] + offset, decoder->stride, size); \
table[xy_half] (decoder->dest[1] + y * decoder->stride + decoder->offset, \ table[xy_half] (decoder->dest[1] + y * decoder->stride + decoder->offset, \
ref[1] + offset, decoder->stride, size); \ ref[1] + offset, decoder->stride, size); \
table[xy_half] (decoder->dest[2] + y * decoder->stride + decoder->offset, \ table[xy_half] (decoder->dest[2] + y * decoder->stride + decoder->offset, \
ref[2] + offset, decoder->stride, size) ref[2] + offset, decoder->stride, size)
#define MOTION_FIELD_444(table,ref,motion_x,motion_y,dest_field,op,src_field) \ #define MOTION_FIELD_444(table,ref,motion_x,motion_y,dest_field,op,src_field) \
pos_x = 2 * decoder->offset + motion_x; \ pos_x = 2 * decoder->offset + motion_x; \
pos_y = decoder->v_offset + motion_y; \ pos_y = decoder->v_offset + motion_y; \
if (unlikely (pos_x > decoder->limit_x)) { \ if (unlikely (pos_x > decoder->limit_x)) { \
pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
motion_x = pos_x - 2 * decoder->offset; \ motion_x = pos_x - 2 * decoder->offset; \
} \ } \
if (unlikely (pos_y > decoder->limit_y)) { \ if (unlikely (pos_y > decoder->limit_y)) { \
pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
motion_y = pos_y - decoder->v_offset; \ motion_y = pos_y - decoder->v_offset; \
} \ } \
xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
offset = (pos_x >> 1) + ((pos_y op) + src_field) * decoder->stride; \ offset = (pos_x >> 1) + ((pos_y op) + src_field) * decoder->stride; \
table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \ table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \
decoder->offset, ref[0] + offset, \ decoder->offset, ref[0] + offset, \
2 * decoder->stride, 8); \ 2 * decoder->stride, 8); \
table[xy_half] (decoder->dest[1] + dest_field * decoder->stride + \ table[xy_half] (decoder->dest[1] + dest_field * decoder->stride + \
decoder->offset, ref[1] + offset, \ decoder->offset, ref[1] + offset, \
2 * decoder->stride, 8); \ 2 * decoder->stride, 8); \
table[xy_half] (decoder->dest[2] + dest_field * decoder->stride + \ table[xy_half] (decoder->dest[2] + dest_field * decoder->stride + \
decoder->offset, ref[2] + offset, \ decoder->offset, ref[2] + offset, \
2 * decoder->stride, 8) 2 * decoder->stride, 8)
#define MOTION_DMV_444(table,ref,motion_x,motion_y) \ #define MOTION_DMV_444(table,ref,motion_x,motion_y) \
pos_x = 2 * decoder->offset + motion_x; \ pos_x = 2 * decoder->offset + motion_x; \
pos_y = decoder->v_offset + motion_y; \ pos_y = decoder->v_offset + motion_y; \
if (unlikely (pos_x > decoder->limit_x)) { \ if (unlikely (pos_x > decoder->limit_x)) { \
pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
motion_x = pos_x - 2 * decoder->offset; \ motion_x = pos_x - 2 * decoder->offset; \
} \ } \
if (unlikely (pos_y > decoder->limit_y)) { \ if (unlikely (pos_y > decoder->limit_y)) { \
pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
motion_y = pos_y - decoder->v_offset; \ motion_y = pos_y - decoder->v_offset; \
} \ } \
xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \ offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \
table[xy_half] (decoder->dest[0] + decoder->offset, \ table[xy_half] (decoder->dest[0] + decoder->offset, \
ref[0] + offset, 2 * decoder->stride, 8); \ ref[0] + offset, 2 * decoder->stride, 8); \
table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \ table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \
ref[0] + decoder->stride + offset, \ ref[0] + decoder->stride + offset, \
2 * decoder->stride, 8); \ 2 * decoder->stride, 8); \
table[xy_half] (decoder->dest[1] + decoder->offset, \ table[xy_half] (decoder->dest[1] + decoder->offset, \
ref[1] + offset, 2 * decoder->stride, 8); \ ref[1] + offset, 2 * decoder->stride, 8); \
table[xy_half] (decoder->dest[1] + decoder->stride + decoder->offset, \ table[xy_half] (decoder->dest[1] + decoder->stride + decoder->offset, \
ref[1] + decoder->stride + offset, \ ref[1] + decoder->stride + offset, \
2 * decoder->stride, 8); \ 2 * decoder->stride, 8); \
table[xy_half] (decoder->dest[2] + decoder->offset, \ table[xy_half] (decoder->dest[2] + decoder->offset, \
ref[2] + offset, 2 * decoder->stride, 8); \ ref[2] + offset, 2 * decoder->stride, 8); \
table[xy_half] (decoder->dest[2] + decoder->stride + decoder->offset, \ table[xy_half] (decoder->dest[2] + decoder->stride + decoder->offset, \
ref[2] + decoder->stride + offset, \ ref[2] + decoder->stride + offset, \
2 * decoder->stride, 8) 2 * decoder->stride, 8)
#define MOTION_ZERO_444(table,ref) \ #define MOTION_ZERO_444(table,ref) \
offset = decoder->offset + decoder->v_offset * decoder->stride; \ offset = decoder->offset + decoder->v_offset * decoder->stride; \
table[0] (decoder->dest[0] + decoder->offset, \ table[0] (decoder->dest[0] + decoder->offset, \
ref[0] + offset, decoder->stride, 16); \ ref[0] + offset, decoder->stride, 16); \
table[4] (decoder->dest[1] + decoder->offset, \ table[4] (decoder->dest[1] + decoder->offset, \
ref[1] + offset, decoder->stride, 16); \ ref[1] + offset, decoder->stride, 16); \
table[4] (decoder->dest[2] + (decoder->offset >> 1), \ table[4] (decoder->dest[2] + (decoder->offset >> 1), \
ref[2] + offset, decoder->stride, 16) ref[2] + offset, decoder->stride, 16)
#define bit_buf (decoder->bitstream_buf) #define bit_buf (decoder->bitstream_buf)
#define bits (decoder->bitstream_bits) #define bits (decoder->bitstream_bits)
#define bit_ptr (decoder->bitstream_ptr) #define bit_ptr (decoder->bitstream_ptr)
static void motion_mp1 (mpeg2_decoder_t * const decoder, static void motion_mp1 (mpeg2_decoder_t * const decoder,
motion_t * const motion, motion_t * const motion,
mpeg2_mc_fct * const * const table) mpeg2_mc_fct * const * const table)
{ {
int motion_x, motion_y; int motion_x, motion_y;
unsigned int pos_x, pos_y, xy_half, offset; unsigned int pos_x, pos_y, xy_half, offset;
...@@ -421,231 +421,231 @@ static void motion_mp1 (mpeg2_decoder_t * const decoder, ...@@ -421,231 +421,231 @@ static void motion_mp1 (mpeg2_decoder_t * const decoder,
} }
#define MOTION_FUNCTIONS(FORMAT,MOTION,MOTION_FIELD,MOTION_DMV,MOTION_ZERO) \ #define MOTION_FUNCTIONS(FORMAT,MOTION,MOTION_FIELD,MOTION_DMV,MOTION_ZERO) \
\ \
static void motion_fr_frame_##FORMAT (mpeg2_decoder_t * const decoder, \ static void motion_fr_frame_##FORMAT (mpeg2_decoder_t * const decoder, \
motion_t * const motion, \ motion_t * const motion, \
mpeg2_mc_fct * const * const table) \ mpeg2_mc_fct * const * const table) \
{ \ { \
int motion_x, motion_y; \ int motion_x, motion_y; \
unsigned int pos_x, pos_y, xy_half, offset; \ unsigned int pos_x, pos_y, xy_half, offset; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
motion->f_code[0]); \ motion->f_code[0]); \
motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \ motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \ motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \
motion->f_code[1]); \ motion->f_code[1]); \
motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \ motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \
motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \ motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \
\ \
MOTION (table, motion->ref[0], motion_x, motion_y, 16, 0); \ MOTION (table, motion->ref[0], motion_x, motion_y, 16, 0); \
} \ } \
\ \
static void motion_fr_field_##FORMAT (mpeg2_decoder_t * const decoder, \ static void motion_fr_field_##FORMAT (mpeg2_decoder_t * const decoder, \
motion_t * const motion, \ motion_t * const motion, \
mpeg2_mc_fct * const * const table) \ mpeg2_mc_fct * const * const table) \
{ \ { \
int motion_x, motion_y, field; \ int motion_x, motion_y, field; \
unsigned int pos_x, pos_y, xy_half, offset; \ unsigned int pos_x, pos_y, xy_half, offset; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
field = UBITS (bit_buf, 1); \ field = UBITS (bit_buf, 1); \
DUMPBITS (bit_buf, bits, 1); \ DUMPBITS (bit_buf, bits, 1); \
\ \
motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
motion->f_code[0]); \ motion->f_code[0]); \
motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
motion->pmv[0][0] = motion_x; \ motion->pmv[0][0] = motion_x; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
motion_y = ((motion->pmv[0][1] >> 1) + \ motion_y = ((motion->pmv[0][1] >> 1) + \
get_motion_delta (decoder, motion->f_code[1])); \ get_motion_delta (decoder, motion->f_code[1])); \
/* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \ /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \
motion->pmv[0][1] = motion_y << 1; \ motion->pmv[0][1] = motion_y << 1; \
\ \
MOTION_FIELD (table, motion->ref[0], motion_x, motion_y, 0, & ~1, field); \ MOTION_FIELD (table, motion->ref[0], motion_x, motion_y, 0, & ~1, field); \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
field = UBITS (bit_buf, 1); \ field = UBITS (bit_buf, 1); \
DUMPBITS (bit_buf, bits, 1); \ DUMPBITS (bit_buf, bits, 1); \
\ \
motion_x = motion->pmv[1][0] + get_motion_delta (decoder, \ motion_x = motion->pmv[1][0] + get_motion_delta (decoder, \
motion->f_code[0]); \ motion->f_code[0]); \
motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
motion->pmv[1][0] = motion_x; \ motion->pmv[1][0] = motion_x; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
motion_y = ((motion->pmv[1][1] >> 1) + \ motion_y = ((motion->pmv[1][1] >> 1) + \
get_motion_delta (decoder, motion->f_code[1])); \ get_motion_delta (decoder, motion->f_code[1])); \
/* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \ /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \
motion->pmv[1][1] = motion_y << 1; \ motion->pmv[1][1] = motion_y << 1; \
\ \
MOTION_FIELD (table, motion->ref[0], motion_x, motion_y, 1, & ~1, field); \ MOTION_FIELD (table, motion->ref[0], motion_x, motion_y, 1, & ~1, field); \
} \ } \
\ \
static void motion_fr_dmv_##FORMAT (mpeg2_decoder_t * const decoder, \ static void motion_fr_dmv_##FORMAT (mpeg2_decoder_t * const decoder, \
motion_t * const motion, \ motion_t * const motion, \
mpeg2_mc_fct * const * const table) \ mpeg2_mc_fct * const * const table) \
{ \ { \
int motion_x, motion_y, dmv_x, dmv_y, m, other_x, other_y; \ int motion_x, motion_y, dmv_x, dmv_y, m, other_x, other_y; \
unsigned int pos_x, pos_y, xy_half, offset; \ unsigned int pos_x, pos_y, xy_half, offset; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
motion->f_code[0]); \ motion->f_code[0]); \
motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \ motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
dmv_x = get_dmv (decoder); \ dmv_x = get_dmv (decoder); \
\ \
motion_y = ((motion->pmv[0][1] >> 1) + \ motion_y = ((motion->pmv[0][1] >> 1) + \
get_motion_delta (decoder, motion->f_code[1])); \ get_motion_delta (decoder, motion->f_code[1])); \
/* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \ /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \
motion->pmv[1][1] = motion->pmv[0][1] = motion_y << 1; \ motion->pmv[1][1] = motion->pmv[0][1] = motion_y << 1; \
dmv_y = get_dmv (decoder); \ dmv_y = get_dmv (decoder); \
\ \
m = decoder->top_field_first ? 1 : 3; \ m = decoder->top_field_first ? 1 : 3; \
other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x; \ other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x; \
other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y - 1; \ other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y - 1; \
MOTION_FIELD (mpeg2_mc.put, motion->ref[0], other_x, other_y, 0, | 1, 0); \ MOTION_FIELD (mpeg2_mc.put, motion->ref[0], other_x, other_y, 0, | 1, 0); \
\ \
m = decoder->top_field_first ? 3 : 1; \ m = decoder->top_field_first ? 3 : 1; \
other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x; \ other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x; \
other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y + 1; \ other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y + 1; \
MOTION_FIELD (mpeg2_mc.put, motion->ref[0], other_x, other_y, 1, & ~1, 0);\ MOTION_FIELD (mpeg2_mc.put, motion->ref[0], other_x, other_y, 1, & ~1, 0);\
\ \
MOTION_DMV (mpeg2_mc.avg, motion->ref[0], motion_x, motion_y); \ MOTION_DMV (mpeg2_mc.avg, motion->ref[0], motion_x, motion_y); \
} \ } \
\ \
static void motion_reuse_##FORMAT (mpeg2_decoder_t * const decoder, \ static void motion_reuse_##FORMAT (mpeg2_decoder_t * const decoder, \
motion_t * const motion, \ motion_t * const motion, \
mpeg2_mc_fct * const * const table) \ mpeg2_mc_fct * const * const table) \
{ \ { \
int motion_x, motion_y; \ int motion_x, motion_y; \
unsigned int pos_x, pos_y, xy_half, offset; \ unsigned int pos_x, pos_y, xy_half, offset; \
\ \
motion_x = motion->pmv[0][0]; \ motion_x = motion->pmv[0][0]; \
motion_y = motion->pmv[0][1]; \ motion_y = motion->pmv[0][1]; \
\ \
MOTION (table, motion->ref[0], motion_x, motion_y, 16, 0); \ MOTION (table, motion->ref[0], motion_x, motion_y, 16, 0); \
} \ } \
\ \
static void motion_zero_##FORMAT (mpeg2_decoder_t * const decoder, \ static void motion_zero_##FORMAT (mpeg2_decoder_t * const decoder, \
motion_t * const motion, \ motion_t * const motion, \
mpeg2_mc_fct * const * const table) \ mpeg2_mc_fct * const * const table) \
{ \ { \
unsigned int offset; \ unsigned int offset; \
\ \
motion->pmv[0][0] = motion->pmv[0][1] = 0; \ motion->pmv[0][0] = motion->pmv[0][1] = 0; \
motion->pmv[1][0] = motion->pmv[1][1] = 0; \ motion->pmv[1][0] = motion->pmv[1][1] = 0; \
\ \
MOTION_ZERO (table, motion->ref[0]); \ MOTION_ZERO (table, motion->ref[0]); \
} \ } \
\ \
static void motion_fi_field_##FORMAT (mpeg2_decoder_t * const decoder, \ static void motion_fi_field_##FORMAT (mpeg2_decoder_t * const decoder, \
motion_t * const motion, \ motion_t * const motion, \
mpeg2_mc_fct * const * const table) \ mpeg2_mc_fct * const * const table) \
{ \ { \
int motion_x, motion_y; \ int motion_x, motion_y; \
uint8_t ** ref_field; \ uint8_t ** ref_field; \
unsigned int pos_x, pos_y, xy_half, offset; \ unsigned int pos_x, pos_y, xy_half, offset; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
ref_field = motion->ref2[UBITS (bit_buf, 1)]; \ ref_field = motion->ref2[UBITS (bit_buf, 1)]; \
DUMPBITS (bit_buf, bits, 1); \ DUMPBITS (bit_buf, bits, 1); \
\ \
motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
motion->f_code[0]); \ motion->f_code[0]); \
motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \ motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \ motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \
motion->f_code[1]); \ motion->f_code[1]); \
motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \ motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \
motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \ motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \
\ \
MOTION (table, ref_field, motion_x, motion_y, 16, 0); \ MOTION (table, ref_field, motion_x, motion_y, 16, 0); \
} \ } \
\ \
static void motion_fi_16x8_##FORMAT (mpeg2_decoder_t * const decoder, \ static void motion_fi_16x8_##FORMAT (mpeg2_decoder_t * const decoder, \
motion_t * const motion, \ motion_t * const motion, \
mpeg2_mc_fct * const * const table) \ mpeg2_mc_fct * const * const table) \
{ \ { \
int motion_x, motion_y; \ int motion_x, motion_y; \
uint8_t ** ref_field; \ uint8_t ** ref_field; \
unsigned int pos_x, pos_y, xy_half, offset; \ unsigned int pos_x, pos_y, xy_half, offset; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
ref_field = motion->ref2[UBITS (bit_buf, 1)]; \ ref_field = motion->ref2[UBITS (bit_buf, 1)]; \
DUMPBITS (bit_buf, bits, 1); \ DUMPBITS (bit_buf, bits, 1); \
\ \
motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
motion->f_code[0]); \ motion->f_code[0]); \
motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
motion->pmv[0][0] = motion_x; \ motion->pmv[0][0] = motion_x; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \ motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \
motion->f_code[1]); \ motion->f_code[1]); \
motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \ motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \
motion->pmv[0][1] = motion_y; \ motion->pmv[0][1] = motion_y; \
\ \
MOTION (table, ref_field, motion_x, motion_y, 8, 0); \ MOTION (table, ref_field, motion_x, motion_y, 8, 0); \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
ref_field = motion->ref2[UBITS (bit_buf, 1)]; \ ref_field = motion->ref2[UBITS (bit_buf, 1)]; \
DUMPBITS (bit_buf, bits, 1); \ DUMPBITS (bit_buf, bits, 1); \
\ \
motion_x = motion->pmv[1][0] + get_motion_delta (decoder, \ motion_x = motion->pmv[1][0] + get_motion_delta (decoder, \
motion->f_code[0]); \ motion->f_code[0]); \
motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
motion->pmv[1][0] = motion_x; \ motion->pmv[1][0] = motion_x; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
motion_y = motion->pmv[1][1] + get_motion_delta (decoder, \ motion_y = motion->pmv[1][1] + get_motion_delta (decoder, \
motion->f_code[1]); \ motion->f_code[1]); \
motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \ motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \
motion->pmv[1][1] = motion_y; \ motion->pmv[1][1] = motion_y; \
\ \
MOTION (table, ref_field, motion_x, motion_y, 8, 8); \ MOTION (table, ref_field, motion_x, motion_y, 8, 8); \
} \ } \
\ \
static void motion_fi_dmv_##FORMAT (mpeg2_decoder_t * const decoder, \ static void motion_fi_dmv_##FORMAT (mpeg2_decoder_t * const decoder, \
motion_t * const motion, \ motion_t * const motion, \
mpeg2_mc_fct * const * const table) \ mpeg2_mc_fct * const * const table) \
{ \ { \
int motion_x, motion_y, other_x, other_y; \ int motion_x, motion_y, other_x, other_y; \
unsigned int pos_x, pos_y, xy_half, offset; \ unsigned int pos_x, pos_y, xy_half, offset; \
\ \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
motion->f_code[0]); \ motion->f_code[0]); \
motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \ motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \
NEEDBITS (bit_buf, bits, bit_ptr); \ NEEDBITS (bit_buf, bits, bit_ptr); \
other_x = ((motion_x + (motion_x > 0)) >> 1) + get_dmv (decoder); \ other_x = ((motion_x + (motion_x > 0)) >> 1) + get_dmv (decoder); \
\ \
motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \ motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \
motion->f_code[1]); \ motion->f_code[1]); \
motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \ motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \
motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \ motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \
other_y = (((motion_y + (motion_y > 0)) >> 1) + get_dmv (decoder) + \ other_y = (((motion_y + (motion_y > 0)) >> 1) + get_dmv (decoder) + \
decoder->dmv_offset); \ decoder->dmv_offset); \
\ \
MOTION (mpeg2_mc.put, motion->ref[0], motion_x, motion_y, 16, 0); \ MOTION (mpeg2_mc.put, motion->ref[0], motion_x, motion_y, 16, 0); \
MOTION (mpeg2_mc.avg, motion->ref[1], other_x, other_y, 16, 0); \ MOTION (mpeg2_mc.avg, motion->ref[1], other_x, other_y, 16, 0); \
} \ } \
MOTION_FUNCTIONS (420, MOTION_420, MOTION_FIELD_420, MOTION_DMV_420, MOTION_FUNCTIONS (420, MOTION_420, MOTION_FIELD_420, MOTION_DMV_420,
MOTION_ZERO_420) MOTION_ZERO_420)
MOTION_FUNCTIONS (422, MOTION_422, MOTION_FIELD_422, MOTION_DMV_422, MOTION_FUNCTIONS (422, MOTION_422, MOTION_FIELD_422, MOTION_DMV_422,
MOTION_ZERO_422) MOTION_ZERO_422)
MOTION_FUNCTIONS (444, MOTION_444, MOTION_FIELD_444, MOTION_DMV_444, MOTION_FUNCTIONS (444, MOTION_444, MOTION_FIELD_444, MOTION_DMV_444,
MOTION_ZERO_444) MOTION_ZERO_444)
/* like motion_frame, but parsing without actual motion compensation */ /* like motion_frame, but parsing without actual motion compensation */
static void motion_fr_conceal (mpeg2_decoder_t * const decoder) static void motion_fr_conceal (mpeg2_decoder_t * const decoder)
...@@ -692,43 +692,43 @@ static void motion_fi_conceal (mpeg2_decoder_t * const decoder) ...@@ -692,43 +692,43 @@ static void motion_fi_conceal (mpeg2_decoder_t * const decoder)
#undef bits #undef bits
#undef bit_ptr #undef bit_ptr
#define MOTION_CALL(routine,direction) \ #define MOTION_CALL(routine,direction) \
do { \ do { \
if ((direction) & MACROBLOCK_MOTION_FORWARD) \ if ((direction) & MACROBLOCK_MOTION_FORWARD) \
routine (decoder, &(decoder->f_motion), mpeg2_mc.put); \ routine (decoder, &(decoder->f_motion), mpeg2_mc.put); \
if ((direction) & MACROBLOCK_MOTION_BACKWARD) \ if ((direction) & MACROBLOCK_MOTION_BACKWARD) \
routine (decoder, &(decoder->b_motion), \ routine (decoder, &(decoder->b_motion), \
((direction) & MACROBLOCK_MOTION_FORWARD ? \ ((direction) & MACROBLOCK_MOTION_FORWARD ? \
mpeg2_mc.avg : mpeg2_mc.put)); \ mpeg2_mc.avg : mpeg2_mc.put)); \
} while (0) } while (0)
#define NEXT_MACROBLOCK \ #define NEXT_MACROBLOCK \
do { \ do { \
decoder->offset += 16; \ decoder->offset += 16; \
if (decoder->offset == decoder->width) { \ if (decoder->offset == decoder->width) { \
do { /* just so we can use the break statement */ \ do { /* just so we can use the break statement */ \
if (decoder->convert) { \ if (decoder->convert) { \
decoder->convert (decoder->convert_id, decoder->dest, \ decoder->convert (decoder->convert_id, decoder->dest, \
decoder->v_offset); \ decoder->v_offset); \
if (decoder->coding_type == B_TYPE) \ if (decoder->coding_type == B_TYPE) \
break; \ break; \
} \ } \
decoder->dest[0] += decoder->slice_stride; \ decoder->dest[0] += decoder->slice_stride; \
decoder->dest[1] += decoder->slice_uv_stride; \ decoder->dest[1] += decoder->slice_uv_stride; \
decoder->dest[2] += decoder->slice_uv_stride; \ decoder->dest[2] += decoder->slice_uv_stride; \
} while (0); \ } while (0); \
decoder->v_offset += 16; \ decoder->v_offset += 16; \
if (decoder->v_offset > decoder->limit_y) { \ if (decoder->v_offset > decoder->limit_y) { \
if (mpeg2_cpu_state_restore) \ if (mpeg2_cpu_state_restore) \
mpeg2_cpu_state_restore (&cpu_state); \ mpeg2_cpu_state_restore (&cpu_state); \
return; \ return; \
} \ } \
decoder->offset = 0; \ decoder->offset = 0; \
} \ } \
} while (0) } while (0)
void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3], void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3],
uint8_t * forward_fbuf[3], uint8_t * backward_fbuf[3]) uint8_t * forward_fbuf[3], uint8_t * backward_fbuf[3])
{ {
int offset, stride, height, bottom_field; int offset, stride, height, bottom_field;
......
...@@ -105,7 +105,7 @@ void mpeg2_xxmc_slice( mpeg2dec_t *mpeg2dec, picture_t *picture, ...@@ -105,7 +105,7 @@ void mpeg2_xxmc_slice( mpeg2dec_t *mpeg2dec, picture_t *picture,
/* /*
* Check that first field went through OK. Otherwise, * Check that first field went through OK. Otherwise,
* indicate bad frame. * indicate bad frame.
*/ */
if (decoder->second_field) if (decoder->second_field)
{ {
mpeg2dec->xvmc_last_slice_code = (xxmc->decoded) ? 0 : -1; mpeg2dec->xvmc_last_slice_code = (xxmc->decoded) ? 0 : -1;
...@@ -238,7 +238,7 @@ void mpeg2_xxmc_slice( mpeg2dec_t *mpeg2dec, picture_t *picture, ...@@ -238,7 +238,7 @@ void mpeg2_xxmc_slice( mpeg2dec_t *mpeg2dec, picture_t *picture,
if (xxmc->result != 0) if (xxmc->result != 0)
{ {
//xxmc->proc_xxmc_flushsync( picture ); //xxmc->proc_xxmc_flushsync( picture );
xxmc->proc_xxmc_flush( picture ); xxmc->proc_xxmc_flush( picture );
mpeg2dec->xvmc_last_slice_code=-1; mpeg2dec->xvmc_last_slice_code=-1;
return; return;
} }
...@@ -276,7 +276,7 @@ void mpeg2_xxmc_slice( mpeg2dec_t *mpeg2dec, picture_t *picture, ...@@ -276,7 +276,7 @@ void mpeg2_xxmc_slice( mpeg2dec_t *mpeg2dec, picture_t *picture,
} }
} }
void mpeg2_xxmc_vld_frame_complete(mpeg2dec_t *mpeg2dec, picture_t *picture, int code) void mpeg2_xxmc_vld_frame_complete(mpeg2dec_t *mpeg2dec, picture_t *picture, int code)
{ {
vlc_xxmc_t *xxmc = (vlc_xxmc_t *) picture->p_data; vlc_xxmc_t *xxmc = (vlc_xxmc_t *) picture->p_data;
vlc_vld_frame_t *vft = &xxmc->vld_frame; vlc_vld_frame_t *vft = &xxmc->vld_frame;
......
...@@ -21,35 +21,35 @@ ...@@ -21,35 +21,35 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#define GETWORD(bit_buf,shift,bit_ptr) \ #define GETWORD(bit_buf,shift,bit_ptr) \
do { \ do { \
bit_buf |= ((bit_ptr[0] << 8) | bit_ptr[1]) << (shift); \ bit_buf |= ((bit_ptr[0] << 8) | bit_ptr[1]) << (shift); \
bit_ptr += 2; \ bit_ptr += 2; \
} while (0) } while (0)
static inline void bitstream_init (mpeg2_decoder_t * decoder, static inline void bitstream_init (mpeg2_decoder_t * decoder,
const uint8_t * start) const uint8_t * start)
{ {
decoder->bitstream_buf = decoder->bitstream_buf =
(start[0] << 24) | (start[1] << 16) | (start[2] << 8) | start[3]; (start[0] << 24) | (start[1] << 16) | (start[2] << 8) | start[3];
decoder->bitstream_ptr = start + 4; decoder->bitstream_ptr = start + 4;
decoder->bitstream_bits = -16; decoder->bitstream_bits = -16;
} }
/* make sure that there are at least 16 valid bits in bit_buf */ /* make sure that there are at least 16 valid bits in bit_buf */
#define NEEDBITS(bit_buf,bits,bit_ptr) \ #define NEEDBITS(bit_buf,bits,bit_ptr) \
do { \ do { \
if (unlikely (bits > 0)) { \ if (unlikely (bits > 0)) { \
GETWORD (bit_buf, bits, bit_ptr); \ GETWORD (bit_buf, bits, bit_ptr); \
bits -= 16; \ bits -= 16; \
} \ } \
} while (0) } while (0)
/* remove num valid bits from bit_buf */ /* remove num valid bits from bit_buf */
#define DUMPBITS(bit_buf,bits,num) \ #define DUMPBITS(bit_buf,bits,num) \
do { \ do { \
bit_buf <<= (num); \ bit_buf <<= (num); \
bits += (num); \ bits += (num); \
} while (0) } while (0)
/* take num bits from the high part of bit_buf and zero extend them */ /* take num bits from the high part of bit_buf and zero extend them */
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* include/config.h.in. Generated from configure.in by autoheader. */ /* include/config.h.in. Generated from configure.in by autoheader. */
/* autodetect accelerations */ /* autodetect accelerations */
#define ACCEL_DETECT #define ACCEL_DETECT
/* alpha architecture */ /* alpha architecture */
/* #undef ARCH_ALPHA */ /* #undef ARCH_ALPHA */
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
/* #undef ARCH_SPARC */ /* #undef ARCH_SPARC */
/* x86 architecture */ /* x86 architecture */
#define ARCH_X86 #define ARCH_X86
/* maximum supported data alignment */ /* maximum supported data alignment */
#define ATTRIBUTE_ALIGNED_MAX 64 #define ATTRIBUTE_ALIGNED_MAX 64
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
/* #undef HAVE_ALTIVEC_H */ /* #undef HAVE_ALTIVEC_H */
/* Define if you have the `__builtin_expect' function. */ /* Define if you have the `__builtin_expect' function. */
#define HAVE_BUILTIN_EXPECT #define HAVE_BUILTIN_EXPECT
/* Define to 1 if you have the <dlfcn.h> header file. */ /* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1 #define HAVE_DLFCN_H 1
...@@ -86,10 +86,10 @@ ...@@ -86,10 +86,10 @@
/* #undef LIBVO_SDL */ /* #undef LIBVO_SDL */
/* libvo X11 support */ /* libvo X11 support */
#define LIBVO_X11 #define LIBVO_X11
/* libvo Xv support */ /* libvo Xv support */
#define LIBVO_XV #define LIBVO_XV
/* mpeg2dec profiling */ /* mpeg2dec profiling */
/* #undef MPEG2DEC_GPROF */ /* #undef MPEG2DEC_GPROF */
......
...@@ -110,7 +110,7 @@ static int OpenDecoder( vlc_object_t *p_this ) ...@@ -110,7 +110,7 @@ static int OpenDecoder( vlc_object_t *p_this )
decoder_t *p_dec = (decoder_t*)p_this; decoder_t *p_dec = (decoder_t*)p_this;
decoder_sys_t *p_sys = NULL; decoder_sys_t *p_sys = NULL;
uint32_t i_accel = 0; uint32_t i_accel = 0;
FILE *f_wd_dec; FILE *f_wd_dec;
msg_Dbg(p_dec, "OpenDecoder Entering"); msg_Dbg(p_dec, "OpenDecoder Entering");
mtrace(); mtrace();
...@@ -695,7 +695,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf ) ...@@ -695,7 +695,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
{ {
// fprintf(p_sys->f_wd_nb, "%d\n", mdate()); // fprintf(p_sys->f_wd_nb, "%d\n", mdate());
fprintf(p_sys->f_wd_nb, "%s\n", mdate()); fprintf(p_sys->f_wd_nb, "%s\n", mdate());
fflush(p_sys->f_wd_nb); fflush(p_sys->f_wd_nb);
} }
#endif #endif
p_pic = p_dec->pf_vout_buffer_new( p_dec ); p_pic = p_dec->pf_vout_buffer_new( p_dec );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment