本文整理汇总了C++中RenderedBitmap类的典型用法代码示例。如果您正苦于以下问题:C++ RenderedBitmap类的具体用法?C++ RenderedBitmap怎么用?C++ RenderedBitmap使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了RenderedBitmap类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DumpThumbnail
void DumpThumbnail(BaseEngine *engine)
{
RectD rect = engine->Transform(engine->PageMediabox(1), 1, 1.0, 0);
if (rect.IsEmpty()) {
Out("\t<Thumbnail />\n");
return;
}
float zoom = min(128 / (float)rect.dx, 128 / (float)rect.dy) - 0.001f;
RectI thumb = RectD(0, 0, rect.dx * zoom, rect.dy * zoom).Round();
rect = engine->Transform(thumb.Convert<double>(), 1, zoom, 0, true);
RenderedBitmap *bmp = engine->RenderBitmap(1, zoom, 0, &rect);
if (!bmp) {
Out("\t<Thumbnail />\n");
return;
}
size_t len;
ScopedMem<unsigned char> data(tga::SerializeBitmap(bmp->GetBitmap(), &len));
ScopedMem<char> hexData(data ? str::MemToHex(data, len) : NULL);
if (hexData)
Out("\t<Thumbnail>\n\t\t%s\n\t</Thumbnail>\n", hexData.Get());
else
Out("\t<Thumbnail />\n");
delete bmp;
}
示例2: RenderDocument
void RenderDocument(BaseEngine *engine, const WCHAR *renderPath, bool silent=false)
{
for (int pageNo = 1; pageNo <= engine->PageCount(); pageNo++) {
RenderedBitmap *bmp = engine->RenderBitmap(pageNo, 1.0, 0);
if (!bmp || silent) {
delete bmp;
continue;
}
ScopedMem<WCHAR> pageBmpPath(str::Format(renderPath, pageNo));
if (str::EndsWithI(pageBmpPath, L".png")) {
Bitmap gbmp(bmp->GetBitmap(), NULL);
gbmp.Save(pageBmpPath, &GetEncoderClsid(L"image/png"));
}
else if (str::EndsWithI(pageBmpPath, L".bmp")) {
size_t bmpDataLen;
ScopedMem<char> bmpData((char *)SerializeBitmap(bmp->GetBitmap(), &bmpDataLen));
if (bmpData)
file::WriteAll(pageBmpPath, bmpData, bmpDataLen);
}
else { // render as TGA for all other file extensions
size_t tgaDataLen;
ScopedMem<unsigned char> tgaData(tga::SerializeBitmap(bmp->GetBitmap(), &tgaDataLen));
if (tgaData)
file::WriteAll(pageBmpPath, tgaData, tgaDataLen);
}
delete bmp;
}
}
示例3: WaitForSingleObject
DWORD WINAPI RenderCache::RenderCacheThread(LPVOID data)
{
RenderCache *cache = (RenderCache *)data;
PageRenderRequest req;
RenderedBitmap * bmp;
for (;;) {
if (cache->ClearCurrentRequest()) {
DWORD waitResult = WaitForSingleObject(cache->startRendering, INFINITE);
// Is it not a page render request?
if (WAIT_OBJECT_0 != waitResult)
continue;
}
if (!cache->GetNextRequest(&req))
continue;
if (!req.dm->PageVisibleNearby(req.pageNo) && !req.renderCb)
continue;
if (req.dm->dontRenderFlag) {
if (req.renderCb)
req.renderCb->Callback();
continue;
}
// make sure that we have extracted page text for
// all rendered pages to allow text selection and
// searching without any further delays
if (!req.dm->textCache->HasData(req.pageNo))
req.dm->textCache->GetData(req.pageNo);
CrashIf(req.abortCookie != NULL);
bmp = req.dm->engine->RenderBitmap(req.pageNo, req.zoom, req.rotation, &req.pageRect, Target_View, &req.abortCookie);
if (req.abort) {
delete bmp;
if (req.renderCb)
req.renderCb->Callback();
continue;
}
if (req.renderCb) {
// the callback must free the RenderedBitmap
req.renderCb->Callback(bmp);
req.renderCb = (RenderingCallback *)1; // will crash if accessed again, which should not happen
}
else {
// don't replace colors for individual images
if (bmp && !req.dm->engine->IsImageCollection())
UpdateBitmapColorRange(bmp->GetBitmap(), cache->colorRange);
cache->Add(req, bmp);
#ifdef CONSERVE_MEMORY
cache->FreeNotVisible();
#endif
req.dm->RepaintDisplay();
}
}
return 0;
}
示例4: RenderDocument
bool RenderDocument(BaseEngine *engine, const WCHAR *renderPath, float zoom=1.f, bool silent=false)
{
if (!CheckRenderPath(renderPath))
return false;
if (str::EndsWithI(renderPath, L".txt")) {
str::Str<WCHAR> text(1024);
for (int pageNo = 1; pageNo <= engine->PageCount(); pageNo++)
text.AppendAndFree(engine->ExtractPageText(pageNo, L"\r\n", NULL, Target_Export));
if (silent)
return true;
ScopedMem<WCHAR> txtFilePath(str::Format(renderPath, 0));
ScopedMem<char> textUTF8(str::conv::ToUtf8(text.Get()));
ScopedMem<char> textUTF8BOM(str::Join(UTF8_BOM, textUTF8));
return file::WriteAll(txtFilePath, textUTF8BOM, str::Len(textUTF8BOM));
}
if (str::EndsWithI(renderPath, L".pdf")) {
if (silent)
return false;
ScopedMem<WCHAR> pdfFilePath(str::Format(renderPath, 0));
return engine->SaveFileAsPDF(pdfFilePath, true) || PdfCreator::RenderToFile(pdfFilePath, engine);
}
bool success = true;
for (int pageNo = 1; pageNo <= engine->PageCount(); pageNo++) {
RenderedBitmap *bmp = engine->RenderBitmap(pageNo, zoom, 0);
success &= bmp != NULL;
if (!bmp && !silent)
ErrOut("Error: Failed to render page %d for %s!", pageNo, engine->FileName());
if (!bmp || silent) {
delete bmp;
continue;
}
ScopedMem<WCHAR> pageBmpPath(str::Format(renderPath, pageNo));
if (str::EndsWithI(pageBmpPath, L".png")) {
Bitmap gbmp(bmp->GetBitmap(), NULL);
CLSID pngEncId = GetEncoderClsid(L"image/png");
gbmp.Save(pageBmpPath, &pngEncId);
}
else if (str::EndsWithI(pageBmpPath, L".bmp")) {
size_t bmpDataLen;
ScopedMem<char> bmpData((char *)SerializeBitmap(bmp->GetBitmap(), &bmpDataLen));
if (bmpData)
file::WriteAll(pageBmpPath, bmpData, bmpDataLen);
}
else { // render as TGA for all other file extensions
size_t tgaDataLen;
ScopedMem<unsigned char> tgaData(tga::SerializeBitmap(bmp->GetBitmap(), &tgaDataLen));
if (tgaData)
file::WriteAll(pageBmpPath, tgaData, tgaDataLen);
}
delete bmp;
}
return success;
}
示例5: CopySelectionToClipboard
void CopySelectionToClipboard(WindowInfo* win) {
if (!win->currentTab || !win->currentTab->selectionOnPage)
return;
CrashIf(win->currentTab->selectionOnPage->size() == 0 && win->mouseAction != MouseAction::SelectingText);
if (win->currentTab->selectionOnPage->size() == 0)
return;
CrashIf(!win->AsFixed());
if (!win->AsFixed())
return;
if (!OpenClipboard(nullptr))
return;
EmptyClipboard();
DisplayModel* dm = win->AsFixed();
#ifndef DISABLE_DOCUMENT_RESTRICTIONS
if (!dm->GetEngine()->AllowsCopyingText())
win->ShowNotification(_TR("Copying text was denied (copying as image only)"));
else
#endif
if (!dm->GetEngine()->IsImageCollection()) {
AutoFreeW selText;
bool isTextSelection = dm->textSelection->result.len > 0;
if (isTextSelection) {
selText.Set(dm->textSelection->ExtractText(L"\r\n"));
} else {
WStrVec selections;
for (SelectionOnPage& sel : *win->currentTab->selectionOnPage) {
WCHAR* text = dm->GetTextInRegion(sel.pageNo, sel.rect);
if (text)
selections.Push(text);
}
selText.Set(selections.Join());
}
// don't copy empty text
if (!str::IsEmpty(selText.Get()))
CopyTextToClipboard(selText, true);
if (isTextSelection) {
// don't also copy the first line of a text selection as an image
CloseClipboard();
return;
}
}
/* also copy a screenshot of the current selection to the clipboard */
SelectionOnPage* selOnPage = &win->currentTab->selectionOnPage->at(0);
RenderedBitmap* bmp = dm->GetEngine()->RenderBitmap(selOnPage->pageNo, dm->GetZoomReal(), dm->GetRotation(),
&selOnPage->rect, RenderTarget::Export);
if (bmp)
CopyImageToClipboard(bmp->GetBitmap(), true);
delete bmp;
CloseClipboard();
}
示例6: CopySelectionToClipboard
void CopySelectionToClipboard(WindowInfo *win)
{
if (!win->selectionOnPage) return;
CrashIf(win->selectionOnPage->Count() == 0);
if (win->selectionOnPage->Count() == 0) return;
CrashIf(!win->dm || !win->dm->engine);
if (!win->dm || !win->dm->engine) return;
if (!OpenClipboard(NULL)) return;
EmptyClipboard();
#ifndef DISABLE_DOCUMENT_RESTRICTIONS
if (!win->dm->engine->AllowsCopyingText())
ShowNotification(win, _TR("Copying text was denied (copying as image only)"));
else
#endif
if (!win->dm->engine->IsImageCollection()) {
ScopedMem<WCHAR> selText;
bool isTextSelection = win->dm->textSelection->result.len > 0;
if (isTextSelection) {
selText.Set(win->dm->textSelection->ExtractText(L"\r\n"));
}
else {
WStrVec selections;
for (size_t i = 0; i < win->selectionOnPage->Count(); i++) {
SelectionOnPage *selOnPage = &win->selectionOnPage->At(i);
WCHAR *text = win->dm->GetTextInRegion(selOnPage->pageNo, selOnPage->rect);
if (text)
selections.Push(text);
}
selText.Set(selections.Join());
}
// don't copy empty text
if (!str::IsEmpty(selText.Get()))
CopyTextToClipboard(selText, true);
if (isTextSelection) {
// don't also copy the first line of a text selection as an image
CloseClipboard();
return;
}
}
/* also copy a screenshot of the current selection to the clipboard */
SelectionOnPage *selOnPage = &win->selectionOnPage->At(0);
RenderedBitmap * bmp = win->dm->engine->RenderBitmap(selOnPage->pageNo,
win->dm->ZoomReal(), win->dm->Rotation(), &selOnPage->rect, Target_Export);
if (bmp)
CopyImageToClipboard(bmp->GetBitmap(), true);
delete bmp;
CloseClipboard();
}
示例7: RenderDocument
void RenderDocument(BaseEngine *engine, const WCHAR *renderPath)
{
for (int pageNo = 1; pageNo <= engine->PageCount(); pageNo++) {
RenderedBitmap *bmp = engine->RenderBitmap(pageNo, 1.0, 0);
size_t len = 0;
ScopedMem<unsigned char> data;
if (bmp && str::EndsWithI(renderPath, L".bmp"))
data.Set(SerializeBitmap(bmp->GetBitmap(), &len));
else if (bmp)
data.Set(tga::SerializeBitmap(bmp->GetBitmap(), &len));
ScopedMem<WCHAR> pageBmpPath(str::Format(renderPath, pageNo));
file::WriteAll(pageBmpPath, data, len);
delete bmp;
}
}
示例8: GetEngine
IFACEMETHODIMP PreviewBase::GetThumbnail(UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha)
{
BaseEngine *engine = GetEngine();
if (!engine)
return E_FAIL;
RectD page = engine->Transform(engine->PageMediabox(1), 1, 1.0, 0);
float zoom = min(cx / (float)page.dx, cx / (float)page.dy) - 0.001f;
RectI thumb = RectD(0, 0, page.dx * zoom, page.dy * zoom).Round();
BITMAPINFO bmi = { 0 };
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biHeight = thumb.dy;
bmi.bmiHeader.biWidth = thumb.dx;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
unsigned char *bmpData = NULL;
HBITMAP hthumb = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void **)&bmpData, NULL, 0);
if (!hthumb)
return E_OUTOFMEMORY;
page = engine->Transform(thumb.Convert<double>(), 1, zoom, 0, true);
RenderedBitmap *bmp = engine->RenderBitmap(1, zoom, 0, &page);
HDC hdc = GetDC(NULL);
if (bmp && GetDIBits(hdc, bmp->GetBitmap(), 0, thumb.dy, bmpData, &bmi, DIB_RGB_COLORS)) {
// cf. http://msdn.microsoft.com/en-us/library/bb774612(v=VS.85).aspx
for (int i = 0; i < thumb.dx * thumb.dy; i++)
bmpData[4 * i + 3] = 0xFF;
*phbmp = hthumb;
if (pdwAlpha)
*pdwAlpha = WTSAT_RGB;
}
else {
DeleteObject(hthumb);
hthumb = NULL;
}
ReleaseDC(NULL, hdc);
delete bmp;
return hthumb ? S_OK : E_NOTIMPL;
}
示例9: LoadThumbnail
bool LoadThumbnail(DisplayState& ds) {
delete ds.thumbnail;
ds.thumbnail = nullptr;
AutoFreeW bmpPath(GetThumbnailPath(ds.filePath));
if (!bmpPath) {
return false;
}
RenderedBitmap* bmp = LoadRenderedBitmap(bmpPath);
if (!bmp || bmp->Size().IsEmpty()) {
delete bmp;
return false;
}
ds.thumbnail = bmp;
return true;
}
示例10: LoadThumbnail
static bool LoadThumbnail(DisplayState& ds)
{
delete ds.thumbnail;
ds.thumbnail = NULL;
ScopedMem<WCHAR> bmpPath(GetThumbnailPath(ds.filePath));
if (!bmpPath)
return false;
RenderedBitmap *bmp = LoadRenderedBitmap(bmpPath);
if (!bmp || bmp->Size().IsEmpty()) {
delete bmp;
return false;
}
ds.thumbnail = bmp;
return true;
}
示例11: PageMediabox
bool DjVuEngineImpl::RenderPage(HDC hDC, RectI screenRect, int pageNo, float zoom, int rotation, RectD *pageRect, RenderTarget target, AbortCookie **cookie_out)
{
bool success = true;
RectD mediabox = PageMediabox(pageNo);
HRGN clip = CreateRectRgn(screenRect.x, screenRect.y, screenRect.x + screenRect.dx, screenRect.y + screenRect.dy);
SelectClipRgn(hDC, clip);
DjVuAbortCookie *cookie = NULL;
if (cookie_out)
*cookie_out = cookie = new DjVuAbortCookie();
// render in 1 MB bands, as otherwise GDI can run out of memory
RectD rect = pageRect ? *pageRect : mediabox;
int bandDy = (int)((1 << 20) / (rect.dy * zoom));
PointI pt = Transform(rect, pageNo, zoom, rotation).TL().Convert<int>();
for (int y = 0; y * bandDy < rect.dy; y++) {
RectD pageBand(rect.x, y * bandDy, rect.dx, bandDy);
pageBand = pageBand.Intersect(mediabox);
RectI screenBand = Transform(pageBand, pageNo, zoom, rotation).Round();
screenBand.Offset(screenRect.x - pt.x, screenRect.y - pt.y);
RenderedBitmap *bmp = RenderBitmap(pageNo, zoom, rotation, &pageBand, target, cookie_out);
if (bmp && bmp->GetBitmap())
success = bmp->StretchDIBits(hDC, screenBand);
else
success = false;
delete bmp;
if (cookie && cookie->abort) {
success = false;
break;
}
}
SelectClipRgn(hDC, NULL);
return success;
}
示例12: Find
// TODO: conceptually, RenderCache is not the right place for code that paints
// (this is the only place that knows about Tiles, though)
UINT RenderCache::PaintTile(HDC hdc, RectI bounds, DisplayModel *dm, int pageNo,
TilePosition tile, RectI tileOnScreen, bool renderMissing,
bool *renderOutOfDateCue, bool *renderedReplacement)
{
BitmapCacheEntry *entry = Find(dm, pageNo, dm->Rotation(), dm->ZoomReal(), &tile);
UINT renderDelay = 0;
if (!entry) {
if (!isRemoteSession) {
if (renderedReplacement)
*renderedReplacement = true;
entry = Find(dm, pageNo, dm->Rotation(), INVALID_ZOOM, &tile);
}
renderDelay = GetRenderDelay(dm, pageNo, tile);
if (renderMissing && RENDER_DELAY_UNDEFINED == renderDelay && !IsRenderQueueFull())
Render(dm, pageNo, tile);
}
RenderedBitmap *renderedBmp = entry ? entry->bitmap : NULL;
HBITMAP hbmp = renderedBmp ? renderedBmp->GetBitmap() : NULL;
if (!hbmp) {
if (entry && !(renderedBmp && ReduceTileSize()))
renderDelay = RENDER_DELAY_FAILED;
else if (0 == renderDelay)
renderDelay = 1;
if (entry)
DropCacheEntry(entry);
return renderDelay;
}
HDC bmpDC = CreateCompatibleDC(hdc);
if (bmpDC) {
SizeI bmpSize = renderedBmp->Size();
int xSrc = -min(tileOnScreen.x, 0);
int ySrc = -min(tileOnScreen.y, 0);
float factor = min(1.0f * bmpSize.dx / tileOnScreen.dx, 1.0f * bmpSize.dy / tileOnScreen.dy);
SelectObject(bmpDC, hbmp);
if (factor != 1.0f)
StretchBlt(hdc, bounds.x, bounds.y, bounds.dx, bounds.dy,
bmpDC, (int)(xSrc * factor), (int)(ySrc * factor),
(int)(bounds.dx * factor), (int)(bounds.dy * factor), SRCCOPY);
else
BitBlt(hdc, bounds.x, bounds.y, bounds.dx, bounds.dy,
bmpDC, xSrc, ySrc, SRCCOPY);
DeleteDC(bmpDC);
#ifdef DEBUG_TILE_LAYOUT
HPEN pen = CreatePen(PS_SOLID, 1, RGB(0xff, 0xff, 0x00));
HGDIOBJ oldPen = SelectObject(hdc, pen);
PaintRect(hdc, bounds);
DeletePen(SelectObject(hdc, oldPen));
#endif
}
if (renderOutOfDateCue)
*renderOutOfDateCue = renderedBmp->outOfDate;
DropCacheEntry(entry);
return 0;
}
示例13: PrintToDevice
//.........这里部分代码省略.........
if (bounds.IsEmpty())
continue;
if (progressUI)
progressUI->UpdateProgress(current, total);
StartPage(hdc);
SizeT<float> bSize = bounds.Size().Convert<float>();
float zoom = min((float)printable.dx / bSize.dx,
(float)printable.dy / bSize.dy);
// use the correct zoom values, if the page fits otherwise
// and the user didn't ask for anything else (default setting)
if (PrintScaleShrink == pd.advData.scale)
zoom = min(dpiFactor, zoom);
else if (PrintScaleNone == pd.advData.scale)
zoom = dpiFactor;
for (size_t i = 0; i < pd.sel.Count(); i++) {
if (pd.sel.At(i).pageNo != pageNo)
continue;
RectD *clipRegion = &pd.sel.At(i).rect;
PointI offset((int)((clipRegion->x - bounds.x) * zoom), (int)((clipRegion->y - bounds.y) * zoom));
if (!pd.advData.asImage) {
RectI rc((int)(printable.dx - bSize.dx * zoom) / 2 + offset.x,
(int)(printable.dy - bSize.dy * zoom) / 2 + offset.y,
(int)(clipRegion->dx * zoom), (int)(clipRegion->dy * zoom));
engine.RenderPage(hdc, rc, pd.sel.At(i).pageNo, zoom, pd.rotation, clipRegion, Target_Print, abortCookie ? &abortCookie->cookie : NULL);
if (abortCookie)
abortCookie->Clear();
}
else {
RenderedBitmap *bmp = NULL;
short shrink = 1;
do {
bmp = engine.RenderBitmap(pd.sel.At(i).pageNo, zoom / shrink, pd.rotation, clipRegion, Target_Print, abortCookie ? &abortCookie->cookie : NULL);
if (abortCookie)
abortCookie->Clear();
if (!bmp || !bmp->GetBitmap()) {
shrink *= 2;
delete bmp;
bmp = NULL;
}
} while (!bmp && shrink < 32 && !(progressUI && progressUI->WasCanceled()));
if (bmp) {
RectI rc((int)(paperSize.dx - bSize.dx * zoom) / 2 + offset.x,
(int)(paperSize.dy - bSize.dy * zoom) / 2 + offset.y,
bmp->Size().dx * shrink, bmp->Size().dy * shrink);
bmp->StretchDIBits(hdc, rc);
delete bmp;
}
}
}
if (EndPage(hdc) <= 0 || progressUI && progressUI->WasCanceled()) {
AbortDoc(hdc);
return false;
}
current++;
}
EndDoc(hdc);
return false;
}
示例14: DrawStartPage
void DrawStartPage(WindowInfo& win, HDC hdc, FileHistory& fileHistory, COLORREF textColor, COLORREF backgroundColor)
{
HPEN penBorder = CreatePen(PS_SOLID, DOCLIST_SEPARATOR_DY, WIN_COL_BLACK);
HPEN penThumbBorder = CreatePen(PS_SOLID, DOCLIST_THUMBNAIL_BORDER_W, WIN_COL_BLACK);
HPEN penLinkLine = CreatePen(PS_SOLID, 1, COL_BLUE_LINK);
ScopedFont fontSumatraTxt(GetSimpleFont(hdc, L"MS Shell Dlg", 24));
ScopedFont fontLeftTxt(GetSimpleFont(hdc, L"MS Shell Dlg", 14));
HGDIOBJ origFont = SelectObject(hdc, fontSumatraTxt); /* Just to remember the orig font */
ClientRect rc(win.hwndCanvas);
RECT rTmp = rc.ToRECT();
ScopedGdiObj<HBRUSH> brushLogoBg(CreateSolidBrush(GetLogoBgColor()));
FillRect(hdc, &rTmp, brushLogoBg);
SelectObject(hdc, brushLogoBg);
SelectObject(hdc, penBorder);
bool isRtl = IsUIRightToLeft();
/* render title */
RectI titleBox = RectI(PointI(0, 0), CalcSumatraVersionSize(hdc));
titleBox.x = rc.dx - titleBox.dx - 3;
DrawSumatraVersion(hdc, titleBox);
PaintLine(hdc, RectI(0, titleBox.dy, rc.dx, 0));
/* render recent files list */
SelectObject(hdc, penThumbBorder);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, WIN_COL_BLACK);
rc.y += titleBox.dy;
rc.dy -= titleBox.dy;
rTmp = rc.ToRECT();
ScopedGdiObj<HBRUSH> brushAboutBg(CreateSolidBrush(GetAboutBgColor()));
FillRect(hdc, &rTmp, brushAboutBg);
rc.dy -= DOCLIST_BOTTOM_BOX_DY;
Vec<DisplayState *> list;
fileHistory.GetFrequencyOrder(list);
int width = limitValue((rc.dx - DOCLIST_MARGIN_LEFT - DOCLIST_MARGIN_RIGHT + DOCLIST_MARGIN_BETWEEN_X) / (THUMBNAIL_DX + DOCLIST_MARGIN_BETWEEN_X), 1, DOCLIST_MAX_THUMBNAILS_X);
int height = min((rc.dy - DOCLIST_MARGIN_TOP - DOCLIST_MARGIN_BOTTOM + DOCLIST_MARGIN_BETWEEN_Y) / (THUMBNAIL_DY + DOCLIST_MARGIN_BETWEEN_Y), FILE_HISTORY_MAX_FREQUENT / width);
PointI offset(rc.x + DOCLIST_MARGIN_LEFT + (rc.dx - width * THUMBNAIL_DX - (width - 1) * DOCLIST_MARGIN_BETWEEN_X - DOCLIST_MARGIN_LEFT - DOCLIST_MARGIN_RIGHT) / 2, rc.y + DOCLIST_MARGIN_TOP);
if (offset.x < ABOUT_INNER_PADDING)
offset.x = ABOUT_INNER_PADDING;
else if (list.Count() == 0)
offset.x = DOCLIST_MARGIN_LEFT;
SelectObject(hdc, fontSumatraTxt);
SIZE txtSize;
const WCHAR *txt = _TR("Frequently Read");
GetTextExtentPoint32(hdc, txt, (int)str::Len(txt), &txtSize);
RectI headerRect(offset.x, rc.y + (DOCLIST_MARGIN_TOP - txtSize.cy) / 2, txtSize.cx, txtSize.cy);
if (isRtl)
headerRect.x = rc.dx - offset.x - headerRect.dx;
rTmp = headerRect.ToRECT();
DrawText(hdc, txt, -1, &rTmp, (isRtl ? DT_RTLREADING : DT_LEFT) | DT_NOPREFIX);
SelectObject(hdc, fontLeftTxt);
SelectObject(hdc, GetStockBrush(NULL_BRUSH));
win.staticLinks.Reset();
for (int h = 0; h < height; h++) {
for (int w = 0; w < width; w++) {
if (h * width + w >= (int)list.Count()) {
// display the "Open a document" link right below the last row
height = w > 0 ? h + 1 : h;
break;
}
DisplayState *state = list.At(h * width + w);
RectI page(offset.x + w * (int)(THUMBNAIL_DX + DOCLIST_MARGIN_BETWEEN_X * win.uiDPIFactor),
offset.y + h * (int)(THUMBNAIL_DY + DOCLIST_MARGIN_BETWEEN_Y * win.uiDPIFactor),
THUMBNAIL_DX, THUMBNAIL_DY);
if (isRtl)
page.x = rc.dx - page.x - page.dx;
bool loadOk = true;
if (!state->thumbnail)
loadOk = LoadThumbnail(*state);
if (loadOk && state->thumbnail) {
SizeI thumbSize = state->thumbnail->Size();
if (thumbSize.dx != THUMBNAIL_DX || thumbSize.dy != THUMBNAIL_DY) {
page.dy = thumbSize.dy * THUMBNAIL_DX / thumbSize.dx;
page.y += THUMBNAIL_DY - page.dy;
}
HRGN clip = CreateRoundRectRgn(page.x, page.y, page.x + page.dx, page.y + page.dy, 10, 10);
SelectClipRgn(hdc, clip);
RenderedBitmap *clone = state->thumbnail->Clone();
UpdateBitmapColors(clone->GetBitmap(), textColor, backgroundColor);
clone->StretchDIBits(hdc, page);
SelectClipRgn(hdc, NULL);
DeleteObject(clip);
delete clone;
}
RoundRect(hdc, page.x, page.y, page.x + page.dx, page.y + page.dy, 10, 10);
int iconSpace = (int)(20 * win.uiDPIFactor);
RectI rect(page.x + iconSpace, page.y + page.dy + 3, page.dx - iconSpace, iconSpace);
//.........这里部分代码省略.........
示例15: PrintToDevice
static bool PrintToDevice(const PrintData &pd, ProgressUpdateUI *progressUI = nullptr,
AbortCookieManager *abortCookie = nullptr) {
AssertCrash(pd.engine);
if (!pd.engine)
return false;
AssertCrash(pd.printerName);
if (!pd.printerName)
return false;
BaseEngine &engine = *pd.engine;
ScopedMem<WCHAR> fileName;
DOCINFO di = { 0 };
di.cbSize = sizeof(DOCINFO);
if (gPluginMode) {
fileName.Set(url::GetFileName(gPluginURL));
// fall back to a generic "filename" instead of the more confusing temporary filename
di.lpszDocName = fileName ? fileName : L"filename";
} else
di.lpszDocName = engine.FileName();
int current = 1, total = 0;
if (pd.sel.Count() == 0) {
for (size_t i = 0; i < pd.ranges.Count(); i++) {
if (pd.ranges.At(i).nToPage < pd.ranges.At(i).nFromPage)
total += pd.ranges.At(i).nFromPage - pd.ranges.At(i).nToPage + 1;
else
total += pd.ranges.At(i).nToPage - pd.ranges.At(i).nFromPage + 1;
}
} else {
for (int pageNo = 1; pageNo <= engine.PageCount(); pageNo++) {
if (!BoundSelectionOnPage(pd.sel, pageNo).IsEmpty())
total++;
}
}
AssertCrash(total > 0);
if (0 == total)
return false;
if (progressUI)
progressUI->UpdateProgress(current, total);
// cf. http://blogs.msdn.com/b/oldnewthing/archive/2012/11/09/10367057.aspx
ScopeHDC hdc(CreateDC(nullptr, pd.printerName, nullptr, pd.devMode));
if (!hdc)
return false;
if (StartDoc(hdc, &di) <= 0)
return false;
// MM_TEXT: Each logical unit is mapped to one device pixel.
// Positive x is to the right; positive y is down.
SetMapMode(hdc, MM_TEXT);
const SizeI paperSize(GetDeviceCaps(hdc, PHYSICALWIDTH), GetDeviceCaps(hdc, PHYSICALHEIGHT));
const RectI printable(GetDeviceCaps(hdc, PHYSICALOFFSETX), GetDeviceCaps(hdc, PHYSICALOFFSETY),
GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES));
const float dpiFactor = std::min(GetDeviceCaps(hdc, LOGPIXELSX) / engine.GetFileDPI(),
GetDeviceCaps(hdc, LOGPIXELSY) / engine.GetFileDPI());
bool bPrintPortrait = paperSize.dx < paperSize.dy;
if (pd.devMode && (pd.devMode.Get()->dmFields & DM_ORIENTATION))
bPrintPortrait = DMORIENT_PORTRAIT == pd.devMode.Get()->dmOrientation;
if (pd.sel.Count() > 0) {
for (int pageNo = 1; pageNo <= engine.PageCount(); pageNo++) {
RectD bounds = BoundSelectionOnPage(pd.sel, pageNo);
if (bounds.IsEmpty())
continue;
if (progressUI)
progressUI->UpdateProgress(current, total);
StartPage(hdc);
geomutil::SizeT<float> bSize = bounds.Size().Convert<float>();
float zoom = std::min((float)printable.dx / bSize.dx, (float)printable.dy / bSize.dy);
// use the correct zoom values, if the page fits otherwise
// and the user didn't ask for anything else (default setting)
if (PrintScaleShrink == pd.advData.scale)
zoom = std::min(dpiFactor, zoom);
else if (PrintScaleNone == pd.advData.scale)
zoom = dpiFactor;
for (size_t i = 0; i < pd.sel.Count(); i++) {
if (pd.sel.At(i).pageNo != pageNo)
continue;
RectD *clipRegion = &pd.sel.At(i).rect;
PointI offset((int)((clipRegion->x - bounds.x) * zoom),
(int)((clipRegion->y - bounds.y) * zoom));
if (pd.advData.scale != PrintScaleNone) {
// center the selection on the physical paper
offset.x += (int)(printable.dx - bSize.dx * zoom) / 2;
offset.y += (int)(printable.dy - bSize.dy * zoom) / 2;
}
bool ok = false;
short shrink = 1;
do {
RenderedBitmap *bmp = engine.RenderBitmap(
pd.sel.At(i).pageNo, zoom / shrink, pd.rotation, clipRegion, Target_Print,
//.........这里部分代码省略.........