bool GrAtlas::addSubImage(int width, int height, const void* image, GrIPoint16* loc) { if (!fRects->addRect(width + BORDER, height + BORDER, loc)) { return false; } GrAutoSMalloc<1024> storage; int dstW = width + 2*BORDER; int dstH = height + 2*BORDER; if (BORDER) { const int bpp = GrMaskFormatBytesPerPixel(fMaskFormat); const size_t dstRB = dstW * bpp; uint8_t* dst = (uint8_t*)storage.realloc(dstH * dstRB); Gr_bzero(dst, dstRB); // zero top row dst += dstRB; for (int y = 0; y < height; y++) { dst = zerofill(dst, bpp); // zero left edge memcpy(dst, image, width * bpp); dst += width * bpp; dst = zerofill(dst, bpp); // zero right edge image = (const void*)((const char*)image + width * bpp); } Gr_bzero(dst, dstRB); // zero bottom row image = storage.get(); } adjustForPlot(loc, fPlot); fTexture->uploadTextureData(loc->fX, loc->fY, dstW, dstH, image); // now tell the caller to skip the top/left BORDER loc->fX += BORDER; loc->fY += BORDER; return true; }
GrAtlasMgr::GrAtlasMgr(GrGpu* gpu) { fGpu = gpu; gpu->ref(); Gr_bzero(fTexture, sizeof(fTexture)); for (int i = 0; i < kCount_GrMaskFormats; ++i) { fPlotMgr[i] = SkNEW_ARGS(GrPlotMgr, (GR_PLOT_WIDTH, GR_PLOT_HEIGHT)); } }
bool GrAtlas::addSubImage(int width, int height, const void* image, GrIPoint16* loc) { if (!fRects->addRect(width + BORDER, height + BORDER, loc)) { return false; } SkAutoSMalloc<1024> storage; int dstW = width + 2*BORDER; int dstH = height + 2*BORDER; if (BORDER) { const int bpp = GrMaskFormatBytesPerPixel(fMaskFormat); const size_t dstRB = dstW * bpp; uint8_t* dst = (uint8_t*)storage.reset(dstH * dstRB); Gr_bzero(dst, dstRB); // zero top row dst += dstRB; for (int y = 0; y < height; y++) { dst = zerofill(dst, bpp); // zero left edge memcpy(dst, image, width * bpp); dst += width * bpp; dst = zerofill(dst, bpp); // zero right edge image = (const void*)((const char*)image + width * bpp); } Gr_bzero(dst, dstRB); // zero bottom row image = storage.get(); } adjustForPlot(loc, fPlot); 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, dstW, dstH, fTexture->config(), image, 0, GrContext::kDontFlush_PixelOpsFlag); // now tell the caller to skip the top/left BORDER loc->fX += BORDER; loc->fY += BORDER; #if FONT_CACHE_STATS ++g_UploadCount; #endif return true; }
void set(const GrMatrix& m) { Gr_bzero(fMat, sizeof(fMat)); fMat[0] = GrScalarToFloat(m[GrMatrix::kScaleX]); fMat[4] = GrScalarToFloat(m[GrMatrix::kSkewX]); fMat[12] = GrScalarToFloat(m[GrMatrix::kTransX]); fMat[1] = GrScalarToFloat(m[GrMatrix::kSkewY]); fMat[5] = GrScalarToFloat(m[GrMatrix::kScaleY]); fMat[13] = GrScalarToFloat(m[GrMatrix::kTransY]); fMat[3] = GrScalarToFloat(m[GrMatrix::kPersp0]); fMat[7] = GrScalarToFloat(m[GrMatrix::kPersp1]); fMat[15] = GrScalarToFloat(m[GrMatrix::kPersp2]); fMat[10] = 1.f; // z-scale }
void GrGpuGLFixed::flushProjectionMatrix() { float mat[16]; Gr_bzero(mat, sizeof(mat)); GrAssert(NULL != fCurrDrawState.fRenderTarget); mat[0] = 2.f / fCurrDrawState.fRenderTarget->width(); mat[5] = -2.f / fCurrDrawState.fRenderTarget->height(); mat[10] = -1.f; mat[15] = 1; mat[12] = -1.f; mat[13] = 1.f; GR_GL(MatrixMode(GR_GL_PROJECTION)); GR_GL(LoadMatrixf(mat)); }
GrAtlasMgr::GrAtlasMgr(GrGpu* gpu) { fGpu = gpu; gpu->ref(); Gr_bzero(fTexture, sizeof(fTexture)); fPlotMgr = new GrPlotMgr(GR_PLOT_WIDTH, GR_PLOT_HEIGHT); }
GrRectanizerPow2(int w, int h) : GrRectanizer(w, h) { fNextStripY = 0; fAreaSoFar = 0; Gr_bzero(fRows, sizeof(fRows)); }
void reset() { Gr_bzero(fMat, sizeof(fMat)); fMat[0] = fMat[5] = fMat[10] = fMat[15] = GR_Scalar1; }