package Term::Caca::Constants;

use strict;
use base 'Exporter';
use vars qw(@EXPORT_OK %EXPORT_TAGS $VERSION);

$VERSION = '0.9';

use constant {

  ## enum caca_color

  CACA_COLOR_BLACK              => 0,
  CACA_COLOR_BLUE               => 1,
  CACA_COLOR_GREEN              => 2,
  CACA_COLOR_CYAN               => 3,
  CACA_COLOR_RED                => 4,
  CACA_COLOR_MAGENTA            => 5,
  CACA_COLOR_BROWN              => 6,
  CACA_COLOR_LIGHTGRAY          => 7,
  CACA_COLOR_DARKGRAY           => 8,
  CACA_COLOR_LIGHTBLUE          => 9,
  CACA_COLOR_LIGHTGREEN         => 10,
  CACA_COLOR_LIGHTCYAN          => 11,
  CACA_COLOR_LIGHTRED           => 12,
  CACA_COLOR_LIGHTMAGENTA       => 13,
  CACA_COLOR_YELLOW             => 14,
  CACA_COLOR_WHITE              => 15,

  ## enum caca_feature

  CACA_BACKGROUND               => 0x10,
  CACA_BACKGROUND_BLACK         => 0x11,
  CACA_BACKGROUND_SOLID         => 0x12,

  CACA_BACKGROUND_MIN           => 0x11,
  CACA_BACKGROUND_MAX           => 0x12,

  CACA_ANTIALIASING             => 0x20,
  CACA_ANTIALIASING_NONE        => 0x21,
  CACA_ANTIALIASING_PREFILTER   => 0x22,

  CACA_ANTIALIASING_MIN         => 0x21,
  CACA_ANTIALIASING_MAX         => 0x22,

  CACA_DITHERING                => 0x30,
  CACA_DITHERING_NONE           => 0x31,
  CACA_DITHERING_ORDERED2       => 0x32,
  CACA_DITHERING_ORDERED4       => 0x33,
  CACA_DITHERING_ORDERED8       => 0x34,
  CACA_DITHERING_RANDOM         => 0x35,

  CACA_DITHERING_MIN            => 0x31,
  CACA_DITHERING_MAX            => 0x35,

  CACA_FEATURE_UNKNOWN          => 0xffff,

  ## enum caca_event

  CACA_EVENT_NONE               => 0x00000000,
  CACA_EVENT_KEY_PRESS          => 0x01000000,
  CACA_EVENT_KEY_RELEASE        => 0x02000000,
  CACA_EVENT_MOUSE_PRESS        => 0x04000000,
  CACA_EVENT_MOUSE_RELEASE      => 0x08000000,
  CACA_EVENT_MOUSE_MOTION       => 0x10000000,
  CACA_EVENT_RESIZE             => 0x20000000,
  CACA_EVENT_ANY                => 0xff000000,

  ## enum caca_key
  CACA_KEY_UNKNOWN              => 0,

  # /* The following keys have ASCII equivalents */
  CACA_KEY_BACKSPACE            => 8,
  CACA_KEY_TAB                  => 9,
  CACA_KEY_RETURN               => 13,
  CACA_KEY_PAUSE                => 19,
  CACA_KEY_ESCAPE               => 27,
  CACA_KEY_DELETE               => 127,

  # /* The following keys do not have ASCII equivalents but have been
  #  * chosen to match the SDL equivalents */
  CACA_KEY_UP                   => 273,
  CACA_KEY_DOWN                 => 274,
  CACA_KEY_LEFT                 => 275,
  CACA_KEY_RIGHT                => 276,
  CACA_KEY_INSERT               => 277,
  CACA_KEY_HOME                 => 278,
  CACA_KEY_END                  => 279,
  CACA_KEY_PAGEUP               => 280,
  CACA_KEY_PAGEDOWN             => 281,
  CACA_KEY_F1                   => 282,
  CACA_KEY_F2                   => 283,
  CACA_KEY_F3                   => 284,
  CACA_KEY_F4                   => 285,
  CACA_KEY_F5                   => 286,
  CACA_KEY_F6                   => 287,
  CACA_KEY_F7                   => 288,
  CACA_KEY_F8                   => 289,
  CACA_KEY_F9                   => 290,
  CACA_KEY_F10                  => 291,
  CACA_KEY_F11                  => 292,
  CACA_KEY_F12                  => 293,
  CACA_KEY_F13                  => 294,
  CACA_KEY_F14                  => 295,
  CACA_KEY_F15                  => 296,

};

