DrawTextOp
DrawTextOpあとで調べよう。
1425 class DrawTextOp : public DrawBoundedOp { 1426 public: 1427 DrawTextOp(const char* text, int bytesCount, int count, float x, float y, 1428 const float* positions, SkPaint* paint, float totalAdvance, const Rect& bounds) 1429 : DrawBoundedOp(bounds, paint), mText(text), mBytesCount(bytesCount), mCount(count), 1430 mX(x), mY(y), mPositions(positions), mTotalAdvance(totalAdvance) { 1431 memset(&mPrecacheTransform.data[0], 0xff, 16 * sizeof(float)); 1432 } 1433 1434 virtual void onDefer(OpenGLRenderer& renderer, DeferInfo& deferInfo, 1435 const DeferredDisplayState& state) { 1436 SkPaint* paint = getPaint(renderer); 1437 FontRenderer& fontRenderer = renderer.getCaches().fontRenderer->getFontRenderer(paint); 1438 const mat4& transform = renderer.findBestFontTransform(state.mMatrix); 1439 if (mPrecacheTransform != transform) { 1440 fontRenderer.precache(paint, mText, mCount, transform); 1441 mPrecacheTransform = transform; 1442 } 1443 deferInfo.batchId = mPaint->getColor() == 0xff000000 ? 1444 DeferredDisplayList::kOpBatch_Text : 1445 DeferredDisplayList::kOpBatch_ColorText; 1446 1447 deferInfo.mergeId = (mergeid_t)mPaint->getColor(); 1448 1449 // don't merge decorated text - the decorations won't draw in order 1450 bool noDecorations = !(mPaint->getFlags() & (SkPaint::kUnderlineText_Flag | 1451 SkPaint::kStrikeThruText_Flag)); 1452 deferInfo.mergeable = state.mMatrix.isPureTranslate() && noDecorations && 1453 OpenGLRenderer::getXfermodeDirect(mPaint) == SkXfermode::kSrcOver_Mode; 1454 } 1455 1456 virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty) { 1457 Rect bounds; 1458 getLocalBounds(renderer.getDrawModifiers(), bounds); 1459 return renderer.drawText(mText, mBytesCount, mCount, mX, mY, 1460 mPositions, getPaint(renderer), mTotalAdvance, bounds); 1461 } 1462 1463 virtual status_t multiDraw(OpenGLRenderer& renderer, Rect& dirty, 1464 const Vector<OpStatePair>& ops, const Rect& bounds) { 1465 status_t status = DrawGlInfo::kStatusDone; 1466 for (unsigned int i = 0; i < ops.size(); i++) { 1467 const DeferredDisplayState& state = *(ops[i].state); 1468 DrawOpMode drawOpMode = (i == ops.size() - 1) ? kDrawOpMode_Flush : kDrawOpMode_Defer; 1469 renderer.restoreDisplayState(state, true); // restore all but the clip 1470 1471 DrawTextOp& op = *((DrawTextOp*)ops[i].op); 1472 // quickReject() will not occure in drawText() so we can use mLocalBounds 1473 // directly, we do not need to account for shadow by calling getLocalBounds() 1474 status |= renderer.drawText(op.mText, op.mBytesCount, op.mCount, op.mX, op.mY, 1475 op.mPositions, op.getPaint(renderer), op.mTotalAdvance, op.mLocalBounds, 1476 drawOpMode); 1477 } 1478 return status; 1479 } 1480 1481 virtual void output(int level, uint32_t logFlags) const { 1482 OP_LOG("Draw Text of count %d, bytes %d", mCount, mBytesCount); 1483 } 1484 1485 virtual const char* name() { return "DrawText"; } 1486 1487 private: 1488 const char* mText; 1489 int mBytesCount; 1490 int mCount; 1491 float mX; 1492 float mY; 1493 const float* mPositions; 1494 float mTotalAdvance; 1495 mat4 mPrecacheTransform; 1496 };