int SkDeferredCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags) { drawingCanvas()->saveLayer(bounds, paint, flags); int count = this->INHERITED::save(flags); this->clipRectBounds(bounds, flags, NULL); return count; }
DEF_GPUTEST(GpuDrawPath, reporter, factory) { return; for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) { GrContextFactory::GLContextType glType = static_cast<GrContextFactory::GLContextType>(type); GrContext* grContext = factory->get(glType); if (NULL == grContext) { continue; } static const int sampleCounts[] = { 0, 4, 16 }; for (size_t i = 0; i < SK_ARRAY_COUNT(sampleCounts); ++i) { const int W = 255; const int H = 255; GrTextureDesc desc; desc.fConfig = kSkia8888_GrPixelConfig; desc.fFlags = kRenderTarget_GrTextureFlagBit; desc.fWidth = W; desc.fHeight = H; desc.fSampleCnt = sampleCounts[i]; SkAutoTUnref<GrTexture> texture(grContext->createUncachedTexture(desc, NULL, 0)); SkAutoTUnref<SkGpuDevice> device(SkNEW_ARGS(SkGpuDevice, (grContext, texture.get()))); SkCanvas drawingCanvas(device.get()); test_drawPathEmpty(reporter, &drawingCanvas); } } }
void onDraw(const int loops, SkCanvas* canvas) override { // The canvas is not actually used for this test except to provide // configuration information: gpu, multisampling, size, etc? SkImageInfo info = SkImageInfo::MakeN32Premul(kSurfaceWidth, kSurfaceHeight); const SkRect fullCanvasRect = SkRect::MakeWH( SkIntToScalar(kSurfaceWidth), SkIntToScalar(kSurfaceHeight)); SkAutoTUnref<SkSurface> surface(canvas->newSurface(info)); // newSurface() can return NULL for several reasons, so we need to check if (NULL == surface.get()) { SkDebugf("DeferredSurfaceCopyBench newSurface failed, bench results are meaningless\n"); return; // should we signal the caller that we hit an error? } SkAutoTUnref<SkDeferredCanvas> drawingCanvas(SkDeferredCanvas::Create(surface)); for (int iteration = 0; iteration < loops; iteration++) { drawingCanvas->clear(0); SkAutoTUnref<SkImage> image(drawingCanvas->newImageSnapshot()); SkPaint paint; if (!fDiscardableContents) { // If paint is not opaque, prior canvas contents are // not discardable because they are needed for compositing. paint.setAlpha(127); } drawingCanvas->drawRect(fullCanvasRect, paint); // Trigger copy on write, which should be faster in the discardable case. drawingCanvas->flush(); } }
void SkDeferredCanvas::drawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], SkScalar constY, const SkPaint& paint) { drawingCanvas()->drawPosTextH(text, byteLength, xpos, constY, paint); }
void SkDeferredCanvas::clear(SkColor color) { // purge pending commands if (fDeferredDrawing) { getDeferredDevice()->contentsCleared(); } drawingCanvas()->clear(color); }
void SkDeferredCanvas::drawPaint(const SkPaint& paint) { if (fDeferredDrawing && isFullFrame(NULL, &paint) && isPaintOpaque(paint)) { getDeferredDevice()->purgePending(); } drawingCanvas()->drawPaint(paint); }
void SkDeferredCanvas::drawTextOnPath(const void* text, size_t byteLength, const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) { drawingCanvas()->drawTextOnPath(text, byteLength, path, matrix, paint); }
void SkDeferredCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m, const SkPaint* paint) { // TODO: reset recording canvas if paint+bitmap is opaque and clip rect // covers canvas entirely and transformed bitmap covers canvas entirely drawingCanvas()->drawBitmapMatrix(bitmap, m, paint); flushIfNeeded(bitmap); }
void SkDeferredCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { if (fDeferredDrawing && isFullFrame(&rect, &paint) && isPaintOpaque(&paint)) { getDeferredDevice()->contentsCleared(); } drawingCanvas()->drawRect(rect, paint); }
void SkDeferredCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst, const SkPaint* paint) { // TODO: reset recording canvas if paint+bitmap is opaque and clip rect // covers canvas entirely and dst covers canvas entirely drawingCanvas()->drawBitmapNine(bitmap, center, dst, paint); flushIfNeeded(bitmap); }
void SkDeferredCanvas::setDeferredDrawing(bool val) { validate(); // Must set device before calling this method SkASSERT(drawingCanvas()->getSaveCount() == 1); if (val != fDeferredDrawing) { if (fDeferredDrawing) { // Going live. getDeferredDevice()->flushPending(); } fDeferredDrawing = val; } }
bool SkDeferredCanvas::isFullFrame(const SkRect* rect, const SkPaint* paint) const { SkCanvas* canvas = drawingCanvas(); SkISize canvasSize = getDeviceSize(); if (rect) { if (!canvas->getTotalMatrix().rectStaysRect()) { return false; // conservative } SkRect transformedRect; canvas->getTotalMatrix().mapRect(&transformedRect, *rect); if (paint) { SkPaint::Style paintStyle = paint->getStyle(); if (!(paintStyle == SkPaint::kFill_Style || paintStyle == SkPaint::kStrokeAndFill_Style)) { return false; } if (paint->getMaskFilter() || paint->getLooper() || paint->getPathEffect() || paint->getImageFilter()) { return false; // conservative } } // The following test holds with AA enabled, and is conservative // by a 0.5 pixel margin with AA disabled if (transformedRect.fLeft > SkIntToScalar(0) || transformedRect.fTop > SkIntToScalar(0) || transformedRect.fRight < SkIntToScalar(canvasSize.fWidth) || transformedRect.fBottom < SkIntToScalar(canvasSize.fHeight)) { return false; } } switch (canvas->getClipType()) { case SkCanvas::kRect_ClipType : { SkIRect bounds; canvas->getClipDeviceBounds(&bounds); if (bounds.fLeft > 0 || bounds.fTop > 0 || bounds.fRight < canvasSize.fWidth || bounds.fBottom < canvasSize.fHeight) return false; } break; case SkCanvas::kComplex_ClipType : return false; // conservative case SkCanvas::kEmpty_ClipType: default: break; }; return true; }
void CanvasRenderingContext2D::drawFocusRing(const Path& path) { m_usageCounters.numDrawFocusCalls++; if (!drawingCanvas()) return; SkColor color = LayoutTheme::theme().focusRingColor().rgb(); const int focusRingWidth = 5; drawPlatformFocusRing(path.getSkPath(), drawingCanvas(), color, focusRingWidth); // We need to add focusRingWidth to dirtyRect. StrokeData strokeData; strokeData.setThickness(focusRingWidth); SkIRect dirtyRect; if (!computeDirtyRect(path.strokeBoundingRect(strokeData), &dirtyRect)) return; didDraw(dirtyRect); }
void SkDeferredCanvas::drawVertices(VertexMode vmode, int vertexCount, const SkPoint vertices[], const SkPoint texs[], const SkColor colors[], SkXfermode* xmode, const uint16_t indices[], int indexCount, const SkPaint& paint) { drawingCanvas()->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode, indices, indexCount, paint); }
void SkDeferredCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top, const SkPaint* paint) { SkRect bitmapRect = SkRect::MakeXYWH(left, top, SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())); if (fDeferredDrawing && isFullFrame(&bitmapRect, paint) && isPaintOpaque(paint, &bitmap)) { getDeferredDevice()->contentsCleared(); } drawingCanvas()->drawBitmap(bitmap, left, top, paint); flushIfNeeded(bitmap); }
void CanvasRenderingContext2D::addHitRegion(const HitRegionOptions& options, ExceptionState& exceptionState) { if (options.id().isEmpty() && !options.control()) { exceptionState.throwDOMException(NotSupportedError, "Both id and control are null."); return; } if (options.control() && !canvas()->isSupportedInteractiveCanvasFallback(*options.control())) { exceptionState.throwDOMException(NotSupportedError, "The control is neither null nor a " "supported interactive canvas fallback " "element."); return; } Path hitRegionPath = options.hasPath() ? options.path()->path() : m_path; SkCanvas* c = drawingCanvas(); if (hitRegionPath.isEmpty() || !c || !state().isTransformInvertible() || !c->getClipDeviceBounds(0)) { exceptionState.throwDOMException(NotSupportedError, "The specified path has no pixels."); return; } hitRegionPath.transform(state().transform()); if (state().hasClip()) { hitRegionPath.intersectPath(state().getCurrentClipPath()); if (hitRegionPath.isEmpty()) exceptionState.throwDOMException(NotSupportedError, "The specified path has no pixels."); } if (!m_hitRegionManager) m_hitRegionManager = HitRegionManager::create(); // Remove previous region (with id or control) m_hitRegionManager->removeHitRegionById(options.id()); m_hitRegionManager->removeHitRegionByControl(options.control()); HitRegion* hitRegion = HitRegion::create(hitRegionPath, options); Element* element = hitRegion->control(); if (element && element->isDescendantOf(canvas())) updateElementAccessibility(hitRegion->path(), hitRegion->control()); m_hitRegionManager->addHitRegion(hitRegion); }
void SkDeferredCanvas::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src, const SkRect& dst, const SkPaint* paint) { if (fDeferredDrawing && isFullFrame(&dst, paint) && isPaintOpaque(paint, &bitmap)) { getDeferredDevice()->contentsCleared(); } drawingCanvas()->drawBitmapRect(bitmap, src, dst, paint); flushIfNeeded(bitmap); }
void SkDeferredCanvas::drawSprite(const SkBitmap& bitmap, int left, int top, const SkPaint* paint) { SkRect bitmapRect = SkRect::MakeXYWH(left, top, bitmap.width(), bitmap.height()); if (fDeferredDrawing && isFullFrame(&bitmapRect, paint) && isPaintOpaque(*paint, &bitmap)) { getDeferredDevice()->purgePending(); } drawingCanvas()->drawSprite(bitmap, left, top, paint); flushIfNeeded(bitmap); }
void SkDeferredCanvas::drawPicture(SkPicture& picture) { drawingCanvas()->drawPicture(picture); }
void SkDeferredCanvas::setMatrix(const SkMatrix& matrix) { drawingCanvas()->setMatrix(matrix); this->INHERITED::setMatrix(matrix); }
void SkDeferredCanvas::drawPosText(const void* text, size_t byteLength, const SkPoint pos[], const SkPaint& paint) { drawingCanvas()->drawPosText(text, byteLength, pos, paint); }
void SkDeferredCanvas::drawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint) { drawingCanvas()->drawText(text, byteLength, x, y, paint); }
bool SkDeferredCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAntiAlias) { drawingCanvas()->clipRect(rect, op, doAntiAlias); return this->INHERITED::clipRect(rect, op, doAntiAlias); }
bool SkDeferredCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAntiAlias) { drawingCanvas()->clipPath(path, op, doAntiAlias); return this->INHERITED::clipPath(path, op, doAntiAlias); }
bool SkDeferredCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) { drawingCanvas()->clipRegion(deviceRgn, op); return this->INHERITED::clipRegion(deviceRgn, op); }
SkDrawFilter* SkDeferredCanvas::setDrawFilter(SkDrawFilter* filter) { drawingCanvas()->setDrawFilter(filter); return INHERITED::setDrawFilter(filter); }
SkBounder* SkDeferredCanvas::setBounder(SkBounder* bounder) { drawingCanvas()->setBounder(bounder); return INHERITED::setBounder(bounder); }
void SkDeferredCanvas::drawPath(const SkPath& path, const SkPaint& paint) { drawingCanvas()->drawPath(path, paint); }
SkCanvas* SkDeferredCanvas::canvasForDrawIter() { return drawingCanvas(); }
void SkDeferredCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[], const SkPaint& paint) { drawingCanvas()->drawPoints(mode, count, pts, paint); }