displaystate.cc.svn-base

来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· SVN-BASE 代码 · 共 114 行

SVN-BASE
114
字号
/* Copyright Krzysztof Kowalczyk 2006-2007
   License: GPLv2 */
#include "DisplayState.h"
#include "str_util.h"
#include "dstring.h"

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

void normalizeRotation(int *rotation)
{
    assert(rotation);
    if (!rotation) return;
    while (*rotation < 0)
        *rotation += 360;
    while (*rotation >= 360)
        *rotation -= 360;
}

BOOL validRotation(int rotation)
{
    normalizeRotation(&rotation);
    if ((0 == rotation) || (90 == rotation) ||
        (180 == rotation) || (270 == rotation))
        return TRUE;
    return FALSE;
}

BOOL ValidZoomVirtual(double zoomVirtual)
{
    if ((ZOOM_FIT_PAGE == zoomVirtual) || (ZOOM_FIT_WIDTH == zoomVirtual))
        return TRUE;
    if ((zoomVirtual < ZOOM_MIN) || (zoomVirtual > ZOOM_MAX)) {
        DBG_OUT("ValidZoomVirtual() invalid zoom: %.4f\n", zoomVirtual);
        return FALSE;
    }
    return TRUE;
}

#define STR_FROM_ENUM(val) \
    if (val == var) \
        return val##_STR;

const char *DisplayModeNameFromEnum(DisplayMode var)
{
    STR_FROM_ENUM(DM_SINGLE_PAGE)
    STR_FROM_ENUM(DM_FACING)
    STR_FROM_ENUM(DM_CONTINUOUS)
    STR_FROM_ENUM(DM_CONTINUOUS_FACING)
    return NULL;
}

#define IS_STR_ENUM(enumName) \
    if (str_eq(txt, enumName##_STR)) { \
        *resOut = enumName; \
        return true; \
    }

bool DisplayModeEnumFromName(const char *txt, DisplayMode *resOut)
{
    IS_STR_ENUM(DM_SINGLE_PAGE)
    IS_STR_ENUM(DM_FACING)
    IS_STR_ENUM(DM_CONTINUOUS)
    IS_STR_ENUM(DM_CONTINUOUS_FACING)
    assert(0);
    return false;
}

void DisplayState_Init(DisplayState *ds)
{
    memzero(ds, sizeof(DisplayState));
    ds->displayMode = DM_SINGLE_PAGE;
    ds->visible = FALSE;
    ds->pageNo = 1;
    ds->zoomVirtual = 100.0;
    ds->rotation = 0;
    ds->showToc = TRUE;
}

void DisplayState_Free(DisplayState *ds)
{
    free((void*)ds->filePath);
    DisplayState_Init(ds);
}

bool DisplayState_Serialize(DisplayState *ds, DString *strOut)
{
    const char *        displayModeName = NULL;

    DStringSprintf(strOut, "  %s: %s\n", FILE_STR, ds->filePath);

    displayModeName = DisplayModeNameFromEnum(ds->displayMode);
    if (displayModeName)
        DStringSprintf(strOut, "  %s: %s\n", DISPLAY_MODE_STR, displayModeName);
    else
        DStringSprintf(strOut, "  %s: %s\n", DISPLAY_MODE_STR, DisplayModeNameFromEnum(DM_SINGLE_PAGE));

    DStringSprintf(strOut, "  %s: %d\n",   VISIBLE_STR, ds->visible);
    DStringSprintf(strOut, "  %s: %d\n",   PAGE_NO_STR, ds->pageNo);
    DStringSprintf(strOut, "  %s: %.4f\n", ZOOM_VIRTUAL_STR, ds->zoomVirtual);
    DStringSprintf(strOut, "  %s: %d\n",   ROTATION_STR, ds->rotation);

    DStringSprintf(strOut, "  %s: %d\n",   SCROLL_X_STR, ds->scrollX);
    DStringSprintf(strOut, "  %s: %d\n",   SCROLL_Y_STR, ds->scrollY);

    DStringSprintf(strOut, "  %s: %d\n",   WINDOW_X_STR, ds->windowX);
    DStringSprintf(strOut, "  %s: %d\n",   WINDOW_Y_STR, ds->windowY);
    DStringSprintf(strOut, "  %s: %d\n",   WINDOW_DX_STR, ds->windowDx);
    DStringSprintf(strOut, "  %s: %d\n",   WINDOW_DY_STR, ds->windowDy);
    return TRUE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?