Пример #1
0
void TextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
  QGraphicsItem::mouseReleaseEvent(event);

  if (isSelected() && (flags() & QGraphicsItem::ItemIsMovable) && positionChanged) {

    InsertData insertData = meta.value();

    qreal topLeft[2] = { sceneBoundingRect().left(),  sceneBoundingRect().top() };
    qreal size[2]    = { sceneBoundingRect().width(), sceneBoundingRect().height() };

    PlacementData pld;

    pld.placement    = TopLeft;
    pld.justification    = Center;
    pld.relativeTo      = PageType;
    pld.preposition   = Inside;

    calcOffsets(pld,insertData.offsets,topLeft,size);
    QStringList list = toPlainText().split("\n");
    insertData.text = list.join("\\n");
    meta.setValue(insertData);

    beginMacro(QString("MoveText"));

    changeInsertOffset(&meta);

    endMacro();
  }
}
Пример #2
0
void LLVertexBuffer::updateNumVerts(S32 nverts)
{
	LLMemType mt(LLMemType::MTYPE_VERTEX_DATA);

	llassert(nverts >= 0);

	if (nverts >= 65535)
	{
		llwarns << "Vertex buffer overflow!" << llendl;
		nverts = 65535;
	}

	mRequestedNumVerts = nverts;

	if (!mDynamicSize)
	{
		mNumVerts = nverts;
	}
	else if (mUsage == GL_STATIC_DRAW_ARB ||
		nverts > mNumVerts ||
		nverts < mNumVerts/2)
	{
		if (mUsage != GL_STATIC_DRAW_ARB && nverts + nverts/4 <= 65535)
		{
			nverts += nverts/4;
		}
		mNumVerts = nverts;
	}
	mSize = calcOffsets(mTypeMask, mOffsets, mNumVerts);
}
Пример #3
0
/* Calculate all offset in font set. Start by assuming the best possible case
   where all variable-length offsets are 1-byte long and calculate sizes and
   offsets. Then recalculate all sizes and offsets and iterate until there are
   no further changes. */
