SkCanvas* SkDocument::beginPage(SkScalar width, SkScalar height, const SkRect* content) { if (width <= 0 || height <= 0) { return NULL; } SkRect outer = SkRect::MakeWH(width, height); SkRect inner; if (content) { inner = *content; if (!inner.intersect(outer)) { return NULL; } } else { inner = outer; } for (;;) { switch (fState) { case kBetweenPages_State: fState = kInPage_State; return this->onBeginPage(width, height, inner); case kInPage_State: this->endPage(); break; case kClosed_State: return NULL; } } SkDEBUGFAIL("never get here"); return NULL; }
sk_sp<SkImage> SkImageMakeRasterCopyAndAssignColorSpace(const SkImage* src, SkColorSpace* colorSpace) { // Read the pixels out of the source image, with no conversion SkImageInfo info = as_IB(src)->onImageInfo(); if (kUnknown_SkColorType == info.colorType()) { SkDEBUGFAIL("Unexpected color type"); return nullptr; } size_t rowBytes = info.minRowBytes(); size_t size = info.computeByteSize(rowBytes); if (SkImageInfo::ByteSizeOverflowed(size)) { return nullptr; } auto data = SkData::MakeUninitialized(size); if (!data) { return nullptr; } SkPixmap pm(info, data->writable_data(), rowBytes); if (!src->readPixels(pm, 0, 0, SkImage::kDisallow_CachingHint)) { return nullptr; } // Wrap them in a new image with a different color space return SkImage::MakeRasterData(info.makeColorSpace(sk_ref_sp(colorSpace)), data, rowBytes); }
void Task::spawnChild(Task* task) { if (!task->usesGpu()) { fTaskRunner->add(task); } else { SkDEBUGFAIL("Sorry, we can't spawn GPU tasks. :( See comment in TaskRunner::wait()."); } }
void GrGLBuffer::onUnmap() { if (this->wasDestroyed()) { return; } VALIDATE(); SkASSERT(this->isMapped()); if (0 == fBufferID) { fMapPtr = nullptr; return; } // bind buffer handles the dirty context switch (this->glCaps().mapBufferType()) { case GrGLCaps::kNone_MapBufferType: SkDEBUGFAIL("Shouldn't get here."); return; case GrGLCaps::kMapBuffer_MapBufferType: // fall through case GrGLCaps::kMapBufferRange_MapBufferType: { GrGLenum target = this->glGpu()->bindBuffer(fIntendedType, this); GL_CALL(UnmapBuffer(target)); break; } case GrGLCaps::kChromium_MapBufferType: this->glGpu()->bindBuffer(fIntendedType, this); // TODO: Is this needed? GL_CALL(UnmapBufferSubData(fMapPtr)); break; } fMapPtr = nullptr; }
static void showPathContours(SkPath::Iter& iter, const char* pathName) { uint8_t verb; SkPoint pts[4]; while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { switch (verb) { case SkPath::kMove_Verb: SkDebugf(" %s.moveTo(%#1.9gf, %#1.9gf);\n", pathName, pts[0].fX, pts[0].fY); continue; case SkPath::kLine_Verb: SkDebugf(" %s.lineTo(%#1.9gf, %#1.9gf);\n", pathName, pts[1].fX, pts[1].fY); break; case SkPath::kQuad_Verb: SkDebugf(" %s.quadTo(%#1.9gf, %#1.9gf, %#1.9gf, %#1.9gf);\n", pathName, pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY); break; case SkPath::kCubic_Verb: SkDebugf(" %s.cubicTo(%#1.9gf, %#1.9gf, %#1.9gf, %#1.9gf, %#1.9gf, %#1.9gf);\n", pathName, pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY, pts[3].fX, pts[3].fY); break; case SkPath::kClose_Verb: SkDebugf(" %s.close();\n", pathName); break; default: SkDEBUGFAIL("bad verb"); return; } } }
const char* SkImageDecoder::GetFormatName(Format format) { switch (format) { case kUnknown_Format: return "Unknown Format"; case kBMP_Format: return "BMP"; case kGIF_Format: return "GIF"; case kICO_Format: return "ICO"; case kPKM_Format: return "PKM"; case kKTX_Format: return "KTX"; case kJPEG_Format: return "JPEG"; case kPNG_Format: return "PNG"; case kWBMP_Format: return "WBMP"; case kWEBP_Format: return "WEBP"; default: SkDEBUGFAIL("Invalid format type!"); } return "Unknown Format"; }
static void set_paintflat(SkPaint* paint, SkFlattenable* obj, unsigned paintFlat) { SkASSERT(paintFlat < kCount_PaintFlats); switch (paintFlat) { case kColorFilter_PaintFlat: paint->setColorFilter((SkColorFilter*)obj); break; case kDrawLooper_PaintFlat: paint->setLooper((SkDrawLooper*)obj); break; case kMaskFilter_PaintFlat: paint->setMaskFilter((SkMaskFilter*)obj); break; case kPathEffect_PaintFlat: paint->setPathEffect((SkPathEffect*)obj); break; case kRasterizer_PaintFlat: paint->setRasterizer((SkRasterizer*)obj); break; case kShader_PaintFlat: paint->setShader((SkShader*)obj); break; case kImageFilter_PaintFlat: paint->setImageFilter((SkImageFilter*)obj); break; case kXfermode_PaintFlat: paint->setXfermode((SkXfermode*)obj); break; default: SkDEBUGFAIL("never gets here"); } }
static void drawFrame(SkBitmap* bm, const SavedImage* frame, const ColorMapObject* cmap) { int transparent = -1; for (int i = 0; i < frame->ExtensionBlockCount; ++i) { ExtensionBlock* eb = frame->ExtensionBlocks + i; if (eb->Function == GRAPHICS_EXT_FUNC_CODE && eb->ByteCount == 4) { bool has_transparency = ((eb->Bytes[0] & 1) == 1); if (has_transparency) { transparent = (unsigned char)eb->Bytes[3]; } } } if (frame->ImageDesc.ColorMap != NULL) { // use local color table cmap = frame->ImageDesc.ColorMap; } if (cmap == NULL || cmap->ColorCount != (1 << cmap->BitsPerPixel)) { SkDEBUGFAIL("bad colortable setup"); return; } #if GIFLIB_MAJOR < 5 // before GIFLIB 5, de-interlacing wasn't done by library at load time if (frame->ImageDesc.Interlace) { blitInterlace(bm, frame, cmap, transparent); return; } #endif blitNormal(bm, frame, cmap, transparent); }
/* Fill out buffer with the compressed format Ganesh expects from a colortable based bitmap. [palette (colortable) + indices]. At the moment Ganesh only supports 8bit version. If Ganesh allowed we others we could detect that the colortable.count is <= 16, and then repack the indices as nibbles to save RAM, but it would take more time (i.e. a lot slower than memcpy), so skipping that for now. Ganesh wants a full 256 palette entry, even though Skia's ctable is only as big as the colortable.count says it is. */ static void build_compressed_data(void* buffer, const SkBitmap& bitmap) { SkASSERT(SkBitmap::kIndex8_Config == bitmap.config()); SkAutoLockPixels apl(bitmap); if (!bitmap.readyToDraw()) { SkDEBUGFAIL("bitmap not ready to draw!"); return; } SkColorTable* ctable = bitmap.getColorTable(); char* dst = (char*)buffer; memcpy(dst, ctable->lockColors(), ctable->count() * sizeof(SkPMColor)); ctable->unlockColors(false); // always skip a full 256 number of entries, even if we memcpy'd fewer dst += kGrColorTableSize; if (bitmap.width() == bitmap.rowBytes()) { memcpy(dst, bitmap.getPixels(), bitmap.getSize()); } else { // need to trim off the extra bytes per row size_t width = bitmap.width(); size_t rowBytes = bitmap.rowBytes(); const char* src = (const char*)bitmap.getPixels(); for (int y = 0; y < bitmap.height(); y++) { memcpy(dst, src, width); src += rowBytes; dst += width; } } }
static SkTypeface* find_best_face(const FamilyRec* family, SkTypeface::Style style) { SkTypeface* const* faces = family->fFaces; if (faces[style] != NULL) { // exact match return faces[style]; } // look for a matching bold style = (SkTypeface::Style)(style ^ SkTypeface::kItalic); if (faces[style] != NULL) { return faces[style]; } // look for the plain if (faces[SkTypeface::kNormal] != NULL) { return faces[SkTypeface::kNormal]; } // look for anything for (int i = 0; i < 4; i++) { if (faces[i] != NULL) { return faces[i]; } } // should never get here, since the faces list should not be empty SkDEBUGFAIL("faces list is empty"); return NULL; }
SkScalar SkPath1DPathEffect::next(SkPath* dst, SkScalar distance, SkPathMeasure& meas) const { switch (fStyle) { case kTranslate_Style: { SkPoint pos; if (meas.getPosTan(distance, &pos, nullptr)) { dst->addPath(fPath, pos.fX, pos.fY); } } break; case kRotate_Style: { SkMatrix matrix; if (meas.getMatrix(distance, &matrix)) { dst->addPath(fPath, matrix); } } break; case kMorph_Style: morphpath(dst, fPath, meas, distance); break; default: SkDEBUGFAIL("unknown Style enum"); break; } return fAdvance; }
const char* SkDrawCommand::GetCommandString(DrawType type) { switch (type) { case UNUSED: SkDEBUGFAIL("DrawType UNUSED\n"); break; case DRAW_CLEAR: return "Clear"; case CLIP_PATH: return "Clip Path"; case CLIP_REGION: return "Clip Region"; case CLIP_RECT: return "Clip Rect"; case CLIP_RRECT: return "Clip RRect"; case CONCAT: return "Concat"; case DRAW_BITMAP: return "Draw Bitmap"; case DRAW_BITMAP_MATRIX: return "Draw Bitmap Matrix"; case DRAW_BITMAP_NINE: return "Draw Bitmap Nine"; case DRAW_BITMAP_RECT_TO_RECT: return "Draw Bitmap Rect"; case DRAW_DATA: return "Draw Data"; case DRAW_OVAL: return "Draw Oval"; case DRAW_PAINT: return "Draw Paint"; case DRAW_PATH: return "Draw Path"; case DRAW_PICTURE: return "Draw Picture"; case DRAW_POINTS: return "Draw Points"; case DRAW_POS_TEXT: return "Draw Pos Text"; case DRAW_POS_TEXT_H: return "Draw Pos Text H"; case DRAW_RECT: return "Draw Rect"; case DRAW_RRECT: return "Draw RRect"; case DRAW_SPRITE: return "Draw Sprite"; case DRAW_TEXT: return "Draw Text"; case DRAW_TEXT_ON_PATH: return "Draw Text On Path"; case DRAW_VERTICES: return "Draw Vertices"; case RESTORE: return "Restore"; case ROTATE: return "Rotate"; case SAVE: return "Save"; case SAVE_LAYER: return "Save Layer"; case SCALE: return "Scale"; case SET_MATRIX: return "Set Matrix"; case SKEW: return "Skew"; case TRANSLATE: return "Translate"; case NOOP: return "NoOp"; case BEGIN_COMMENT_GROUP: return "BeginCommentGroup"; case COMMENT: return "Comment"; case END_COMMENT_GROUP: return "EndCommentGroup"; default: SkDebugf("DrawType error 0x%08x\n", type); SkASSERT(0); break; } SkDEBUGFAIL("DrawType UNUSED\n"); return NULL; }
void add (DiffRecord* drp) { uint32_t mismatchValue; if (drp->fBase.fFilename.equals(drp->fComparison.fFilename)) { fResultsOfType[drp->fResult].push(new SkString(drp->fBase.fFilename)); } else { SkString* blame = new SkString("("); blame->append(drp->fBase.fFilename); blame->append(", "); blame->append(drp->fComparison.fFilename); blame->append(")"); fResultsOfType[drp->fResult].push(blame); } switch (drp->fResult) { case DiffRecord::kEqualBits_Result: fNumMatches++; break; case DiffRecord::kEqualPixels_Result: fNumMatches++; break; case DiffRecord::kDifferentSizes_Result: fNumMismatches++; break; case DiffRecord::kDifferentPixels_Result: fNumMismatches++; if (drp->fFractionDifference * 100 > fMaxMismatchPercent) { fMaxMismatchPercent = drp->fFractionDifference * 100; } mismatchValue = MAX3(drp->fMaxMismatchR, drp->fMaxMismatchG, drp->fMaxMismatchB); if (mismatchValue > fMaxMismatchV) { fMaxMismatchV = mismatchValue; } break; case DiffRecord::kCouldNotCompare_Result: fNumMismatches++; fStatusOfType[drp->fBase.fStatus][drp->fComparison.fStatus].push( new SkString(drp->fBase.fFilename)); break; case DiffRecord::kUnknown_Result: SkDEBUGFAIL("adding uncategorized DiffRecord"); break; default: SkDEBUGFAIL("adding DiffRecord with unhandled fResult value"); break; } }
void SkShader::shadeSpan16(int x, int y, uint16_t span16[], int count) { SkASSERT(span16); SkASSERT(count > 0); SkASSERT(this->canCallShadeSpan16()); // basically, if we get here, the subclass screwed up SkDEBUGFAIL("kHasSpan16 flag is set, but shadeSpan16() not implemented"); }
void SkColorFilter::filterSpan16(const uint16_t s[], int count, uint16_t d[]) { SkASSERT(this->getFlags() & SkColorFilter::kHasFilter16_Flag); SkDEBUGFAIL("missing implementation of SkColorFilter::filterSpan16"); if (d != s) { memcpy(d, s, count * sizeof(uint16_t)); } }
// static SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( uint32_t fontID, SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo, const uint32_t* glyphIDs, uint32_t glyphIDsCount) { SkDEBUGFAIL("SkFontHost::GetAdvancedTypefaceMetrics unimplemented"); return NULL; }
void SkTransparentShader::TransparentShaderContext::shadeSpan(int x, int y, SkPMColor span[], int count) { unsigned scale = SkAlpha255To256(this->getPaintAlpha()); switch (fDevice->colorType()) { case kN32_SkColorType: if (scale == 256) { SkPMColor* src = fDevice->getAddr32(x, y); if (src != span) { memcpy(span, src, count * sizeof(SkPMColor)); } } else { const SkPMColor* src = fDevice->getAddr32(x, y); for (int i = count - 1; i >= 0; --i) { span[i] = SkAlphaMulQ(src[i], scale); } } break; case kRGB_565_SkColorType: { const uint16_t* src = fDevice->getAddr16(x, y); if (scale == 256) { for (int i = count - 1; i >= 0; --i) { span[i] = SkPixel16ToPixel32(src[i]); } } else { unsigned alpha = this->getPaintAlpha(); for (int i = count - 1; i >= 0; --i) { uint16_t c = src[i]; unsigned r = SkPacked16ToR32(c); unsigned g = SkPacked16ToG32(c); unsigned b = SkPacked16ToB32(c); span[i] = SkPackARGB32( alpha, SkAlphaMul(r, scale), SkAlphaMul(g, scale), SkAlphaMul(b, scale)); } } break; } case kAlpha_8_SkColorType: { const uint8_t* src = fDevice->getAddr8(x, y); if (scale == 256) { for (int i = count - 1; i >= 0; --i) { span[i] = SkPackARGB32(src[i], 0, 0, 0); } } else { for (int i = count - 1; i >= 0; --i) { span[i] = SkPackARGB32(SkAlphaMul(src[i], scale), 0, 0, 0); } } break; } default: SkDEBUGFAIL("colorType not supported as a destination device"); break; } }
SkPath SubsetContours::getSubsetPath() const { SkPath result; result.setFillType(fPath.getFillType()); if (!fSelected.count()) { return result; } SkPath::RawIter iter(fPath); uint8_t verb; SkPoint pts[4]; int contourCount = 0; bool enabled = fSelected[0]; bool addMoveTo = true; while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { if (enabled && addMoveTo) { result.moveTo(pts[0]); addMoveTo = false; } switch (verb) { case SkPath::kMove_Verb: break; case SkPath::kLine_Verb: if (enabled) { result.lineTo(pts[1]); } break; case SkPath::kQuad_Verb: if (enabled) { result.quadTo(pts[1], pts[2]); } break; case SkPath::kConic_Verb: if (enabled) { result.conicTo(pts[1], pts[2], iter.conicWeight()); } break; case SkPath::kCubic_Verb: if (enabled) { result.cubicTo(pts[1], pts[2], pts[3]); } break; case SkPath::kClose_Verb: if (enabled) { result.close(); } if (++contourCount >= fSelected.count()) { break; } enabled = fSelected[contourCount]; addMoveTo = true; continue; default: SkDEBUGFAIL("bad verb"); return result; } } return result; }
// Compiles a GL shader and attaches it to a program. Returns the shader ID if // successful, or 0 if not. static GrGLuint attach_shader(const GrGLContext& glCtx, GrGLuint programId, GrGLenum type, const SkString& shaderSrc) { const GrGLInterface* gli = glCtx.interface(); GrGLuint shaderId; GR_GL_CALL_RET(gli, shaderId, CreateShader(type)); if (0 == shaderId) { return 0; } const GrGLchar* sourceStr = shaderSrc.c_str(); GrGLint sourceLength = static_cast<GrGLint>(shaderSrc.size()); GR_GL_CALL(gli, ShaderSource(shaderId, 1, &sourceStr, &sourceLength)); GR_GL_CALL(gli, CompileShader(shaderId)); // Calling GetShaderiv in Chromium is quite expensive. Assume success in release builds. bool checkCompiled = !glCtx.isChromium(); #ifdef SK_DEBUG checkCompiled = true; #endif if (checkCompiled) { GrGLint compiled = GR_GL_INIT_ZERO; GR_GL_CALL(gli, GetShaderiv(shaderId, GR_GL_COMPILE_STATUS, &compiled)); if (!compiled) { GrGLint infoLen = GR_GL_INIT_ZERO; GR_GL_CALL(gli, GetShaderiv(shaderId, GR_GL_INFO_LOG_LENGTH, &infoLen)); SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger if (infoLen > 0) { // retrieve length even though we don't need it to workaround bug in Chromium cmd // buffer param validation. GrGLsizei length = GR_GL_INIT_ZERO; GR_GL_CALL(gli, GetShaderInfoLog(shaderId, infoLen+1, &length, (char*)log.get())); GrPrintf(shaderSrc.c_str()); GrPrintf("\n%s", log.get()); } SkDEBUGFAIL("Shader compilation failed!"); GR_GL_CALL(gli, DeleteShader(shaderId)); return 0; } } if (c_PrintShaders) { GrPrintf(shaderSrc.c_str()); GrPrintf("\n"); } // Attach the shader, but defer deletion until after we have linked the program. // This works around a bug in the Android emulator's GLES2 wrapper which // will immediately delete the shader object and free its memory even though it's // attached to a program, which then causes glLinkProgram to fail. GR_GL_CALL(gli, AttachShader(programId, shaderId)); return shaderId; }
GrTexture* SkBlurImageFilter::onFilterImageGPU(Proxy* proxy, GrTexture* src, const SkRect& rect) { #if SK_SUPPORT_GPU SkAutoTUnref<GrTexture> input(this->getInputResultAsTexture(proxy, src, rect)); return src->getContext()->gaussianBlur(input.get(), false, rect, fSigma.width(), fSigma.height()); #else SkDEBUGFAIL("Should not call in GPU-less build"); return NULL; #endif }
bool GrGLShaderBuilder::finish() { SkASSERT(0 == fProgramID); GL_CALL_RET(fProgramID, CreateProgram()); if (!fProgramID) { return false; } SkTDArray<GrGLuint> shadersToDelete; if (!this->compileAndAttachShaders(fProgramID, &shadersToDelete)) { GL_CALL(DeleteProgram(fProgramID)); return false; } this->bindProgramLocations(fProgramID); GL_CALL(LinkProgram(fProgramID)); // Calling GetProgramiv is expensive in Chromium. Assume success in release builds. bool checkLinked = !fGpu->ctxInfo().isChromium(); #ifdef SK_DEBUG checkLinked = true; #endif if (checkLinked) { GrGLint linked = GR_GL_INIT_ZERO; GL_CALL(GetProgramiv(fProgramID, GR_GL_LINK_STATUS, &linked)); if (!linked) { GrGLint infoLen = GR_GL_INIT_ZERO; GL_CALL(GetProgramiv(fProgramID, GR_GL_INFO_LOG_LENGTH, &infoLen)); SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger if (infoLen > 0) { // retrieve length even though we don't need it to workaround // bug in chrome cmd buffer param validation. GrGLsizei length = GR_GL_INIT_ZERO; GL_CALL(GetProgramInfoLog(fProgramID, infoLen+1, &length, (char*)log.get())); GrPrintf((char*)log.get()); } SkDEBUGFAIL("Error linking program"); GL_CALL(DeleteProgram(fProgramID)); fProgramID = 0; return false; } } this->resolveProgramLocations(fProgramID); for (int i = 0; i < shadersToDelete.count(); ++i) { GL_CALL(DeleteShader(shadersToDelete[i])); } return true; }
inline SkMask::Format SkMaskFormat_for_SkBitmapConfig(SkBitmap::Config config) { switch (config) { case SkBitmap::kA8_Config: return SkMask::kA8_Format; case SkBitmap::kARGB_8888_Config: return SkMask::kARGB32_Format; default: SkDEBUGFAIL("unsupported SkBitmap::Config"); return SkMask::kA8_Format; } }
static void showPathData(const SkPath& path) { SkPath::RawIter iter(path); uint8_t verb; SkPoint pts[4]; SkPoint firstPt = {0, 0}, lastPt = {0, 0}; bool firstPtSet = false; bool lastPtSet = true; while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { switch (verb) { case SkPath::kMove_Verb: if (firstPtSet && lastPtSet && firstPt != lastPt) { SkDebugf("{{%1.9g,%1.9g}, {%1.9g,%1.9g}},\n", lastPt.fX, lastPt.fY, firstPt.fX, firstPt.fY); lastPtSet = false; } firstPt = pts[0]; firstPtSet = true; continue; case SkPath::kLine_Verb: SkDebugf("{{%1.9g,%1.9g}, {%1.9g,%1.9g}},\n", pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY); lastPt = pts[1]; lastPtSet = true; break; case SkPath::kQuad_Verb: SkDebugf("{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}},\n", pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY); lastPt = pts[2]; lastPtSet = true; break; case SkPath::kCubic_Verb: SkDebugf("{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}},\n", pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY, pts[3].fX, pts[3].fY); lastPt = pts[3]; lastPtSet = true; break; case SkPath::kClose_Verb: if (firstPtSet && lastPtSet && firstPt != lastPt) { SkDebugf("{{%1.9g,%1.9g}, {%1.9g,%1.9g}},\n", lastPt.fX, lastPt.fY, firstPt.fX, firstPt.fY); } firstPtSet = lastPtSet = false; break; default: SkDEBUGFAIL("bad verb"); return; } } if (firstPtSet && lastPtSet && firstPt != lastPt) { SkDebugf("{{%1.9g,%1.9g}, {%1.9g,%1.9g}},\n", lastPt.fX, lastPt.fY, firstPt.fX, firstPt.fY); } }
static const char* geomtypename(GeomType gt) { switch (gt) { case kRect_GeomType: return "rectangle"; case kOval_GeomType: return "oval"; default: SkDEBUGFAIL("unknown geometry type"); return "error"; } }
inline SkMask::Format SkMaskFormat_for_SkColorType(SkColorType colorType) { switch (colorType) { case kAlpha_8_SkColorType: return SkMask::kA8_Format; case kN32_SkColorType: return SkMask::kARGB32_Format; default: SkDEBUGFAIL("unsupported SkBitmap::Config"); return SkMask::kA8_Format; } }
inline SkColorType SkColorType_for_FTPixelMode(FT_Pixel_Mode pixel_mode) { switch (pixel_mode) { case FT_PIXEL_MODE_MONO: case FT_PIXEL_MODE_GRAY: return kAlpha_8_SkColorType; case FT_PIXEL_MODE_BGRA: return kN32_SkColorType; default: SkDEBUGFAIL("unsupported FT_PIXEL_MODE"); return kAlpha_8_SkColorType; } }
static const char* ClipStr(Clip clip) { switch (clip) { case kRect_Clip: return "rect"; case kRRect_Clip: return "rrect"; case kPath_Clip: return "path"; } SkDEBUGFAIL("Unknown clip type."); return ""; }
bool SkOpEdgeBuilder::walk() { uint8_t* verbPtr = fPathVerbs.begin(); uint8_t* endOfFirstHalf = &verbPtr[fSecondHalf]; const SkPoint* pointsPtr = fPathPts.begin() - 1; SkPath::Verb verb; while ((verb = (SkPath::Verb) *verbPtr) != SkPath::kDone_Verb) { if (verbPtr == endOfFirstHalf) { fOperand = true; } verbPtr++; switch (verb) { case SkPath::kMove_Verb: if (fCurrentContour) { if (fAllowOpenContours) { complete(); } else if (!close()) { return false; } } if (!fCurrentContour) { fCurrentContour = fContours.push_back_n(1); fCurrentContour->setOperand(fOperand); fCurrentContour->setXor(fXorMask[fOperand] == kEvenOdd_PathOpsMask); } pointsPtr += 1; continue; case SkPath::kLine_Verb: fCurrentContour->addLine(pointsPtr); break; case SkPath::kQuad_Verb: fCurrentContour->addQuad(pointsPtr); break; case SkPath::kCubic_Verb: fCurrentContour->addCubic(pointsPtr); break; case SkPath::kClose_Verb: SkASSERT(fCurrentContour); if (!close()) { return false; } continue; default: SkDEBUGFAIL("bad verb"); return false; } pointsPtr += SkPathOpsVerbToPoints(verb); SkASSERT(fCurrentContour); } if (fCurrentContour && !fAllowOpenContours && !close()) { return false; } return true; }
void SkMultiPictureDraw::add(SkCanvas* canvas, const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint) { if (NULL == canvas || NULL == picture) { SkDEBUGFAIL("parameters to SkMultiPictureDraw::add should be non-NULL"); return; } SkTDArray<DrawData>& array = canvas->getGrContext() ? fGPUDrawData : fThreadSafeDrawData; array.append()->init(canvas, picture, matrix, paint); }
SkColorShader::SkColorShader(SkReadBuffer& b) : INHERITED(b) { // V25_COMPATIBILITY_CODE We had a boolean to make the color shader inherit the paint's // color. We don't support that any more. if (b.isVersionLT(SkReadBuffer::kColorShaderNoBool_Version)) { if (b.readBool()) { SkDEBUGFAIL("We shouldn't have pictures that recorded the inherited case."); fColor = SK_ColorWHITE; return; } } fColor = b.readColor(); }