static void doDraw(SkCanvas* canvas, SkPaint* paint, const int isrc[], const int idst[], int count) { SkMatrix matrix; SkPoint src[4], dst[4]; for (int i = 0; i < count; i++) { src[i].set(SkIntToScalar(isrc[2*i+0]), SkIntToScalar(isrc[2*i+1])); dst[i].set(SkIntToScalar(idst[2*i+0]), SkIntToScalar(idst[2*i+1])); } canvas->save(); matrix.setPolyToPoly(src, dst, count); canvas->concat(matrix); paint->setColor(sk_tool_utils::color_to_565(SK_ColorGRAY)); paint->setStyle(SkPaint::kStroke_Style); const SkScalar D = 64; canvas->drawRect(SkRect::MakeWH(D, D), *paint); canvas->drawLine(0, 0, D, D, *paint); canvas->drawLine(0, D, D, 0, *paint); SkPaint::FontMetrics fm; paint->getFontMetrics(&fm); paint->setColor(SK_ColorRED); paint->setStyle(SkPaint::kFill_Style); SkScalar x = D/2; SkScalar y = D/2 - (fm.fAscent + fm.fDescent)/2; uint16_t glyphID = 3; // X canvas->drawText((void*) &glyphID, sizeof(glyphID), x, y, *paint); canvas->restore(); }
Boolean Matrix::NativeSetPolyToPoly( /* [in] */ Int64 nObj, /* [in] */ ArrayOf<Float>* _src, /* [in] */ Int32 srcIndex, /* [out] */ ArrayOf<Float>* _dst, /* [in] */ Int32 dstIndex, /* [in] */ Int32 ptCount) { SkASSERT(srcIndex >= 0); SkASSERT(dstIndex >= 0); SkASSERT(ptCount <= 4); SkASSERT(_src->GetLength() >= srcIndex + (ptCount << 1)); SkASSERT(_dst->GetLength() >= dstIndex + (ptCount << 1)); SkMatrix* matrix = reinterpret_cast<SkMatrix*>(nObj); SkASSERT(srcIndex >= 0); SkASSERT(dstIndex >= 0); SkASSERT((unsigned)ptCount <= 4); // AutoJavaFloatArray autoSrc(env, jsrc, srcIndex + (ptCount << 1), kRO_JNIAccess); // AutoJavaFloatArray autoDst(env, jdst, dstIndex + (ptCount << 1), kRW_JNIAccess); Float* src = _src->GetPayload() + srcIndex; Float* dst = _dst->GetPayload() + dstIndex; bool result; #ifdef SK_SCALAR_IS_FLOAT result = matrix->setPolyToPoly((const SkPoint*)src, (const SkPoint*)dst, ptCount); #else SkASSERT(FALSE); #endif return result ? TRUE : FALSE; }
static void doDraw(SkCanvas* canvas, SkPaint* paint, const int isrc[], const int idst[], int count) { SkMatrix matrix; SkPoint src[4], dst[4]; for (int i = 0; i < count; i++) { src[i].set(SkIntToScalar(isrc[2*i+0]), SkIntToScalar(isrc[2*i+1])); dst[i].set(SkIntToScalar(idst[2*i+0]), SkIntToScalar(idst[2*i+1])); } canvas->save(); matrix.setPolyToPoly(src, dst, count); canvas->concat(matrix); paint->setColor(SK_ColorGRAY); paint->setStyle(SkPaint::kStroke_Style); const SkScalar D = SkIntToScalar(64); canvas->drawRectCoords(0, 0, D, D, *paint); canvas->drawLine(0, 0, D, D, *paint); canvas->drawLine(0, D, D, 0, *paint); SkPaint::FontMetrics fm; paint->getFontMetrics(&fm); paint->setColor(SK_ColorRED); paint->setStyle(SkPaint::kFill_Style); SkScalar x = D/2; float y = D/2 - (fm.fAscent + fm.fDescent)/2; SkString str; str.appendS32(count); canvas->drawText(str.c_str(), str.size(), x, y, *paint); canvas->restore(); }
void draw(SkCanvas* canvas) { SkMatrix matrix; SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}}; SkRect::Make(source.bounds()).toQuad(bitmapBounds); matrix.setPolyToPoly(bitmapBounds, perspect, 4); matrix.preScale(.75f, 1.5f, source.width() / 2, source.height() / 2); canvas->concat(matrix); canvas->drawBitmap(source, 0, 0); }
static jboolean setPolyToPoly(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloatArray jsrc, jint srcIndex, jfloatArray jdst, jint dstIndex, jint ptCount) { SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); SkASSERT(srcIndex >= 0); SkASSERT(dstIndex >= 0); SkASSERT((unsigned)ptCount <= 4); AutoJavaFloatArray autoSrc(env, jsrc, srcIndex + (ptCount << 1), kRO_JNIAccess); AutoJavaFloatArray autoDst(env, jdst, dstIndex + (ptCount << 1), kRW_JNIAccess); float* src = autoSrc.ptr() + srcIndex; float* dst = autoDst.ptr() + dstIndex; bool result; #ifdef SK_SCALAR_IS_FLOAT result = matrix->setPolyToPoly((const SkPoint*)src, (const SkPoint*)dst, ptCount); #else SkASSERT(false); #endif return result ? JNI_TRUE : JNI_FALSE; }