scummvm/engines/saga2/document.h
2022-10-29 23:45:59 +02:00

178 lines
4.8 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program 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, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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
* aint32 with this program; if not, write to the Free Software
*
*
* Based on the original sources
* Faery Tale II -- The Halls of the Dead
* (c) 1993-1996 The Wyrmkeep Entertainment Co.
*/
#ifndef SAGA2_DOCUMENT_H
#define SAGA2_DOCUMENT_H
#include "saga2/modal.h"
namespace Saga2 {
// prototypes
void appendBookText(char *string = NULL);
void appendScrollText(char *string = NULL);
int16 openBook(uint16);
int16 openScroll(uint16);
int16 openParchment(uint16);
// constants
const uint32 kBookGroupID = MKTAG('B', 'O', 'O', 'K');
const int kMaxVisiblePages = 2;
enum {
kPageLeft = 0,
kPageRight,
kPageUp,
kPageDown
};
enum pageOrientation {
kPageOrientVertical = 0,
kPageOrientHorizontal
};
struct CDocumentAppearance {
StaticRect windowPos; // Position of window on screen
int16 numPages; // Number of visible pages
int16 orientation; // Orientation of pages
uint8 *textColors; // Text color array
StaticRect pageRect[kMaxVisiblePages];// Array of visible page rects
StaticRect closeRect; // Close-box rectangle
StaticWindow *decoList; // List of decorator panels
int16 numDecos; // Number of decorator panels
hResID groupID; // Resource ID for decoration group
hResID decoID; // Resource ID for decorations
};
// Base class for scrolls, books, and parchments
class CDocument : public ModalWindow {
friend class CScroll;
friend class CBook;
private:
enum {
kMaxPages = 32,
kMaxLines = 32,
kMaxChars = 32,
kTextPictureOffset = 1
};
struct ImageHeader {
Point16 size;
int16 compress;
int8 data[2];
};
CDocumentAppearance &_app;
// image poiner array
void *_images[kMaxPages];
uint16 _currentPage,
_lineWidth,
_pageHeight,
_totalLines,
_totalPages;
gFont *_textFont;
uint16 _textHeight;
uint16 _pages;
uint16 _numLines[kMaxPages];
uint16 _lineLen[kMaxPages][kMaxLines];
uint16 _lineOffset[kMaxPages];
Extent16 _imageSizes[kMaxPages];
bool _pageBreakSet;
char *_scan; // for parsing book text.
// string sizes
uint16 _maxSize;
uint16 _textSize;
// image context
hResContext *_illustrationCon;
private:
bool activate(gEventType why); // activate the control
void deactivate();
void pointerMove(gPanelMessage &msg);
bool pointerHit(gPanelMessage &msg);
void pointerDrag(gPanelMessage &msg);
void pointerRelease(gPanelMessage &msg);
bool keyStroke(gPanelMessage &msg);
protected:
void drawClipped(
gPort &port,
const Point16 &offset,
const Rect16 &clipRect);
void draw(); // redraw the window
void renderText();
void makePages();
bool checkForPageBreak(char *string,
uint16 index,
int32 &offset);
bool checkForImage(char *string,
uint16 index,
uint16 pageIndex,
int32 &offset);
gPanel *keyTest(int16 key);
public:
char *origText; // the original text string
char *text; // the working text string
public:
CDocument(CDocumentAppearance &app,
char *buffer, // buffer to edit
gFont *font, // font of the text
uint16 ident, // control ID
AppFunc *cmd = NULL); // application command func
~CDocument();
void gotoPage(int8 page);
APPFUNCV(cmdDocumentEsc);
APPFUNCV(cmdDocumentLt);
APPFUNCV(cmdDocumentRt);
APPFUNCV(cmdDocumentUp);
APPFUNCV(cmdDocumentDn);
// void setText( char *text );
// void appendText( char *string );
};
} // end of namespace Saga2
#endif