@EXPORT_OK = qw(

  CACA_COLOR_BLACK
  CACA_COLOR_BLUE
  CACA_COLOR_GREEN
  CACA_COLOR_CYAN
  CACA_COLOR_RED
  CACA_COLOR_MAGENTA
  CACA_COLOR_BROWN
  CACA_COLOR_LIGHTGRAY
  CACA_COLOR_DARKGRAY
  CACA_COLOR_LIGHTBLUE
  CACA_COLOR_LIGHTGREEN
  CACA_COLOR_LIGHTCYAN
  CACA_COLOR_LIGHTRED
  CACA_COLOR_LIGHTMAGENTA
  CACA_COLOR_YELLOW
  CACA_COLOR_WHITE


  CACA_BACKGROUND
  CACA_BACKGROUND_BLACK
  CACA_BACKGROUND_SOLID

  CACA_BACKGROUND_MIN
  CACA_BACKGROUND_MAX

  CACA_ANTIALIASING
  CACA_ANTIALIASING_NONE
  CACA_ANTIALIASING_PREFILTER

  CACA_ANTIALIASING_MIN
  CACA_ANTIALIASING_MAX

  CACA_DITHERING
  CACA_DITHERING_NONE
  CACA_DITHERING_ORDERED2
  CACA_DITHERING_ORDERED4
  CACA_DITHERING_ORDERED8
  CACA_DITHERING_RANDOM

  CACA_DITHERING_MIN
  CACA_DITHERING_MAX

  CACA_FEATURE_UNKNOWN


  CACA_EVENT_NONE
  CACA_EVENT_KEY_PRESS
  CACA_EVENT_KEY_RELEASE
  CACA_EVENT_MOUSE_PRESS
  CACA_EVENT_MOUSE_RELEASE
  CACA_EVENT_MOUSE_MOTION
  CACA_EVENT_RESIZE
  CACA_EVENT_ANY

  CACA_KEY_UNKNOWN

  CACA_KEY_BACKSPACE
  CACA_KEY_TAB
  CACA_KEY_RETURN
  CACA_KEY_PAUSE
  CACA_KEY_ESCAPE
  CACA_KEY_DELETE

  CACA_KEY_UP
  CACA_KEY_DOWN
  CACA_KEY_LEFT
  CACA_KEY_RIGHT
  CACA_KEY_INSERT
  CACA_KEY_HOME
  CACA_KEY_END
  CACA_KEY_PAGEUP
  CACA_KEY_PAGEDOWN
  CACA_KEY_F1
  CACA_KEY_F2
  CACA_KEY_F3
  CACA_KEY_F4
  CACA_KEY_F5
  CACA_KEY_F6
  CACA_KEY_F7
  CACA_KEY_F8
  CACA_KEY_F9
  CACA_KEY_F10
  CACA_KEY_F11
  CACA_KEY_F12
  CACA_KEY_F13
  CACA_KEY_F14
  CACA_KEY_F15
);

%EXPORT_TAGS = (
  colors => [ qw(
    CACA_COLOR_BLACK
    CACA_COLOR_BLUE
    CACA_COLOR_GREEN
    CACA_COLOR_CYAN
    CACA_COLOR_RED
    CACA_COLOR_MAGENTA
    CACA_COLOR_BROWN
    CACA_COLOR_LIGHTGRAY
    CACA_COLOR_DARKGRAY
    CACA_COLOR_LIGHTBLUE
    CACA_COLOR_LIGHTGREEN
    CACA_COLOR_LIGHTCYAN
    CACA_COLOR_LIGHTRED
    CACA_COLOR_LIGHTMAGENTA
    CACA_COLOR_YELLOW
    CACA_COLOR_WHITE
  ) ],

  features => [ qw(
    CACA_BACKGROUND
    CACA_BACKGROUND_BLACK
    CACA_BACKGROUND_SOLID

    CACA_BACKGROUND_MIN
    CACA_BACKGROUND_MAX

    CACA_ANTIALIASING
    CACA_ANTIALIASING_NONE
    CACA_ANTIALIASING_PREFILTER

    CACA_ANTIALIASING_MIN
    CACA_ANTIALIASING_MAX

    CACA_DITHERING
    CACA_DITHERING_NONE
    CACA_DITHERING_ORDERED2
    CACA_DITHERING_ORDERED4
    CACA_DITHERING_ORDERED8
    CACA_DITHERING_RANDOM

    CACA_DITHERING_MIN
    CACA_DITHERING_MAX

    CACA_FEATURE_UNKNOWN
  ) ],

  events => [ qw(
    CACA_EVENT_NONE
    CACA_EVENT_KEY_PRESS
    CACA_EVENT_KEY_RELEASE
    CACA_EVENT_MOUSE_PRESS
    CACA_EVENT_MOUSE_RELEASE
    CACA_EVENT_MOUSE_MOTION
    CACA_EVENT_RESIZE
    CACA_EVENT_ANY
  ) ],

  'keys' => [ qw(
    CACA_KEY_UNKNOWN

    CACA_KEY_BACKSPACE
    CACA_KEY_TAB
    CACA_KEY_RETURN
    CACA_KEY_PAUSE
    CACA_KEY_ESCAPE
    CACA_KEY_DELETE

    CACA_KEY_UP
    CACA_KEY_DOWN
    CACA_KEY_LEFT
    CACA_KEY_RIGHT
    CACA_KEY_INSERT
    CACA_KEY_HOME
    CACA_KEY_END
    CACA_KEY_PAGEUP
    CACA_KEY_PAGEDOWN
    CACA_KEY_F1
    CACA_KEY_F2
    CACA_KEY_F3
    CACA_KEY_F4
    CACA_KEY_F5
    CACA_KEY_F6
    CACA_KEY_F7
    CACA_KEY_F8
    CACA_KEY_F9
    CACA_KEY_F10
    CACA_KEY_F11
    CACA_KEY_F12
    CACA_KEY_F13
    CACA_KEY_F14
    CACA_KEY_F15
  ) ],

  all => [ ],
);

# add all the other ":class" tags to the ":all" class,
# deleting duplicates
{
  my %seen;

  push @{$EXPORT_TAGS{all}},
    grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}} foreach keys %EXPORT_TAGS;
}


1;

__END__

=head1 NAME

Term::Caca::Constants - libcaca constants from caca.h

=head1 SYNOPSIS

Import all constants into current package/namespace:

  use Term::Caca::Constants ':all';

Only import the constants pertaining to events and keys:

  use Term::Caca qw(:events :keys);

=head1 DESCRIPTION



=cut

