void draw(SkCanvas* canvas) { SkMatrix m; m.setIdentity(); m.set(SkMatrix::kMPersp0, -0.004f); SkAutoCanvasRestore autoRestore(canvas, true); canvas->translate(22, 144); SkPaint black; black.setAntiAlias(true); black.setTextSize(24); SkPaint gray = black; gray.setColor(0xFF9f9f9f); SkString string; string.appendScalar(m.getPerspX()); canvas->drawString(string, 0, -72, gray); canvas->concat(m); canvas->drawString(string, 0, 0, black); }
void SkFlatMatrix::dump() const { const SkMatrix* matrix = (const SkMatrix*) fMatrixData; char pBuffer[DUMP_BUFFER_SIZE]; char* bufferPtr = pBuffer; bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), "matrix: "); SkScalar scaleX = matrix->getScaleX(); SkMatrix defaultMatrix; defaultMatrix.reset(); if (scaleX != defaultMatrix.getScaleX()) bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), "scaleX:%g ", SkScalarToFloat(scaleX)); SkScalar scaleY = matrix->getScaleY(); if (scaleY != defaultMatrix.getScaleY()) bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), "scaleY:%g ", SkScalarToFloat(scaleY)); SkScalar skewX = matrix->getSkewX(); if (skewX != defaultMatrix.getSkewX()) bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), "skewX:%g ", SkScalarToFloat(skewX)); SkScalar skewY = matrix->getSkewY(); if (skewY != defaultMatrix.getSkewY()) bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), "skewY:%g ", SkScalarToFloat(skewY)); SkScalar translateX = matrix->getTranslateX(); if (translateX != defaultMatrix.getTranslateX()) bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), "translateX:%g ", SkScalarToFloat(translateX)); SkScalar translateY = matrix->getTranslateY(); if (translateY != defaultMatrix.getTranslateY()) bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), "translateY:%g ", SkScalarToFloat(translateY)); SkScalar perspX = matrix->getPerspX(); if (perspX != defaultMatrix.getPerspX()) bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), "perspX:%g ", SkFractToFloat(perspX)); SkScalar perspY = matrix->getPerspY(); if (perspY != defaultMatrix.getPerspY()) bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), "perspY:%g ", SkFractToFloat(perspY)); SkDebugf("%s\n", pBuffer); }
void SkSVGPaint::setSave(SkSVGParser& parser) { SkTDArray<SkString*> clips; SkSVGPaint* walking = parser.fHead; int index; SkMatrix sum; sum.reset(); while (walking != NULL) { for (index = kInitial + 1; index < kTerminal; index++) { SkString* lastAttr = (*walking)[index]; if (lastAttr->size() == 0) continue; if (index == kTransform) { const char* str = lastAttr->c_str(); SkASSERT(strncmp(str, "matrix(", 7) == 0); str += 6; const char* strEnd = strrchr(str, ')'); SkASSERT(strEnd != NULL); SkString mat(str, strEnd - str); SkSVGParser::ConvertToArray(mat); SkScalar values[6]; SkParse::FindScalars(mat.c_str() + 1, values, 6); SkMatrix matrix; matrix.reset(); matrix.setScaleX(values[0]); matrix.setSkewY(values[1]); matrix.setSkewX(values[2]); matrix.setScaleY(values[3]); matrix.setTranslateX(values[4]); matrix.setTranslateY(values[5]); sum.setConcat(matrix, sum); continue; } if ( index == kClipPath) *clips.insert(0) = lastAttr; } walking = walking->fNext; } if ((sum == parser.fLastTransform) == false) { SkMatrix inverse; bool success = parser.fLastTransform.invert(&inverse); SkASSERT(success == true); SkMatrix output; output.setConcat(inverse, sum); parser.fLastTransform = sum; SkString outputStr; outputStr.appendUnichar('['); outputStr.appendScalar(output.getScaleX()); outputStr.appendUnichar(','); outputStr.appendScalar(output.getSkewX()); outputStr.appendUnichar(','); outputStr.appendScalar(output.getTranslateX()); outputStr.appendUnichar(','); outputStr.appendScalar(output.getSkewY()); outputStr.appendUnichar(','); outputStr.appendScalar(output.getScaleY()); outputStr.appendUnichar(','); outputStr.appendScalar(output.getTranslateY()); outputStr.appendUnichar(','); outputStr.appendScalar(output.getPerspX()); outputStr.appendUnichar(','); outputStr.appendScalar(output.getPerspY()); outputStr.append(",1]"); parser._startElement("matrix"); parser._addAttributeLen("matrix", outputStr.c_str(), outputStr.size()); parser._endElement(); } #if 0 // incomplete if (parser.fTransformClips.size() > 0) { // need to reset the clip when the 'g' scope is ended parser._startElement("add"); const char* start = strchr(current->f_clipPath.c_str(), '#') + 1; SkASSERT(start); parser._addAttributeLen("use", start, strlen(start) - 1); parser._endElement(); // clip } #endif }