2012-05-14 21:29:27 +02:00

407 lines
9.7 KiB
C++
Raw Blame History

/* 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 2
* 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
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
/*
* This code is based on original Tony Tough source code
*
* Copyright (c) 1997-2003 Nayma Software
*/
#ifndef TONY_FONT_H
#define TONY_FONT_H
#include "common/system.h"
#include "common/coroutines.h"
#include "tony/gfxcore.h"
#include "tony/resid.h"
namespace Tony {
class RMInput;
class RMInventory;
class RMItem;
class RMLoc;
class RMLocation;
class RMPointer;
/**
* Gestisce un font, in cui ha varie surface per ogni lettera
*/
class RMFont : public RMGfxTaskSetPrior {
protected:
int nLetters;
RMGfxSourceBuffer8RLEByte *m_letter;
public:
int m_fontDimx, m_fontDimy;
private:
int m_dimx, m_dimy;
class RMFontPrimitive : public RMGfxPrimitive {
public:
RMFontPrimitive() : RMGfxPrimitive() {}
RMFontPrimitive(RMGfxTask *task) : RMGfxPrimitive(task) {}
virtual ~RMFontPrimitive() { }
virtual RMGfxPrimitive *Duplicate() {
return new RMFontPrimitive(*this);
}
int m_nChar;
};
protected:
// Caricamento del font
void Load(uint32 resID, int nChars, int dimx, int dimy, uint32 palResID = RES_F_PAL);
void Load(const byte *buf, int nChars, int dimx, int dimy, uint32 palResID = RES_F_PAL);
// Scaricamente del font (anche da distruttore)
void Unload(void);
protected:
// Conversione (da overloadare)
virtual int ConvertToLetter(int nChar) = 0;
// Lunghezza dei caratteri (da overloadare)
virtual int LetterLength(int nChar, int nNext = 0) = 0;
public:
virtual int LetterHeight(void) = 0;
public:
RMFont();
virtual ~RMFont();
// Inizializzazione e chiusura
virtual void Init(void) = 0;
virtual void Close(void);
// Funzione del task da overloadare
virtual void Draw(CORO_PARAM, RMGfxTargetBuffer &bigBug, RMGfxPrimitive *prim);
// Crea una primitiva per una lettera
RMGfxPrimitive *MakeLetterPrimitive(byte bChar, int &nLength);
// Lunghezza in pixel di una stringa con il font corrente
int StringLen(const RMString &text);
int StringLen(char bChar, char bNext = 0);
};
class RMFontColor : public virtual RMFont {
private:
byte m_r, m_g, m_b;
public:
RMFontColor();
virtual ~RMFontColor();
virtual void SetBaseColor(byte r, byte g, byte b);
};
class RMFontWithTables : public virtual RMFont {
protected:
int cTable[256];
int lTable[256];
int lDefault;
int hDefault;
signed char l2Table[256][256];
protected:
// Overload dei metodi
int ConvertToLetter(int nChar) {
return cTable[nChar];
}
int LetterLength(int nChar, int nNext = 0) {
return (nChar != -1 ? lTable[nChar] + l2Table[nChar][nNext] : lDefault);
}
public:
int LetterHeight() {
return hDefault;
}
virtual ~RMFontWithTables() {}
};
class RMFontParla : public RMFontColor, public RMFontWithTables {
public:
void Init(void);
virtual ~RMFontParla() {}
};
class RMFontObj : public RMFontColor, public RMFontWithTables {
private:
void SetBothCase(int nChar, int nNext, signed char spiazz);
public:
void Init(void);
virtual ~RMFontObj() {}
};
class RMFontMacc : public RMFontColor, public RMFontWithTables {
public:
void Init(void);
virtual ~RMFontMacc() {}
};
class RMFontCredits : public RMFontColor, public RMFontWithTables {
public:
void Init(void);
virtual ~RMFontCredits() {}
virtual void SetBaseColor(byte r, byte g, byte b) {}
};
/**
* Gestisce una scritta su schermo, con tutte le possibilita' di formattazione disponibile
*/
class RMText : public RMGfxWoodyBuffer {
private:
static RMFontColor *m_fonts[4];
static RMGfxClearTask m_clear;
int maxLineLength;
public:
enum HORALIGN {
HLEFT,
HLEFTPAR,
HCENTER,
HRIGHT
};
enum VERALIGN {
VTOP,
VCENTER,
VBOTTOM
};
private:
HORALIGN aHorType;
VERALIGN aVerType;
byte m_r, m_g, m_b;
protected:
virtual void ClipOnScreen(RMGfxPrimitive *prim);
public:
RMText();
virtual ~RMText();
static void InitStatics();
static void Unload();
// Setta il tipo di allineamento
void SetAlignType(HORALIGN aHor, VERALIGN aVer) {
aHorType = aHor;
aVerType = aVer;
}
// Setta la lunghezza massima di una linea in pixel (utilizzato per formattare il testo)
void SetMaxLineLength(int max);
// Scrive un testo
void WriteText(const RMString &text, int font, int *time = NULL);
void WriteText(const RMString &text, RMFontColor *font, int *time = NULL);
// Overloading della funzione ereditata da RMGfxTask per decidere
// quando eliminare un oggetto dalla OTLIST
virtual void RemoveThis(CORO_PARAM, bool &result);
// Overloading del Draw per centrare la scritta, se necessario
virtual void Draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim);
// Setta il colore di base
void SetColor(byte r, byte g, byte b) {
m_r = r;
m_g = g;
m_b = b;
}
};
/**
* Gestisce il testo di un dialogo
*/
class RMTextDialog : public RMText {
protected:
int m_startTime;
int m_time;
bool m_bSkipStatus;
RMPoint dst;
uint32 hEndDisplay;
bool m_bShowed;
bool m_bForceTime;
bool m_bForceNoTime;
uint32 hCustomSkip;
uint32 hCustomSkip2;
RMInput *m_input;
bool m_bAlwaysDisplay;
bool m_bNoTab;
public:
RMTextDialog();
virtual ~RMTextDialog();
// Scrive un testo
void WriteText(const RMString &text, int font, int *time = NULL);
void WriteText(const RMString &text, RMFontColor *font, int *time = NULL);
// Overloading della funzione ereditata da RMGfxTask per decidere
// quando eliminare un oggetto dalla OTLIST
virtual void RemoveThis(CORO_PARAM, bool &result);
// Overloading della funzione di deregistrazione, utilizzata per capire
// quando ci leviamo di torno
virtual void Unregister(void);
// Overloading del Draw per centrare la scritta, se necessario
virtual void Draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim);
// Setta la posizione
void SetPosition(const RMPoint &pt) {
dst = pt;
}
// Aspetta che venga finita la visualizzazione
void WaitForEndDisplay(CORO_PARAM);
void SetCustomSkipHandle(uint32 hCustomSkip);
void SetCustomSkipHandle2(uint32 hCustomSkip);
void SetSkipStatus(bool bEnabled);
void SetForcedTime(uint32 dwTime);
void SetNoTab(void);
void ForceTime(void);
void ForceNoTime(void);
void SetAlwaysDisplay(void);
// Setta il dispositivo di input, per permettere skip da mouse
void SetInput(RMInput *input);
void Show(void);
void Hide(CORO_PARAM);
};
class RMTextDialogScrolling : public RMTextDialog {
protected:
RMLocation *curLoc;
RMPoint startScroll;
virtual void ClipOnScreen(RMGfxPrimitive *prim);
public:
RMTextDialogScrolling();
RMTextDialogScrolling(RMLocation *loc);
virtual ~RMTextDialogScrolling();
virtual void Draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim);
};
/****************************************************************************\
* class RMTextItemName
* --------------------
* Description: Gestisce il nome dell'oggetto selezionato su schermo
\****************************************************************************/
class RMTextItemName : protected RMText {
protected:
RMPoint m_mpos;
RMPoint m_curscroll;
RMItem *m_item;
RMString m_itemName;
public:
RMTextItemName();
virtual ~RMTextItemName();
void SetMouseCoord(const RMPoint &m) {
m_mpos = m;
}
void DoFrame(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMLocation &loc, RMPointer &ptr, RMInventory &inv);
virtual void Draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim);
RMPoint GetHotspot();
RMItem *GetSelectedItem();
bool IsItemSelected();
bool IsNormalItemSelected();
virtual void RemoveThis(CORO_PARAM, bool &result) {
result = true;
}
};
/**
* Gestisce la schermata di scelta delle voci di un dialogo
*/
class RMDialogChoice : public RMGfxWoodyBuffer {
private:
int m_curSelection;
int m_numChoices;
RMText *m_drawedStrings;
RMPoint *m_ptDrawStrings;
int m_curAdded;
bool m_bShow;
RMGfxSourceBuffer8 DlgText;
RMGfxSourceBuffer8 DlgTextLine;
RMPoint m_ptDrawPos;
uint32 hUnreg;
bool bRemoveFromOT;
protected:
void Prepare(CORO_PARAM);
void SetSelected(CORO_PARAM, int pos);
public:
virtual void RemoveThis(CORO_PARAM, bool &result);
virtual void Draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim);
void Unregister(void);
public:
// Inizializzazione
RMDialogChoice();
virtual ~RMDialogChoice();
// Inizializzazione e chiusura
void Init(void);
void Close(void);
// Setta il numero delle frasi possibili, che dovranno essere poi aggiunte
// con AddChoice()
void SetNumChoices(int num);
// Aggiunge una stringa con la scelta
void AddChoice(const RMString &string);
// Mostra e nasconde la scelta, con eventuali animazioni
// NOTA: Se non viene passato parametro alla Show(), <20> obbligo del
// chiamante assicurarsi che la classe venga inserita alla OTlist
void Show(CORO_PARAM, RMGfxTargetBuffer *bigBuf = NULL);
void Hide(CORO_PARAM);
// Polling di aggiornamento
void DoFrame(CORO_PARAM, RMPoint ptMousePos);
// Ritorna la voce attualmente selezionata, o -1 se nessuna <20> selezionata
int GetSelection(void);
};
} // End of namespace Tony
#endif