1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636
|
/* vim:expandtab:ts=2 sw=2:
*/
/* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright owned by various GrafX2 authors, see COPYRIGHT.txt for details.
Grafx2 is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2
of the License.
Grafx2 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grafx2; if not, see <http://www.gnu.org/licenses/>
*/
//////////////////////////////////////////////////////////////////////////////
///@file struct.h
/// Structures that can be used in the whole program.
//////////////////////////////////////////////////////////////////////////////
#ifndef _STRUCT_H_
#define _STRUCT_H_
#if defined(__BEOS__) || defined(__TRU64__)
#include <inttypes.h>
#else
#include <stdint.h>
#endif
#include "const.h"
// POSIX calls it strcasecmp, Windows uses stricmp... no ANSI standard.
#ifdef WIN32
#ifdef _MSC_VER
#define strcasecmp _stricmp
#else
#define strcasecmp stricmp
#endif
#endif
// Definition of the base data types
/// 8bit unsigned integer
typedef uint8_t byte;
/// 16bit unsigned integer
typedef uint16_t word;
/// 32bit unsigned integer
typedef uint32_t dword;
/// 64bit unsigned integer
typedef uint64_t qword;
// Named function prototypes
// GrafX2 use a lot of function pointer to do the drawing depending in the "fake hardware zoom" and the magnifier status.
typedef void (* Func_action) (void); ///< An action.
typedef void (* Func_btn_action) (int); ///< An action. Used when you click a menu button or trigger a keyboard shortcut.
typedef void (* Func_pixel) (word,word,byte); ///< Set pixel at position (x,y) to color c. Used in load screen to write the data to brush, picture, or preview area.
typedef void (* Func_pixel_opt_preview) (word,word,byte,int); ///< Set pixel at position (x,y) to color c. With optional preview.
typedef byte (* Func_read) (word,word); ///< Read a pixel at position (x,y) on something. Used for example in save to tell if the data is a brush or a picture
typedef void (* Func_clear) (byte);
typedef void (* Func_display) (word,word,word);
typedef byte (* Func_effect) (word,word,byte); ///< Called by all drawing tools to draw with a special effect (smooth, transparency, shade, ...)
typedef void (* Func_block) (word,word,word,word,byte);
typedef void (* Func_line_XOR) (word,word,word); ///< Draw an XOR line on the picture view of the screen. Use a different function when in magnify mode.
typedef void (* Func_display_brush_color) (word,word,word,word,word,word,byte,word);
typedef void (* Func_display_brush_mono) (word,word,word,word,word,word,byte,byte,word);
typedef void (* Func_gradient) (long,short,short);
typedef void (* Func_remap) (word,word,word,word,byte *);
typedef void (* Func_procsline) (word,word,word,byte *);
typedef void (* Func_display_zoom) (word,word,word,byte *);
typedef void (* Func_display_brush_color_zoom) (word,word,word,word,word,word,byte,word,byte *);
typedef void (* Func_display_brush_mono_zoom) (word,word,word,word,word,word,byte,byte,word,byte *);
typedef void (* Func_draw_brush) (byte *,word,word,word,word,word,word,byte,word);
typedef void (* Func_draw_list_item) (word,word,word,byte); ///< Draw an item inside a list button. This is done with a callback so it is possible to draw anything, as the list itself doesn't handle the content
/// A set of RGB values.
#ifdef __GNUC__
typedef struct
{
byte R; ///< Red
byte G; ///< Green
byte B; ///< Blue
} __attribute__((__packed__)) T_Components, T_Palette[256] ; ///< A complete 256-entry RGB palette (768 bytes).
#else
#pragma pack(1)
typedef struct
{
byte R; ///< Red
byte G; ///< Green
byte B; ///< Blue
} T_Components, T_Palette[256] ; ///< A complete 256-entry RGB palette (768 bytes).
#pragma pack()
#endif
/// A normal rectangular button in windows and menus.
typedef struct T_Normal_button
{
short Number; ///< Unique identifier for all controls
word Pos_X; ///< Coordinate for top of button, relative to the window, before scaling.
word Pos_Y; ///< Coordinate for left of button, relative to the window, before scaling.
word Width; ///< Width before scaling
word Height; ///< Height before scaling
byte Clickable; ///< Boolean, unused.
byte Repeatable; ///< Boolean, true if the button activates repeatedly until you release the mouse button. Used for "+" buttons, for example.
word Shortcut; ///< Keyboard shortcut that will emulate a click on this button.
struct T_Normal_button * Next;///< Pointer to the next normal button of current window.
} T_Normal_button;
/// A window control that shows a complete 256-color palette
typedef struct T_Palette_button
{
short Number; ///< Unique identifier for all controls
word Pos_X; ///< Coordinate for top of button, relative to the window, before scaling.
word Pos_Y; ///< Coordinate for left of button, relative to the window, before scaling.
struct T_Palette_button * Next;///< Pointer to the next palette of current window.
} T_Palette_button;
/// A window control that represents a scrollbar, with a slider, and two arrow buttons.
typedef struct T_Scroller_button
{
short Number; ///< Unique identifier for all controls
byte Is_horizontal; ///< Boolean: True if slider is horizontal instead of vertical.
word Pos_X; ///< Coordinate for top of button, relative to the window, before scaling.
word Pos_Y; ///< Coordinate for left of button, relative to the window, before scaling.
word Length; ///< Length before scaling.
word Nb_elements; ///< Number of distinct values it can take.
word Nb_visibles; ///< If this slider is meant to show several elements of a collection, this is their number (otherwise, it's 1).
word Position; ///< Current position of the slider: which item it's pointing.
word Cursor_length; ///< Dimension of the slider, in pixels before scaling.
struct T_Scroller_button * Next;///< Pointer to the next scroller of current window.
} T_Scroller_button;
/// Special invisible button
/// A window control that only has a rectangular "active" area which catches mouse clicks,
// but no visible shape. It's used for custom controls where the drawing is done on
// a case by case basis.
typedef struct T_Special_button
{
short Number; ///< Unique identifier for all controls
word Pos_X; ///< Coordinate for top of button, relative to the window, before scaling.
word Pos_Y; ///< Coordinate for left of button, relative to the window, before scaling.
word Width; ///< Width before scaling
word Height; ///< Height before scaling
word Shortcut; ///< Keyboard shortcut that will emulate a click on this button.
struct T_Special_button * Next;///< Pointer to the next special button of current window.
} T_Special_button;
/// Data for a dropdown item, ie. one proposed choice.
typedef struct T_Dropdown_choice
{
short Number; ///< Value that identifies the choice (for this dropdown only)
const char * Label; ///< String to display in the dropdown panel
struct T_Dropdown_choice * Next;///< Pointer to the next choice for this dropdown.
} T_Dropdown_choice;
/// A window control that behaves like a dropdown button.
typedef struct T_Dropdown_button
{
short Number; ///< Unique identifier for all controls
word Pos_X; ///< Coordinate for top of button, relative to the window, before scaling.
word Pos_Y; ///< Coordinate for left of button, relative to the window, before scaling.
word Width; ///< Width before scaling
word Height; ///< Height before scaling
byte Display_choice; ///< Boolean, true if the engine should print the selected item's label in the dropdown area when the user chooses it.
byte Display_centered; ///< Boolean, true to center the labels (otherwise, align left)
byte Display_arrow; ///< Boolean, true to display a "down" arrow box in top right
byte Bottom_up; ///< Boolean, true to make the dropdown panel go above its button instead of below it
byte Active_button; ///< Determines which mouse button(s) cause the dropdown panel to open: LEFT_SIDE || RIGHT_SIDE || (LEFT_SIDE|RIGHT_SIDE)
word Dropdown_width; ///< Width of the dropdown panel when it's open. Use 0 for "same as the dropdown button"
T_Dropdown_choice * First_item; ///< Linked list with the choices available for this dropdown.
struct T_Dropdown_button * Next;///< Pointer to the next dropdown button of current window.
} T_Dropdown_button;
/// Data for one item (file, directory) in a fileselector.
typedef struct T_Fileselector_item
{
enum FSOBJECT_TYPE Type; ///< Type of item: 0 = File, 1 = Directory, 2 = Drive
byte Icon; ///< One of ::ICON_TYPES, ICON_NONE for none.
struct T_Fileselector_item * Next; ///< Pointer to next item of the current fileselector.
struct T_Fileselector_item * Previous;///< Pointer to previous item of the current fileselector.
word * Unicode_full_name; ///< Pointer to allocated unicode string. Filesystem name
word * Unicode_short_name; ///< Pointer to allocated unicode string. Name to display
char Short_name[36]; ///< Name to display. limited to 35 characters (used in factory.c)
char Full_name[1]; ///< Filesystem value.
// No field after Full_name[] ! Dynamic allocation according to name length.
} T_Fileselector_item;
/// Data for a fileselector
typedef struct T_Fileselector
{
/// Number of elements in the current fileselector's ::Filelist
unsigned short Nb_elements;
/// Number of files in the current fileselector's ::Filelist
unsigned short Nb_files;
/// Number of directories in the current fileselector's ::Filelist
unsigned short Nb_directories;
/// Head of the linked list for the fileselector.
T_Fileselector_item * First;
/// Index for direct access to element number N
T_Fileselector_item ** Index;
} T_Fileselector;
/// "List" button as used in the font selection, skin selection, and brush factory screens. It's like a limited filelist.
/// The screenmode selection and load/save screen were written before this existed so they use their own code. It would be nice if they were updated to use this one.
typedef struct T_List_button
{
short Number; ///< Unique identifier for all controls
short List_start; ///< Index of the font to appear as first line
short Cursor_position; ///< Index of the selected line (0=top)
T_Special_button * Entry_button; ///< Pointer to the associated selection control.
T_Scroller_button * Scroller; ///< Pointer to the associated scroller
Func_draw_list_item Draw_list_item; ///< Function to call for each item to draw its line
byte Color_index; ///< Background color: From 0->MC_Black to 3->MC_White
struct T_List_button * Next; ///< Pointer to the next list button of current window.
} T_List_button;
/// A stackable window (editor screen)
typedef struct
{
word Pos_X;
word Pos_Y;
word Width;
word Height;
word Nb_buttons;
T_Normal_button *Normal_button_list;
T_Palette_button *Palette_button_list;
T_Scroller_button *Scroller_button_list;
T_Special_button *Special_button_list;
T_Dropdown_button *Dropdown_button_list;
T_List_button *List_button_list;
int Attribute1;
int Attribute2;
byte Draggable;
} T_Window;
/// Data for one line of the "Help" screens.
typedef struct {
char Line_type; ///< Kind of line: 'N' for normal line, 'S' for a bold line, 'K' for a line with keyboard shortcut, 'T' and '-' for upper and lower titles.
const char * Text; ///< Displayed string.
int Line_parameter; ///< Generic parameter depending on line type. For 'K' lines: a shortcut identifier. For others: unused.
} T_Help_table;
/// Data for one section of the "Help" screens, ie a page.
typedef struct
{
const T_Help_table* Help_table; ///< Pointer to the array of ::T_Help_table that contains the lines
word Length; ///< Size of the array of lines
} T_Help_section;
/// Data for one setting of gradients. Warning, this one is saved/loaded as binary.
typedef struct
{
byte Start; ///< First color
byte End; ///< Last color
dword Inverse; ///< Boolean, true if the gradient goes in descending order
dword Mix; ///< Amount of randomness to add to the mix (0-255)
dword Technique;///< Gradient technique: 0 (no pattern) 1 (dithering), or 2 (big dithering)
byte Speed; ///< Speed of cycling. 0 for disabled, max value COLOR_CYCLING_SPEED_MAX. 1=>0.2856Hz, 64=>18.28Hz
} T_Gradient_range;
#define COLOR_CYCLING_SPEED_MAX 250
/// Data for a full set of gradients.
typedef struct
{
int Used; ///< Reference count
T_Gradient_range Range[16];
} T_Gradient_array;
/// Data for one setting of shade. Warning, this one is saved/loaded as binary.
typedef struct
{
word List[512]; ///< List of entries, each one is either a color (0-255) or -1 for empty.
byte Step; ///< Step to increment/decrement on left-clicks.
byte Mode; ///< Shade mode: Normal, Loop, or No-saturation see ::SHADE_MODES
} T_Shade;
/// Data for one fullscreen video mode in configuration file. Warning, this one is saved/loaded as binary.
typedef struct
{
byte State; ///< How good is the mode supported. 0:Good (white) 1:OK (light) 2:So-so (dark) 4:User-disabled (black); +128 => System doesn't support it at all.
word Width; ///< Videomode width in pixels.
word Height;///< Videomode height in pixels.
} T_Config_video_mode;
/// Header for gfx2.cfg
typedef struct
{
char Signature[3]; ///< Signature for the file format. "CFG".
byte Version1; ///< Major version number (ex: 2)
byte Version2; ///< Minor version number (ex: 0)
byte Beta1; ///< Major beta version number (ex: 96)
byte Beta2; ///< Major beta version number (ex: 5)
} T_Config_header;
/// Header for a config chunk in for gfx2.cfg
typedef struct
{
byte Number; ///< Section identfier. Possible values are in enum ::CHUNKS_CFG
word Size; ///< Size of the configuration block that follows, in bytes.
} T_Config_chunk;
/// Configuration for one keyboard shortcut in gfx2.cfg
typedef struct
{
word Number; ///< Indicates the shortcut action. This is a number starting from 0, which matches ::T_Key_config.Number
word Key; ///< Keyboard shortcut: SDLK_something, or -1 for none
word Key2; ///< Alternate keyboard shortcut: SDLK_something, or -1 for none
} T_Config_shortcut_info;
/// This structure holds all the settings saved and loaded as gfx2.ini.
typedef struct
{
char *Font_file; ///< Name of the font used in the menus. Matches file skins/font_*.png (Case-sensitive on some filesystems)
char *Skin_file; ///< String, name of the file where all the graphic data is stored
int Show_hidden_files; ///< Boolean, true to show hidden files in fileselectors.
int Show_hidden_directories; ///< Boolean, true to show hidden directories in fileselectors.
// int Show_system_directories; ///< (removed when converted from DOS)
byte Display_image_limits; ///< Boolean, true to display a dotted line at the borders of the image if it's smaller than screen.
byte Cursor; ///< Mouse cursor aspect: 1 Solid, 2 Transparent, 3 Thin
byte Maximize_preview; ///< Boolean, true to make previews in fileselector fit the whole rectangle.
byte Auto_set_res; ///< Boolean, true to make grafx2 switch to a new resolution whenever you load an image.
byte Coords_rel; ///< Boolean, true to display coordinates as relative (instead of absolute)
byte Backup; ///< Boolean, true to backup the original file whenever you save an image.
byte Adjust_brush_pick; ///< Boolean, true to omit the right and bottom edges when grabbing a brush in Grid mode.
byte Auto_save; ///< Boolean, true to save configuration when exiting program.
byte Max_undo_pages; ///< Number of steps to memorize for Undo/Redo.
byte Mouse_sensitivity_index_x; ///< Mouse sensitivity in X axis
byte Mouse_sensitivity_index_y; ///< Mouse sensitivity in Y axis
byte Mouse_merge_movement; ///< Number of SDL mouse events that are merged into a single change of mouse coordinates.
byte Delay_left_click_on_slider; ///< Delay (in 1/100s) between two activations of a repeatable button when you hold left-click.
byte Delay_right_click_on_slider; ///< Delay (in 1/100s) between two activations of a repeatable button when you hold left-click.
long Timer_delay; ///< Delay (in 1/55s) before showing a preview in a fileselector.
T_Components Fav_menu_colors[4]; ///< Favorite colors to use for the menu.
int Nb_max_vertices_per_polygon; ///< Limit for the number of vertices in polygon tools.
byte Clear_palette; ///< Boolean, true to reset the palette (to black) before loading an image.
byte Set_resolution_according_to; ///< When Auto_set_res is on, this determines if the mode should be chosen according to the "original screen" information in the file (1) or the picture dimensons (2)
int8_t Ratio; ///< Determines the scaling of menu and windows: 0 no scaling, 1 scaling, 2 slight scaling, negative= opposite of max scaling
byte Fast_zoom; ///< Boolean, true if the magnifier shortcut should automatically view the mouse area.
byte Find_file_fast; ///< In fileselectors, this determines which entries should be sought when typing letters: 0 all, 1 files only, 2 directories only.
byte Separate_colors; ///< Boolean, true if the menu palette should separate color cells with a black outline.
word Palette_cells_X; ///< Number of colors to show in a row of the menu palette.
word Palette_cells_Y; ///< Number of colors to show in a column of the menu palette.
byte Palette_vertical; ///< Boolean, true if the menu palette should go top to bottom instead of left to right
byte FX_Feedback; ///< Boolean, true if drawing effects should read the image being modified (instead of the image before clicking)
byte Safety_colors; ///< Boolean, true to make the palette automatically re-create menu colors if needed after a "Zap" or color reduction.
byte Opening_message; ///< Boolean, true to display the splash screen on strtup.
byte Clear_with_stencil; ///< Boolean, true to take the stencil into effect (if active) when using the Clear function.
byte Auto_discontinuous; ///< Boolean, true to automatically switch to the discontinuous freehand draw after grabbing a brush.
byte Screen_size_in_GIF; ///< Boolean, true to store current resolution in GIF files.
byte Auto_nb_used; ///< Boolean, true to count colors in Palette screen.
byte Default_resolution; ///< Default video mode to use on startup. Index in ::Video_mode.
char *Bookmark_directory[NB_BOOKMARKS];///< Bookmarked directories in fileselectors: This is the full directory name.
char Bookmark_label[NB_BOOKMARKS][24]; ///< Bookmarked directories in fileselectors: This is the displayed name.
int Window_pos_x; ///< Last window x position (9999 if unsupportd/irrelevant for the platform)
int Window_pos_y; ///< Last window y position (9999 if unsupportd/irrelevant for the platform)
word Double_click_speed; ///< Maximum delay for double-click, in ms.
word Double_key_speed; ///< Maximum delay for double-keypress, in ms.
byte Right_click_colorpick; ///< Boolean, true to enable a "tablet" mode, where RMB acts as instant colorpicker
byte Sync_views; ///< Boolean, true when the Main and Spare should share their viewport settings.
byte Stylus_mode; ///< Boolean, true to tweak some tools (eg:Curve) for single-button stylus.
word Swap_buttons; ///< Sets which key swaps mouse buttons : 0=none, or GFX2_MOD_CTRL, or GFX2_MOD_ALT.
char * Scripts_directory; ///< Full pathname of directory for Lua scripts
byte Allow_multi_shortcuts; ///< Boolean, true if the same key combination can trigger multiple shortcuts.
byte Tilemap_allow_flipped_x; ///< Boolean, true if the Tilemap tool should detect x-flipped tiles.
byte Tilemap_allow_flipped_y; ///< Boolean, true if the Tilemap tool should detect y-flipped tiles.
byte Tilemap_show_count; ///< Boolean, true if the Tilemap tool should display tile count after analysis.
byte Use_virtual_keyboard; ///< 0: Auto, 1: On, 2: Off
byte Default_mode_layers; ///< Indicates if default new image has layers (alternative is animation)
byte MOTO_gamma; ///< Number, 10 x the Gamma used for converting MO6/TO8/TO9 palette
} T_Config;
// Structures utilisées pour les descriptions de pages et de liste de pages.
// Lorsqu'on gèrera les animations, il faudra aussi des listes de listes de
// pages.
// Ces structures sont manipulées à travers des fonctions de gestion du
// backup dans "graph.c".
typedef struct T_Image
{
byte * Pixels;
int Duration;
} T_Image;
/// This is the data for one step of Undo/Redo, for one image.
/// This structure is resized dynamically to hold pointers to all of the layers in the picture.
/// The pointed layers are just byte* holding the raw pixel data. But at Image[0]-1 you will find a short that is used as a reference counter for each layer.
/// This way we can use the same pixel data in many undo pages when the user edit only one of the layers (which is what they usually do).
typedef struct T_Page
{
int Width; ///< Image width in pixels.
int Height; ///< Image height in pixels.
T_Palette Palette; ///< Image palette.
enum IMAGE_MODES Image_mode; ///< 0= layered image, 1=animation,
char Comment[COMMENT_SIZE+1]; ///< Comment to store in the image file.
char * File_directory; ///< Directory that contains the file.
char * Filename; ///< Filename without directory.
word * Filename_unicode; ///< Filename without directory.
enum FILE_FORMATS File_format; ///< File format, in enum ::FILE_FORMATS
struct T_Page *Next; ///< Pointer to the next backup
struct T_Page *Prev; ///< Pointer to the previous backup
T_Gradient_array *Gradients; ///< Pointer to the gradients used by the image.
byte Background_transparent; ///< Boolean, true if Layer 0 should have transparent pixels
byte Transparent_color; ///< Index of transparent color. 0 to 255.
int Nb_layers; ///< Number of layers
#if __GNUC__ < 3
// gcc2 doesn't suport [], but supports [0] which does the same thing.
T_Image Image[0]; ///< Pixel data for the (first layer of) image.
#else
T_Image Image[]; ///< Pixel data for the (first layer of) image.
#endif
// No field after Image[] ! Dynamic layer allocation for Image[1], [2] etc.
} T_Page;
/// Collection of undo/redo steps.
typedef struct
{
int List_size; ///< Number of ::T_Page in the vector "Pages".
T_Page * Pages; ///< Head of a linked list of pages, each one being a undo/redo step.
} T_List_of_pages;
/// A single image bitmap
/// This struct is used to store a flattened view of the current picture.
typedef struct
{
int Width; ///< Image width in pixels.
int Height; ///< Image height in pixels.
byte * Image; ///< Pixel data for the image.
} T_Bitmap;
/// A single memorized brush from the Brush Container
typedef struct
{
byte Paintbrush_shape; ///< Kind of brush
byte Thumbnail[BRUSH_CONTAINER_PREVIEW_WIDTH][BRUSH_CONTAINER_PREVIEW_HEIGHT];
// Data for color brush
word Width;
word Height;
byte * Brush; /// < Color brush (if any)
T_Palette Palette;
byte Colormap[256];
byte Transp_color;
} T_Brush_template;
/// GUI skin data
typedef struct
{
// Mouse
/// X coordinate of the mouse cursor's "hot spot". It is < ::CURSOR_SPRITE_WIDTH
word Cursor_offset_X[NB_CURSOR_SPRITES];
/// Y coordinate of the mouse cursor's "hot spot". It is < ::CURSOR_SPRITE_HEIGHT
word Cursor_offset_Y[NB_CURSOR_SPRITES];
/// Graphic resources for the mouse cursor.
byte Cursor_sprite[NB_CURSOR_SPRITES][CURSOR_SPRITE_HEIGHT][CURSOR_SPRITE_WIDTH];
// Sieve patterns
/// Preset sieve patterns, stored as binary (one word per line)
word Sieve_pattern[12][16];
// Menu and other graphics
/// Bitmap data for the menu, a single rectangle.
byte Menu_block[3][35][MENU_WIDTH];
byte Layerbar_block[3][10][144];
byte Animbar_block[3][14][236];
byte Statusbar_block[3][9][20];
/// Bitmap data for the icons that are displayed over the menu.
byte Menu_sprite[2][NB_MENU_SPRITES][MENU_SPRITE_HEIGHT][MENU_SPRITE_WIDTH];
/// Bitmap data for the different "effects" icons.
byte Effect_sprite[NB_EFFECTS_SPRITES][EFFECT_SPRITE_HEIGHT][EFFECT_SPRITE_WIDTH];
/// Bitmap data for the different Layer icons.
byte Layer_sprite[3][16][LAYER_SPRITE_HEIGHT][LAYER_SPRITE_WIDTH];
/// Bitmap data for the Grafx2 logo that appears on splash screen. All 256 colors allowed.
byte Logo_grafx2[231*56];
/// Bitmap data for the 6x8 font used in help screens.
byte Help_font_norm [256][6][8];
/// Bitmap data for the 6x8 font used in help screens ("bold" verstion).
byte Bold_font [256][6][8];
// 12
// 34
/// Bitmap data for the title font used in help screens. Top-left quarter.
byte Help_font_t1 [64][6][8];
/// Bitmap data for the title font used in help screens. Top-right quarter.
byte Help_font_t2 [64][6][8];
/// Bitmap data for the title font used in help screens. Bottom-left quarter.
byte Help_font_t3 [64][6][8];
/// Bitmap data for the title font used in help screens. Bottom-right quarter.
byte Help_font_t4 [64][6][8];
/// Bitmap data for the small 8x8 icons.
byte Icon_sprite[NB_ICON_SPRITES][ICON_SPRITE_HEIGHT][ICON_SPRITE_WIDTH];
/// A default 256-color palette.
T_Palette Default_palette;
/// Preview for displaying in the skin dialog
byte Preview[16][173];
/// GUI color indices in skin palette: black, dark, light, white.
byte Color[4];
/// Transparent GUI color index in skin file
byte Color_trans;
} T_Gui_skin;
typedef struct {
// Preset paintbrushes
/// Graphic resources for the preset paintbrushes.
byte Sprite[PAINTBRUSH_HEIGHT][PAINTBRUSH_WIDTH];
/// Width of the preset paintbrushes.
word Width;
/// Height of the preset paintbrushes.
word Height;
/// Type of the preset paintbrush: index in enum PAINTBRUSH_SHAPES
byte Shape;
/// Brush handle for the preset brushes. Generally ::T_Paintbrush::Width[]/2
word Offset_X;
/// Brush handle for the preset brushes. Generally ::T_Paintbrush::Height[]/2
word Offset_Y;
} T_Paintbrush;
/**
* Element of a circular linked list in the tile map
*/
typedef struct
{
int Previous; ///< Previous similar tile in the linked list
int Next; ///< Next similar tile in the linked list
byte Flipped; ///< 0:no, 1:horizontally, 2:vertically, 3:both
} T_Tile;
/// Settings for an entire file selector screen
typedef struct T_Selector_settings
{
byte Format_filter; ///< 0 for "*.*", or a value of enum ::FILE_FORMATS
short Position; ///< Index of the first file/entry to display in list
short Offset; ///< Position of the "highlight" bar in the file list
char * Directory; ///< Directory currently browsed
word * Directory_unicode; ///< Directory currently browsed
char * filename; ///< Filename (without directory) of the highlighted file
word * filename_unicode; ///< /// Filename (without directory) of the highlighted file
} T_Selector_settings;
/// structure for Main or Spare page global data
typedef struct
{
/// Palette
T_Palette palette;
/// Boolean, means the page has been modified since last save.
byte image_is_modified;
/// Width in pixels of the image.
short image_width;
/// Height in pixels of the image.
short image_height;
/// X position (in image space) of the pixel to display in the top left corner of screen.
short offset_X;
/// Y position (in image space) of the pixel to display in the top left corner of screen.
short offset_Y;
/// File format of the image currently edited as page. It's a value of enum ::FILE_FORMATS
enum FILE_FORMATS fileformat;
/// File selector settings
T_Selector_settings selector;
/// X position (in screen coordinates) of the separator between normal and magnified views.
short separator_position;
/// X position (in screen coordinates) of the first pixel of the magnified view.
short X_zoom;
/// Proportion of the non-magnified part of the screen.
float separator_proportion;
/// Boolean, true if the main image has the magnifier active.
byte magnifier_mode;
/// Zoom factor used in the magnifier.
word magnifier_factor;
/// Width of the magnified view for the page.
word magnifier_height;
/// Height of the magnified view for the page.
word magnifier_width;
/// X position (in image space) of the pixel to display in the top left corner of the magnified view.
short magnifier_offset_X;
/// Y position (in image space) of the pixel to display in the top left corner of the magnified view.
short magnifier_offset_Y;
/// Index of layer currently being edited
int current_layer;
/// Bitfield that records which layers are visible. 2^0 for 0, 2^1 for 1, 2^2 for 2, etc.
dword layers_visible;
/// Backup for layers_visible
dword layers_visible_backup;
/// Index to use next time, when creating incremental backups, to make unique filename.
long safety_number;
/// Number of edit actions since the last safety backup
long edits_since_safety_backup;
/// SDL Time of the previous safety backup
dword time_of_safety_backup;
/// Letter prefix for the filenames of safety backups. a or b
byte safety_backup_prefix;
/// Tilemap mode
byte tilemap_mode;
/// Tilemap
T_Tile * tilemap;
/// Number of tiles (horizontally) for the tilemap
short tilemap_width;
/// Number of tiles (vertically) for the tilemap
short tilemap_height;
/// The pixels of visible layers, flattened copy.
T_Bitmap visible_image;
/// List of backup pages for the main image.
T_List_of_pages * backups;
} T_Document;
typedef struct T_Unicode_Font
{
struct T_Unicode_Font * Next;
dword FirstChar;
dword LastChar;
byte * FontData;
} T_Unicode_Font;
#endif
|