From 48a24b1b20620a08afcb58c1f3d6666bd97ddbee Mon Sep 17 00:00:00 2001 From: wwyang <137208408@qq.com> Date: Fri, 15 Nov 2024 18:32:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E5=8D=A1=E9=A1=BF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wwyang <137208408@qq.com> --- .../lib/src/viewer/pinch/pdf_view_pinch.dart | 52 +++--- .../src/main/ets/io/scer/pdfx/Messages.ets | 150 +++++++++--------- .../src/main/ets/io/scer/pdfx/OhosPdfView.ets | 20 ++- .../src/main/ets/io/scer/pdfx/PdfxView.ets | 42 +---- 4 files changed, 115 insertions(+), 149 deletions(-) diff --git a/packages/pdfx/lib/src/viewer/pinch/pdf_view_pinch.dart b/packages/pdfx/lib/src/viewer/pinch/pdf_view_pinch.dart index e63c596..f094735 100644 --- a/packages/pdfx/lib/src/viewer/pinch/pdf_view_pinch.dart +++ b/packages/pdfx/lib/src/viewer/pinch/pdf_view_pinch.dart @@ -377,7 +377,7 @@ class _PdfViewPinchState extends State return; } - const fullPurgeDistThreshold = 33; + const fullPurgeDistThreshold = 10; const partialRemovalDistThreshold = 8; final dpr = MediaQuery.of(context).devicePixelRatio; @@ -412,31 +412,31 @@ class _PdfViewPinchState extends State page.realSizeOverlayRect = null; } else { // render real-size overlay - final offset = part.topLeft - pageRectZoomed.topLeft; - page - ..realSizeOverlayRect = Rect.fromLTWH( - offset.dx / r, - offset.dy / r, - part.width / r, - part.height / r, - ) - ..realSize ??= await page.pdfPage.createTexture(); - final w = (part.width * dpr).toInt(); - final h = (part.height * dpr).toInt(); - await page.realSize!.updateRect( - documentId: _controller._document!.id, - width: w, - height: h, - sourceX: (offset.dx * dpr).toInt(), - sourceY: (offset.dy * dpr).toInt(), - textureWidth: w, - textureHeight: h, - fullWidth: fw, - fullHeight: fh, - allowAntiAliasing: true, - backgroundColor: '#ffffff', - ); - page._updateRealSizeOverlay(); + // final offset = part.topLeft - pageRectZoomed.topLeft; + // page + // ..realSizeOverlayRect = Rect.fromLTWH( + // offset.dx / r, + // offset.dy / r, + // part.width / r, + // part.height / r, + // ) + // ..realSize ??= await page.pdfPage.createTexture(); + // final w = (part.width * dpr).toInt(); + // final h = (part.height * dpr).toInt(); + // await page.realSize!.updateRect( + // documentId: _controller._document!.id, + // width: w, + // height: h, + // sourceX: (offset.dx * dpr).toInt(), + // sourceY: (offset.dy * dpr).toInt(), + // textureWidth: w, + // textureHeight: h, + // fullWidth: fw, + // fullHeight: fh, + // allowAntiAliasing: true, + // backgroundColor: '#ffffff', + // ); + // page._updateRealSizeOverlay(); } } } diff --git a/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/Messages.ets b/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/Messages.ets index 4c0473b..74e5176 100644 --- a/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/Messages.ets +++ b/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/Messages.ets @@ -15,7 +15,6 @@ import { PlatformViewsController } from '@ohos/flutter_ohos'; import { FlutterPluginBinding } from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/FlutterPlugin'; -import Log from '@ohos/flutter_ohos/src/main/ets/util/Log'; import { GetPageMessage, GetPageReply, @@ -34,16 +33,14 @@ import { } from './Pigeon'; import { PdfViewPlatformView } from './PdfxView' -import { Params } from '@ohos/flutter_ohos/src/main/ets/plugin/platform/PlatformView'; import { common } from '@kit.AbilityKit'; import fs from '@ohos.file.fs'; -import { randomID, randomFilename } from './utils/Random'; +import { randomFilename } from './utils/Random'; import { pdfService } from '@kit.PDFKit'; import { PageRepository } from './resources/PageRepository'; import { DocumentRepository } from './resources/DocumentRepository'; import { image } from '@kit.ImageKit'; -import { SurfaceTextureEntry } from '@ohos/flutter_ohos/src/main/ets/view/TextureRegistry'; - +import { TextureRegistry } from '@ohos/flutter_ohos'; const TAG = "Messages"; @@ -52,8 +49,10 @@ export class Messages extends PdfxApi { private documents: DocumentRepository; private pages: PageRepository; private platformViewController: PlatformViewsController | null; - private textures: Map = new Map(); + private textures: Map = new Map(); private platformViews: Map = new Map(); + private pixelMaps: Map = new Map(); + private textureRegistry: TextureRegistry; constructor(binding: FlutterPluginBinding, documents: DocumentRepository, @@ -63,9 +62,11 @@ export class Messages extends PdfxApi { this.documents = documents; this.pages = pages; this.platformViewController = this.binding.getFlutterEngine().getPlatformViewsController(); + this.textureRegistry = this.binding.getTextureRegistry(); } openDocumentData(message: OpenDataMessage, result: Result): void { + this.cleanAll(); const resultResponse = new OpenReply(); try { let filePath = getContext(this).tempDir + '/' + randomFilename(); @@ -86,6 +87,7 @@ export class Messages extends PdfxApi { } openDocumentFile(message: OpenPathMessage, result: Result): void { + this.cleanAll(); const resultResponse = new OpenReply(); try { const pdfDocument = new pdfService.PdfDocument(); @@ -101,6 +103,7 @@ export class Messages extends PdfxApi { } openDocumentAsset(message: OpenPathMessage, result: Result): void { + this.cleanAll(); const resultResponse: OpenReply = new OpenReply(); try { const pdfDocument = new pdfService.PdfDocument(); @@ -127,51 +130,9 @@ export class Messages extends PdfxApi { } } - getPage(message: GetPageMessage, result: Result): void { - const resultResponse = new GetPageReply() - try { - const documentId = message.documentId!!; - const pageNumber = message.pageNumber!!; - - if (message.autoCloseOhos!!) { - const page = this.documents.get(documentId).openPage(pageNumber); - resultResponse.width = page.getWidth(); - resultResponse.height = page.getHeight(); - - } else { - const pageRenderer = this.documents.get(documentId).openPage(pageNumber); - const page = this.pages.register(documentId, pageRenderer); - resultResponse.id = page.id; - resultResponse.width = page.getWidth() + 0.1; - resultResponse.height = page.getHeight() + 0.1; - } - result.success(resultResponse) - } catch (e) { - result.error(e) - } - } - renderPage(message: RenderPageMessage, result: Result): void { - const resultResponse = new RenderPageReply(); - try { - const pageId = message.getPage(); - - const page = this.pages.get(pageId) - - const pageImage: image.PixelMap = page.render(); - - // 渲染 - - resultResponse.setPath(""); - resultResponse.setWidth(1.1); - resultResponse.setHeight(1.1) - result.success(resultResponse) - } catch (e) { - result.error(e); - } } - closePage(message: IdMessage): void { try { const id = message.getId(); @@ -181,14 +142,27 @@ export class Messages extends PdfxApi { } } - private flutterTexture?: SurfaceTextureEntry; + getPage(message: GetPageMessage): GetPageReply { + const resultResponse = new GetPageReply() + const documentId = message.documentId!!; + const pageNumber = message.pageNumber!!; + + const pageRenderer = this.documents.get(documentId).openPage(pageNumber); + const page = this.pages.register(documentId, pageRenderer); // 打开了page,绑定了一个pageId, page 未关闭 + + resultResponse.id = page.id; + resultResponse.width = page.getWidth() + 0.1; + resultResponse.height = page.getHeight() + 0.1; + + return resultResponse; + + } registerTexture(): RegisterTextureReply { - const textureRegistry = this.binding.getTextureRegistry(); - const textureId = textureRegistry.getTextureId(); - const surfaceTexture = textureRegistry.registerTexture(textureId); + const textureId = this.textureRegistry.getTextureId(); + const surfaceTexture = this.textureRegistry.registerTexture(textureId); - this.textures.set(textureId, surfaceTexture); + this.textures.set(textureId, surfaceTexture.getSurfaceId()); const platformView: PdfViewPlatformView = new PdfViewPlatformView(); this.platformViews.set(textureId, platformView); @@ -196,33 +170,59 @@ export class Messages extends PdfxApi { return new RegisterTextureReply(textureId); } - updateTexture(message: UpdateTextureMessage, result: Result): void { + updateTexture(message: UpdateTextureMessage, result: Result) { try { const textureId = message.getTextureId(); - const pageNumber = message.getPageNumber(); - const surfaceTexture = this.textures.get(textureId); - const document = this.documents.get(message.getDocumentId()); - - const pdfPage: pdfService.PdfPage = document.openPage(pageNumber); - const pixelMap: image.PixelMap = pdfPage.getPagePixelMap(); - // todo: 刷新渲染 - // 找到textureId对应的platformView - const platformView = this.platformViews.get(textureId); - platformView!.setPixelMap(pixelMap); - platformView!.setWidth(message.getWidth()); - platformView!.setHeight(message.getHeight()); - platformView!.setLeft(message.getSourceX()); - platformView!.setTop(message.getSourceY()); + const pageId = message.getPageId(); + const surfaceId = this.textures.get(textureId); - this.platformViewController?.render(surfaceTexture?.getSurfaceId(), platformView!, - message.getWidth(), message.getHeight(), message.getSourceX(), message.getSourceY()); + let pixelMap = this.pixelMaps.get(textureId) + if (pixelMap === undefined) { + pixelMap = this.pages.get(pageId).render(); + this.pixelMaps.set(textureId, pixelMap); + } + // 找到textureId对应的platformView + let platformView = this.platformViews.get(textureId); + platformView?.setPixelMap(pixelMap); + this.platformViewController?.render(surfaceId, platformView, + message.getWidth(), + message.getHeight(), + message.getSourceX(), + message.getSourceY()); result.success(undefined); } catch (e) { result.error(e); } } + + unregisterTexture(message: UnregisterTextureMessage): void { + try { + const textureId = message.getId(); + + let surfaceId = this.textures.get(textureId); + this.textures.delete(textureId); + this.platformViews.delete(textureId); + + this.pixelMaps.get(textureId)?.release(); + this.pixelMaps.delete(textureId); + + this.platformViewController?.dispose(surfaceId); + + this.textureRegistry.unregisterTexture(textureId); + + } catch (e) { + console.error(e) + } + } + + cleanAll() { + this.textures.forEach((value, key) => { + this.unregisterTexture((new UnregisterTextureMessage(key))) + }) + } + resizeTexture(message: ResizeTextureMessage, result: Result): void { const texId = message.getTextureId(); const width = message.getWidth(); @@ -232,14 +232,6 @@ export class Messages extends PdfxApi { result.success() } - unregisterTexture(message: UnregisterTextureMessage): void { - const id = message.getId(); - const tex = this.textures.get(id); - tex?.release(); - this.textures.delete(id); - this.binding.getTextureRegistry().unregisterTexture(id); - } - openDataDocument() { } @@ -262,4 +254,4 @@ export class Messages extends PdfxApi { } return filePath; } -} \ No newline at end of file +} diff --git a/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/OhosPdfView.ets b/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/OhosPdfView.ets index 99ba62e..39c8f88 100644 --- a/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/OhosPdfView.ets +++ b/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/OhosPdfView.ets @@ -12,11 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import {pdfService} from '@kit.PDFKit'; + +import { pdfService } from '@kit.PDFKit'; import { image } from '@kit.ImageKit'; import { Params } from '@ohos/flutter_ohos/src/main/ets/plugin/platform/PlatformView'; -import {PdfViewPlatformView}from './PdfxView' +import { PdfViewPlatformView } from './PdfxView' const TAG = '[PDFKit_LOG_TAG]'; @Entry @@ -25,14 +25,20 @@ struct PDFPreview { @Prop params: Params; _pixelMap: image.PixelMap | undefined = undefined; + aboutToDisappear(): void { + this._pixelMap?.release(() => { + this._pixelMap = undefined; + }) + } + build() { - Column(){ + Column() { Image(this._pixelMap) } } } @Builder -export function PdfBuilder(params: Params){ - PDFPreview({params: params,_pixelMap: (params.platformView as PdfViewPlatformView).getPixelMap()}); -} \ No newline at end of file +export function PdfBuilder(params: Params) { + PDFPreview({ params: params, _pixelMap: (params.platformView as PdfViewPlatformView).getPixelMap() }); +} diff --git a/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/PdfxView.ets b/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/PdfxView.ets index 235b8b0..15e7a3b 100644 --- a/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/PdfxView.ets +++ b/packages/pdfx/ohos/src/main/ets/io/scer/pdfx/PdfxView.ets @@ -21,55 +21,23 @@ import { image } from '@kit.ImageKit'; export class PdfViewPlatformView extends PlatformView { private _pixelMap: image.PixelMap | undefined = undefined; - private _width: number = 0; - private _height: number = 0; - private _left: number = 0; - private _top: number = 0; getView(): WrappedBuilder<[Params]> { return new WrappedBuilder(PdfBuilder) } dispose(): void { + this._pixelMap?.release(() => { + this._pixelMap = undefined; + }) } getPixelMap(): image.PixelMap | undefined { return this._pixelMap; + } setPixelMap(_pixelMap: image.PixelMap | undefined): void { this._pixelMap = _pixelMap; } - - getWidth(): number { - return this._width; - } - - setWidth(setterArg: number) { - this._width = setterArg; - } - - getHeight(): number { - return this._height; - } - - setHeight(setterArg: number) { - this._height = setterArg; - } - - getLeft(): number { - return this._left; - } - - setLeft(setterArg: number) { - this._left = setterArg; - } - - getTop(): number { - return this._top; - } - - setTop(setterArg: number) { - this._top = setterArg; - } -} \ No newline at end of file +} -- Gitee From 45e33e5c7a20ff8300ec44fd63afe61a72546057 Mon Sep 17 00:00:00 2001 From: wwyang <137208408@qq.com> Date: Mon, 18 Nov 2024 11:02:31 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=A7=A3=E5=86=B3pdfx=E5=8D=A1=E9=A1=BF?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wwyang <137208408@qq.com> --- .../lib/src/viewer/pinch/pdf_view_pinch.dart | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/packages/pdfx/lib/src/viewer/pinch/pdf_view_pinch.dart b/packages/pdfx/lib/src/viewer/pinch/pdf_view_pinch.dart index f094735..7bcaba5 100644 --- a/packages/pdfx/lib/src/viewer/pinch/pdf_view_pinch.dart +++ b/packages/pdfx/lib/src/viewer/pinch/pdf_view_pinch.dart @@ -411,32 +411,6 @@ class _PdfViewPinchState extends State // no real-size overlay needed; use preview page.realSizeOverlayRect = null; } else { - // render real-size overlay - // final offset = part.topLeft - pageRectZoomed.topLeft; - // page - // ..realSizeOverlayRect = Rect.fromLTWH( - // offset.dx / r, - // offset.dy / r, - // part.width / r, - // part.height / r, - // ) - // ..realSize ??= await page.pdfPage.createTexture(); - // final w = (part.width * dpr).toInt(); - // final h = (part.height * dpr).toInt(); - // await page.realSize!.updateRect( - // documentId: _controller._document!.id, - // width: w, - // height: h, - // sourceX: (offset.dx * dpr).toInt(), - // sourceY: (offset.dy * dpr).toInt(), - // textureWidth: w, - // textureHeight: h, - // fullWidth: fw, - // fullHeight: fh, - // allowAntiAliasing: true, - // backgroundColor: '#ffffff', - // ); - // page._updateRealSizeOverlay(); } } } -- Gitee