22 #include "table/strings.h" 24 #if defined(WITH_ZLIB) 28 #if defined(WITH_LZMA) 60 _nested_textfile_widgets,
lengthof(_nested_textfile_widgets)
63 TextfileWindow::TextfileWindow(
TextfileType file_type) :
Window(&_textfile_desc), file_type(file_type)
65 this->CreateNestedTree();
68 this->FinishInitNested();
69 this->GetWidget<NWidgetCore>(
WID_TF_CAPTION)->
SetDataTip(STR_TEXTFILE_README_CAPTION + file_type, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS);
71 this->hscroll->SetStepSize(10);
75 TextfileWindow::~TextfileWindow()
103 size->width =
max(200u, size->width);
160 y_offset += line_height;
204 #if defined(WITH_ZLIB) 220 static void Gunzip(byte **bufp,
size_t *sizep)
222 static const int BLOCKSIZE = 8192;
224 size_t alloc_size = 0;
228 memset(&z, 0,
sizeof(z));
230 z.avail_in = (uInt)*sizep;
233 res = inflateInit2(&z, 15 + 32);
235 while (res == Z_OK || (res == Z_BUF_ERROR && z.avail_out == 0)) {
238 alloc_size += BLOCKSIZE;
239 z.avail_out += BLOCKSIZE;
241 z.next_out = buf + alloc_size - z.avail_out;
242 res = inflate(&z, Z_FINISH);
248 if (res == Z_STREAM_END) {
250 *sizep = alloc_size - z.avail_out;
260 #if defined(WITH_LZMA) 276 static void Xunzip(byte **bufp,
size_t *sizep)
278 static const int BLOCKSIZE = 8192;
280 size_t alloc_size = 0;
281 lzma_stream z = LZMA_STREAM_INIT;
287 res = lzma_auto_decoder(&z, UINT64_MAX, LZMA_CONCATENATED);
289 while (res == LZMA_OK || (res == LZMA_BUF_ERROR && z.avail_out == 0)) {
292 alloc_size += BLOCKSIZE;
293 z.avail_out += BLOCKSIZE;
295 z.next_out = buf + alloc_size - z.avail_out;
296 res = lzma_code(&z, LZMA_FINISH);
302 if (res == LZMA_STREAM_END) {
304 *sizep = alloc_size - z.avail_out;
320 if (textfile == NULL)
return;
326 FILE *handle =
FioFOpenFile(textfile,
"rb", dir, &filesize);
327 if (handle == NULL)
return;
330 size_t read = fread(this->
text, 1, filesize, handle);
333 if (read != filesize)
return;
335 #if defined(WITH_ZLIB) || defined(WITH_LZMA) 336 const char *suffix = strrchr(textfile,
'.');
337 if (suffix == NULL)
return;
340 #if defined(WITH_ZLIB) 342 if (strcmp(suffix,
".gz") == 0)
Gunzip((byte**)&this->
text, &filesize);
345 #if defined(WITH_LZMA) 347 if (strcmp(suffix,
".xz") == 0)
Xunzip((byte**)&this->text, &filesize);
350 if (!this->text)
return;
353 this->text =
ReallocT(this->text, filesize + 1);
354 this->text[filesize] =
'\0';
357 for (
char *p = this->text; *p !=
'\0'; p++) {
358 if (*p ==
'\t' || *p ==
'\r') *p =
' ';
362 char *p = this->text + (strncmp(
"\xEF\xBB\xBF", this->text, 3) == 0 ? 3 : 0);
369 for (; *p !=
'\0'; p++) {
388 static const char *
const prefixes[] = {
393 assert_compile(
lengthof(prefixes) == TFT_END);
395 const char *prefix = prefixes[type];
397 if (filename == NULL)
return NULL;
399 static char file_path[MAX_PATH];
402 char *slash = strrchr(file_path, PATHSEPCHAR);
403 if (slash == NULL)
return NULL;
405 static const char *
const exts[] = {
407 #if defined(WITH_ZLIB) 410 #if defined(WITH_LZMA) 415 for (
size_t i = 0; i <
lengthof(exts); i++) {
void CheckForMissingGlyphs(bool base_font, MissingGlyphSearcher *searcher)
Check whether the currently loaded language pack uses characters that the currently loaded font does ...
Data about how and where to blit pixels.
ResizeInfo resize
Resize information.
void SetWidgetDisabledState(byte widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
static void Xunzip(byte **bufp, size_t *sizep)
Do an in-memory xunzip operation.
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
Update size and resize step of a widget in the window.
Subdirectory
The different kinds of subdirectories OpenTTD uses.
High level window description.
char * text
Lines of text from the NewGRF's textfile.
static WindowDesc _textfile_desc(WDP_CENTER, "textfile", 630, 460, WC_TEXTFILE, WC_NONE, 0, _nested_textfile_widgets, lengthof(_nested_textfile_widgets))
Window definition for the textfile window.
int CDECL seprintf(char *str, const char *last, const char *format,...)
Safer implementation of snprintf; same as snprintf except:
textfile; Window numbers:
#define FONT_HEIGHT_MONO
Height of characters in the large (FS_MONO) font.
Index of the monospaced font in the font tables.
virtual void Reset()
Reset the search, i.e.
static void Gunzip(byte **bufp, size_t *sizep)
Do an in-memory gunzip operation.
virtual FontSize DefaultSize()
Get the default (font) size of the string.
void Clear()
Remove all items from the list.
void ToggleWidgetLoweredState(byte widget_index)
Invert the lowered/raised status of a widget.
int GetStringHeight(const char *str, int maxw, FontSize fontsize)
Calculates height of string (in pixels).
Functions for Standard In/Out file operations.
#define lastof(x)
Get the last element of an fixed size array.
static T max(const T a, const T b)
Returns the maximum of two values.
bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height)
Set up a clipping area for only drawing into a certain area.
Settings for the freetype fonts.
T * Append(uint to_add=1)
Append an item and return it.
Data structure for an opened window.
virtual void DrawWidget(const Rect &r, int widget) const
Draw the contents of a nested widget.
Functions to read fonts from files and cache them.
Bottom offset of the text of the frame.
uint GetContentHeight()
Get the total height of the content displayed in this window, if wrapping is disabled.
Functions related to low-level strings.
uint search_iterator
Iterator for the font check search.
virtual bool Monospace()
Whether to search for a monospace font or not.
uint Length() const
Get the number of items in the list.
bool IsWidgetLowered(byte widget_index) const
Gets the lowered state of a widget.
void str_validate(char *str, const char *last, StringValidationSettings settings)
Scans the string for valid characters and if it finds invalid ones, replaces them with a question mar...
FreeTypeSubSetting mono
The mono space font used for license/readme viewers.
Functions related to the gfx engine.
FILE * FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir, size_t *filesize)
Opens a OpenTTD file somewhere in a personal or global directory.
Definition of base types and functions in a cross-platform compatible way.
static const int BOTTOM_SPACING
Additional spacing at the bottom of the WID_TF_BACKGROUND widget.
A number of safeguards to prevent using unsafe methods.
static T * ReallocT(T *t_ptr, size_t num_elements)
Simplified reallocation function that allocates the specified number of elements of the given type...
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
virtual void LoadTextfile(const char *textfile, Subdirectory dir)
Loads the textfile text from file and setup lines.
int DrawString(int left, int right, int top, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Right offset of the text of the frame.
#define lengthof(x)
Return the length of an fixed size array.
TextfileType
Additional text files accompanying Tar archives.
Top offset of the text of the frame.
Left offset of the text of the frame.
bool FioCheckFileExists(const char *filename, Subdirectory subdir)
Check whether the given file exists.
static const int TOP_SPACING
Additional spacing at the top of the WID_TF_BACKGROUND widget.
Scrollbar * hscroll
Horizontal scrollbar.
void SetupScrollbars()
Set scrollbars to the right lengths.
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
No window, redirects to WC_MAIN_WINDOW.
char font[MAX_PATH]
The name of the font, or path to the font.
const char * GetCurrentLanguageIsoCode()
Get the ISO language code of the currently loaded language.
static const NWidgetPart _nested_textfile_widgets[]
Widgets for the textfile window.
Replace the unknown/bad bits with question marks.
virtual void SetFontNames(FreeTypeSettings *settings, const char *font_name)
Set the right font names.
FontSize
Available font sizes.
Scrollbar * vscroll
Vertical scrollbar.
char * strecpy(char *dst, const char *src, const char *last)
Copies characters from one buffer to another.
virtual void OnResize()
Called after the window got resized.
Coordinates of a point in 2D.
static void free(const void *ptr)
Version of the standard free that accepts const pointers.
Offset at right to draw the frame rectangular area.
int width
width of the window (number of pixels to the right in x direction)
Specification of a rectangle with absolute coordinates of all edges.
const char * GetTextfile(TextfileType type, Subdirectory dir, const char *filename)
Search a textfile file next to the given content.
virtual const char * NextString()
Get the next string to search through.
Dimensions (a width and height) of a rectangle in 2D.
SmallVector< const char *, 64 > lines
text, split into lines in a table with lines.
Types related to the graphics and/or input devices.
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
int height
Height of the window (number of pixels down in y direction)
GUI functions related to textfiles.
int DrawStringMultiLine(int left, int right, int top, int bottom, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.