Loading core/java/android/view/GLES20Canvas.java +10 −5 Original line number Diff line number Diff line Loading @@ -773,19 +773,24 @@ class GLES20Canvas extends HardwareCanvas { public void drawPoint(float x, float y, Paint paint) { mPoint[0] = x; mPoint[1] = y; drawPoints(mPoint, 0, 1, paint); drawPoints(mPoint, 0, 2, paint); } @Override public void drawPoints(float[] pts, int offset, int count, Paint paint) { // TODO: Implement public void drawPoints(float[] pts, Paint paint) { drawPoints(pts, 0, pts.length, paint); } @Override public void drawPoints(float[] pts, Paint paint) { drawPoints(pts, 0, pts.length / 2, paint); public void drawPoints(float[] pts, int offset, int count, Paint paint) { int modifiers = setupModifiers(paint); nDrawPoints(mRenderer, pts, offset, count, paint.mNativePaint); if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers); } private static native void nDrawPoints(int renderer, float[] points, int offset, int count, int paint); @Override public void drawPosText(char[] text, int index, int count, float[] pos, Paint paint) { // TODO: Implement Loading core/jni/android_view_GLES20Canvas.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -366,6 +366,13 @@ static void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject clazz, } } static void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloatArray points, jint offset, jint count, SkPaint* paint) { jfloat* storage = env->GetFloatArrayElements(points, NULL); renderer->drawPoints(storage + offset, count, paint); env->ReleaseFloatArrayElements(points, storage, 0); } static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkPath* path, SkPaint* paint) { renderer->drawPath(path, paint); Loading @@ -374,9 +381,7 @@ static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz, static void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloatArray points, jint offset, jint count, SkPaint* paint) { jfloat* storage = env->GetFloatArrayElements(points, NULL); renderer->drawLines(storage + offset, count, paint); env->ReleaseFloatArrayElements(points, storage, 0); } Loading Loading @@ -645,6 +650,7 @@ static JNINativeMethod gMethods[] = { { "nDrawCircle", "(IFFFI)V", (void*) android_view_GLES20Canvas_drawCircle }, { "nDrawOval", "(IFFFFI)V", (void*) android_view_GLES20Canvas_drawOval }, { "nDrawArc", "(IFFFFFFZI)V", (void*) android_view_GLES20Canvas_drawArc }, { "nDrawPoints", "(I[FIII)V", (void*) android_view_GLES20Canvas_drawPoints }, { "nDrawPath", "(III)V", (void*) android_view_GLES20Canvas_drawPath }, { "nDrawLines", "(I[FIII)V", (void*) android_view_GLES20Canvas_drawLines }, Loading libs/hwui/DisplayListRenderer.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ const char* DisplayList::OP_NAMES[] = { "DrawArc", "DrawPath", "DrawLines", "DrawPoints", "DrawText", "ResetShader", "SetupShader", Loading Loading @@ -441,6 +442,13 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level) renderer.drawLines(points, count, getPaint()); } break; case DrawPoints: { int count = 0; float* points = getFloats(count); DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.drawPoints(points, count, getPaint()); } break; case DrawText: { getText(&text); int count = getInt(); Loading Loading @@ -787,6 +795,12 @@ void DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) { addPaint(paint); } void DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) { addOp(DisplayList::DrawPoints); addFloats(points, count); addPaint(paint); } void DisplayListRenderer::drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint) { addOp(DisplayList::DrawText); Loading libs/hwui/DisplayListRenderer.h +2 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,7 @@ public: DrawArc, DrawPath, DrawLines, DrawPoints, DrawText, ResetShader, SetupShader, Loading Loading @@ -264,6 +265,7 @@ public: float startAngle, float sweepAngle, bool useCenter, SkPaint* paint); void drawPath(SkPath* path, SkPaint* paint); void drawLines(float* points, int count, SkPaint* paint); void drawPoints(float* points, int count, SkPaint* paint); void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint); void resetShader(); Loading libs/hwui/OpenGLRenderer.cpp +52 −0 Original line number Diff line number Diff line Loading @@ -879,6 +879,11 @@ void OpenGLRenderer::setupDrawWithTexture(bool isAlpha8) { mDescription.hasAlpha8Texture = isAlpha8; } void OpenGLRenderer::setupDrawPoint(float pointSize) { mDescription.isPoint = true; mDescription.pointSize = pointSize; } void OpenGLRenderer::setupDrawColor(int color) { setupDrawColor(color, (color >> 24) & 0xFF); } Loading Loading @@ -987,6 +992,11 @@ void OpenGLRenderer::setupDrawModelView(float left, float top, float right, floa } } void OpenGLRenderer::setupDrawPointUniforms() { int slot = mCaches.currentProgram->getUniform("pointSize"); glUniform1f(slot, mDescription.pointSize); } void OpenGLRenderer::setupDrawColorUniforms() { if (mColorSet || (mShader && mSetShaderColor)) { mCaches.currentProgram->setColor(mColorR, mColorG, mColorB, mColorA); Loading Loading @@ -1446,6 +1456,48 @@ void OpenGLRenderer::drawLines(float* points, int count, SkPaint* paint) { } } void OpenGLRenderer::drawPoints(float* points, int count, SkPaint* paint) { if (mSnapshot->isIgnored()) return; // TODO: The paint's cap style defines whether the points are square or circular // TODO: Handle AA for round points // A stroke width of 0 has a special meaningin Skia: // it draws an unscaled 1px point const bool isHairLine = paint->getStrokeWidth() == 0.0f; int alpha; SkXfermode::Mode mode; getAlphaAndMode(paint, &alpha, &mode); int verticesCount = count >> 1; int generatedVerticesCount = 0; TextureVertex pointsData[verticesCount]; TextureVertex* vertex = &pointsData[0]; setupDraw(); setupDrawPoint(isHairLine ? 1.0f : paint->getStrokeWidth()); setupDrawColor(paint->getColor(), alpha); setupDrawColorFilter(); setupDrawShader(); setupDrawBlending(mode); setupDrawProgram(); setupDrawModelViewIdentity(); setupDrawColorUniforms(); setupDrawColorFilterUniforms(); setupDrawPointUniforms(); setupDrawShaderIdentityUniforms(); setupDrawMesh(vertex); for (int i = 0; i < count; i += 2) { TextureVertex::set(vertex++, points[i], points[i + 1], 0.0f, 0.0f); generatedVerticesCount++; } glDrawArrays(GL_POINTS, 0, generatedVerticesCount); } void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) { // No need to check against the clip, we fill the clip region if (mSnapshot->isIgnored()) return; Loading Loading
core/java/android/view/GLES20Canvas.java +10 −5 Original line number Diff line number Diff line Loading @@ -773,19 +773,24 @@ class GLES20Canvas extends HardwareCanvas { public void drawPoint(float x, float y, Paint paint) { mPoint[0] = x; mPoint[1] = y; drawPoints(mPoint, 0, 1, paint); drawPoints(mPoint, 0, 2, paint); } @Override public void drawPoints(float[] pts, int offset, int count, Paint paint) { // TODO: Implement public void drawPoints(float[] pts, Paint paint) { drawPoints(pts, 0, pts.length, paint); } @Override public void drawPoints(float[] pts, Paint paint) { drawPoints(pts, 0, pts.length / 2, paint); public void drawPoints(float[] pts, int offset, int count, Paint paint) { int modifiers = setupModifiers(paint); nDrawPoints(mRenderer, pts, offset, count, paint.mNativePaint); if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers); } private static native void nDrawPoints(int renderer, float[] points, int offset, int count, int paint); @Override public void drawPosText(char[] text, int index, int count, float[] pos, Paint paint) { // TODO: Implement Loading
core/jni/android_view_GLES20Canvas.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -366,6 +366,13 @@ static void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject clazz, } } static void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloatArray points, jint offset, jint count, SkPaint* paint) { jfloat* storage = env->GetFloatArrayElements(points, NULL); renderer->drawPoints(storage + offset, count, paint); env->ReleaseFloatArrayElements(points, storage, 0); } static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkPath* path, SkPaint* paint) { renderer->drawPath(path, paint); Loading @@ -374,9 +381,7 @@ static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz, static void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloatArray points, jint offset, jint count, SkPaint* paint) { jfloat* storage = env->GetFloatArrayElements(points, NULL); renderer->drawLines(storage + offset, count, paint); env->ReleaseFloatArrayElements(points, storage, 0); } Loading Loading @@ -645,6 +650,7 @@ static JNINativeMethod gMethods[] = { { "nDrawCircle", "(IFFFI)V", (void*) android_view_GLES20Canvas_drawCircle }, { "nDrawOval", "(IFFFFI)V", (void*) android_view_GLES20Canvas_drawOval }, { "nDrawArc", "(IFFFFFFZI)V", (void*) android_view_GLES20Canvas_drawArc }, { "nDrawPoints", "(I[FIII)V", (void*) android_view_GLES20Canvas_drawPoints }, { "nDrawPath", "(III)V", (void*) android_view_GLES20Canvas_drawPath }, { "nDrawLines", "(I[FIII)V", (void*) android_view_GLES20Canvas_drawLines }, Loading
libs/hwui/DisplayListRenderer.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ const char* DisplayList::OP_NAMES[] = { "DrawArc", "DrawPath", "DrawLines", "DrawPoints", "DrawText", "ResetShader", "SetupShader", Loading Loading @@ -441,6 +442,13 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level) renderer.drawLines(points, count, getPaint()); } break; case DrawPoints: { int count = 0; float* points = getFloats(count); DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.drawPoints(points, count, getPaint()); } break; case DrawText: { getText(&text); int count = getInt(); Loading Loading @@ -787,6 +795,12 @@ void DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) { addPaint(paint); } void DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) { addOp(DisplayList::DrawPoints); addFloats(points, count); addPaint(paint); } void DisplayListRenderer::drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint) { addOp(DisplayList::DrawText); Loading
libs/hwui/DisplayListRenderer.h +2 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,7 @@ public: DrawArc, DrawPath, DrawLines, DrawPoints, DrawText, ResetShader, SetupShader, Loading Loading @@ -264,6 +265,7 @@ public: float startAngle, float sweepAngle, bool useCenter, SkPaint* paint); void drawPath(SkPath* path, SkPaint* paint); void drawLines(float* points, int count, SkPaint* paint); void drawPoints(float* points, int count, SkPaint* paint); void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint); void resetShader(); Loading
libs/hwui/OpenGLRenderer.cpp +52 −0 Original line number Diff line number Diff line Loading @@ -879,6 +879,11 @@ void OpenGLRenderer::setupDrawWithTexture(bool isAlpha8) { mDescription.hasAlpha8Texture = isAlpha8; } void OpenGLRenderer::setupDrawPoint(float pointSize) { mDescription.isPoint = true; mDescription.pointSize = pointSize; } void OpenGLRenderer::setupDrawColor(int color) { setupDrawColor(color, (color >> 24) & 0xFF); } Loading Loading @@ -987,6 +992,11 @@ void OpenGLRenderer::setupDrawModelView(float left, float top, float right, floa } } void OpenGLRenderer::setupDrawPointUniforms() { int slot = mCaches.currentProgram->getUniform("pointSize"); glUniform1f(slot, mDescription.pointSize); } void OpenGLRenderer::setupDrawColorUniforms() { if (mColorSet || (mShader && mSetShaderColor)) { mCaches.currentProgram->setColor(mColorR, mColorG, mColorB, mColorA); Loading Loading @@ -1446,6 +1456,48 @@ void OpenGLRenderer::drawLines(float* points, int count, SkPaint* paint) { } } void OpenGLRenderer::drawPoints(float* points, int count, SkPaint* paint) { if (mSnapshot->isIgnored()) return; // TODO: The paint's cap style defines whether the points are square or circular // TODO: Handle AA for round points // A stroke width of 0 has a special meaningin Skia: // it draws an unscaled 1px point const bool isHairLine = paint->getStrokeWidth() == 0.0f; int alpha; SkXfermode::Mode mode; getAlphaAndMode(paint, &alpha, &mode); int verticesCount = count >> 1; int generatedVerticesCount = 0; TextureVertex pointsData[verticesCount]; TextureVertex* vertex = &pointsData[0]; setupDraw(); setupDrawPoint(isHairLine ? 1.0f : paint->getStrokeWidth()); setupDrawColor(paint->getColor(), alpha); setupDrawColorFilter(); setupDrawShader(); setupDrawBlending(mode); setupDrawProgram(); setupDrawModelViewIdentity(); setupDrawColorUniforms(); setupDrawColorFilterUniforms(); setupDrawPointUniforms(); setupDrawShaderIdentityUniforms(); setupDrawMesh(vertex); for (int i = 0; i < count; i += 2) { TextureVertex::set(vertex++, points[i], points[i + 1], 0.0f, 0.0f); generatedVerticesCount++; } glDrawArrays(GL_POINTS, 0, generatedVerticesCount); } void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) { // No need to check against the clip, we fill the clip region if (mSnapshot->isIgnored()) return; Loading