diff options
author | Calvin Morrison <calvin@pobox.com> | 2023-04-05 14:13:39 -0400 |
---|---|---|
committer | Calvin Morrison <calvin@pobox.com> | 2023-04-05 14:13:39 -0400 |
commit | 835e373b3eeaabcd0621ed6798ab500f37982fae (patch) | |
tree | dfa16b0e2e1b4956b38f693220eac4e607802133 /xpdf/DisplayState.cc |
Diffstat (limited to 'xpdf/DisplayState.cc')
-rw-r--r-- | xpdf/DisplayState.cc | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/xpdf/DisplayState.cc b/xpdf/DisplayState.cc new file mode 100644 index 0000000..e0d3068 --- /dev/null +++ b/xpdf/DisplayState.cc @@ -0,0 +1,223 @@ +//======================================================================== +// +// DisplayState.cc +// +// Copyright 2014 Glyph & Cog, LLC +// +//======================================================================== + +#include <aconf.h> + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include <stdlib.h> +#include "gmempp.h" +#include "GString.h" +#include "GList.h" +#include "TileMap.h" +#include "TileCache.h" +#include "TileCompositor.h" +#include "DisplayState.h" + + +//------------------------------------------------------------------------ +// DisplayState +//------------------------------------------------------------------------ + +DisplayState::DisplayState(int maxTileWidthA, int maxTileHeightA, + int tileCacheSizeA, int nWorkerThreadsA, + SplashColorMode colorModeA, int bitmapRowPadA) { + int i; + + maxTileWidth = maxTileWidthA; + maxTileHeight = maxTileHeightA; + tileCacheSize = tileCacheSizeA; + nWorkerThreads = nWorkerThreadsA; + colorMode = colorModeA; + bitmapRowPad = bitmapRowPadA; + + tileMap = NULL; + tileCache = NULL; + tileCompositor = NULL; + + for (i = 0; i < splashColorModeNComps[colorMode]; ++i) { + paperColor[i] = 0xff; + matteColor[i] = 0x80; + } + if (colorMode == splashModeRGB8 || colorMode == splashModeBGR8) { + selectColor[0] = 0x80; + selectColor[1] = 0x80; + selectColor[2] = 0xff; + } else { + for (i = 0; i < splashColorModeNComps[colorMode]; ++i) { + selectColor[i] = 0xa0; + } + } + reverseVideo = gFalse; + + doc = NULL; + + winW = winH = 100; + displayMode = displayContinuous; + zoom = 100; + rotate = 0; + scrollPage = 0; + scrollX = scrollY = 0; + + selectRects = NULL; + + +} + +DisplayState::~DisplayState() { + if (selectRects) { + deleteGList(selectRects, SelectRect); + } +} + +void DisplayState::setPaperColor(SplashColorPtr paperColorA) { + splashColorCopy(paperColor, paperColorA); + tileCache->paperColorChanged(); + tileCompositor->paperColorChanged(); +} + +void DisplayState::setMatteColor(SplashColorPtr matteColorA) { + splashColorCopy(matteColor, matteColorA); + tileCompositor->matteColorChanged(); +} + +void DisplayState::setSelectColor(SplashColorPtr selectColorA) { + splashColorCopy(selectColor, selectColorA); + tileCompositor->selectColorChanged(); +} + +void DisplayState::setReverseVideo(GBool reverseVideoA) { + if (reverseVideo != reverseVideoA) { + reverseVideo = reverseVideoA; + tileCache->reverseVideoChanged(); + tileCompositor->reverseVideoChanged(); + } +} + +void DisplayState::setDoc(PDFDoc *docA) { + doc = docA; + tileMap->docChanged(); + tileCache->docChanged(); + tileCompositor->docChanged(); +} + +void DisplayState::setWindowSize(int winWA, int winHA) { + if (winW != winWA || winH != winHA) { + winW = winWA; + winH = winHA; + tileMap->windowSizeChanged(); + tileCompositor->windowSizeChanged(); + } +} + +void DisplayState::setDisplayMode(DisplayMode displayModeA) { + if (displayMode != displayModeA) { + displayMode = displayModeA; + tileMap->displayModeChanged(); + tileCompositor->displayModeChanged(); + } +} + +void DisplayState::setZoom(double zoomA) { + if (zoom != zoomA) { + zoom = zoomA; + tileMap->zoomChanged(); + tileCompositor->zoomChanged(); + } +} + +void DisplayState::setRotate(int rotateA) { + if (rotate != rotateA) { + rotate = rotateA; + tileMap->rotateChanged(); + tileCompositor->rotateChanged(); + } +} + +void DisplayState::setScrollPosition(int scrollPageA, + int scrollXA, int scrollYA) { + if (scrollPage != scrollPageA || + scrollX != scrollXA || + scrollY != scrollYA) { + scrollPage = scrollPageA; + scrollX = scrollXA; + scrollY = scrollYA; + tileMap->scrollPositionChanged(); + tileCompositor->scrollPositionChanged(); + } +} + +void DisplayState::setSelection(int selectPage, + double selectX0, double selectY0, + double selectX1, double selectY1) { + GList *rects; + SelectRect *rect; + + rect = new SelectRect(selectPage, selectX0, selectY0, selectX1, selectY1); + rects = new GList(); + rects->append(rect); + setSelection(rects); +} + +void DisplayState::setSelection(GList *selectRectsA) { + SelectRect *rect, *rectA; + int i; + + if (!selectRects && !selectRectsA) { + return; + } + if (selectRects && selectRectsA && + selectRects->getLength() == selectRectsA->getLength()) { + for (i = 0; i < selectRects->getLength(); ++i) { + rect = (SelectRect *)selectRects->get(i); + rectA = (SelectRect *)selectRectsA->get(i); + if (*rect != *rectA) { + break; + } + } + if (i == selectRects->getLength()) { + deleteGList(selectRectsA, SelectRect); + return; + } + } + if (selectRects) { + deleteGList(selectRects, SelectRect); + } + selectRects = selectRectsA; + tileCompositor->selectionChanged(); +} + +void DisplayState::clearSelection() { + setSelection(NULL); +} + +int DisplayState::getNumSelectRects() { + if (!selectRects) { + return 0; + } + return selectRects->getLength(); +} + +SelectRect *DisplayState::getSelectRect(int idx) { + return (SelectRect *)selectRects->get(idx); +} + +void DisplayState::optionalContentChanged() { + tileCache->optionalContentChanged(); + tileCompositor->optionalContentChanged(); +} + + + +void DisplayState::forceRedraw() { + tileMap->forceRedraw(); + tileCache->forceRedraw(); + tileCompositor->forceRedraw(); +} |