static void fillOffsets(tcprivCtx h) {
    int i;

    /* Initialize header */
    h->cffHdr.major = TC_MAJOR;
    h->cffHdr.minor = TC_MINOR;
    h->cffHdr.offSize = 1;

    /* Compute initial font sizes */
    h->size.FontNames = 0;
    h->size.dicts = 0;
    h->size.gsubrs = subrSizeGlobal(h->g);

    for (i = 0; i < h->set.cnt; i++) {
        fillInitialSizes(h, &h->set.array[i]);
    }

    h->size.nameINDEX = INDEX_SIZE(h->set.cnt, h->size.FontNames);
    h->size.dictINDEX = INDEX_SIZE(h->set.cnt, h->size.dicts);

    /* Iterate offset computation until final offset remains unchanged */
    h->offset.copyright = 0;
    while (calcOffsets(h)) {
        calcSizes(h);
    }

    h->cffHdr.hdrSize = CFF_HEADER_SIZE;

    /* Fill index headers */
    h->nameHdr.count = (unsigned short)h->set.cnt;
    h->nameHdr.offSize = INDEX_OFF_SIZE(h->size.FontNames);
    h->dictHdr.count = (unsigned short)h->set.cnt;
    h->dictHdr.offSize = INDEX_OFF_SIZE(h->size.dicts);

    /* Add offsets to dictionaries */
    for (i = 0; i < h->set.cnt; i++) {
        Font *font = &h->set.array[i];

        if (font->offset.encoding != 0) {
            /* Save encoding offset */
            dictSaveInt(&font->dict, font->offset.encoding);
            DICTSAVEOP(font->dict, cff_Encoding);
        }

        if (!(font->flags & FONT_SYNTHETIC)) {
            if (font->offset.charset != 0) {
                /* Save charset offset */
                dictSaveInt(&font->dict, font->offset.charset);
                DICTSAVEOP(font->dict, cff_charset);
            }
            if (!(font->flags & FONT_CHAMELEON)) {
                /* Save CharString offset */
                dictSaveInt(&font->dict, font->offset.CharStrings);
                DICTSAVEOP(font->dict, cff_CharStrings);
            }
            if (font->flags & FONT_CID) {
                int j;

                /* Save FDSelect offset */
                dictSaveInt(&font->dict, font->offset.fdselect);
                DICTSAVEOP(font->dict, cff_FDSelect);

                /* Save FDArray offset */
                dictSaveInt(&font->dict, font->offset.FDArray);
                DICTSAVEOP(font->dict, cff_FDArray);

                for (j = 0; j < font->fdCount; j++) {
                    FDInfo *fdInfo = &font->fdInfo[j];
                    if (fdInfo->seenChar) {
                        /* Save Private sizes/offsets */
                        dictSaveInt(&fdInfo->FD, fdInfo->size.Private);
                        dictSaveInt(&fdInfo->FD, fdInfo->offset.Private);
                        DICTSAVEOP(fdInfo->FD, cff_Private);

                        if (fdInfo->size.Subrs != 0) {
                            /* Save Subrs offset */
                            dictSaveInt(&fdInfo->Private, fdInfo->offset.Subrs);
                            DICTSAVEOP(fdInfo->Private, cff_Subrs);
                        }
                    }
                }
            } else {
                /* Save Private size/offset */
                dictSaveInt(&font->dict, font->size.Private);
                dictSaveInt(&font->dict, font->offset.Private);
                DICTSAVEOP(font->dict, cff_Private);

                if (font->size.Subrs != 0) {
                    /* Save Subrs offset */
                    dictSaveInt(&font->Private, font->offset.Subrs);
                    DICTSAVEOP(font->Private, cff_Subrs);
                }
            }
        }
    }
}
Пример #4
0
int main(int argc, char **argv)
{
    if (argc < 4)
        errx(1,
             "usage\t:%s <bam> <split out> <discord out> (optional #threads)",
             argv[0]);

    char *bam_file_name = argv[1];
    char *split_file_name = argv[2];
    char *disc_file_name = argv[3];
    int threads = 2;
    if (argc == 5) {
        threads = atoi(argv[4]);
    }

    samFile *disc = sam_open(disc_file_name, "wb");

    samFile *split = sam_open(split_file_name, "wb");

    samFile *in = sam_open(bam_file_name, "rb");
    if(in == NULL)
        errx(1, "Unable to open BAM/SAM file.");

    // TODO: handle cram.
    if (threads > 1) {
        bgzf_mt(in->fp.bgzf, threads, 256);
    }

    hts_idx_t *idx = sam_index_load(in, bam_file_name);
    if(idx == NULL)
        errx(1,"Unable to open BAM/SAM index.");

    bam_hdr_t *hdr = sam_hdr_read(in);

    int r = sam_hdr_write(disc, hdr);
    r = sam_hdr_write(split, hdr);

    bam1_t *aln = bam_init1();
    int ret;

    while(ret = sam_read1(in, hdr, aln) >= 0) {
        if (((aln->core.flag) & 1294) == 0)
            r = sam_write1(disc, hdr, aln);

        uint8_t *sa = bam_aux_get(aln, "SA");

        if (sa != 0) {
            char *sa_tag = strdup(bam_aux2Z(sa));
            if ( count_tags(sa_tag) == 1) {
                char *chrm, strand, *cigar;
                uint32_t pos;
                split_sa_tag(sa_tag,
                             &chrm,
                             &pos,
                             &strand,
                             &cigar);

                struct line sa, al;

                calcOffsets(cigar,
                            pos,
                            strand,
                            &sa);
                sa.chrm = chrm;
                sa.strand = strand;


                calcAlnOffsets(bam_get_cigar(aln),
                               aln->core.n_cigar,
                               aln->core.pos,
                               bam_is_rev(aln) ? '-' : '+',
                               &al);
                al.chrm = hdr->target_name[aln->core.tid];
                al.strand = bam_is_rev(aln) ? '-' : '+';

                struct line *left = &al, *right = &sa;

                if (left->SQO > right->SQO) {
                    left = &sa;
                    right = &al;
                }

                int overlap = MAX(1 + MIN(left->EQO, right->EQO) - 
                        MAX(left->SQO, right->SQO), 0);
                int alen1 = 1 + left->EQO - left->SQO;
                int alen2 = 1 + right->EQO - right->SQO;
                int mno = MIN(alen1-overlap, alen2-overlap);
                if (mno < MIN_NON_OVERLAP) 
                    continue;

                if ( (strcmp(left->chrm, right->chrm) == 0) &&
                     (left->strand == right->strand) ) {

                    int leftDiag, rightDiag, insSize;
                    if (left->strand == '-') {
                        leftDiag = left->rapos - left->sclip;
                        rightDiag = (right->rapos + right->raLen) - 
                                (right->sclip + right->qaLen);
                        insSize = rightDiag - leftDiag;
                    } else {
                        leftDiag = (left->rapos + left->raLen) - 
                                (left->sclip + left->qaLen);
                        rightDiag = right->rapos - right->sclip;
                        insSize = leftDiag - rightDiag;
                    }
                    int desert = right->SQO - left->EQO - 1;
                    if ((abs(insSize) < MIN_INDEL_SIZE) || 
                        ((desert > 0) && (
                            (desert - (int)MAX(0, insSize)) >
                            MAX_UNMAPPED_BASES)))
                        continue;
                }

                char *qname =  bam_get_qname(aln);
                if ((aln->core.flag & 64) == 64)
                    qname[0] = 'A'; 
                else
                    qname[0] = 'B'; 

                r = sam_write1(split, hdr, aln);
            }
            free(sa_tag);
        }
    }

    bam_destroy1(aln);
    hts_idx_destroy(idx);
    bam_hdr_destroy(hdr);
    sam_close(in);
    sam_close(disc);
    sam_close(split);
    if(ret < -1) {
        errx(1, "lumpy_filter: error reading bam: %s\n", bam_file_name);
    }
}