bool GrPlot::addSubImage(int width, int height, const void* image, SkIPoint16* loc) { float percentFull = fRects->percentFull(); if (!fRects->addRect(width, height, loc)) { return false; } // if batching uploads, create backing memory on first use // once the plot is nearly full we will revert to uploading each subimage individually int plotWidth = fRects->width(); int plotHeight = fRects->height(); if (fBatchUploads && NULL == fPlotData && 0.0f == percentFull) { fPlotData = new unsigned char[fBytesPerPixel * plotWidth * plotHeight]; memset(fPlotData, 0, fBytesPerPixel*plotWidth*plotHeight); } // if we have backing memory, copy to the memory and set for future upload if (fPlotData) { const unsigned char* imagePtr = (const unsigned char*) image; // point ourselves at the right starting spot unsigned char* dataPtr = fPlotData; dataPtr += fBytesPerPixel*plotWidth*loc->fY; dataPtr += fBytesPerPixel*loc->fX; // copy into the data buffer for (int i = 0; i < height; ++i) { memcpy(dataPtr, imagePtr, fBytesPerPixel*width); dataPtr += fBytesPerPixel*plotWidth; imagePtr += fBytesPerPixel*width; } fDirtyRect.join(loc->fX, loc->fY, loc->fX + width, loc->fY + height); adjust_for_offset(loc, fOffset); fDirty = true; // otherwise, just upload the image directly } else if (image) { adjust_for_offset(loc, fOffset); TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), "GrPlot::uploadToTexture"); fTexture->writePixels(loc->fX, loc->fY, width, height, fTexture->config(), image, 0, GrContext::kDontFlush_PixelOpsFlag); } else { adjust_for_offset(loc, fOffset); } #if FONT_CACHE_STATS ++g_UploadCount; #endif return true; }
bool addSubImage(int width, int height, const void* image, SkIPoint16* loc, size_t rowBytes) { if (!fRects->addRect(width, height, loc)) { return false; } if (!fData) { fData = reinterpret_cast<unsigned char*>(sk_calloc_throw(fBytesPerPixel * fWidth * fHeight)); } const unsigned char* imagePtr = (const unsigned char*)image; // point ourselves at the right starting spot unsigned char* dataPtr = fData; dataPtr += fBytesPerPixel * fWidth * loc->fY; dataPtr += fBytesPerPixel * loc->fX; // copy into the data buffer for (int i = 0; i < height; ++i) { memcpy(dataPtr, imagePtr, rowBytes); dataPtr += fBytesPerPixel * fWidth; imagePtr += rowBytes; } fDirtyRect.join(loc->fX, loc->fY, loc->fX + width, loc->fY + height); adjust_for_offset(loc, fOffset); SkDEBUGCODE(fDirty = true;) return true;
bool GrPlot::addSubImage(int width, int height, const void* image, GrIPoint16* loc) { if (!fRects->addRect(width, height, loc)) { return false; } SkAutoSMalloc<1024> storage; adjust_for_offset(loc, fOffset); GrContext* context = fTexture->getContext(); // We pass the flag that does not force a flush. We assume our caller is // smart and hasn't referenced the part of the texture we're about to update // since the last flush. context->writeTexturePixels(fTexture, loc->fX, loc->fY, width, height, fTexture->config(), image, 0, GrContext::kDontFlush_PixelOpsFlag); #if FONT_CACHE_STATS ++g_UploadCount; #endif return true; }
bool addSubImage(int width, int height, const void* image, SkIPoint16* loc, size_t rowBytes) { if (!fRects->addRect(width, height, loc)) { return false; } SkASSERT(fData); const unsigned char* imagePtr = (const unsigned char*)image; // point ourselves at the right starting spot unsigned char* dataPtr = fData; dataPtr += fBytesPerPixel * fWidth * loc->fY; dataPtr += fBytesPerPixel * loc->fX; // copy into the data buffer for (int i = 0; i < height; ++i) { memcpy(dataPtr, imagePtr, rowBytes); dataPtr += fBytesPerPixel * fWidth; imagePtr += rowBytes; } fDirtyRect.join(loc->fX, loc->fY, loc->fX + width, loc->fY + height); adjust_for_offset(loc, fOffset); SkDEBUGCODE(fDirty = true;) #if ATLAS_STATS ++g_UploadCount;