A a da maioria da do e e das de da a a e e da da e páginas a do PDF da da é da a de rasterizada e de da a e da do a e em do poucos milissegundos e da da e do da você da e e a nunca a de e a de a da a da de de da pensa da a de da e de sobre a e a do a a isso e. de Então e um da da a e a a a e de do a do usuário e a de a abre a a da do a a de a um do e de e desenho do de a engenharia de e a a A1 da do a e de, e uma do página e a a de da repleta da de de da da de do dezenas da de e do e da da e do a de da e e a e milhares de da da e a de a do traços de e do vetoriais de da a, de ou de da a a um do e do a pôster e do a a a e a e da e do a a de da e lotado do da do a de grupos do de da e do de da da da a transparência da e máscaras de do e de da suaves a e da do, e a da de e a a a da de do a a a a de a da da única a chamada da a do e da a a da e que da de a e o de a da pinta a e da leva de a a dois da ou da três da a de do e da e a a segundos da a a. de Se do a da a e do e da a a e da essa do da a de a chamada e da e a rodar na a da a thread de a do a de a da da e UI da e, a da janela e da e do a para da de de a de repintar de da a do, a de a do a a da e a a a barra do de do título do de da da da do a fica a da de a a e e cinza a de da da a a e da de da a e o de do a sistema de a do e e da a operacional a a e da do e oferece do da a de de a a e a de a para de a e de da de do de eliminar a e a aplicação. de O a trabalho da da e da da é da da de a legítimo e a. A de da e da a página a da e do do a realmente da a e da a de a precisa e da a e do do de da do a a de a todo a da e de esse da a e a a de do e a de e tempo. do a O do a defeito a a do a a da e do a de é da a da a e da a a da do que a da e a do a renderização da é uma da e chamada e da de a bloqueadora indivisível de e do e da sem da do nenhuma a de maneira a de a e a subir de para do respirar e de a a da come do up e da for e air e do da e da e do sem nenhuma a da de a maneira e de a a parar a.
a Este de da a e do e da e artigo e da do é de da da de da exatamente do e de da a sobre do a um de a desses de a dois e de do da a a a a de do da a a a e problemas: o da de do cancelamento de do a a e a da de do a e uma a longa renderização de do da de da página a única de do sem e do a congelar e da do a do da UI a a do. da do e a O do a e da usuário da clicou a a a a e na da do próxima a do de da e página a, e a do a de ou da e deu zoom do, a e a a a de do ou da de e do da a da fechou do o da documento a da a e do da a, e a a e a renderização da de e do e e em do da da a do a e de do voo e do e da/in e da flight da da da de a é e do a da e a agora a um e de trabalho desperdiçado de que e a do de da deveria do a terminar da do a da na a a próxima a a de a oportunidade a de e da em a da de vez a de a a rodar da de a da até do e a de e a a e a conclusão. a Suavizar da e da a de e do a e da de a e da e do a rolagem de da a e o da a e de da a zoom e a do da do do a da através de da do a e da da a do de da a a do cache/caching a do de a da e a da do que e de já de a a a da de do a foi de da a rasterizado de a da da e a da a e de é do de da uma preocupação a e separada a do a a da e de com da da de e da o a da seu a a da próprio a e design de e, a da a coberta a do a da a a do da e no da da de a artigo e da de companheiro da a e a de do a a e de do do de linkado da e a e do da do no do da de e final do da da a de e a. a Aqui a do a a e da do do única da de de questão da é do da da a de a como do a e a da de e e do fazer e a a de a com do de e a a a a e que de da da e da uma renderização da de a da progressiva de a a da responda do de a de da a a a e do uma a da do requisição a a a a de e de do de da a cancelamento de e da de da rápida a e e da a do a de a da limpamente do.
A API de renderização progressiva que o PDFium já distribui
O e PDFium e da a do de a de antecipou a a da de e a metade a de do e da e do a da a de da do a congelamento da de e do da de problema. e do Ao da e de a da lado da da a da de e da e da de da e e a da e e chamada de da a a da e do única e a e/one-shot e a a do e do FPDF_RenderPageBitmap, da do ele de da e a de a expõe da e da do a uma do variante a a progressiva da de a que divide do e da uma de e página do do em da e pedaços/chunks do a da da da de a a e de a de do e de trabalho da. do a e da Você da da da chama da o da e FPDF_RenderPageBitmap_Start a de da de uma e a a do vez de a a para e configurar do a a a de a do de a da de a do a e de renderização do da a e contra da e da a um a bitmap da a da de do de de destino da da a e do, do e e a a então a de da e da do chama e do FPDF_RenderPage_Continue e do de da repetidamente. do e a Cada e da a Continue a do rasteriza do a da da e de a uma fatiada de limitada/bounded a e de a slice do e do a e retorna do um e a da a status de a e a e do. do FPDF_RENDER_TOBECONTINUED da do significa que há da e do do a da e e a mais a do a da da a a e a e de do de da da a fazer e da do, a FPDF_RENDER_DONE e a e a e significa e que da e a do a página e está a da e a e do terminada da, e da e do a e do a FPDF_RENDER_FAILED significa e que e a e da a e ela de a de a da parou da e da em da de a da um e erro de a da e do. a Quando a do e a e o e do de a a loop a e termina a da da e você chama de a a a a a FPDF_RenderPage_Close e para da de a a liberar de da e da o a da da do a e estado e da progressivo da e da de a a da por da página. a de a Porque a do o de controle da retorna ao da seu do a e e da código do do a e entre da da e de a da e da as e do a fatias de e, e você a da de pode e de da bombar/pump da do as da de mensagens da de, a do e atualizar um de da e a indicador e de a a de a progresso e do a, ou de da a verificar de da e se de a e do do o a trabalho e do ainda e da a da é e a do desejado do e da.
O da do mecanismo a do a de a da a que a e da o da PDFium e da fornece a da de a da para da decidir a quando da e da do a e ceder/yield da de da é da e a uma do a a e da e do a struct a da a e da a de a do callback a de do a chamada da do e a IFSDK_PAUSE. de a Você a a da a e a a a e a entrega/hand it do de da para do a e da o a Start e e da para da a da todo Continue. de a a Após do e a cada do pedaço a a da e do o do a PDFium e chama da o do e seu a e ponteiro de do da a da de a e da função a a do a NeedToPauseNow, da e e do a de da se e da isso retornar da de e do um do valor diferente da e de do e de da a de de de da a e a e da de do a zero do a de da do a a a a, do o da a da do do a da Continue a do atual do da a para da de do a cedo a e a a da devolve o do a da controle com a da de do a do a a FPDF_RENDER_TOBECONTINUED. A da a struct e também do da a e a da de da e carrega a da e a do a e de um do a a a do da e a de da da campo e da da version, do o qual de da da deve da e ser da e da de do de definido a a da a para a a a 1, a a de e de do a e da do um de do a da de da a e ponteiro e user a de de do a de da forma a de do de da do a livre/free-form a a que do e a e o a PDFium da a nunca a do toca de a e da e passa e adiante do e do e a e da intacto da a e. a Esse ponteiro do a e do a intacto da a do da a da e é da a de da da e toda de do da de da a de do e a dobradiça/hinge de da e do design da do a a que e da da se a a segue do da e.
Reaproveitando a pausa (pause) como cancelamento (cancel)
A do intenção do e original e da do do a a da de do de do do a a a NeedToPauseNow a da do e da é da do o e fatiamento da da de da da tempo a. de da e a da Retorne a do e da de um do a valor do de diferente da a de da a de de zero a a da quando da e seu a e de a do do a orçamento de de a de da e da a quadros/frame a de e do e da for e do da de e de da e gasto de a do da de a e da e de de do a e a da a e do da, e retorne de zero a do e de para manter a do e a a de a e a e de a a renderização a da, da e a do o e da e do a PDFium a do a do de da e da e da e pausará da e a de da a da a para da a e a a que e do a você e da a e a possa e fazer outra a coisa a da do a antes a a de da retomar e da a a a e a mesma do e da de a do a a a a de a renderização a a da. do O do a a a a Componente e da PDFium a de da da e da reutiliza da do de a da e esse da de do da e e da a da a a do da e mesmo a e a da e de sinal para do um do a da e e a do a de e verbo da da a do de diferente da e do. da Em e vez a da de de da e a de do a e do e responder " devo a do a de a eu pausar do a da a de e deixar você a do da da a do de a retomar, " a o de da callback e a de responde " e da do da a do e esse e da a trabalho do a da e foi e de da da e a cancelado. e da " a da Os do a de do da dois de do da e a a de a e e se e mapeiam a do um no e outro a de da limpamente e porque a do de do e a do do do que e o de da a loop da a de faz e da a quando ele da a de vê do e da a a da bandeira da e a/flag de da a a a a. Uma da do pausa genuína da da a a espera de e a um da a Continue a a a posterior e de a e; um a a cancelamento da a de não. do Uma da e da a vez e e que a do o do a a da de e da e loop de da a a do a chamador/calling e a da a e a a observa da a a que a o a de token a e do está da do da a da cancelado da da a a, a ele e da a fecha o de da de da a a do a de do e da contexto da de de da da renderização do a da e nunca de da e chama o e da a de a a da a Continue de a a novamente a, de e da então do da o a a a e a do e de mesmo de do a da retorno da diferente da e a de de zero de da da da a que o PDFium e da e da lê de a a como a do a " pare e de da este a da e da pedaço da de a a e de " do e da e a do da se de a a a torna do de a, de e e de do da e a na prática/in effect a e da a a e, " da pare de da de da para e sempre/for do de e e good a. do a "
O da da e cancelamento da a é de do da expresso a a e do do através de da uma e do da a interface a da, a IPdfCancellationToken, cuja de da a da da a do e da a e a propriedade e da a da a e da a da a a do da e a de IsCancelled da a e do do vira/flips e de e de a falso de da e da da a para da a verdadeiro e da de a da da e de a e a do e da da e da quando e do de a alguma a da a do e da outra a de a a parte de do o do a do da de programa a pede do a a da para a da a renderização a a parar e da do a e e da a da de. a da A da da a do ponte da a e do e entre a do da a de a da essa da do de da a a interface a do e a Pascal e a o de da callback do a C de a do a do da PDFium a a da é a da um a da do e da de a único a de da a da e a de e ponteiro da do. a A referência de e a da a a interface a da do da do do token e da da e da de a é e de do escrita a do e a a a a e da de da a de de a para da dentro e de do de e IFSDK_PAUSE.user, e e do um a da e e do de e a de callback do e de a estático de a de a cdecl a e de do o e da da a de de de a da do lê de e e a a a a de do e de a da volta e da da e do e o de de a de do a a a de a e a da a a consulta/queries e do. Este a a é e o a e e e da da a problema da e e e a a a e a a da e do clássico do a de a a da e de e a da deixar de uma do biblioteca C de chamar a de a de a a volta da do da de e do para a a e do de o Pascal a a a de e do: o a da callback tem da a a e e de da da de que de do e a ser de do a uma e de função da a a simples/plain a a com a da a de do convenção a de chamada C e da, da e de da a de não um a a e e de e a a a método da de a a, a porque a e do do o a a a da de do PDFium armazena da a a de e invoca do a um de a a da do e a de da a da da de da de e a ponteiro de a da função a de de da a nu/bare que a e da não a da sabe a nada a a da sobre os objetos do de e da a da de e a de do a Pascal e da a e da de a a ou o a a e Self.
type
TPdfProgressivePause = record
Pause: IFSDK_PAUSE; // PDFium reads this; .user holds the token
Token: IPdfCancellationToken; // strong ref keeps the token alive
end;
function ProgressivePauseCallback(pThis: PIFSDK_PAUSE): FPDF_BOOL; cdecl;
var
Token: IPdfCancellationToken;
begin
Result := 0;
if (pThis = nil) or (pThis^.user = nil) then
Exit;
Token := IPdfCancellationToken(pThis^.user);
if Token.IsCancelled then
Result := 1; // non-zero: PDFium stops this chunk
end;
O da callback recupera o a a de token de da e da a fazendo da o do a de casting da a a de a a de do pThis^.user a da do e da de de volta a a do a para do o e da do e a de e tipo da e a da a e da e da a de interface e da de a a e de da do e do e a lê de e da e o de da IsCancelled. de a a Nada do de da e nele do do a da aloca de do e a, bloqueia/locks, a do a a ou bloqueia/blocks, a de e e o a da de do que e de do a e da importa e a porque o de a PDFium da do a o chama a da a da na da thread e da de a e de da da e a do a de renderização do da de após da a da e cada e e de da pedaço e e de da a de e do qualquer trabalho da da e do da feito de a da a e e de do aqui a a de é a de adicionado a da a e da a ao custo a de da do a da da da da a a a a própria da da a a da e do da renderização a de. da e A e do guarda da da a do de da e da a a contra da a a e e da uma a do e de da struct a a nil ou da e a e um da de campo a a de user a e da de da da de do a a a nil da e de da do significa e que e a da a da mesma da e da função da é a da de a do e segura para do se de da e da de a a da da a instalar do a até de mesmo a da a da a e em a do da de da uma do da e de do a renderização a da a que de nunca do e a de a a da da de recebeu um a a e a a de token da da a real do a e de.
Mantendo o token vivo durante o loop
da Fazer o a a casting do e do a de de a a do da um e a da a ponteiro do a e de e da interface da através a de a a a a de a do um a do e a e a Pointer e bruto/raw de da a e e de e a a do de de a de de a de de e a de a volta a da do a da é da a do onde a da a a da e do os bugs a do a de de e de da da a tempo a de vida a a e e de de a a nascem a da. de do e e Uma a e a da IInterface da do no do do Delphi a do é a da e a contada da por de referência a de do, a e a do contagem a do a e só a da se de move a da da do a a a a de do quando e o da de e a a da compilador a de da a pode de a ver do e a a a a do de uma e da variável do da e a a de da do da e a e do a da de a tipo da e a da interface e sendo da e a do da e do a a de da de atribuída e do a do a da. da do Armazenar o token a e da de a da a de do do e apenas a a de da como do um da e da ponteiro a da do a a a nu/bare a a e de do de do de da da a e dentro a da e do a da de do de do da de do de e da IFSDK_PAUSE.user a da a o do e e a da do a a esconderia do a a do do a contador do da a a da de de da a a de do e de da referência a da e do e da a da completamente e a a da e e a. do a Se a de do e única a do outra e da a da a referência a da da da do da a do para da de o de e a da a a da esse a da e a do a a e de e e a a token a e a saísse e a a a de de e de do de da e de da e do de do a e e da da e a escopo da do enquanto e o da do do a da e loop e da de Continue ainda da e do da a do e do da a e a a estivesse e da a de do rodando a do da, do a e da a do a e da e do o de do a a de do objeto seria da e da a de a a de de e a liberado/freed do da por do baixo a da e do e e do a do callback, da a a e o de próximo pedaço de de da a da de da de desreferenciaria a da da um e do a ponteiro pendente/dangling da a e do e do a e.
That is why the descriptor is a record holding two things, not one. The `Pause` field is the struct PDFium reads. The `Token` field is a real interface-typed reference that the compiler counts, and it exists for no other reason than to pin the token in memory for as long as the record lives. The record is a local variable on the stack of the render routine, so it stays valid for the entire duration of the loop and is torn down only when the routine exits. The bare pointer in `user` and the counted reference in `Token` name the same object; one is what PDFium can read, the other is what keeps that object from being collected
Translation: de É a a do por da da e da isso da a do que a o a de descritor é um de do a da da da registro do a de que e e do e do do a de e da da guarda da de a duas da a da coisas a e da e, não a uma do da do e a. O do a da e da campo a Pause da é da da e da a do struct que e a de o de da PDFium da lê da. O da de e campo a Token do é uma a a da referência do do e do e a a de e do da do tipo do da a da interface a a real e da a a da a que o de do da a e compilador do da a da conta da e de do e e a da, do da e e ele e do e da da e da existe do e da e do da de a por e da da e a nenhuma a da a e outra a do de e da de da razão a a do do a de a a não da e a de a de a ser a e de da a a de da da a de a e de da para e do do de e a afixar/pin e a de o do a a do a a a token a na a e e de da a memória da da de e da por e da de a do a a da da de a tanto de e a a do de da tempo da e do e e quanto do de a o da registro de a do a do de viver/lives a. e a O de a e do registro é a do uma a de a variável da da da da a e local a e do da do a a na e de pilha/stack a e da do da da e da e do de da a da da e a da e da a da e rotina do a de renderização, do da do e da e da e do da a então ele do de permanece da do a válido a do de da a a da de do para da a e a a toda e do a do a e a da de da do a duração e da a da a do de da do a da do e da do loop a e é de de a de da e e do de e a do desmontado/torn do de a down da e e apenas a a quando e da a do e da e da do da de a do da rotina do do e a a a sai/exits da a e. a O do a e a ponteiro e da nu a da a de da em a de do e user e a e da e a de a e da e a a de referência da e da de a a e de contada a da e a da e em da a a Token a de da nomeiam a do a de e a o e de do e da mesmo a a e objeto; de a da um da de da a da e da de da da da a a é do o e de que e de a do da o da e PDFium da a do da pode a da ler a do, a o da e outro a da e de é e da do o da do do a que e da da a do e da da de da a de do a do mantém da do da esse de e da do a e a a a de do da de objeto a da de de da ser da coletado de da.
var
Pause: TPdfProgressivePause;
EffectiveToken: IPdfCancellationToken;
begin
// ... choose EffectiveToken ...
// Strong ref first, then publish the same object to PDFium via .user.
Pause.Token := EffectiveToken;
Pause.Pause.version := 1;
Pause.Pause.NeedToPauseNow := ProgressivePauseCallback;
Pause.Pause.user := Pointer(EffectiveToken);
Fechando o contexto de renderização não importa como o loop termine
a da da Toda e a a chamada do de do para a e da do a a a a FPDF_RenderPageBitmap_Start da do de e a aloca e a um da a e estado e a do a de do da progressivo de a e da que e o da a de do PDFium da a associa e de a a da da do da da a a e da com e do da a e da a da página a da, de a a e de e a a do de da esse do a do a a a a a a a a da de do estado é de da da e da liberado e do a e da apenas da do a por a de da da FPDF_RenderPage_Close. e Há a a da do e da três da maneiras do de a a e do a da e sair e de do do a de e a do a a a da a e do da loop da de e a de de do da acionamento/drive da e da e do a. do a A a e da e a página e termina de a da e a e da da e do de o e último de a status a e da do é da e FPDF_RENDER_DONE. O token de da do e da e a a de da a tropeça/trips e de da a da a de do e da a da a e da da o da e loop de a sai da a do de do da a da e e a cedo de a a da a de relatando do a a o a a do a de do da e e da a da e a da cancelamento da e do a. a da de do e a a de e a da Algo a e a e de a da falha e da a da e e a o do da a do de a e da status a de a do a de a a a é FPDF_RENDER_FAILED. Todas a de as a três do e a da e da devem a a do de a e chamar da de a a a o a a da e do do Close, e da a e a do o e caminho da a de do de e a do e cancelamento da é do a a e o da a mais a do fácil da de de e do do e da da e de a se da fazer e a do de a errado e a, do porque e do a da a e do a a da forma natural de a de a da de do de e da de da a e " a de do a ver da a cancelamento do a, a do de de a quebrar/break out " a do tende a da da de e da e da de a a e a de e a de do de a pular/skip do da a do a e a da a de do a de a a limpeza do da e de da da a da e do da a e de a de no do a de do da a a da e seu do e caminho da e de do e para de do a a e do saída da do de e a. da Deixar o a do a da Close do inalcançado/unreached da da vaza do a o a e a da e da estado por-página da do, e e um do da a de visualizador de que do de deixa o da a do a da a a usuário do da a da do de cancelar e a a a e a de da renderização do da após e e e da da e a a renderização e da de do de da da acumularia a a a a esse do de da da vazamento e a da a do e em de do da da de da toda e a e página a abortada da e.
do A a a e da a a e da forma da a a da de robusta da e e a da coloca do a da o a a do a loop e do a e a a a a classificação de do do da e a da a a e resultado da da e dentro e da de um de do try da e do o da a do de da e do do FPDF_RenderPage_Close da e no da a da a correspondente e finally. O do bitmap da de da do a destino do da a do de a é da do a a de destruído a do de no e e da a da e da mesmo e da do da a da a e do e bloco do. a e O de a da da e cancelamento da a a da da pode e a deixar e da o da do a loop e de do da e a a através a do da a da e de do de da e da de do um de a a saída de da a e a a a da de e da e a a e do antecipada Exit a de e e a o da a do finally da e do a da e ainda do e da a roda da, então e a da de e há de do da a e exatamente a da de e um e a a e a e a do de e da a da lugar da a do da da a a que de da e da de da libera do do de e a o da a estado da e progressivo a e ele da da do não do a da a da e e do de pode e a ser da a do a de a da a da ignorado/bypassed.
Status := FPDF_RenderPageBitmap_Start(PdfBmp, FPage, Left, Top,
Width, Height, Ord(Rotation), EncodeRenderOptions(Options), Pause.Pause);
try
while Status = FPDF_RENDER_TOBECONTINUED do
begin
if EffectiveToken.IsCancelled then
begin
Result := prsCancelled;
Exit;
end;
Status := FPDF_RenderPage_Continue(FPage, Pause.Pause);
end;
if EffectiveToken.IsCancelled then
Result := prsCancelled
else if Status = FPDF_RENDER_DONE then
Result := prsDone
else
Result := prsFailed;
finally
// Frees the progressive state Start allocated; mandatory on every path.
FPDF_RenderPage_Close(FPage);
FPDFBitmap_Destroy(PdfBmp);
end;
O da do da a e a loop a do da de verifica a e o de a da token a a a antes da a de e do de da a a a a da a cada Continue bem da a do da como do confiando de no de da a a a de do e da e callback e da a da do de a dentro do e de da dele. O a callback e do da da a e encurta do o a a de a a da pedaço/chunk e do a da e a atual a de do a e do a de da e e do a do a; do a a de da de do e a verificação do de a do da do e a da loop do da para de do a de o a próximo de e de começar a de. da e Juntos do da eles e da da a do limitam/bound e de do o de a a a e tempo a da a que de do um da da a e a do da e a cancelamento do a do a de da e da a leva de para a de da a do e da de a fazer efeito para a e da de a da a e e da da do aproximadamente do da de a da a de do de e a duração da do a de e de do e um de do e a pedaço do da.
Três resultados, e o que o bitmap guarda após um cancelamento
a O da a da a da ponto e da da de de entrada da e a da a público a é e TPdf.RenderPageProgressive, a e da ele de a e a retorna do um e a TPdfProgressiveStatus a a da a de do que e do e do a da e da é da a de um e do da da de do prsDone, a prsCancelled, da e do da a da da a do e de a ou prsFailed. Os e da valores da a da e do da e a e espelham e a e a do do de e as da constantes do a a e a FPDF_RENDER_* do e do e do PDFium a no da do e idioma da a a de de do de do e Pascal da da e, mas da do e dobram/fold o do da a da a e a de e caso e da da da de e de do da de cancelamento da e do a para da a a do a dentro e como do da de e a um da a e da da a a e e da resultado da e de da de da da da primeira classe a da em da da do vez de a de a de a do um a a de e erro do do da.
a da O e a da a a de e a ponto a e e de e que do da a do da a e a da a e e pega da de/catches da as pessoas do da e de é do e o de e do da e a da da e de a que e de da a o da a bitmap da de de e do da destino de a do a a a contém da e da do após a do a do a da o da a do prsCancelled. a Ele de a do de e a de a e da da da da não do e da está a de da da e a a da em e a a do e de branco e da. a O a da e PDFium da de da a do e renderiza a a a de do progressivamente da de do da e da do a e do a para da dentro de da e de da do a do e a a mesmo da e a bitmap a do pedaço do da de após da a pedaço a do, da do da da e do então quando e da um e a a e cancelamento do a do de a a para da a a da a e o do loop da da a, a o e do a a e bitmap a e da da a e guarda e do de da a o de a da e de do que e de da a quer do a e do e da da e da da de da que a a da e a e tenha a sido do da a e e pintado a de a até e do da aquele a a do momento do a, o que e é a da uma de e a a do imagem a a a de da da a do e parcial e: de do a e da da e algumas de do a de da e a da a a da e a a do de da e a da a de bandas da a e e a e do do e concluídas a, a do de a da a do da do o de da da a resto a e do da ainda a a mostrando a e a a de a do de do a do e a da a a e do e do de cor e do e do a da de do a da do e da a da e preenchimento do a a. Se a de e da da da esse de e a da e da de a resultado e parcial de a a da da da do da é a do da do a útil do a do, depende da do do de a chamador da da. Um visualizador que a está e de do de e do a e da da a e e prestes a de do a e a jogar o e do do a da bitmap e a fora da do porque a a a do a de a da e da a da e do o e usuário da a de do a do a a e e da da a navegou a do a de a a a para da e e a da da outro a a a a lugar a da pode da a a do simplesmente do ignorá-lo a da de. da Um de do e da da a do a e da visualizador a da de do a que quer do a do a de e mostrar uma de a de da a pré-visualização e do a a e de e a a baixo do e a a de e do a de custo de a a a pode da do da e de mantê-lo a. e O do que da do de você da da da da da a não do a e a da a e de a a deve e e e do da fazer da a a da do a é do e a de e a assumir e a da de e da e da e da do da de do a a da e que e do a da prsCancelled implica a da do e a um da do de a e da a bitmap a da e de do e da a vazio de ou indefinido do a e do da; a ele a a a de e da implica um a da do de instantâneo/snapshot verdadeiro a de de a de a de da de uma a a a a renderização a a inacabada e do da do de.
var
Bmp: TBitmap;
Token: IPdfCancellationToken;
Status: TPdfProgressiveStatus;
begin
Bmp := TBitmap.Create;
try
// Token starts un-cancelled; flip Token.IsCancelled from elsewhere
// (a UI action, a navigation event) to abort the render in flight.
Status := Pdf.RenderPageProgressive(Bmp, 0, 0, PageW, PageH, Token);
case Status of
prsDone: Image1.Picture.Assign(Bmp); // fully rendered
prsCancelled: ; // partial bitmap, usually discarded
prsFailed: ShowMessage('Render failed');
end;
finally
Bmp.Free;
end;
end;
O token nil e um caminho de callback livre de ramificações (branch-free)
e a O cancelamento da de a e é a opt-in a. a Um a a da do a a a chamador da que da de e do da apenas do e a quer de a a a da de a a renderização de da a a do da e progressiva e de a a a a da do e da pelo de e da a de benefício a do de de da de de e a e de a do bombar e do mensagens/message-pumping de a, do e da de do a com a da nenhuma e da intenção a de abortar, do e da da deveria do e a a ser de capaz da a de e da da e do a e a de a e da do a e de a passar a nil a de a a da da e do para o do token da da e a. da da a a A a maneira do e de ingênua/naive e de da de e de e a de do a a de da suportar do a isso da de e da da e a da é da a do de a a espalhar a a da verificações da de de a de de e de do e e de e e a a " se a um da a a a a de a token a de a foi de do a de do da fornecido da de do de " e da da do a a a através da e do a do da do do a do a de do callback e a da do a a e do o da de loop a da, o que a e significa do do e da a um da e a e a e da da e da ramo/branch de do em da cada a da a e pedaço a do a e um do da e a da a e do e a a de da da a callback de a que e a da tem e da e de do e que de da a lidar de a com a a da e ambos a da e do um a e a a de token da real da da a da e e a a do do sua da de a a a de ausência da a.
A do da e a a a e de implementação do de a a de evita da isso e a da e a substituindo do da a a um singleton e a do a quando de do o e da do de chamador passa do a e nada da da. e Um do a da a de e do e da da e token do e nil a e é a trocado e do do e do a da da da a por e a da e do PdfNoCancellationToken, e a de da uma e da interface da a cuja e da da a a de da a a a a da propriedade e da de do da a da e de de a IsCancelled a da de a a e de do é do da da da sempre da a a falsa a a da do. da da Daquele a e da a a do a ponto a do a do e de em da e a de diante e a, da o do a de a do a do e da e da da callback a e da do e do a o e de da a da a a do de do da loop da a da têm um da e da a de a e de do e a e token e a a do do para de a do a de e a consultar a da a e da da a de de da da de em e a de a da cada de a da a e caso e a, da a do de do de da e a então da e da nenhum do do e a a de do precisa a de e a de de e de do da a uma da a verificação a e a a nil e a a a da de do do a da e a do da nenhum de do e da da a precisa de da de de e um caminho e de a e a e especial da a. do a e da O e do a a e a e e do da a token da do da do nunca-cancela/never-cancel do da a e e da e a da simplesmente e a da sempre a da do e da da e e da a da e responde falso a, de da da o da e a callback a da sempre de da retorna de a do da a zero a a a a, da e a a a a renderização da a do da a de a a roda do a de do e da da da da até do e a a a a a do a e de do e conclusão a a a exatamente de a a a como da do do e da uma de e da da e de do e não-cancelável a a do a da do de e da rodaria do. do da O a e da e de do da comportamento e de da do opcional do da de a da da e e é da modelado e como a um do a da de de da a a token da que de e do da nunca do a do a da e de a da dispara da da a a e de da de do e em da a a de da vez a e a da da de a do da como a da a a de e da da e de a do e da a ausência da da a e de e a da e um a da a de do e a do token a da de da e e do de e da a da, e o a da da e de a que a da da mantém da o a de da a da da de do e a a de do a a da e da da de caminho do e da quente/hot do uniforme a.
// nil -> never-cancel singleton, so the callback path is identical
// whether or not the caller opted into cancellation.
if AToken <> nil then
EffectiveToken := AToken
else
EffectiveToken := PdfNoCancellationToken;
do A forma a da a e da a que do e emerge e a a da e é a a a do da e do do a da de pequena e de e da a da a a a a de do e vale da da e da a de a pena de ser da e da a reafirmada do a de e, porque da da a do da a de do ela a e e é da a a da e a a parte da a e de do da e reutilizável a da do. e Uma da a a e biblioteca de e a a C e de da da do que a a da a e suporta e a de da um do e do da do a callback de da a lhe a dá a a exatamente a da de do um do a canal a e da a para da da a do a de e e de passar e de do a e do o de do e a e de e a a estado e de do a a da para do da dentro da de do da desse a a da e e da da do callback e a a, da e a da o da do a ponteiro de e da da a da do e da a da e e do a do a a de da de da a user da a a e da a e a a da da de opaco. de da Coloque de e do a uma do a a referência da da do da e e de a do e a a interface e da da Pascal a a da a de a e a e da a e contada/counted de a da e do a e de atrás da a de de a desse da e do da e a a ponteiro da de do, a do a e da da e mantenha a e de a uma e do segunda da da do da referência a do e da e do a a a real e a do a de da viva da de e ao da da de lado a e da a da a a struct da para e que e a da e o da do e objeto e a a e não do a da e a de do a possa e de ser da da do e da coletado de da da a de a a da da e de do a a do e do de de e a e da da no do meio-da-chamada/mid-call, a da a da a a a a de da a e do e a da de da e da e leia a da da interface da da de de a volta da a a e do e a a da do e do a e para da de de e a fora do e da da e dentro e a de da e de uma a e a e do da função da da a e a a estática da a e a de a a e e da cdecl. da do Envolva do a de o do a da e e loop e do a de da e de da do a a e e de do a acionamento e a a a a todo da a da a da de em do da de da um do a a da a e do e a a a e e try de e a e da a de a a da libere a a e do do de do e e e e e da e a o da e contexto e da da a e a a nativo a a de da a no do e a do de finally. a da a da a O mesmo da a do de a a e modelo/template da a e se transfere e para do qualquer operação da e da de a PDFium a e progressiva do a ou e de a a movida e a do a callback a de do a do e de e a a da a do onde de do a a e o do código do Pascal a da do a a a da de do tem e da que de a a e da do da e do da e a e do ficar e a da da no e a do da a da a do de controle do de da a a a a do e tempo da de e do da e a e da a de do e de vida do enquanto a e o C e do do a guarda a da e um do da a ponteiro da.
da da da O de a e a cancelamento a é e do da apenas de uma metade de da a de de do e um de a do a de da visualizador do da do da da a a a responsivo. a e a A a de e outra a de a a metade do a e da a é a do não da do a de de a de re-renderizar de do da a a da da a do e páginas da e do do que a da da você já e da e desenhou da e, do de a a de da da a e de a do manter de o a zoom da do a a a e da do a a e do rolagem e suaves de da do da da servindo da a e a do e a bitmaps a do da da a a a e do em e da da a cache/cached a a a do, do a o do da da a que da é a da de coberto de em e nosso da artigo do sobre a da o da e e a do a a e a a da cache de de a a renderização a e e a e desempenho a a do de do e zoom a e a e da a a do da e. do Para de do a a saber a a de da como de a do do da e a a de da a do a e a da a da a de renderização da cancelável a do de a se do e da da e a e da encaixa da e do em e a a e um da da a visualizador de a da a da a completo a do a ao de do da lado da do e da a navegação de, do do e seleção da e do e a e, da e e de da a pesquisa a da da, e e da a do veja da a do a da a de e do de construindo um de da a visualizador de da a e PDF e a do a e da de a da rico a e do de a e da em da e do recursos da a a e e de do com a o a e componente e a do PDFium da VCL do a a do. a A da da renderização a do e a a progressiva do e e a a descrita do a aqui do e da é do da a da distribuída de como a da a a parte do Componente de a do PDFium a da do a a a a para da o a e da a e da da e da Delphi da a e do e a e Lazarus ao lado do a da de das a da e e a da e do do a APIs de a e de da de da a de de a carregamento de do, da do de e a renderização a a da e do formulário e e da cobertas da a do a de a em a a a do da do outros da do a e da de lugares da do a neste do a blog e a de a do a.