Your SlideShare is downloading. ×
0
JAG京都 ソースコードを読む会
JAG京都 ソースコードを読む会
JAG京都 ソースコードを読む会
JAG京都 ソースコードを読む会
JAG京都 ソースコードを読む会
JAG京都 ソースコードを読む会
JAG京都 ソースコードを読む会
JAG京都 ソースコードを読む会
JAG京都 ソースコードを読む会
JAG京都 ソースコードを読む会
JAG京都 ソースコードを読む会
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

JAG京都 ソースコードを読む会

6,849

Published on

日本アンドロイドの会 京都支部 …

日本アンドロイドの会 京都支部
ソースコードを読む会 2012/6/26
資料 PDF阪

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
6,849
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. ソースコード読もう会 Canvas#drawText に潜るよ 発表者:ちいといつ 2012年6月26日 日本アンドロイドの会 京都支部12年6月26日火曜日
  • 2. 今日は,Canvas#drawText に潜ります。 Canvas#drawText はビットマップに文字列を描画するメソッドで,画像に 文字を描画したい時や,View を継承したカスタムViewで文字を描画するの によく用いられます。 また,Label や Button などのキャプションも内部的には Canvas#drawText を使用しています。(多分)12年6月26日火曜日
  • 3. Canvas#drawText /mydroid/frameworks/base/graphics/java/android/graphics/Canvas.java いきなりネイティブを呼んでる。 ・パラメータの mNativeCanvasってなんだろう? → 次ページCanvasの コンストラクタ Canvas.java:1358 /** * Draw the text, with origin at (x,y), using the specified paint. The * origin is interpreted based on the Align setting in the paint. * * @param text The text to be drawn * @param x The x-coordinate of the origin of the text being drawn * @param y The y-coordinate of the origin of the text being drawn * @param paint The paint used for the text (e.g. color, size, style) */ public void drawText(String text, float x, float y, Paint paint) { native_drawText(mNativeCanvas, text, 0, text.length(), x, y, paint.mBidiFlags, paint.mNativePaint); }12年6月26日火曜日
  • 4. Canvas コンストラクタ: mNativeCanvasの型は final int final int mNativeCanvas; mNativeCanvas に initRasterの戻り値を設定。 initRasterはネイティブ関数 private static native int initRaster(int nativeBitmapOrZero); ・ bitmap.ni()が気になります → 次ページ Canvas.java:122 /** * Construct a canvas with the specified bitmap to draw into. The bitmap * must be mutable. * * <p>The initial target density of the canvas is the same as the given * bitmaps density. * * @param bitmap Specifies a mutable bitmap for the canvas to draw into. */ public Canvas(Bitmap bitmap) { if (!bitmap.isMutable()) { throw new IllegalStateException( "Immutable bitmap passed to Canvas constructor"); } throwIfRecycled(bitmap); mNativeCanvas = initRaster(bitmap.ni()); mFinalizer = new CanvasFinalizer(mNativeCanvas); mBitmap = bitmap; mDensity = bitmap.mDensity; }12年6月26日火曜日
  • 5. /mydroid/frameworks/base/graphics/java/android/graphics/Bitmap.java Bitmap#ni() ・本筋に戻って native_drawText を見ます → 次ページ Bitmap.java:1222 /* package */ final int ni() { return mNativeBitmap; }12年6月26日火曜日
  • 6. /mydroid/frameworks/base/core/jni/android/graphics/Canvas.cpp class 名は SkCanvasGlue 966行目から,Javaから呼ぶためのテーブルのようなもの SkCanvasGlue::drawText〜 が本体と思われる ・ 文字列を受け取ってるっぽい SkCanvasGlue:: drawText__StringIIFFIPaint を見ます →次ページ class SkCanvasGlue { Canvas.cpp:966 {"native_drawText","(I[CIIFFII)V", (void*) SkCanvasGlue::drawText___CIIFFIPaint}, {"native_drawText","(ILjava/lang/String;IIFFII)V", (void*) SkCanvasGlue::drawText__StringIIFFIPaint}, {"native_drawTextRun","(I[CIIIIFFII)V", (void*) SkCanvasGlue::drawTextRun___CIIIIFFIPaint}, {"native_drawTextRun","(ILjava/lang/String;IIIIFFII)V", (void*) SkCanvasGlue::drawTextRun__StringIIIIFFIPaint}, {"native_drawPosText","(I[CII[FI)V", (void*) SkCanvasGlue::drawPosText___CII_FPaint}, {"native_drawPosText","(ILjava/lang/String;[FI)V", (void*) SkCanvasGlue::drawPosText__String_FPaint}, {"native_drawTextOnPath","(I[CIIIFFII)V", (void*) SkCanvasGlue::drawTextOnPath___CIIPathFFPaint}, {"native_drawTextOnPath","(ILjava/lang/String;IFFII)V", (void*) SkCanvasGlue::drawTextOnPath__StringPathFFPaint},12年6月26日火曜日
  • 7. /mydroid/frameworks/base/core/jni/android/graphics/Canvas.cpp class 名は SkCanvasGlue 最近は,C++でもJavaっぽく class 内に関数本体書くのがトレンドなん? ・ 次は TextLayout::drawText を見ます →次ページ class SkCanvasGlue { Canvas.cpp:743 static void drawText__StringIIFFIPaint(JNIEnv* env, jobject, SkCanvas* canvas, jstring text, int start, int end, jfloat x, jfloat y, int flags, SkPaint* paint) { const jchar* textArray = env->GetStringChars(text, NULL); #if RTL_USE_HARFBUZZ drawTextWithGlyphs(canvas, textArray, start, end, x, y, flags, paint); #else TextLayout::drawText(paint, textArray + start, end - start, flags, x, y, canvas); #endif env->ReleaseStringChars(text, textArray); }12年6月26日火曜日
  • 8. /mydroid/frameworks/base/core/jni/android/graphics/TextLayout.cpp TextLayout::drawText から → handleText → SkCanvas::drawText と呼び出している Skというキーワードがそろそろ気になります。 ・ SkCanvas::drawText を見ます →次ページ TextLayout.cpp:284 // Draws a paragraph of text on a single line, running bidi and shaping void TextLayout::drawText(SkPaint* paint, const jchar* text, jsize len, int bidiFlags, jfloat x, jfloat y, SkCanvas* canvas) { handleText(paint, text, len, bidiFlags, x, y, canvas, NULL); } TextLayout.cpp:207 void TextLayout::handleText(SkPaint *paint, const jchar* text, jsize len, jint bidiFlags, jfloat x, jfloat y,SkCanvas *canvas, SkPath *path) { const jchar *workText; jchar *buffer = NULL; int32_t workBytes; if (prepareText(paint, text, len, bidiFlags, &workText, &workBytes, &buffer)) { SkScalar x_ = SkFloatToScalar(x); SkScalar y_ = SkFloatToScalar(y); if (canvas) { canvas->drawText(workText, workBytes, x_, y_, *paint); } else { paint->getTextPath(workText, workBytes, x_, y_, path); } free(buffer); } }12年6月26日火曜日
  • 9. /mydroid/external/skia/src/core/SkCanvas.cpp externalて,外部? skia て何? SkCanvas.cpp:1672 void SkCanvas::drawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint) { LOOPER_BEGIN(paint, SkDrawFilter::kText_Type) while (iter.next()) { SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); iter.fDevice->drawText(iter, text, byteLength, x, y, dfp.paint()); DrawTextDecorations(iter, dfp.paint(), static_cast<const char*>(text), byteLength, x, y); }12年6月26日火曜日
  • 10. Skia とは? http://en.wikipedia.org/wiki/Skia_Graphics_Engine Skiaグラフィックス·エンジンは、C++書かれたコンパクトなオープンソースの グラ フィックスライブラリ。 もともとSkia社によって開発され,グーグル社に2005年に買収された。 それは現在のところGoogle Chrome、Chrome OS、およびAndroidに使用され ている。12年6月26日火曜日
  • 11. Skiaのソースフォルダを見ると, svg も扱えるらしい。 Chromeで使われてるんやから, そらそうか。 本日の結論 : AndroidもSVG使えるようにしてよ 以上12年6月26日火曜日

×