https://bitbucket.org/daniel_fort/magic-lantern
Tip revision: 74eebfb474431b130377bb767d6e098513aefd98 authored by Giovanni C on 05 June 2013, 07:47:06 UTC
Close branch 1100d.
Close branch 1100d.
Tip revision: 74eebfb
af_patterns.c
#include "dryos.h"
#include "bmp.h"
#include "menu.h"
#include "property.h"
#include "config.h"
#include "gui.h"
#include "af_patterns.h"
static type_PATTERN_MAP_ITEM pattern_map[] = {
{AF_PATTERN_CENTER, AF_PATTERN_SQUARE, AF_PATTERN_TOPHALF, AF_PATTERN_BOTTOMHALF, AF_PATTERN_LEFTHALF, AF_PATTERN_RIGHTHALF},
{AF_PATTERN_SQUARE, AF_PATTERN_HLINE, AF_PATTERN_TOPHALF, AF_PATTERN_BOTTOMHALF, AF_PATTERN_LEFTHALF, AF_PATTERN_RIGHTHALF},
{AF_PATTERN_TOP, AF_PATTERN_CENTER, AF_PATTERN_TOP, AF_PATTERN_TOPTRIANGLE, AF_PATTERN_TOPLEFT, AF_PATTERN_TOPRIGHT},
{AF_PATTERN_TOPTRIANGLE, AF_PATTERN_CENTER, AF_PATTERN_TOP, AF_PATTERN_TOPDIAMOND, AF_PATTERN_LEFTTRIANGLE, AF_PATTERN_RIGHTTRIANGLE},
{AF_PATTERN_TOPDIAMOND, AF_PATTERN_CENTER, AF_PATTERN_TOPTRIANGLE, AF_PATTERN_TOPHALF, AF_PATTERN_LEFTDIAMOND, AF_PATTERN_RIGHTDIAMOND},
{AF_PATTERN_TOPHALF, AF_PATTERN_CENTER, AF_PATTERN_TOPDIAMOND, AF_PATTERN_HLINE, AF_PATTERN_LEFTHALF, AF_PATTERN_RIGHTHALF},
{AF_PATTERN_BOTTOM, AF_PATTERN_CENTER, AF_PATTERN_BOTTOMTRIANGLE, AF_PATTERN_BOTTOM, AF_PATTERN_BOTTOMLEFT, AF_PATTERN_BOTTOMRIGHT},
{AF_PATTERN_BOTTOMTRIANGLE, AF_PATTERN_CENTER, AF_PATTERN_BOTTOMDIAMOND, AF_PATTERN_BOTTOM, AF_PATTERN_LEFTTRIANGLE, AF_PATTERN_RIGHTTRIANGLE},
{AF_PATTERN_BOTTOMDIAMOND, AF_PATTERN_CENTER, AF_PATTERN_BOTTOMHALF, AF_PATTERN_BOTTOMTRIANGLE, AF_PATTERN_LEFTDIAMOND, AF_PATTERN_RIGHTDIAMOND},
{AF_PATTERN_BOTTOMHALF, AF_PATTERN_CENTER, AF_PATTERN_HLINE, AF_PATTERN_BOTTOMDIAMOND, AF_PATTERN_LEFTHALF, AF_PATTERN_RIGHTHALF},
{AF_PATTERN_TOPLEFT, AF_PATTERN_CENTER, AF_PATTERN_TOP, AF_PATTERN_BOTTOMLEFT, AF_PATTERN_LEFT, AF_PATTERN_TOPRIGHT},
{AF_PATTERN_TOPRIGHT, AF_PATTERN_CENTER, AF_PATTERN_TOP, AF_PATTERN_BOTTOMRIGHT, AF_PATTERN_TOPLEFT, AF_PATTERN_RIGHT},
{AF_PATTERN_BOTTOMLEFT, AF_PATTERN_CENTER, AF_PATTERN_TOPLEFT, AF_PATTERN_BOTTOM, AF_PATTERN_LEFT, AF_PATTERN_BOTTOMRIGHT},
{AF_PATTERN_BOTTOMRIGHT, AF_PATTERN_CENTER, AF_PATTERN_TOPRIGHT, AF_PATTERN_BOTTOM, AF_PATTERN_BOTTOMLEFT, AF_PATTERN_RIGHT},
{AF_PATTERN_LEFT, AF_PATTERN_CENTER, AF_PATTERN_TOPLEFT, AF_PATTERN_BOTTOMLEFT, AF_PATTERN_LEFT, AF_PATTERN_LEFTTRIANGLE},
{AF_PATTERN_LEFTTRIANGLE, AF_PATTERN_CENTER, AF_PATTERN_TOPTRIANGLE, AF_PATTERN_BOTTOMTRIANGLE, AF_PATTERN_LEFT, AF_PATTERN_LEFTDIAMOND},
{AF_PATTERN_LEFTDIAMOND, AF_PATTERN_CENTER, AF_PATTERN_TOPDIAMOND, AF_PATTERN_BOTTOMDIAMOND, AF_PATTERN_LEFTTRIANGLE, AF_PATTERN_LEFTHALF},
{AF_PATTERN_LEFTHALF, AF_PATTERN_CENTER, AF_PATTERN_TOPHALF, AF_PATTERN_BOTTOMHALF, AF_PATTERN_LEFTDIAMOND, AF_PATTERN_VLINE},
{AF_PATTERN_RIGHT, AF_PATTERN_CENTER, AF_PATTERN_TOPRIGHT, AF_PATTERN_BOTTOMRIGHT, AF_PATTERN_RIGHTTRIANGLE, AF_PATTERN_RIGHT},
{AF_PATTERN_RIGHTTRIANGLE, AF_PATTERN_CENTER, AF_PATTERN_TOPTRIANGLE, AF_PATTERN_BOTTOMTRIANGLE, AF_PATTERN_RIGHTDIAMOND, AF_PATTERN_RIGHT},
{AF_PATTERN_RIGHTDIAMOND, AF_PATTERN_CENTER, AF_PATTERN_TOPDIAMOND, AF_PATTERN_BOTTOMDIAMOND, AF_PATTERN_RIGHTHALF, AF_PATTERN_RIGHTTRIANGLE},
{AF_PATTERN_RIGHTHALF, AF_PATTERN_CENTER, AF_PATTERN_TOPHALF, AF_PATTERN_BOTTOMHALF, AF_PATTERN_VLINE, AF_PATTERN_RIGHTDIAMOND},
{AF_PATTERN_HLINE, AF_PATTERN_VLINE, AF_PATTERN_TOPHALF, AF_PATTERN_BOTTOMHALF, AF_PATTERN_LEFTHALF, AF_PATTERN_RIGHTHALF},
{AF_PATTERN_VLINE, AF_PATTERN_ALL, AF_PATTERN_TOPHALF, AF_PATTERN_BOTTOMHALF, AF_PATTERN_LEFTHALF, AF_PATTERN_RIGHTHALF},
{AF_PATTERN_ALL, AF_PATTERN_CENTER, AF_PATTERN_TOPHALF, AF_PATTERN_BOTTOMHALF, AF_PATTERN_LEFTHALF, AF_PATTERN_RIGHTHALF},
END_OF_LIST
};
int afp_transformer (int pattern, type_DIRECTION direction);
int afp[2];
int afp_len = 0;
PROP_HANDLER(PROP_AFPOINT)
{
afp[0] = buf[0];
afp[1] = buf[1];
afp_len = len;
}
#define af_point afp[0]
void afp_show_in_viewfinder() // this function may be called from multiple tasks
{
BMP_LOCK( // reuse this for locking
info_led_on();
assign_af_button_to_halfshutter(); // this has semaphores
SW1(1,200);
SW1(0,50);
restore_af_button_assignment();
info_led_off();
)
}
void set_af_point(int afpoint)
{
if (!afp_len) return;
if (beep_enabled) Beep();
afp[0] = afpoint;
prop_request_change(PROP_AFPOINT, afp, afp_len);
task_create("afp_tmp", 0x18, 0, afp_show_in_viewfinder, 0);
}
int afpoint_for_key_guess = 0;
void afp_center () {
set_af_point(afp_transformer(af_point, DIRECTION_CENTER));
}
void afp_top () {
set_af_point(afp_transformer(af_point, DIRECTION_UP));
}
void afp_bottom () {
set_af_point(afp_transformer(af_point, DIRECTION_DOWN));
}
void afp_left () {
set_af_point(afp_transformer(af_point, DIRECTION_LEFT));
}
void afp_right () {
set_af_point(afp_transformer(af_point, DIRECTION_RIGHT));
}
int afp_transformer (int pattern, type_DIRECTION direction) {
type_PATTERN_MAP_ITEM *item;
// Loop over all items in the pattern map
for (item = pattern_map; ! IS_EOL(item); item++) {
// When we find an item matching the current pattern...
if (item->pattern == pattern) {
// ... we return the next pattern, according to the direction indicated
switch (direction) {
case DIRECTION_CENTER:
return item->next_center;
case DIRECTION_UP:
return item->next_top;
case DIRECTION_DOWN:
return item->next_bottom;
case DIRECTION_LEFT:
return item->next_left;
case DIRECTION_RIGHT:
return item->next_right;
}
}
}
// Just in case something goes wrong
return AF_PATTERN_CENTER;
}
int handle_af_patterns(struct event * event)
{
extern int af_patterns;
if (af_patterns && !lv && gui_state == GUISTATE_IDLE && !DISPLAY_IS_ON)
{
switch (event->param)
{
case BGMT_PRESS_LEFT:
afp_left();
return 0;
case BGMT_PRESS_RIGHT:
afp_right();
return 0;
case BGMT_PRESS_UP:
afp_top();
return 0;
case BGMT_PRESS_DOWN:
afp_bottom();
return 0;
case BGMT_PRESS_SET:
#ifdef CONFIG_60D
if (get_cfn_function_for_set_button()) return 1; // do that custom function instead
#endif
afp_center();
return 0;
#ifdef BGMT_PRESS_UP_LEFT
case BGMT_PRESS_UP_LEFT:
case BGMT_PRESS_UP_RIGHT:
case BGMT_PRESS_DOWN_LEFT:
case BGMT_PRESS_DOWN_RIGHT:
afp_center();
return 0;
#endif
}
}
return 1;
}
void play_zoom_center_on_selected_af_point()
{
#ifdef IMGPLAY_ZOOM_POS_X
if (af_point == AF_POINT_C) return; // nothing to do, zoom is centered by default
int x = 0;
int y = 0;
int n = 0;
if (af_point & AF_POINT_C)
{
x += IMGPLAY_ZOOM_POS_X_CENTER;
y += IMGPLAY_ZOOM_POS_Y_CENTER;
n++;
}
if (af_point & AF_POINT_T)
{
x += IMGPLAY_ZOOM_POS_X_CENTER;
y += IMGPLAY_ZOOM_POS_Y_CENTER - IMGPLAY_ZOOM_POS_DELTA_Y;
n++;
}
if (af_point & AF_POINT_B)
{
x += IMGPLAY_ZOOM_POS_X_CENTER;
y += IMGPLAY_ZOOM_POS_Y_CENTER + IMGPLAY_ZOOM_POS_DELTA_Y;
n++;
}
if (af_point & AF_POINT_L)
{
x += IMGPLAY_ZOOM_POS_X_CENTER - IMGPLAY_ZOOM_POS_DELTA_X;
y += IMGPLAY_ZOOM_POS_Y_CENTER;
n++;
}
if (af_point & AF_POINT_R)
{
x += IMGPLAY_ZOOM_POS_X_CENTER + IMGPLAY_ZOOM_POS_DELTA_X;
y += IMGPLAY_ZOOM_POS_Y_CENTER;
n++;
}
if (af_point & AF_POINT_TL)
{
x += IMGPLAY_ZOOM_POS_X_CENTER - IMGPLAY_ZOOM_POS_DELTA_X / 2;
y += IMGPLAY_ZOOM_POS_Y_CENTER - IMGPLAY_ZOOM_POS_DELTA_Y / 2;
n++;
}
if (af_point & AF_POINT_TR)
{
x += IMGPLAY_ZOOM_POS_X_CENTER + IMGPLAY_ZOOM_POS_DELTA_X / 2;
y += IMGPLAY_ZOOM_POS_Y_CENTER - IMGPLAY_ZOOM_POS_DELTA_Y / 2;
n++;
}
if (af_point & AF_POINT_BL)
{
x += IMGPLAY_ZOOM_POS_X_CENTER - IMGPLAY_ZOOM_POS_DELTA_X / 2;
y += IMGPLAY_ZOOM_POS_Y_CENTER + IMGPLAY_ZOOM_POS_DELTA_Y / 2;
n++;
}
if (af_point & AF_POINT_BR)
{
x += IMGPLAY_ZOOM_POS_X_CENTER + IMGPLAY_ZOOM_POS_DELTA_X / 2;
y += IMGPLAY_ZOOM_POS_Y_CENTER + IMGPLAY_ZOOM_POS_DELTA_Y / 2;
n++;
}
if (n == 0) return;
x /= n;
y /= n;
IMGPLAY_ZOOM_POS_X = x;
IMGPLAY_ZOOM_POS_Y = y;
#endif
}