<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                下面,來看最后兩個和Surface相關的函數調用:一個是lockCanvas;另外一個是unlockCanvasAndPost。 1. lockCanvas的分析 要對lockCanvas進行分析,須先來看Java層的函數,代碼如下所示: **Surface.java::lockCanvas()** ~~~ public Canvas lockCanvas(Rect dirty) throws OutOfResourcesException,IllegalArgumentException { return lockCanvasNative(dirty);//調用native的lockCanvasNative函數。 } ~~~ **android_view_Surface.cpp::Surface_lockCanvas()** ~~~ static jobject Surface_lockCanvas(JNIEnv* env,jobject clazz, jobject dirtyRect) { //從Java中的Surface對象中,取出費盡千辛萬苦得到的Native的Surface對象 constsp<Surface>& surface(getSurface(env, clazz)); ...... // dirtyRect表示需要重繪的矩形塊,下面根據這個dirtyRect設置dirtyRegion RegiondirtyRegion; if(dirtyRect) { Rect dirty; dirty.left =env->GetIntField(dirtyRect, ro.l); dirty.top =env->GetIntField(dirtyRect, ro.t); dirty.right = env->GetIntField(dirtyRect, ro.r); dirty.bottom=env->GetIntField(dirtyRect, ro.b); if(!dirty.isEmpty()) { dirtyRegion.set(dirty); } } else{ dirtyRegion.set(Rect(0x3FFF,0x3FFF)); } //調用NativeSurface對象的lock函數, //傳入了一個參數Surface::SurfaceInfo info和一塊表示臟區域的dirtyRegion Surface::SurfaceInfo info; status_t err = surface->lock(&info, &dirtyRegion); ...... //Java的Surface對象構造的時候會創建一個CompatibleCanvas。 //這里就取出這個CompatibleCanvas對象 jobject canvas = env->GetObjectField(clazz, so.canvas); env->SetIntField(canvas, co.surfaceFormat, info.format); //從Canvas對象中取出SkCanvas對象 SkCanvas* nativeCanvas =(SkCanvas*)env->GetIntField( canvas, no.native_canvas); SkBitmap bitmap; ssize_t bpr = info.s *bytesPerPixel(info.format); bitmap.setConfig(convertPixelFormat(info.format), info.w, info.h, bpr); ...... if (info.w > 0 && info.h > 0) { //info.bits指向一塊存儲區域。 bitmap.setPixels(info.bits); } else{ bitmap.setPixels(NULL); } //給這個SkCanvas設置一個Bitmap,還記得前面說的,畫圖需要的四大金剛嗎? //這里將Bitmap設置到這個Canvas中,這樣進UI繪畫時就有畫布了。 nativeCanvas->setBitmapDevice(bitmap); ...... returncanvas; } ~~~ lockCanvas還算比較簡單: - 先獲得一塊存儲區域,然后將它和Canvas綁定到一起,這樣,UI繪畫的結果就記錄在這塊存儲區域里了。 注意,本書不擬討論Android系統上Skia和OpenGL方面的知識,有興趣的讀者可自行研究。 接下來看unlockCanvasAndPost函數,它也是一個native函數: 2. unlockCanvasAndPost的分析 來看unlockCanvasAndPost的代碼,如下所示: **android_view_Surface.cpp** ~~~ static void Surface_unlockCanvasAndPost(JNIEnv*env, jobject clazz, jobject argCanvas) { jobjectcanvas = env->GetObjectField(clazz, so.canvas); //取出Native的Surface對象 const sp<Surface>& surface(getSurface(env,clazz)); //下面這些內容,不擬討論,讀者若有興趣,可結合Skia庫,自行研究。 SkCanvas* nativeCanvas =(SkCanvas*)env->GetIntField(canvas, no.native_canvas); intsaveCount = env->GetIntField(clazz, so.saveCount); nativeCanvas->restoreToCount(saveCount); nativeCanvas->setBitmapDevice(SkBitmap()); env->SetIntField(clazz, so.saveCount, 0); //調用Surface對象的unlockAndPost函數。 status_t err = surface->unlockAndPost(); ...... } ~~~ unlockCanvasAndPost也很簡單,這里就不再多說了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看